×
Меню
Индекс

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 может выполнять аналогичную функцию, предотвращая удаление существа из сохранения и "памяти" во время сеанса.