Модератор форума: 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? Пиши не в ЛС, а в эту тему.
frodo01  Offline  Сообщение №2941 написано: 6 июля 2020, 20:05 | Отредактировано: frodo01 - 8 июля 2020, 09:51



5
Скрипт никак не хочет работать
А так я хотел связать свой скрипт с чужим
То есть в чужом скрипте проделывалось одно действие и мой скрипт срабатывал параллельно, вот и хотел ухватиться за анимацию

yakor77  Offline  Сообщение №2942 написано: 19 июля 2020, 22:07



28
Здравствуйте, коллега Майпризм!
К теме "Дверь, по прозвищу Зверь (вылет из поместий).
Как Вы помните, из переписки ранеее по этой теме, мне тогда помогло грубое силовое решение. Я вынес внутренню дверь, соединявшую бывший вестибюль поместья, с главным залом, и вылеты прекратились.
Но хотелось бы докопаться до причин.
И я докопался!
Многочисленные жалобы на форумах, на тот же баг, причем связанный именно с манекенами, привели к источнику конфликта. Им оказался скрипт манекенов МанекенАктиваторСкрипт.
Подскажите, есть ли у Вас концептуальные идеи, о причине странной нелюбви модифицированных манекенов - к внутренней двери?
Мод на манекены - не только их оживлял, превращая в анимированных людей, он ещё и запрещал им гулять свободно по всему поместью, и избавляться от надетой на них броньки.
Интересно, в чём тут проблема, как это всё взаимосвязанно?
Ваши подсказки, как всегда, сильно сэкономили бы мне время на дальнейший самостоятельный анализ и устранение проблемы.
Заранее благодарен.

С уважением.
Маг Иридий.
Myprism  Offline  Сообщение №2943 написано: 20 июля 2020, 16:30


Физик


yakor77, не представляю себе, как манекены могут конфликтовать с дверью. В принципе, я делал мод на манекены, но достаточно давно https://modgames.net/load....0-22302 Он выложен для Skyrim SE, но скрипты от этого не должны зависеть. Кажется, я его встраивал и в другие свои моды, в том числе и под LE. Точно не помню, а разбираться сейчас нет времени, завтра я уже буду у подножия Эльбруса :)

yakor77  Offline  Сообщение №2944 написано: 23 июля 2020, 12:02 | Отредактировано: Multigone - 26 июля 2020, 19:19



28
Здравствуйте, Майпризм!
Прежде всего, приятного, надежного и успешного Вам восхождения на Эльбрус!
Что же касается манекенов, то тут простая логика.
1) Вылеты были при установленных модах на манекены, из-за двери, когда я дверь вынес, вылеты прекратились.
2) В сохранении, где старая ванильная дверь была на месте, после вычистки всех доп. модов по манекенам до ванили - вылеты так же прекратились.
3) Более нигде, кроме трёх поместий, конфликтов модов на манекены с помещениями - не было. Ни для ванильных помещений, ни для модовских.
4) Вывод: моды на манкены конфликтуют с дверьми поместий, и более - ни с чем. Причем конфликт шёл в части манекенных скриптов. То есть, имеется какой-то баг, именно в поместьях, и связанный именно с манекенами.
В силу того, что ванильные манекены сильно забагованы и зело глюкавы (бродят по поместю, прячут одежду, и пр.), доп. моды на манекены - крайге необходимы. Отказаться от них не хочется.
5) Опять есть грубое силовое решение: вынести все манекены из всех поместий. В принципе, они мне там и не нужны. Скорее всего, я так и сделаю.
Но всё же, интересно докопаться до причины, и написать патч.
Неофициальные патчи от Бетесды - эту проблему не лечат. Так что, буду разбираться, это интересная логическая задачка.
Но Ваши советы приму с благодарностью. Это экономит труд и время.

Добавлено (26 Июля 2020, 05:40)
---------------------------------------------
Здравствуйте, коллега Майпризм! Продолжаю рассказывать о решении проблемы, связанной с вылетами в пеместьях, манекенами и дверьми. Как вернётесь из тпуска - продолжим беседу. Я локализовал данную проблему. Вылеты "обеспечивал" один-единственный хулиганский скрипт на манекены. Другие скрипты, от других модов, работают нормально, стабильно с игрой, и совместно между собой. Обзор по этим сторонним модамдам чуть позже. А пока расскажу про этого хулигана. Этот файл называется MannequinActivatorSCRIP.pex, размер файла 17065 байт, дата создания 04.10.2013. Привожу описание скрипта дословно и полностью. Сетевую ссылку не даю, здесь это нарушение, но гуглится на раз.
"MannequinActivatorSCRIPT - скрипт взамен дефолтного скрипта манекена.
Автор: AleksTirex

