• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №1111
написано: 30 июня 2014, 12:10
| Отредактировано: Dsion - 30 июня 2014, 12:15
До этого я пользовался глобальными переменными для сообщения данных между скриптами, хотя это и неудобно. Зато надежно. Все это очень печально, когда то, что должно работать, работать отказывается...
;_MVAWeightSKSE Property _MVAWeightLINK Auto ; Скрипт на актере. К какому конкретно актору этот скрипт прицеплен и каким образом? Ты ведь не забыл эту property заполнить? Скрипт наследует Actor или ObjectReference?
Вариант1: Actor Property MyActor Auto MyActor.Disable()
Вариант2: ExtendedActor Property MyExtendedActor Auto MyExtendedActor.SomeVariable = 4
Вероятность того, что второе не работает такая же, как вероятность того, что первое не работает. Главное не забыть прицепить скрипт ExtendedActor к конкретному актору и заполнить property. Разница только в том, что скрипт Actor есть всегда на всех акторах, а расширенный скрипт надо прицепить. Один мой мод создавал 74 объекта с тремя разными видами моих личных скриптов. И они не только переменные друг на друге меняли, а еще и в функции друг друга передавали итп.
Сделать контейнер и в него класть книги заклинаний. Книга указывает тип заклинания, их количество в контейнере - номер варианта.
Без SKSE ты и не определишь, какое заклинание соответствует данной книге. Ну без SKSE или, опять же, больших массивов. Я бы эту информацию все-таки в скрипте хранил. Двумя массивами. Хотя есть способ похитрее и более близкий к традиционному программированию.
Обновление инициализированных скриптов у пользователя - больная тема. И я её особо не изучал. Могу только предположить. После обновления скрипта OnInit на нем почти наверняка не вызывается и переменные не сбрасываются. Но когда дойдет до какого-то инвента, будет вызываться уже новая версия ивента. Некоторые изменения скриптов пройдут для пользователя гладко, а другие - вообще убьют мод. Потому если нужно сделать мод со скриптами обновляемым, об этом нужно с самого начала думать. Если нужно сбросить какие-то переменные после обновления мода, можно сделать специальную функцию на ивенте OnPlayerLoadGame.
Касательно производительности. Массив из 128 чисел типа int32 - это всего 512 байт. Большинству пользователей пофигу, что к его 15Мб сэйву добавится 512 байт... Но думать о чистоте - это, конечно, правильно. На частоту смены кадров в игре скрипт может только коственно повлиять. Например, вызвав 100 NPC. Даже если в нем есть абсолютно багнутая функция типа: While (True) EndWhile То это очень плохо, но производительность игры не снизится. Скрипты отдельно выполняются. Не так, как было в Обливионе.
Добавлено (30 Июня 2014, 17:02) --------------------------------------------- MemoriaVetusta, может, тот мой конкретный скрипт и не работает (хотя чего ему не работать?), но общая идея работает абсолютно точно.
Можешь попробовать сначала что-то более простое, чтоб убедиться. Сделай квест и прицепи к нему скрипт MyQuestScript с какой-то простенькой функцией типа
Код
Function Test(Actor akSpeaker) Debug.MessageBox(akSpeaker) EndFunction
А потом в квесте какой-то диалог с любым NPC и чтоб после выбора какого-то пункта вызывалось: (GetOwningQuest() As MyQuestScript).Test(akSpeaker)
Без SKSE ты и не определишь, какое заклинание соответствует данной книге. Ну без SKSE или, опять же, больших массивов.
Чукча хитрый. Чукча передает в скрипт в качестве параметров два FormList. В одном хранятся заклинания в другом книги. Всё равно каждое заклинание обрабатывается по своему.
Спасибо. Немного попытаю этот OnInit
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №1114
написано: 3 июля 2014, 05:29
| Отредактировано: Aksyonov - 3 июля 2014, 05:30
Люди привет ! напишите пожалуйста простенький скрипт, нужно что бы когда забираешь клинок в свой инвентарь удалялся указанный источник света на всегда из мира skyrim, думаю там не так много писанины но сам сделать не могу, очень надо заранее спасибо, просто подсвечиваю некоторое оружие в мире но источник света остается, будет замечательно если сделать так что бы когда забираешь клинок свет исчезал
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №1115
написано: 3 июля 2014, 13:59
| Отредактировано: Aksyonov - 3 июля 2014, 14:32
Привет спасибо большое за скрипт, скажи MemoriaVetusta, как я понимаю вместо о надписи MyLIGH нужно вписать названия id источника света взятое из окна рендера верно? а то в Properties указать ничего нельзя а так скрипт действительно сохраняется успешно, сейчас проверю на практике, в общем не работает может я что то не правильно делаю не сможешь создать esp файл ? со скриптом
Kepper, это как раз тот способ, который используют разработчики. В частности, так берутся древние свитки. Это позволяет подвесить статический объект, который исчезает при активации, а в инвентаре игрока уже появляется обычный объект.
Myprism, и чем он плох? Конечно можно разместить оружие и в триггере, и отслеживать когда оно его покинет. Но в этом случае оружие может улететь и из-за безжалостной силы.
Aksyonov, при редактировании Property "MyLIGH" выбрать конкретный Object Reference (в данном случае - нужный источник света) в окне рендера (в Properties есть кнопка "Edit" -> "Pick reference in render window"). Можно сразу предварительно загрузить нужную локацию в окно рендера, а потом клац-клац ЛКМ по нужному объекту, и все выберется. ЗЫ: Щас проверил, все работает (у меня это был сундук, из которого я брал заскриптованное оружие ). В смысле, сундук после этого исчез. Значит, и свет должен исчезнуть.
Коллега MemoriaVetusta, скинь пожалуйста свой esp но не работает скрипт у меня и все пожалуйста ! может там закорючки какой не хватает и все ! я посмотрю esp.
Также советую ознакомиться с постами от Kepper, Myprism (что на этой странице), может, их способ будет для тебя проще.
Даже не знаю почему но теперь скрипт работает спасибо большое
Добавлено (05 Июля 2014, 02:39) --------------------------------------------- MemoriaVetusta, а ещё сможешь один скрипт написать ? нужно следующие - просто что бы объект в определенное время появлялся и исчезал было бы очень хорошо если бы смог написать - скажем пусть клинок появлялся бы с 00-00 до - 00-15 или по часам там с полночи до часу ночи
Хочу уточнить решение по обходу одного бага/особенности движка Скайрима.
Проблема: Вызываю объект (активатор), и двигаю его скриптом функцией TranslateTo() на 100000 единиц. Когда объект выходит за пределы области загруженных ячеек игры (~20000 единиц), он пропадает (его 3Д модель выгружается из игры).
Решение, про которое я слышал: Периодически вызывать для объекта функцию MoveToNode(), чтобы она обновляла для движка реальное положение объекта.
Мне интересно, может есть ещё какие то варианты решений ?
Я сделал магический эффект с параметрами "концентрация" + "на цель" (как в заклинании "Искра"/"Пламя"). Подцепил на него скрипт на события OnEffectStart() и OnEffectStop(). Но в игре скрипт не запускается. Хотя эффекты работают и молния бьёт по земле. Если поменять параметры на "концентрация" + "на себя", то скрипт начинает работать.
Вопрос: почему так происходит и как заставить скрипт работать ?
MemoriaVetusta, точно, это я тут ошибся. А в скрипте ничего нет, кроме Debug.Notification("[Balloon] Test1"). Вся штука в том, что скрипт то работает, но только если сменить параметры маг.эффекта на "на себя". А как заставить работать с параметром "на цель" непонятно. У меня этих "на цель" в СК 3 штуки, по описанию вроде как надо использовать или 1й или 3й. И у обоих происходит запуск маг.эффекта, виден удар молнии, но скрипт не стартует. А меняешь параметр - работает. Вот такая загадка.
Добавлено (13 Июля 2014, 01:10) --------------------------------------------- У меня все работает.
Заклинание и эффект скопировал с ванили - "Пламя". К эффекту прицепил скрипт:
Scriptname _MySCRIPT extends ActiveMagicEffect
Event OnEffectStart(Actor akTarget, Actor akCaster) Debug.Notification("+") EndEvent
При атаке цели этим эффектом у меня появляется "+", значит, эффект срабатывает (на цели, естественно). Если просто активировать заклинание, ни в кого не целясь и не попадая снарядом Projectile в актеров, конечно же, ничего не произойдет, и не должно происходить. Чтобы при активации заклинания, неважно, попадаешь по цели или нет, срабатывал эффект "на себя", если заклинание имеет другой тип активации (а у нас это "на цель"), то надо сделать так:
Скрипт цепляется к эффекту "на цель" в нашем заклинании.
Scriptname _MySCRIPT extends ActiveMagicEffect
Spell Property MySpell Auto
Event OnEffectStart(Actor akTarget, Actor akCaster) MySpell.Cast(akCaster) EndEvent
MySpell - другое заклинание с эффектом, которое ты хочешь наложить на заклинателя. Должно иметь тип "на себя".
Nothing is...
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №1132
написано: 13 июля 2014, 05:53
| Отредактировано: Dsion - 13 июля 2014, 05:55
Если просто активировать заклинание, ни в кого не целясь и не попадая снарядом Projectile в актеров, конечно же, ничего не произойдет, и не должно происходить.
Ага... Только когда эффект накладывается на какого-то актора, создается копия скрипта и вызывается ивент EffectStart. Если ни в кого не попасть, то и скрипта нету. А если это был взрыв и задел сразу 10 NPC, то будет 10 экземпляров скрипта и в каждом вызовется EffectStart.
Возможно, в твоем сообщении нужно поменять местами два словосочетания...
Так же из этого выплывает, что сделать заклинание, которое будет срабатывать на неживые предметы, чуть посложнее. Хотя и можно :-Р
Dsion, MemoriaVetusta, начинаю понимать, "на цель" вызывает скрипт, только при попадании в НПС, ... , а мне как раз и не надо ни в кого попадать.
Вообще, на сколько я понял, "на цель" имеет три типа: по Projectile, моментально и только по НПС и без Projectile, по статикам без Projectile. Я пытался использовать именно третий тип, спец-эффекты при этом выполняются, но скрипт не срабатывает.
Два слова, чего я хочу добиться: Пока кастуется моё заклинание, должен работать скрипт, меняющий переменные в зависимости от того куда смотрит ГГ. Как только мы прекращаем каст, переменные передаются на выполнение другому скрипту.
Можно конечно оставить тип "на себя"; но мне хотелось, чтобы анимация ГГ была с вытянутой рукой перёд, как бы указывая направление. А это есть только в типе "на цель".
помогите пожайлуста какой нужен скрипт чтобы при активации предмета например робота мозготрона ГГ становился мозготроном с его анимациеей и оружием а модель ГГ исчезала
MemoriaVetusta, так ведь у заклинания нет поля для скрипта, а если повесить его на маг-эффект, то он не вызовется, пока не попадёшь им по НПС. Или я чего то не понял ...?
anton, MemoriaVetusta, нужно правильно поставить вопрос: Почему персонаж вытягивает руку, когда поддерживает заклинание типа "Оберег"? Оно ведь тоже Conc Self.
А я уже знаю :-Р
Изменение репутации для пользователя anton
antonOffline
Сообщение №1140
написано: 13 июля 2014, 16:54
| Отредактировано: anton - 13 июля 2014, 16:56