• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Unplayable Items  (Прочитано 647 раз)

Описание:

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Unplayable Items
« : 09 Декабрь, 2006, 01:36:33 »
0
Перевод 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. Участвуя в этих дискуссиях, я только помог закрепить понимание, как и когда использовать маркеры.
Награды За огромный вклад в развитие Румора

Теги:
 

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal