Я создал ActorValue и хочу менять его через скрипты внутри квеста во время диалогов с НПС.
Если я создам скрипт внутри конкретной фразы НПС с объявлением этого ActorValue в Properties, то функция SetValue корректно работает как надо (пример скрипта akSpeaker.SetValue( SAR_Dial_Type_1, 120 ) ), но я с ума сойду заниматься объявлением в каждой отдельной фразе.
Хочу сделать функцию в общем для квеста скрипте с модификацией ActorValue в ней, а ее уже вызывать в нужных фразах НПС через код фразы kmyQuest.SetDialType1( akSpeaker, 120 ). Естественно для kmyQuest. я указываю скрипт квеста.
Сама функция внутри скрипта квеста выглядит так:
ActorValue Property SAR_Dial_Type_1 Auto
Function SetDialType1( Actor akSpeaker, int count)
akSpeaker.SetValue(SAR_Dial_Type_1, count)
EndFunction
И в таком виде она не срабатывает. Подозреваю, что нужно что-то добавить, но не могу понять что. Сделать ActorValue с параметром Hardcoded игра не позволяет.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №94
написано: 26 июля 2024, 19:27
| Отредактировано: Multigone - 26 июля 2024, 20:00
ImKabachok, что именно не срабатывает? Папирус не компилирует? Компилирует, но ничего не происходит? Property SAR_Dial_Type_1 в квесте точно заполнено? Тестовое сообщение, добавленное в эту функцию, показывается?
Попробуй так:
GetOwningQuest().SetDialType1(akSpeaker, 120)
(GetOwningQuest() as InsertMyCustomQuestScriptNameHere).SetDialType1(akSpeaker, 120)
Изменение репутации для пользователя ImKabachok
ImKabachokOffline
Сообщение №95
написано: 28 июля 2024, 04:30
| Отредактировано: ImKabachok - 28 июля 2024, 04:47
ImKabachok, что именно не срабатывает? Папирус не компилирует? Компилирует, но ничего не происходит? Property SAR_Dial_Type_1 в квесте точно заполнено? Тестовое сообщение, добавленное в эту функцию, показывается?
Попробуй так:
GetOwningQuest().SetDialType1(akSpeaker, 120)
(GetOwningQuest() as InsertMyCustomQuestScriptNameHere).SetDialType1(akSpeaker, 120)
Папирус компилирует, property заполнено, тестовое сообщение через debug.notification внутри функции срабатывает.
Добавил к квесту новый скрипт, его функции вообще не срабатывают, даже debug.notification, хотя код такой же и в kmyQuest ссылка на новый скрипт.
Тогда сделал новый тестовый мод, в котором прописал тот же самый код, и он работает!
Видимо, проблема конкретно в моей версии Creation Kit. Из-за внутренней ошибки в крупном моде могут не срабатывать некоторые функции, если их с самого начала не использовать.
Спасибо за оперативный ответ, твоя конструкция работает и мне еще пригодится в будущем, но эту проблему не решила в силу ее природы. Мне просто нужно менять редактор на версию посвежее, а пока пойду нудным путем, чтобы все не переделывать.
П.С. это точно проблема моего редактора, я раньше замечал подобное, когда у меня также не срабатывал скрипт на добавление предметов ammo конкретному akSpeaker также через общий для квеста скрипт. Когда начал мод заново, то проблема испарилась.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №96
написано: 28 июля 2024, 08:20
| Отредактировано: Multigone - 28 июля 2024, 08:21
ImKabachok, в Скайриме, если скриптом попытаться выдать два Notification с одним и тем же текстом (либо после расчета аргументов Notification окажется, что тексты одинаковы), то будет показано только одно. Если мне не изменяет память. Я даже запилил функцию в свой набор утилит:
String FUNCTION sEve(Int N = 3) Global ; Набор из N цифр для одинаковых одновременных уведомлений: Notification("N" + sEve() + ": Сообщение уникально c шансом 99,9%."). IF N > 0 String S WHILE N S += Utility.RandomInt(0, 9) N -= 1 ENDWHILE RETURN S ENDIF ENDFUNCTION
... правда, ни разу ей не воспользовался. Думаю, в Ф4 эта особенность осталась. Так что не факт, что последнее уведомление не отправляется.
Попробуй заменить akSpeaker.GetName() на akSpeaker != none, может, там и нет никакого говорящего.
ImKabachok, эм, тестировать аргументы надо в функции скрипта квеста; к akSpeaker != none надо кастовать стринг (akSpeaker != none) as string (это я упустил) (вроде как все базовые типы переменных автоматически переводятся из одного типа в другой, но лучше указывать явно); а вообще, все должно работать, не понимаю, почему у тебя не работает. Только пользоваться не kmyQuest, а GetOwningQuest (kmyQuest вроде как для стадий квеста, по крайней мере, об этом говорится на вики Ская, про Ф4 не в курсе, может, там для любых составляющих квеста).
Ванильные квесты Ская в большинстве случаев для вызова не глобальных функций из диалогов используют GetOwningQuest. Этим можно пользоваться, чтобы, например, по цепочке запустить функцию из вообще стороннего квеста или референса любой другой формы, не заполняя ее Property в каждом диалоге.
Multigone, так я и говорю, что у меня замечены были проблемы в редакторе. В свое время долго в ступоре был, когда некоторые функции не срабатывали. При этом эти же функции срабатывают, если новый мод создать. В общем, я просто поставил версию поновее, надеюсь, больше подобного не будет, а чтобы уже существующий мод не переделывать, обойдусь костылями.
не утверждаю что точно помню. НО вроде бы как это работало на какой то ранней врсии игры. я создавал esm файл и там контейнер. если у меня скачан какой то esp мод с оружием\шмоткой я просто открывал нужный esp с моим esm, и в мой контейнер закидывал нужные вещи.
и так с кучей модов.
решил недавно обновить фоллыч. на аниверсари не стал сразу замахиваться, поставил 1.10.163.0 (pre-NG)
и вот там косяк. в моем контейнере в моем esm файле отображаются только вещи из последнего связанного с ним esp мода.
отчасти из за этого забил на 1.10.163.0 (pre-NG) и поставил уже аниверсари 1.11.191
внимание вопрос! а как правильно то сделать? учитывая что все методы слияния двух и больше esp убивают что нибудь в модах с вероятностью 99%
то есть мне надо иметь базовый контейнер, который будет с легко запоминающимся моим именем, и при добавлении нового esp мода складывать оттуда в мой контейнер нужное мне из этого мода.
чтобы в игре мне было доступно всё что я положил в контейнер, а не только из последнего в списке мода.
не понравилась идея создавать объединяющий esp и ставить его последним. по причинам: 1.если я какой то мод выкину, то его фиг выпишешь из объединяющего esp и будет там мусор копиться 2.объединяющий esp это плюс один esp к списку, который всегда вконец списка двигать надо, следить, не потерять. уж лучше один базовый esm(он лежит себе и лежит, всегда подключен, всегда есть, не требует изменений)
я на всех форумах по обливиону под ником 7755 или vzik
Форум » Fallout 4 » Мастерская » Вопросы по моддингу Fallout 4 (Задаем свои вопросы по редактированию игры)