MSFD Проверка активации объектов и предметов
Обычно предмет активируется, когда вы нажимаете кнопку (включить), чтобы “использовать” его.
У большинства предметов есть стандартные действия, которые происходят при их активации: двери открываются, сундуки показывают свое содержимое, актеры начинают диалог и т.д. Функция OnActivate позволяет перехватить вызов стандартного действия и сделать что-то другое или в начале проверить условия:
OnActivate
If ( OnActivate == 1 )
Принимает значение 1 в том кадре, когда объект активирован.
OnActivate сбрасывается, после вызова, так что только один скрипт может его обработать.
Также используйте только один вызов OnActivate в скрипте.
Чтобы выполнить стандартное действие над объектом при вызове OnActivate, вы должны использовать команду активации:
Activate
activate (если скрипт на активированном объекте)
Activate может использоваться как инициатор стандартного действия после вызова OnActivate.
Стандартные действия, вызываемые Activate:
Двери -> Открыть (Возможно, не работает с оригинальным Мором, в версии 1.6.1820 работает).
Загружающие двери -> Ничего (сломана?Очевидно, под загружаемыми дверьм понимается двери которые телепортируют игрока в другую ячейку. Если это так, то могу авторитетно заявить, что телепортация осуществляется. (Прим. Gwathlobal))
Контейнеры -> Открыть (показать содержимое)
Книги/свитки -> Показывает текст для чтения*.
Активаторы -> Ничего
Актеры -> Диалог
Оружие -> Подбор
Броня -> Подбор
Разное -> Подбор
Не тестировалось, но я предполагаю:
Надеваемый свет -> Подбор
Другой свет -> Ничего
Щупы -> Подбор
Алхим. аппараты -> Подбор
*(Но, похоже, это отключает опцию «взять». Также может создавать проблемы без использования однократных условий. См раздел Советов и Трюков для решения этих проблем)
Пример:
Следующий скрипт хорошо демонстрирует использование функции OnActivate.
Он присоединен к контейнеру (сундуку), который НЕ показывает, что на нем установлена ловушка, как обычные внутриигровые контейнеры:
Begin Trap_script
short done
if ( OnActivate == 1 )
if ( done == 1 ) ;однократное условие
Activate
return
else
Cast, "flame", Player ;повредить игрока
set done to 1
Activate ; Вызвать стандартное действие: сундук открывается
endif
endif
End trap_script
Примечание: Согласно моим тестам, Activate не может использоваться без OnActivate в одном и том же скрипте.
OnActivate и Activate могут быть в разных частях скрипта.
Однако Activate не будет работать, если OnActivate не была вызвана перед этим.
Также есть сообщения, что объект должен быть вручную активизирован хотя бы раз в 72 часа, иначе игра забывает, что OnActivate было вызвано перед этим.
Фз, возможно требуется флаг References persist, так чтобы игра всегда "помнила" объект и записывала его в сохранение.
72 часа это время сброса "памяти" игры по умолчанию, дабы очистить ОЗУ от "мусора", в который попадают статсы Нпс и еще много всякого..
Попробуйте этот скрипт, чтобы узнать все самим (я его применил к двери):
Begin GBG_activate
Short done
if ( OnActivate == 1 )
MessageBox "Спасибо за активацию"
endif
if ( done == 0 )
If ( GetDistance, Player < 100 )
set done to 1
MessageBox "Игрок закрывает"
endif
endif
if ( done == 1 )
If ( GetDistance, Player > 200 )
MessageBox "Sesame"
Activate
set done to 0
endif
endIf
End
Также были сообщения, что существует другие трудности с функцией OnActivate.
Исходя из моего опыта, использование только одного OnActivate - самый безопасный способ обойти их.
Также используйте OnPCEquip, когда хотите использовать предмет из инвентаря на себя, OnActivate при этом не вызывается.
Информация от UESP: существует недокументированная особенность Activate, которая заключается в указании игрока после функции, например
begin RemoteContainer
short OnPCEquip
if ( OnPCEquip == 1 )
set OnPCEquip to 0
"dh_remote_chest_01"->Activate, player
endif
end
Если контейнер имеет свойство references persist, этот скрипт должен открыть его, где бы игрок ни был.
Это великолепная возможность создавать переносные контейнеры и т.п.
Вот-вот! Он сам пишет о необходимости References persist флага.
Вероятно для существ флаг Corpses persist может выполнять аналогичную функцию, предотвращая удаление существа из сохранения и "памяти" во время сеанса.