Перевод Eugene
Unplayable ItemsАвтор: guidobot101
Неигровые объекты
Вы, должно быть, уже встречались с таким понятием, как маркер и вам интересно что это такое и почему вокруг них такая суета.
Это базовые неигровые объекты, которые позволяют эффективно перепрограммировать любого актера или даже игрока. Несмотря на скромное название, маркеры возможно являются самым сильным средством, которое есть у скриптеров в стандартном CS. Сами маркеры являются почти тем, что они есть – т.е. это объект, существующий только для того, что бы запустить привязанный к нему скрипт на цель. Еще одна важная деталь – это эффект маркера.
Чтобы создать маркер:
1) Выберите любой объект в игре у которого имеется переключатель Playable. Фактически это одежда и оружие. Хотя самый распространенный выбор – кольцо – это не так важно, т.к. его 3D объект никогда и не увидит дневного света. Фактически базовая модель, отмеченная как unplayable вообще не может быть помещена в игру.
2) Скопируйте выбранный объект, сохранив его под новым уникальным ID. Вам вероятно захочется использовать его название в качестве комментария, какой данный маркер будет иметь эффект и т.п.
3) Отключите опцию Playable.
4) Прикрепите или создайте объектный скрипт - свой 'эффект маркера'.
Чтобы навести маркер на цель просто запустите следующую команду из любого активного скрипта:
actor.AddItem MyToken 1
Итак, что в нем особенного? Это в большинстве случаев то, что нельзя проделать с другими объектами. Вот список важных свойств маркера:
1) Маркеры всегда специфичны в зависимости от актера к которому они приложены, даже если этот актер был создан PlaceAtMe. В контрасте, заклинания и способности добавляются в базовую модель. (Все [новые] ссылки актера той же самой базовой модели наследуют эти эффекты при возрождении)
2) Локальные переменные – постоянны. Заскриптованные эффекты заклинаний сбрасываются, когда актер перемещается в область (ту же ячейку), где и игрок, значит любая локальная переменная реинсталлируется (на 0)
3) Вы можете добавить маркер дистанционно - то есть актеру даже не в вашей ячейке, пока он является постоянной ссылкой.
4) Скрипты с эффектом маркера всегда активны и блок OnActivate может быть вызван, когда актер находится вне области. Это не действует когда скрипт на самом объекте.
5) Когда [отмеченный актер] находится в области, блок GameMode активируется каждый фрейм. Когда вне области – блок GameMode активируется каждые 30 секунд или всякий раз как игрок перемещается в новою ячейку. К тому же он всегда будет активирован при первом добавлении маркера – значит у вас есть эффективный метод OnAdd.
6) В отличие от стандартных объектов, маркеры никогда не отображаются в инвентаре цели/игрока. (Это по существу компенсирует то, что объекты инвентаря не могут быть отключены)
7) Как и заклинания, маркеры могут удалять себя или быть удаленными вызванным скриптом (очень удобно для мгновенных или одноразовых эффектов).
Вот очень полезный пример. Этот эффект маркера позволяет, что бы у торговца в инвентаре было конкретное заклинание для продажи. Этот эффект прикреплен как скрипт к маркеру (тому что вы только что сделали), названный LoadSpellToken.
scn LoadSpellTokenEffect
ref target
Begin GameMode
; ожидает присутствия игрока
if GetInSameCell player
; добавляет заклинания в инвентарь и удаляет эффект
set target to GetContainer
target.AddSpell MySpell01
target.AddSpell MySpell02
target.AddSpell MySpell03
RemoveMe
endif
End
Чтобы использовать эту версию, я предлагаю квестовый скрипт. Существуют и другие способы проделать это, но наличие стартового квеста будет хорошей идеей практически для любого мода, включающего в себя скрипты. Вот стартовый скрипт, прикрепленный к квесту с ID MyStartupQuest:
scn MyStartupQuestScript
short doOnce
; ...все остальные переменные
Begin GameMode
if doOnce
Return
endif
set doOnce to 1
; это уникальная ссылка для текущей игры (должна быть постоянной и уникальной)
<InGameVendor1>.AddItem LoadSpellToken 1
; другая уникальная ссылка для второго поставщика заклинаний
<InGameVendor2>.AddItem LoadSpellToken 1
End
Хорошо, что мы имеем? Мы добавили заклинания конкретному поставщику (или поставщикам) даже не изменяя мира – даже не помещая активатор/сенсор около поставщика!
Отметим, что в данном примере можно запустить AddSpell прямо из квестового скрипта. Тем не менее, часто может понадобиться добавить множественные объекты, или же конкретные команды не будут работать, пока актера нет в той же области, следовательно, GetInSameCell – условная переменная. Для условных и глобальных переменных часто нужно обеспечивать синхронизацию, когда инициированы эффекты маркера.
НЕБОЛЬШОЕ ОТСТУПЛЕНИЕ: Это работает одинаково хорошо для базовых объектов и т.п. Тем не менее, во многих случаях вы захотите ввести постоянный заскриптованный объект в игру. Это немного потруднее, поскольку эти объекты легко теряют привязанный к ним скрипт при перемещении из 3D (мир) в 2D (инвентарь/контейнер). Для того чтобы это проделать, во-первых, будет хорошей идеей иметь собственную комнату, где можно будет держать все объекты, даже если эта ячейка будет недоступна для игрока. Так у вас никогда не будет конфликтов мода. Далее вам понадобится
(1) MyObject.MoveTo player
(2) MyObject.Activate player
(3) MyObject.RemoveMe <СпрятанныйКонтейнерПоставщика>.
Эти три шага должны быть проделаны в разные (последующие) фреймы. Нужно использовать спрятанный контейнер поставщика заклинаний. Если добавить прямо поставщику, то в 9 из 10 случаях поставщик мгновенно экипируется этим предметом – и не позволит запустить скрипт. (Это удобно если вам нужно чтобы объект был скрыт)
Маркеры на игроке: Очень полезно для OBSE программирования. Для этого нужно проделать два шага:
(1) set tokenRef to player.AddItem MyPlayerToken 1
(2) tokenRef.Activate player
Кроме того, чтобы удержать приложенный к маркеру скрипт, эти команды должны быть активированы в разные фреймы (используйте счетчик). Это вероятно связано с OB ожиданием сообщения для AddItem при добавлении игроку. Тем не менее, AddItem может для этого работать.
Злоупотребление маркерами: Так как маркеры всегда активны, убедитесь, что вы не добавляете их многократно или практически ко всем NPC встречающимся в игре. Иногда для этого больше подходит использование заклинания, способности или другого подобного метода.
Изобретение маркеров: Мне хочется сказать, что это я изобрел маркеры, но это не так. Оказывается, они берут начало в дискуссиях, и первоначально были использованы ранними адаптаторами, такими как Shuggsywuggsy-the-ferret. Участвуя в этих дискуссиях, я только помог закрепить понимание, как и когда использовать маркеры.