Возможности:
1. Манекен рассчитан на 32 слота одежды, поэтому можно собрать совершенно любой комплект одежды, всё будет зависеть от совместимости самой одежды.
2. На манекен можно так же надевать оружие и стрелы.
3. Стрелы будут экипироваться только при экипированном луке.
4. Скрипт поддерживает работу с SKSE, при этом он полностью работоспособен и без него. При использовании SKSE одежда меняется без задержек, как это на дефолте. Так же с SKSE манекен может использовать парное оружие с соответствующей анимацией.
5. Манекен имеет разные анимации, и боевую стойку тоже. Анимация выбирается в случайном порядке автоматически. Есть кнопка для сманы анимации. В режиме с оружием кнопка работает как переключение боевой стойки и стойки "вольно".
6. В режиме сника (скрытности) при активации манекена будет возможность менять расу манекена на несколько дефолтных рас. Т.к. ESP не используется, то названия сообщения и кнопок будут от основного режима. При этом средняя кнопка - выбор расы, при нажатии на неё в верхнем левом углу появится сообщение о выбранной расе, и окно/сообщение закроется. При следующем нажатии - следующая раса, и т.д. Левая кнопка - активация выбранной расы. После смены расы все дефолтые манекены будут этой расы. В случае удаления этого скрипта, надо ОБЯЗАТЕЛЬНО поменять расу манекена на дефолтную, т.к. смена расы - процесс необратимый и игра сама расу не вернёт, иначе манекены так и останутся с этой расой (в этом случае при первой же перезагрузке игры у манекенов появится проблема с отображением головы, это дефолтный баг игры, а данный скрипт умеет с этим багом бороться)
7. Поддерживаются манекены из модов и со своими собственными расами.
8. Это манекен, а не сундук для хранения вещей и не просто актёр, поэтому не стоит требовать и ждать, что и без того достаточно глючная анимация Скайрима отрабатывала с исключительной точностью.

Установка простая - положить файл скрипта в папку Scripts. В архиве имеется исходник, но для работы самого скрипта в игре он не нужен.
Удаление: вернуть манекенам дефолтную расу, если её меняли, и удалить файл скрипта."

Вот с этим краксом-пексом, чтобы сделать фикс, ;) я сейчас и разбираюсь. Потому, как этот скрипт - хорошо работает везде, но только за пределами домов трёх поместий.

Добавлено (26 Июля 2020, 05:47)
---------------------------------------------
Чтобы наш разговор был предметным, привожу полный текст этого скрипта.


С уважением.
Маг Иридий.
Andrey059918  Offline  Сообщение №2945 написано: 26 июля 2020, 23:05 | Отредактировано: Andrey059918 - 27 июля 2020, 12:21



5
Здравствуйте, форумчане!
Возникла проблема с отладкой скрипта. Мне нужно, чтобы после создания ObjectReference в мире, его RefID (а-ля 4201B14D) отобразился на экране.
Следующая команда:

Код
Debug.Notification(myRef)
выводит мне такой текст: "[ObjectReference". Аналогично и с NPC: "[Actor". Как отобразить RefID предмета, также как в консоли при выборе?
Edit 1: Нашел причину, символ "<" перед самим RefID, но по прежнему не знаю решение.
Edit 2: MessageBox решил проблему, хотя это и дико неудобный способ

И вторая проблема, которую я как раз пытаюсь отладить.
Выброшенный и перемещенный командами
Код
myRef=DropItem(myItem,1)
myRef.SetAngle(...)
myRef.SetPosition(...)
и даже тополнительно
Код
myRef.Enable()

