Проверка, влияет ли Мод на Объект

 Fallout New Vegas  G.E.C.K. глазами разработчиков  RJ 2145 0

Многие плагины (моды) затрагивают Объекты, которые существуют в оригинальном Мастер-файле, так же как и создают свои, новые Объекты. Так как редактирование существующих объектов является абсолютно естественным, возможность, что такое редактирование будет отвергнуто в процессе загрузки мода должна приниматься во внимание.

Если два мода редактируют один и тот же Объект, только одна версия этого объекта будет использована в игре. "Победит" то редактирование, мод которого загружается последним - это зависит от пользователя, и его отношения к автору мода. Основываясь на этом, авторы модов должны принимать во внимание тот факт, что одно или несколько их изменений может быть "перезаписано" другим модом!

Один из способов проверить "перезаписывается" ли Объект другим модом, это создать постоянную ссылку "IsAffectedRef" и присоединить ей скрипт, который будет проверять состояние переменной "rIsAffected":

ScriptName GenericIsAffectedSCRIPT

short rIsAffected

BEGIN OnLoad

Set rIsAffected To IsAffectedRef

END

Если к Объекту присоединен скрипт с блоком OnLoad, как показано выше, есть возможность проверить "перезаписывается" ли этот объект. Чтобы сделать это вам нужно создать пустую ячейку (просто скопировать одну из ячеек Dummy в Fallout3.esm) и поместить в нее объект, который вы редактировали.

Теперь, установите объект как постоянную ссылку (Persistent Reference) и дайте этом объекту свой ObjectRefID. Когда вы захотите проверить "перезаписывается" или нет этот Объект, используйте скрипт, похожий на следующий:

ScriptName GetIsAffectedSCRIPT

short sDoOnce
ref rIsAffected

BEGIN BlockName ; имеется ввиду "имя блока", например GameMode


If sDoOnce == 0
Set sDoOnce To 1
ObjectRefID.MoveTo Player
ObjectRefID.SetScale 0 ; эффективно убирает объект из "поля зрения"
; без предотвращения выполнения блока OnLoad
else
Set rIsAffected To ObjectRefID.rIsAffected
if rIsAffected.GetIsReference IsAffectedRef
; Объект не был "перезаписан"
else
; Объект был "перезаписан"
endif

END

Если вы хотите провести проверку "перезаписи" объекта Модов в условии (например, для кнопки в сообщении), тогда вам нужно проделать небольшую работу. Так как такого рода условия не могут выполнить проверку переменной на соответствие с ссылкой, вам нужно сделать что-то типа переменной "sObjectIsAffected", объявленной в скрипте квеста и в результате получить скрипт, похожий на следующий:

Set sQuestName.sObjectIsAffected To (ObjectRefID.rIsAffected == IsAffectedRef)

Теперь в условии вы можете проверить является ли "sQuestName.sObjectIsAffected == 1".

Смотрите также

Запуск блока OnLoad на объектах, выключенных функцией Disable

Мне нравится    10