1) изменить названия состояний UnLock на Close и LockOn на Open;
2) в функции RegisterForSingleUpdateGameTimeAt регистрация должна происходить с немного увеличенным временем, т.е. не (GameTime - CurrentTime), а (GameTime - CurrentTime + 0.01);
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1113
| Тема: Вопросы по скриптам Papyrus
написано: 24 июня 2024, 06:52
| Отредактировано: Multigone - 24 июня 2024, 07:00
Stea1ch, моды в СК обычно создаются, возможно, с последующими изменениями в TESVEdit. Если скрипты в .bsa, то при пересохранении .esp в СК может произойти потеря связей между ними (? уточнить). Восклицательные знаки случаются, когда СК не может получить данные моделей (они отсутствуют по указанным в формах путям). Слайдеры настройки внешности актера могут не использоваться игрой, а служить для экспорта меша и оттенка головы в папки FaceGen (Ctr+F4 на форме актера). Меш может быть отредактирован далее, ему назначены опред. текстуры и прочее.
Я не разбирался с татуировками. Нужно знать, каким образом они размещаются на актере, и что отвечает за это. Проще всего раскурочить какой-нибудь мод, где в заявленных возможностях есть изменение татуировок на актерах, например, напарниках.
Скриптами можно управлять HeadPart (Actor, ActorBase), TextureSet (ActorBase, только для игрока (?)), Skin (ActorBase, Race), ColorForm (цвет пресетов доп. слоев текстур актера, используемых в Race). Если я правильно понял, моделью головы из папки FaceGenData используется одна текстура для всех отметок (татуировки, макияж, грязь и т.д.). Думаю, здесь ничего нельзя сделать, т.е. чтобы произвольному актеру без подготовки заменить одну из его отметок. С подготовкой актера и соотв. форм: можно заменить ему Skin, или HeadPart (голову).
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1115
| Тема: Вопросы по скриптам Papyrus
написано: 26 июня 2024, 16:45
| Отредактировано: Multigone - 26 июня 2024, 17:04
Я имею в виду, что все ванильные актеры имеют данные о внешности в виде модели головы, находящейся в Meshes...FaceGenData, и одной (?) текстуры оттенка кожи / татуировок / макияжа / грязи, находящейся в Textures...FaceGenData. Эта текстура получается путем смешивания желаемых слоев при создании / экспорте данных актера. Путь к текстуре указан внутри модели, поэтому, чтобы изменить текстуру, функция скрипта должна уметь оперировать с самой моделью. Насколько я знаю, таких функций в LE нет. Игра позволяет назначать другие наборы текстур (TextureSet) для форм, имеющих World Model, но неясно, можно ли это сделать для актеров или их HeadParts (не в курсе, нужны тесты). За это отвечают функции GetWorldModelNumTextureSets, GetWorldModelNthTextureSet, SetWorldModelNthTextureSet. Для ActorBase есть функция Get/SetFaceTextureSet, но неясно, можно ли использовать ее для кого-либо, кроме игрока.
Типичные ситуации применения:
Form Property xF Auto ; какая-то форма, например, актер (?), Armor (skin) или HeadPart TextureSet Property xS Auto Function MyFun() Int iN = xF.GetWorldModelNumTextureSets() ; число элементов у модели, которые могут иметь TextureSet (?) If iN >= 3 and xF.GetWorldModelNthTextureSet(2) != none ; порядок номеров элементов начинается с 0; например, проверяем, что число элементов не меньше 3, и что значение третьего элемента не пусто xF.SetWorldModelNthTextureSet(xS, 2) ; даем третьему элементу модели новое значение xS If xF as Actor and (xF as Actor).IsOnMount() == false ; например, проверяем, является ли форма актером, и не находится ли он верхом (xF as Actor).QueueNiNodeUpdate() ; обновляем модель ; DO NOT USE WHILE MOUNTED
Actor Property xA Auto Function MyFun() ((Game.GetPlayer().GetBaseObject()) as ActorBase).SetFaceTextureSet(xS) ((xA.GetBaseObject()) as ActorBase).SetFaceTextureSet(xS) ; обновляем модели, убедившись, что актеры не верхом, в противном случае ждем, пока они спешатся, либо спешиваем их принудительно
Далее, сохранение не запоминает эти изменения, поэтому их нужно производить при каждой загрузке актера (?).
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1116
| Тема: Вопросы по скриптам Papyrus
написано: 30 июня 2024, 15:28
| Отредактировано: Multigone - 30 июня 2024, 15:52
Stea1ch, объекты для вкл. и откл. определяются референс-алиасами - что в них хранится, тем скрипт и оперирует. Вместо алиасов, можно указать, к примеру, конкретные референсы. Также можно находить референсы вокруг игрока по определенным признакам, но это довольно ресурсоемкая функция.
Stea1ch, это скрипт для управления составляющими формы с типом TextureSet. Функции позволяют узнать число слоев, используемых тем или иным TextureSet, и назначить слоям пути к другим текстурам. Изменения будут затрагивать всех пользователей этого TextureSet, и не запоминаются между игровыми сессиями. Слэши из путей либо такие же, как в винде, либо обратные (? уточнить). TextureSet'ы используются в том числе для HeadPart и Skin, и назначение TextureSet другой текстуры, по сути, почти эквивалентно замене HeadPart или Skin (таких же, но с другими текстурами).
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1118
| Тема: Вопросы по скриптам Papyrus
написано: 3 июля 2024, 18:46
| Отредактировано: Multigone - 3 июля 2024, 18:53
Stea1ch, SetNthTexturePath(Int n, String texturePath), как и любая другая функция, примет аргументы только тех типов и в том порядке, в каком виде она объявлена в соответствующем исходнике скрипта .psc, иначе пользовательский скрипт не скомпилируется с ошибкой. Для конкретно этой функции первым аргументом должен быть int (целое число), вторым string (текст). Текстовая перем. берется в кавычки и может быть пустой, типа так:
""
Значение none может быть присвоено скриптовым переменным, оперирующим формами СК.
ImKabachok, что именно не срабатывает? Папирус не компилирует? Компилирует, но ничего не происходит? Property SAR_Dial_Type_1 в квесте точно заполнено? Тестовое сообщение, добавленное в эту функцию, показывается?
Попробуй так:
GetOwningQuest().SetDialType1(akSpeaker, 120)
(GetOwningQuest() as InsertMyCustomQuestScriptNameHere).SetDialType1(akSpeaker, 120)
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1121
| Тема: Вопросы по моддингу Fallout 4
написано: 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
MultigoneOffline
Сообщение №1124
| Тема: Вопросы по скриптам Papyrus
написано: 4 августа 2024, 07:13
| Отредактировано: Multigone - 4 августа 2024, 07:13
1) Бросить заклинание FF-Aim от Х-маркера вертикально вниз. Маркер должен находиться чуть ниже, чем летающая штуковина, чтобы снаряд не попал в ее хитбокс. У снаряда взрыв, у взрыва Placed Object, у которого скрипт, передающий собственные коорд. в основной скрипт, управляющий этим. Спавн-удаление всех этих объектов скриптами. Сложна. Зато можно узнать коорд. любого препятствия, ведь снаряды можно пулять в любом направлении.
2) Бросить Hazard с флагом Drop to ground, затем проверить его коорд. (сразу или, возможно, спустя краткое время).
3) Спавнить / передвинуть актера и узнать его коорд. Актер может быть крошечным и невидимым. Не обязательно, что он появится в указанной ему точке, возможно смещение на несколько или даже много метров, поэтому точность способа приблизительная. Зато есть и свои плюшки (проверка особых для маг. эффектов условий, которые нельзя узнать скриптом, напр., находится ли актер в воде).
Это немного не так работает. Опрос здесь вряд ли может показать действительное число людей, потенциально заинтересованных в подобном моде. А показать может число скачиваний за определенный промежуток времени - например, полгода-год. Поэтому, моим советом было бы выложить мод, не забыв про его описание. Несколько доп. часов, потраченных на разработку / релиз / полировку мода - это, как бы, в пределах очень маленькой погрешности (конечно, зависит от сложности мода, начальных знаний и т.д.).