объект не виден в игре (пробовал на книгах и парагонах, скрипт размещен на NPC, которому я через GiftMenu передаю этот предмет). Может быть кто-то знает в чем дело?
Edit 2: Когда заменил подсчет нужных координат непосредственно в вызове функции на переменные, содержащие посчитанные перед вызовом координаты, всё стало нормально. До этого предмет оказывался за пределами досягаемой области локации (было видно, но долететь было нельзя, телепортировало обратно). В общем какой-то бред с этим Папирусом
Edit 3: Снова то же самое. Ошибка была вообще в чем-то другом, пересоздал скрипт и персонажа, на котором он висит. Теперь всё работает, хотя скопировал текст в точности с того скрипта

В общем, может кому-то поможет тоже

yakor77  Offline  Сообщение №2946 написано: 28 июля 2020, 00:08 | Отредактировано: yakor77 - 28 июля 2020, 01:00



28
Здравствуйте, Андрей!
Вы просите помочь: [quote=Andrey059918;1336689]Мне нужно, чтобы после создания ObjectReference в мире, его RefID (а-ля 4201B14D) отобразился на экране.[/quote]
Согласен, видеть ID сразу, без заморочек с inv и сундуками - было бы очень удобно.
В стиле "Капитана Очевидность", предлагаю простое, грубое, надежное, но... очень скучное и трудоёмкое решение.
Ручками, в редакторе Tes5Edit, для каждой позиции номенклатуры, прописываем ID, сразу после первого значимого слова названия этой позиции. Например: "Даэдрическая булава 000139b8".
Чтобы не было так скучно, можно, под Виндовз, написать простой макрос, цикл "Пока", который берет в редакторе ID, и добавляет его в номенклатуру, по всем строчкам базы данных, пока не закончатся все позиции в списке.
Почему в конец названия? Чтобы не нарушить алфавитный порядок сортировки в редакторе (я обычно юзаю расширенный UI редактор).
Да, файлы игры частично перестанут быть совместимыми, станут уникальными.
Но ведь Вы же играете - для себя? Зачем Вам эта "совместимость"?
Есть решение более изящное, но тоже трудоемкое. Изменить скрипт редактора UI. Добавить в него колонку с ID. Но это надо глубоко изучить скрит данного редактора, лично мне лениво и некогда это делать.

[b]Добавлено[/b] (28 Июля 2020, 03:39)
---------------------------------------------
Здравствуйте, коллега Майпризм!
Продолжаю рассказывать о решении проблемы, связанной с вылетами в поместьях, манекенами и дверьми.
Роясь в мусорном ящике Инета (в мусорном, ибо форумы - засраны срачами), наткнулся на коммент по данному скрипту, на который ранее - не обращал внимания. Он оказался очень любопытен.
Во-первых, не мне одному данный скрипт причинял вылеты.
А, во-вторых, автор коммента, возможно, эмпирически нащщупал причину вылетов.

Цитирую коммент дословно.
"Roiloor 25.11.2015 18:03
Очень не рекомендую этот скрипт, потому-что лично я очень пожелел, т.к. у меня данный скрипт вызывал стабильный вылет игры при входе в дом и даже город после покупки первого дома в Маркарте и Рифте и, видимо любого другого ванильного дома с манекенами (на НЕ ванильных проблемы не было), в конфигурации: лиц. Скайрим, последней версии, последний оф. апдейт, Неоф. патч, позапрошлая версия, вроде. Предыдущие версии SKSE и SkyUI. Довольно долго мучился ища причину, хорошо Интернет помог, ато никогда на него ни подумал бы. После удаления скрипта вылеты прекратились сразу-же, больше его не ставил, с новыми версиями примочек не тестил. Не знаю хотя, для кого я это пишу- стараюсь, может это только у меня так было? Ну может кому-то пригодится, если такие-же проблемы будут. Или, может Alex пофиксит что-то, хотя теперь уж навряд-ли."
И, далее,
"Roiloor 02.12.2015 16:32
Вообщем так... Потестил я тут на днях с дефолтным чистым конфигом и со своим, на: Skyrim ver. 1.9.32 лиц., последний офф. апдейт, SKSE 1.7.03, Не-офф. патч 2.1.3a. Вылетает он, видимо, только при первом входе в дом, после покупки ванильного дома с манекенами. Возможно это связано с ванильными скриптами, которые выполняются при первом входе в ванильные дома. Так-что, если у кого тоже вылетает так, сначала прикупите ванильный дом/дома, которые хотели, войдите в них, потыркайте там манекен, можете дать ему что-нибудь, сохранитесь, а потом уже ставьте скрипт. А если будете потом еще докупать ванильные дома, то удалите временно скрипт, перед покупкой. Можете, на всякий случай, забрать свои вещички со всех манекенов перед этим, если, вдруг, что пропадет, хотя, вроде, не должно, проверьте сразу.
Кстати, этот скрипт не позволяет менять пол манекена. ( Просто потому, что в игре нет женской модели манекена. Спасибо Беседке.. Блин, хочу манекены из белого мрамора, как античные статуи чтоб такие были, где есть такие а, подскажите кто-нить, ато уж больно в Скайриме манекены эти деревянные страшные, особенно рожи их."

Что из этого для меня следует?
1) Да, у меня этот скрипт уже стоял, когда я начал строить новые дома в поместьях. Сейчас они так обставлены и наполнены вручную, что крайне лениво начинать всё сначала.
2) И, да, проблема с ванильными манекенами в поместьях - реальна. Я сейчас перепробовал с десяток сторонних модов на манекены. Текстуры и меши они прописывают, но... деревянные тупые рожи ванильных манекенов, как и их мужской пол - как были, так и остаются.
Со сторонними модами - всё норм, там всё меняется.

Есть гипотеза. Что дверь - была только активатором. (Каким образом? Как только заканчивалась постройка вестибюля, он же малый дом, а заканчивалась она именно с установкой двери - сразу после этого активировались скрипты на ванильные манекены, как и всякое другое наполнение поместья через верстаки.) И что проблема была не в двери, как таковой, а в ванильных манекенах поместья. (Или, возможно, дверь обеспечивала вылеты независимо от проблемы с манекенами, сама по себе, как вторая причина, пока не знаю.)
Задача самому себе мною же изменена: найти, где именно ванильный скрипт на постройку поместий - жёстко прописывает ванильные манекены, и изменить его. Самое простое и грубое решение - удалить нафиг вообще установку всяких манекенов в поместья, из этого ванильного скрипта.
Тружусь... dash

С уважением.
Маг Иридий.
nepewka  Offline  Сообщение №2947 написано: 30 июля 2020, 18:03



255
День добрый, есть кто живой ?
Нужна помощь по адаптации мода https://www.nexusmods.com/skyrim/mods/60750
а конкретно скрипта в нём

готов кто помочь ? не за бесплатно

yakor77  Offline  Сообщение №2948 написано: 1 августа 2020, 10:45 | Отредактировано: yakor77 - 1 августа 2020, 10:46



28
Здравствуйте, Непевка!
Вы пишете, цитирую:
[quote=nepewka;1336721]День добрый, есть кто живой ?
Нужна помощь по адаптации мода https://www.nexusmods.com/skyrim/mods/60750
а конкретно скрипта в нём готов кто помочь ? не за бесплатно[/quote]
конец цитаты.
Посмотрел я по Вашей ссылке этот мод на Нексусе.
Мультимагический разрушительный мод, с использованием трёх вспомогательных шаров, для стрельбы заклинаниями.
Так в чём конкретно у Вас с ним проблема? Чего Вы хотите от скрипта?
Поподробнее, плиз.

С уважением.
Маг Иридий.
Multigone  Offline  Сообщение №2949 написано: 1 августа 2020, 18:00



832
nepewka, с вопросами платного создания модов добро пожаловать на Коммерческий форум.

Dsion  Offline  Сообщение №2950 написано: 1 августа 2020, 20:21



Вот мне интересно, чо будет, если непешка реально во всех подробностях расскажет якорю, чего хочет от мода. Якор-то ничего сделать не может. Либо притворится, что ушел, либо задвинет длинную бесполезную философскую речь, в которой между любой парой строк будет видно, что он нифига не шарит в вопросе.

myav  Offline  Сообщение №2951 написано: 4 августа 2020, 11:03 | Отредактировано: myav - 4 августа 2020, 11:28



30
Всем хай. Смотрю, у вас тут как всегда))) философские толкания мыслей от якоря)

Ладно, я не из-за этого сюда зашел.

В общем, 4 месяца я делал огромный ИИ мод под стелларис, всё сделал, всё работает, выложил. И для себя пришел к выводу, что менять ИИ в скайриме это самый сложный моддинг :-Р а всё остальное - в разы проще (так как - там всё просто и работает. А тут - не хочет работать и всё).

Я столкнулся с очередной "непонятной" проблемой. Может кому-то будет не лень догадаться и помочь.

В общем, у меня есть функция которая проверяет имя НПС. А потом вторая функция берет базу НПС + имя и меняет имя, если баба)

И я столкнулся с проблемой...

Если призвать НПС через консоль player.placeatme  (код НПС)

То всё работает, игра распознает что бандит, распознает что баба и меняет имя на женское. Например: меняет бандит на бандитка.

Но если я встречаю этого же бандита в игре - игра распознает что это бандит, распознает имя, но НЕ распознает секс (баба или мужик).

Может кто-то сталкивался с этим ?

OneffectStart
....
CheckWho()
....

Код
Function CheckWho ()
    ActorBase UCM_TempBase = selfactor.GetActorBase()
    string TempName=selfactor.GetDisplayName()
    int MySex = UCM_TempBase.GetSex()
        if(selfactor.IsInFaction(BanditFaction))
        CheckName()    
        debug.notification("checkname launched")

            if (FinalName=="-63z-32z-19z-28z-24z-14z0z0z0z0z0z0")
                debug.notification("bandit detected, now check sex")
                if MySex == 1
                     debug.notification("sex female detected and name changed")
                    TempName="Бандитка"
                else
                    debug.notification("sex female NOT detected")
                endif

Если я призываю через консоль то всё всегда работает и получаю сообщения:

checkname launched
bandit detected, now check sex
sex female detected and name changed

Но если я встречаю этих же бандитов где угодно в мире, я получаю сообщения:

checkname launched
bandit detected, now check sex
sex female NOT detected

Они что.. БЕЗПОЛЫЕ ? :-Р

Или я не учел какой-то прикол ? Помогите кто знает, что не так с актор.базой в мире, и почему всё работает через консоль.

Отдельное сообщение якорю: НИ СЛОВА плз.

Myprism  Offline  Сообщение №2952 написано: 4 августа 2020, 15:55


Физик


myav, секс персонажа может не соответствовать базовому актёру. В игре часто (и особенно у бандитов) базовый актёр является мужиком, который служит заготовкой для ряда левельных актёров, часть их которых становятся женщинами. Твой код проверяет пол базового актёра и он, естественно, оказывается мужиком.

Dsion  Offline  Сообщение №2953 написано: 5 августа 2020, 08:08 | Отредактировано: Dsion - 5 августа 2020, 08:58



А с GetLeveledActorBase() не работает? Не могу проверить, но шансы хорошие.

Ezalor  Offline  Сообщение №2954 написано: 5 августа 2020, 16:07



5
Доброго дня. Подскажите пожалуйста, усли у меня есть стадия квеста, которую можно получить в любой момент, подобрав определенный предмет, как должен выглядеть скрипт, который выяснит текущую задачу и закроет именно ее? Спамить десять строк objectivecomplete не хочется, но кроме того, что в скрипте должна быть функция getstage больше ничего в голову не приходит.

Multigone  Offline  Сообщение №2955 написано: 5 августа 2020, 21:43



832
Ezalor, ну, если при перемещении предмета в инвентарь игрока текущая задача квеста должна быть завершена, и при условии, что CompleteAllObjectives() завершает только отображенные сейчас задачи (эт я не знаю), то вот:

Код
Scriptname _TESTTEST61 Extends ObjectReference ; На базовую форму или референс предмета.

Quest Property MyQuest Auto ; Заполнить своим квестом.

EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
    IF akNewContainer == Game.GetPlayer()
        GoToState("Stopped")
            ; Для базовой формы перевод в пустое состояние, предотвращающее повторные срабатывания события, может не работать.
        MyQuest.CompleteAllObjectives()
    ENDIF
ENDEVENT

STATE Stopped
    EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
    ENDEVENT
ENDSTATE

Вариант, если это квестовый предмет и он принадлежит этому же квесту:
Код
Scriptname _TESTTEST61 Extends ReferenceAlias ; На алиас предмета.

EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
    IF akNewContainer == Game.GetPlayer()
        GoToState("Stopped")
        GetOwningQuest().CompleteAllObjectives()
    ENDIF
ENDEVENT

STATE Stopped
    EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
    ENDEVENT
ENDSTATE

myav  Offline  Сообщение №2956 написано: 5 августа 2020, 21:47



30
Myprism, Dsion спс что направили мой взор в нужную сторону. Я про эти leveled списки вообще забыл. GetLeveledActorBase() - сегодня тестил - работает, правда иногда попадаются бандиты которых даже такое не берет и мои дебуг сообщения не могут определить кого встретили (может еще один lvl-список внутри списка).

Ezalor, а создать переменную temp и автоматом её менять после каждой выполненной задачи? И чтобы выяснить стадию, просто чекнуть temp.

Ezalor  Offline  Сообщение №2957 написано: 6 августа 2020, 00:30 | Отредактировано: Ezalor - 6 августа 2020, 00:38



5
Multigone, честно говоря, вариант для новичка страшный и непонятный, к тому же я нашел уже более простой, но все равно большое спасибо)
И к слову об остановке события, для меня это как раз стало актуально. Если мне нужно чтобы скрипт на контейнере сработал только один раз, хотя сам контейнер можно открывать на разных стадиях (скрипт активирует 10 разных стадий в зависимости от текущей), его можно заморозить после срабатывания через state stopped? Или я не так понимаю принцип работы функции?

yakor77  Offline  Сообщение №2958 написано: 6 августа 2020, 08:44



28
Майпризм, с благополучным возвращением с гор!
А я тут трудился над манекенами. Проверил очередное "самое простое и грубое решение". Слил, в Тес5Едит, все три поместья, точнее, их моды- модификаторы (стены, двор, подвалы, охрана, манекены, и пр.) - в единый файл. Все ID при этом поменялись (естественно, кроме ванильных). Скайрим стал воспринимать поместья, как единый сторонний мод, типа подвала. Ну а в стороннем моде - модификация манекенов всегда проходила успешно. Ну, и сейчас прошла. Ванильных деревянных рож у манекенов - больше нет, стоят нормальные голые мужики. Не вылетает. Всё хорошо. (Но пришлось после этого поработать ручками, перенастроить внутреннее убранство, позаполнять сундуки барахлом, поодевать манекены и слуг, и пр. рутиннная работа.)

С уважением.
Маг Иридий.
Multigone  Offline  Сообщение №2959 написано: 6 августа 2020, 08:49 | Отредактировано: Multigone - 6 августа 2020, 09:03



832
Ezalor, STATE дает возможность создавать несколько версий событий или функций. В одном скрипте может быть множество STATE с произвольными именами. GoToState() переводит скрипт в указанное. По умолчанию любой скрипт стартует в пустом STATE (объявлять это состояние не нужно, перевод в него осуществляется так: GoToState(""), события и функции в пустом состоянии являются основными и работают всегда, если в текущем-не-пустом состоянии нет их версий). Чтобы исключить к.-л. событие из работы, нужно в текущем-не-пустом состоянии указать такое же событие, в котором ничего нет).
Без команды скрипт состояние не меняет. Состояние записывается в сохранении.

Пример:
Код
; Пустое состояние по умолчанию.

EVENT MyEvent_1()
    ; Код 1.
ENDEVENT

EVENT MyEvent_2()
    ; Код 2.
ENDEVENT

FUNCTION MyFun_1()
    ; Код 3.
ENDFUNCTION

FUNCTION MyFun_2()
    ; Код 4.
ENDFUNCTION

; В этом состоянии будут работать MyEvent_2 (Код 2), MyFun_1 (Код 3), MyFun_2 (Код 4), MyEvent_1 (Код 10)
STATE MyState_1
    EVENT MyEvent_1()
        ; Код 10.
    ENDEVENT
ENDSTATE

; В этом состоянии будут работать MyEvent_2 (Код 2), MyFun_2 (Код 4), MyEvent_1 (пусто), MyFun_1 (пусто)
STATE MyState_2
    EVENT MyEvent_1()
    ENDEVENT

    FUNCTION MyFun_1()
    ENDFUNCTION
ENDSTATE

; В этом состоянии будут работать MyEvent_1 (Код 1), MyEvent_2 (Код 2), MyEvent_3 (Код 5), MyFun_1 (Код 3), MyFun_2 (Код 4)
STATE MyState_3
    EVENT MyEvent_3()
        ; Код 5.
    ENDEVENT
ENDSTATE

; В этом состоянии будет работать все из пустого, при входе в это состояние сработает код 6, при выходе из него сработает код 7.
STATE MyState_4
    EVENT OnBeginState()
        ; Код 6.
    ENDEVENT

    EVENT OnEndState()
        ; Код 7.
    ENDEVENT
