Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Dsion  Offline  Сообщение №1111 написано: 30 июня 2014, 12:10 | Отредактировано: Dsion - 30 июня 2014, 12:15



Цитата MemoriaVetusta

До этого я пользовался глобальными переменными для сообщения данных между скриптами, хотя это и неудобно. Зато надежно. Все это очень печально, когда то, что должно работать, работать отказывается...


;_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 объекта с тремя разными видами моих личных скриптов. И они не только переменные друг на друге меняли, а еще и в функции друг друга передавали итп.

Dsion  Offline  Сообщение №1112 написано: 30 июня 2014, 13:02



Цитата Kepper

Сделать контейнер и в него класть книги заклинаний. Книга указывает тип заклинания, их количество в контейнере - номер варианта.


Без 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)

Даже ничего и заполнят не нужно...

Kepper  Offline  Сообщение №1113 написано: 30 июня 2014, 13:20



860
Цитата Dsion

Без SKSE ты и не определишь, какое заклинание соответствует данной книге. Ну без SKSE или, опять же, больших массивов.


Чукча хитрый. Чукча передает в скрипт в качестве параметров два FormList. В одном хранятся заклинания в другом книги.
Всё равно каждое заклинание обрабатывается по своему.

Спасибо. Немного попытаю этот OnInit

Aksyonov  Offline  Сообщение №1114 написано: 3 июля 2014, 05:29 | Отредактировано: Aksyonov - 3 июля 2014, 05:30



937
Люди привет ! напишите пожалуйста простенький скрипт, нужно что бы когда забираешь клинок в свой инвентарь удалялся указанный источник света на всегда из мира skyrim, думаю там не так много писанины но сам сделать не могу, очень надо заранее спасибо, просто подсвечиваю некоторое оружие в мире но источник света остается, будет замечательно если сделать так что бы когда забираешь клинок свет исчезал :)

Aksyonov  Offline  Сообщение №1115 написано: 3 июля 2014, 13:59 | Отредактировано: Aksyonov - 3 июля 2014, 14:32



937
Цитата MemoriaVetusta

Aksyonov, привет.


Привет спасибо большое за скрипт, скажи MemoriaVetusta, как я понимаю вместо о надписи MyLIGH нужно вписать названия id источника света взятое из окна рендера верно?  а то в Properties указать ничего нельзя а так скрипт действительно сохраняется успешно, сейчас проверю на практике, в общем не работает может я что то не правильно делаю не сможешь создать esp файл ? со скриптом :)

Dsion  Offline  Сообщение №1116 написано: 3 июля 2014, 16:04



Так и знал, что кто-то предложит повесить скрипт на само оружие или на игрока... Эх...

Kepper  Offline  Сообщение №1117 написано: 4 июля 2014, 04:53



860
Цитата MemoriaVetusta

Dsion, а куда его повесить?


Ещё есть вариант.
Разместить в мире активатор с моделью оружия. И при активации выдавать оружие и самоликвидироваться. Подобно сиянию рассвета.

Myprism  Offline  Сообщение №1118 написано: 4 июля 2014, 06:44


Физик


Kepper, это как раз тот способ, который используют разработчики. В частности, так берутся древние свитки. Это позволяет подвесить статический объект, который исчезает при активации, а в инвентаре игрока уже появляется обычный объект.

Kepper  Offline  Сообщение №1119 написано: 4 июля 2014, 07:10



860
Myprism, и чем он плох?
Конечно можно разместить оружие и в триггере, и отслеживать когда оно его покинет.
Но в этом случае оружие может улететь и из-за безжалостной силы.

Insomniac  Offline  Сообщение №1120 написано: 4 июля 2014, 08:07



70
подскажите пожалуйста как сделать так, что бы по завершению определенного маг эффекта, на персонажа повесился другой

Код
Event OnEffectFinish(Actor akTarget, Actor akCaster)

Myprism  Offline  Сообщение №1121 написано: 4 июля 2014, 08:26


Физик


Kepper, совсем не плох. Я думаю, что как раз правильно будет использовать те же приёмы, что используют разработчики.

Insomniac  Offline  Сообщение №1122 написано: 4 июля 2014, 10:15



70
MemoriaVetusta, благодарю

Aksyonov  Offline  Сообщение №1123 написано: 4 июля 2014, 15:03 | Отредактировано: Aksyonov - 4 июля 2014, 15:06



937
Цитата MemoriaVetusta