ENDSTATE

; Auto переводит скрипт в это состояние при старте скрипта.
STATE MyState_5 Auto
ENDSTATE

Событие OnUpdate() имеет баг, поэтому его можно использовать только в пустом состоянии. Если его надо использовать в нескольких состояниях, делать так:

Код
EVENT OnUpdate()
    MyFun_3()
ENDEVENT

FUNCTION MyFun_3()
    ; Код 100.
ENDFUNCTION

STATE MyState_101
    FUNCTION MyFun_3()
        ; Код 101.
    ENDFUNCTION
ENDSTATE

STATE MyState_102
    FUNCTION MyFun_3()
        ; Код 102.
    ENDFUNCTION
ENDSTATE
Функции, объявляемые в скрипте, прежде всего должны иметь версию в пустом состоянии, и опционально - в других, но не наоборот.

Ссылка.

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

Код
Int iSwitch = 0

EVENT OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
    IF iSwitch == 0
        iSwitch = 1
        ; Код 1
    ELSEIF iSwitch == 1
        iSwitch = 2
        ; Код 2
    ELSEIF iSwitch == 2
        iSwitch = 3
        ; Код 3
    ELSE
        iSwitch = 0
        ; Код 4
    ENDIF
ENDEVENT

myav  Offline  Сообщение №2960 написано: 6 августа 2020, 11:18 | Отредактировано: myav - 6 августа 2020, 11:33



30
Закончил с бандитами... Перешел к волкам, и снова проблема.

Я реализовал, что каждый волк во время effect start кастует на себя спел с радиусом поражения (чтобы задело всех остальных волков рядом), чтобы определить сам волк или не сам

Код
Event OnEffectStart (...)
UCM_Wolf_Pack_Spell.Cast(selfactor as objectreference, selfactor as objectreference)
debug.notification("Pack Casted")
....

Event OnHit (ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)    

    if (akSource As Spell)
        debug.notification("ONHIT spell detected")
        if !(akSource As Spell).IsHostile()
            if (akSource As Spell).GetNthEffectMagicEffect(0) == UCM_Wolf_Pack
                debug.notification("ONHIT pack detected")
....


и не проходит хит даже не появляется надпись ONHIT spell detected... 2 волка 3 волка.. сколько бы их не было. Друг друга не задевают спелом, чтобы прошел OnHit. Хоть радиус поражения 15 метров.

Пишет дебуг сообщение что спел кастонут, но что хит прилетел - не пишет.

Скриншот спела:

https://prnt.sc/tv1bdi

Я пробовал менять stagger архетип на другие варианты (включая скрипт), пробовал ставить галочку не recovery, пробовал добавить magnitude. Но OnHit не регистрирует даже сам по себе (в spell.cast я же указал как цель selfactor as objectreference)

Onhit aksource as spell не проходит, хоть убей...

Опять я что-то упускаю... Если кто-то заметит что именно - хелп плз. Что нужно поменять чтобы onhit зарегистрировался по всем волками, без нанесения урона (если с уроном то всё просто, я бы просто скопировал любой эффект FFAimedArea).

Ezalor  Offline  Сообщение №2961 написано: 6 августа 2020, 15:36 | Отредактировано: Multigone - 10 августа 2020, 14:28



5
Теперь новая проблема. Тот самый скрипт на зачет целей по текущей стадии:
Код
int MyQuestStage1 = MyQuest.GetStage()
if MyQuest.GetStage() != 17 && MyQuest.GetStage() != 26 && MyQuest.GetStage() != 37
    MyQuest.SetObjectiveCompleted(MyQuestStage1)
elseif MyQuest.GetStage() == 17
    MyQuest.SetObjectiveCompleted(15)
elseif MyQuest.GetStage() == 26
    MyQuest.SetObjectiveCompleted(25)
elseif MyQuest.GetStage() == 37
    MyQuest.SetObjectiveCompleted(45)
endif

Но он не работает. Вообще. Что он есть, что его нет. В чем причина? То есть он компилируется, но в игре эффекта нет.

Multigone  Offline  Сообщение №2962 написано: 6 августа 2020, 15:54



832
Ezalor, добавь Debug.MessageBox("Текст") в нужные строки и посмотри результат.

myav,

1) Area < 15 в игре не работает.

2) Эффект Self с действием по площади работает только для других целей, но не для источника. Если нужно и для источника, в заклинании должно быть 2 эффекта: Self - Area и Self без Area.

3) Area в СК не всегда включается с первого раза (т.е. все вроде как сделано, но в игре нет). Попробуй так: после того, как эффект настроен и добавлен в заклинание, сними флаг AutoCalculate, сохрани, поставь, сохрани.

myav  Offline  Сообщение №2963 написано: 6 августа 2020, 16:43



30
Multigone, так у меня же Area не <15 а =15 ))

и цель заклинания (delivery) не "self" а "on target". Или ты про что-то другое говоришь ?

ну ладно, area я сегодня подниму до 20 и еще раз проверю, а вот про self я не понял про что разговор.

Ezalor  Offline  Сообщение №2964 написано: 6 августа 2020, 16:59



5
Multigone, бокс появился, цель не зачлась. То есть скрипт срабатывает, да, но свою цель не выполняет.

Multigone  Offline  Сообщение №2965 написано: 6 августа 2020, 18:01



832
Ezalor, у тебя лишняя логика, плюс мб перед завершением задачи нужно ее показать:

Код
Debug.MessageBox(MyQuest)

int MyQuestStage1 = MyQuest.GetStage()
Debug.MessageBox(MyQuestStage1)

if MyQuest.GetStage() == 17
    MyQuest.SetObjectiveDisplayed(15)
    MyQuest.SetObjectiveCompleted(15)
elseif MyQuest.GetStage() == 26
    MyQuest.SetObjectiveDisplayed(25)
    MyQuest.SetObjectiveCompleted(25)
elseif MyQuest.GetStage() == 37
    MyQuest.SetObjectiveDisplayed(45)
    MyQuest.SetObjectiveCompleted(45)
else
    MyQuest.SetObjectiveDisplayed(MyQuestStage1)
    MyQuest.SetObjectiveCompleted(MyQuestStage1)
endif

myav,
Цитата myav

и цель заклинания (delivery) не "self" а "on target". Или ты про что-то другое говоришь ?

Там в русифицированной версии есть несколько "на цель", тогда как в англ. все четко и понятно. К тому же ты пишешь "кастует на себя спел". Ну ладно, неважно, в любом случае, п.2) относится не только к Self, а вообще к любому типу доставки, включая Target Actor (я прост подзабыл, ща проверил). Переделывай. Не забудь про п.3).

nepewka  Offline  Сообщение №2966 написано: 25 августа 2020, 12:32



255
Здравствуйте. Существует ли скриптовая команда, с помощью которой можно проверить количество одних и тех маг. эффектов на цели ?
К примеру скастовал на цель 3 заклинания с мгновенным уроном и каким-то уроном на 5 сек например. Все эти 5 сек на цели будут висеть 3 одинаковых маг эффекта.
Как скриптом сделать проверку на них в количестве 3 ?

Multigone  Offline  Сообщение №2967 написано: 25 августа 2020, 12:59 | Отредактировано: Multigone - 27 августа 2020, 11:37



832
nepewka, если это неизвестные эффекты, то никак. Если это твой эффект, при старте даешь актеру неигровой предмет, при финише удаляешь его. Кол-во предметов у актера в опред. момент времени равно кол-ву навешенных на него эффектов. Если несколько актеров в один промежуток времени не проверяются, вместо предмета использовать переменную.

nepewka  Offline  Сообщение №2968 написано: 27 августа 2020, 16:33



255
Спасибо
А если идти от обратного, я могу же использовать способ с предметами и на уникальных актёрах ?
Вообщем выдал я в скрипте маг.эффекта тагрету предметы, какой командой сделать проверку на количество этих N предметов?

Multigone  Offline  Сообщение №2969 написано: 27 августа 2020, 18:56



832
nepewka,


Код
; Returns how many of the specified item is in this object reference's inventory
int Function GetItemCount(Form akItem) native

VictorCorvin  Offline  Сообщение №2970 написано: 1 октября 2020, 15:17



8
Добрый день, уважаемы мастера, помогите пожалуйста с такой проблемой. Хочу сделать так чтобы при испитии зелья у моего ГГ менялся цвет глаз и добавилось несколько пассивных эффектов. Можете подсказать как это сделать?

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





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