Aksyonov, при редактировании Property "MyLIGH" выбрать конкретный Object Reference (в данном случае - нужный источник света) в окне рендера (в Properties есть кнопка "Edit" -> "Pick reference in render window"). Можно сразу предварительно загрузить нужную локацию в окно рендера, а потом клац-клац ЛКМ по нужному объекту, и все выберется. ЗЫ: Щас проверил, все работает (у меня это был сундук, из которого я брал заскриптованное оружие  ). В смысле, сундук после этого исчез. Значит, и свет должен исчезнуть.


Коллега MemoriaVetusta, скинь пожалуйста свой esp но не работает скрипт у меня и все пожалуйста !  ^_^ может там закорючки какой не хватает и все ! я посмотрю esp.

Aksyonov  Offline  Сообщение №1124 написано: 4 июля 2014, 22:39



937
Цитата MemoriaVetusta

Также советую ознакомиться с постами от Kepper, Myprism (что на этой странице), может, их способ будет для тебя проще.


Даже не знаю почему но теперь скрипт работает спасибо большое :)

Добавлено (05 Июля 2014, 02:39)
---------------------------------------------
MemoriaVetusta, а ещё сможешь один скрипт написать ? нужно следующие - просто что бы объект в определенное время появлялся и исчезал было бы очень хорошо если бы смог написать - скажем пусть клинок появлялся бы с 00-00 до - 00-15 или по часам там с полночи до часу ночи :)


anton  Offline  Сообщение №1125 написано: 7 июля 2014, 12:22



362
Хочу уточнить решение по обходу одного бага/особенности движка Скайрима.

Проблема:
Вызываю объект (активатор), и двигаю его скриптом функцией TranslateTo() на 100000 единиц.
Когда объект выходит за пределы области загруженных ячеек игры (~20000 единиц), он пропадает (его 3Д модель выгружается из игры).

Решение, про которое я слышал:
Периодически вызывать для объекта функцию MoveToNode(), чтобы она обновляла для движка реальное положение объекта.

Мне интересно, может есть ещё какие то варианты решений ?

Мой Блог
Myprism  Offline  Сообщение №1126 написано: 10 июля 2014, 06:32


Физик


Чем различается действие строк:
Alias_Alice.GetReference().Enable()
Alias_Alice.GetActorReference().Enable()

?

Dsion  Offline  Сообщение №1127 написано: 10 июля 2014, 07:14



Цитата Myprism

Чем различается действие строк:Alias_Alice.GetReference().Enable()
Alias_Alice.GetActorReference().Enable()
?


Вторая сработает только если в алиасе именно Актор. Больше никакой разницы:

Actor Function GetActorReference()
    return GetReference() as Actor
endFunction

anton  Offline  Сообщение №1128 написано: 12 июля 2014, 19:45



362
Я сделал магический эффект с параметрами "концентрация" + "на цель" (как в заклинании "Искра"/"Пламя").
Подцепил на него скрипт на события OnEffectStart() и OnEffectStop(). Но в игре скрипт не запускается.
Хотя эффекты работают и молния бьёт по земле.
Если поменять параметры на "концентрация" + "на себя", то скрипт начинает работать.

Вопрос: почему так происходит и как заставить скрипт работать ?

Мой Блог
MemoriaVetusta  Offline  Сообщение №1129 написано: 12 июля 2014, 19:56



173
anton

Вместо OnEffectStop():
OnEffectFinish()

Можно скрипт глянуть?

Nothing is...
anton  Offline  Сообщение №1130 написано: 12 июля 2014, 20:07



362
MemoriaVetusta, точно, это я тут ошибся. А в скрипте ничего нет, кроме Debug.Notification("[Balloon] Test1").
Вся штука в том, что скрипт то работает, но только если сменить параметры маг.эффекта на "на себя".
А как заставить работать с параметром "на цель" непонятно.
У меня этих "на цель" в СК 3 штуки, по описанию вроде как надо использовать или 1й или 3й. И у обоих происходит запуск маг.эффекта, виден удар молнии, но скрипт не стартует. А меняешь параметр - работает. Вот такая загадка.

Мой Блог
MemoriaVetusta  Offline  Сообщение №1131 написано: 12 июля 2014, 21:10 | Отредактировано: MemoriaVetusta - 12 июля 2014, 21:15



173
anton, я проверю у себя и сообщу.

Добавлено (13 Июля 2014, 01:10)
---------------------------------------------
У меня все работает.

Заклинание и эффект скопировал с ванили - "Пламя". К эффекту прицепил скрипт:


При атаке цели этим эффектом у меня появляется "+", значит, эффект срабатывает (на цели, естественно). Если просто активировать заклинание, ни в кого не целясь и не попадая снарядом Projectile в актеров, конечно же, ничего не произойдет, и не должно происходить.
Чтобы при активации заклинания, неважно, попадаешь по цели или нет, срабатывал эффект "на себя", если заклинание имеет другой тип активации (а у нас это "на цель"), то надо сделать так:

Скрипт цепляется к эффекту "на цель" в нашем заклинании.


MySpell - другое заклинание с эффектом, которое ты хочешь наложить на заклинателя. Должно иметь тип "на себя".

Nothing is...
Dsion  Offline  Сообщение №1132 написано: 13 июля 2014, 05:53 | Отредактировано: Dsion - 13 июля 2014, 05:55



Цитата MemoriaVetusta

Если просто активировать заклинание, ни в кого не целясь и не попадая снарядом Projectile в актеров, конечно же, ничего не произойдет, и не должно происходить.


Ага... Только когда эффект накладывается на какого-то актора, создается копия скрипта и вызывается ивент EffectStart. Если ни в кого не попасть, то и скрипта нету. А если это был взрыв и задел сразу 10 NPC, то будет 10 экземпляров скрипта и в каждом вызовется EffectStart.

Возможно, в твоем сообщении нужно поменять местами два словосочетания...

Так же из этого выплывает, что сделать заклинание, которое будет срабатывать на неживые предметы, чуть посложнее. Хотя и можно :-Р

anton  Offline  Сообщение №1133 написано: 13 июля 2014, 06:31



362
DsionMemoriaVetusta, начинаю понимать, "на цель" вызывает скрипт, только при попадании в НПС, ... , а мне как раз и не надо ни в кого попадать.

Вообще, на сколько я понял, "на цель" имеет три типа: по Projectile, моментально и только по НПС и без Projectile, по статикам без Projectile.
Я пытался использовать именно третий тип, спец-эффекты при этом выполняются, но скрипт не срабатывает.

Два слова, чего я хочу добиться:
Пока кастуется моё заклинание, должен работать скрипт, меняющий переменные в зависимости от того куда смотрит ГГ.
Как только мы прекращаем каст, переменные передаются на выполнение другому скрипту.

Можно конечно оставить тип "на себя"; но мне хотелось, чтобы анимация ГГ была с вытянутой рукой перёд, как бы указывая направление.
А это есть только в типе "на цель".

Мой Блог
Dsion  Offline  Сообщение №1134 написано: 13 июля 2014, 07:37



А менять переменные во время каста действительно нужно? Нельзя просто высчитать всё в момент завершения каста и передать дальше?

anton  Offline  Сообщение №1135 написано: 13 июля 2014, 09:00



362
Dsion, да, можно и так, мне главное чтобы анимация рук при касте работала как "на цель".

Мой Блог
werewolveMEN  Offline  Сообщение №1136 написано: 13 июля 2014, 10:38



10
помогите пожайлуста какой нужен скрипт чтобы при активации предмета например робота мозготрона ГГ становился мозготроном с его анимациеей и оружием а модель ГГ исчезала

WerewolF
anton  Offline  Сообщение №1137 написано: 13 июля 2014, 12:10



362
MemoriaVetusta, так ведь у заклинания нет поля для скрипта, а если повесить его на маг-эффект, то он не вызовется, пока не попадёшь им по НПС. Или я чего то не понял ...?

Ладно, всё равно попробую.

Мой Блог
anton  Offline  Сообщение №1138 написано: 13 июля 2014, 13:29 | Отредактировано: anton - 13 июля 2014, 13:29



362
MemoriaVetusta, точно, не работает, как и не работает моя идея вызвать на себя Абилку через Перк на этом маг-эффекте.
Перк ничего не хочет добавлять. :(

Мой Блог
Dsion  Offline  Сообщение №1139 написано: 13 июля 2014, 16:17



antonMemoriaVetusta, нужно правильно поставить вопрос:
Почему персонаж вытягивает руку, когда поддерживает заклинание типа "Оберег"? Оно ведь тоже Conc Self.

А я уже знаю :-Р

anton  Offline  Сообщение №1140 написано: 13 июля 2014, 16:54 | Отредактировано: anton - 13 июля 2014, 16:56



362
MemoriaVetusta, с Перками мой фокус тоже не пройдёт т.к. им тоже цель нужна, а у меня её не будет.

Dsion, Ну так чего же ты молчишь !?!? Поделись знанием со страждущими ! :)
(а то за сегодня меня этот СК уже достал)

Мой Блог
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб