Перейти к основному содержимому

Цели Elite Script

Цели являются центральной частью Elite Scripts и необходимы для работы Действий и Зон.

Типы целей

Типы целей определяют, какие сущности или местоположения выбираются скриптом.

Тип целиПодробностиОсобое
NEARBY_PLAYERSИгроки в радиусеТребует range
NEARBY_MOBSМобы в радиусеТребует range
NEARBY_ELITESЭлитки в радиусеТребует range
WORLD_PLAYERSИгроки в мире
ALL_PLAYERSИгроки на сервере
DIRECT_TARGETИгроки в событииТребует совместимого события
SELFЭлитка, использующая пауэр
SELF_SPAWNЦелит в локацию спавна босса
LOCATIONКонкретная локацияТребует location
LOCATIONSНесколько конкретных локацийТребует locations
ZONE_FULLЦели внутри зоныТребует Zone
ZONE_BORDERЦели на границе зоныТребует Zone
ACTION_TARGETНаследует цели от действия.Может использоваться только для условий действий и относительных векторов!!
LANDING_LOCATIONЦелит в локацию, на которую приземлился блок или сущность.Может использоваться только в landingScripts действий SPAWN_FALLING_BLOCK и SUMMON_ENTITY!
INHERIT_SCRIPT_TARGETНаследует цель от скрипта, который запускает этот скриптМожет выполняться только в том случае, если скрипт был вызван другим скриптом!
INHERIT_SCRIPT_ZONE_FULLЦели внутри зоны, унаследованной от скрипта, который запускает этот скриптТребует Zone в скрипте, который вызывает этот скрипт!
INHERIT_SCRIPT_ZONE_BORDERЦели на границе зоны, унаследованной от скрипта, который запускает этот скриптТребует Zone в скрипте, который вызывает этот скрипт!
Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: ALL_PLAYERS
sValue: "&2Hello World!"

Это отправляет сообщение цели. Поскольку цель задана как ALL_PLAYERS, оно будет отправлено всем игрокам в сети.


Общие атрибуты

Следующие настройки можно применить ко всем целям.

ValuesDetailsSpecial
offsetЗадаёт смещение для локации цели.Нельзя целиться в сущности!
relativeOffsetЗадаёт относительное смещение для локации цели. Принимает чертёж относительного вектора, позволяя вычислять смещение относительно направления, в котором смотрит босс.Нельзя целиться в сущности!
Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"

Это ударяет молнией на 2 блока выше босса. Обратите внимание, что STRIKE_LIGHTNING использует локации и не воздействует на сущности, поэтому к нему можно применять смещения.

Нельзя задать смещение для отправки сообщения, поскольку сообщения отправляются игрокам. Однако вы можете задать смещение для зоны, которая затем может целиться в сущности.


range

Задаёт радиус поиска ближайших игроков для типа цели NEARBY_PLAYERS.

ValuesDetailsDefault
rangeЗадаёт радиус в блоках для поиска целей-игроков.20.0
Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"

Это отправляет сообщение игрокам в пределах 25 блоков от босса, когда босс умирает.

location

Задаёт локацию для типа цели LOCATION.

ValuesDetailsDefault
locationЗадаёт локацию в мире, которая будет выбрана целью.none

Используется формат location: worldname,x,y,z,pitch,yaw для локации.

Обратите внимание, что same_as_boss является допустимым плейсхолдером для имени мира, например same_as_boss,100,64,100,0,0 будет допустимой локацией, которая будет целиться в тот же мир, где находится босс.

Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATION
location: "myWorld,100,64,200,0,0"

Это вызывает удар молнии в локации x=100, y=64, z=200 в мире под названием myWorld.


locations

Задаёт локации для типа цели LOCATIONS.

ValuesDetailsDefault
locationsЗадаёт список локаций в мире, которые будут выбраны целью.none

Используется формат worldname,x,y,z,pitch,yaw для локации.

Обратите внимание, что same_as_boss является допустимым плейсхолдером для имени мира, например same_as_boss,100,64,100,0,0 будет допустимой локацией, которая будет целиться в тот же мир, где находится босс.

Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATIONS
locations:
- "myWorld,100,64,200,0,0"
- "same_as_boss,-100,12,130,0,0"

Это вызывает удар молнии в локации x=100, y=64, z=200 в мире под названием myWorld и ещё один удар молнии в том же мире, где находится босс, в локации x=-100, y=12 и z=130.


Нацеливание на зоны

Зоны имеют несколько целей, и важно понимать, как они работают, чтобы использовать Elite Scripting в полной мере.

Зоны работают в две части:

Часть 1 — задание того, где будет находиться зона

Зонам нужно знать, где они должны находиться, и для этого вы используете систему целей так же, как для любого другого эффекта на основе локации, например удара молнии.

Пример
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF

Это создаёт цилиндрическую зону вокруг босса. Обратите внимание, что в этом примере пока не задано никаких действий, это рассматривается ниже.

Некоторые зоны, такие как STATIC_RAY, имеют две или более целей. Это потому, что лучи — это линии, а линии определяются двумя точками. Это более подробно рассматривается на странице о зонах, но в основе своей все они работают одинаково.

Часть 2 — нацеливание на внутреннюю часть зоны

Теперь, когда зона знает, где она находится, нам нужно, чтобы действие знало, что его целью является заданная нами зона. Именно для этого предназначены targetType: ZONE_FULL и targetType:ZONE_BORDER.

Пример
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL

Используя ту же зону из первой части, мы теперь добавляем действие. Целью этого действия является ZONE_FULL, что означает, что частицы будут спавниться внутри всей зоны.

Обратите внимание, что ZONE_BORDER доступен не для каждой зоны. Подробнее об этом на странице зон скриптов.

Отслеживание зоны (track)

Задаёт, будет ли зона перемещаться вместе с целью, например будет ли зона двигаться при движении босса для targetType: SELF.

ValuesDetailsDefault
trackЗадаёт, будет ли зона перемещаться вместе с целью.true

Обратите внимание, что анимируемые зоны не могут отслеживать. Подробнее об этом здесь.

Пример
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false

Используя тот же пример из частей 1 и 2, зона теперь настроена так, чтобы не отслеживать. Это означает, что зона заспавнится в локации босса, но даже когда босс продолжит уходить, зона останется там, где она впервые заспавнилась.

Наконец, обратите внимание, что если зона настроена так, чтобы не отслеживать, она зафиксирует свою локацию в момент вызова скрипта.

Например, если вы хотите, чтобы у вашего скрипта была фаза предупреждения и фаза урона, вам нужно убедиться, что вы запускаете все действия в начале и задаёте время ожидания для всех действий, связанных с уроном, которые вы хотите выполнить позже по отдельности. По техническим причинам не следует задерживать целый скрипт, который вы вызываете через RUN_SCRIPT.

Ниже приведён правильный пример пауэра с фазой предупреждения и фазой урона, взятый из Frost Palace Sanctum.

Пример
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
- action: SPAWN_PARTICLE
wait: 60
times: 13
repeatEvery: 3
particles:
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: -0.5
speed: 0.2
Target:
targetType: ZONE_FULL
track: false
- action: RUN_SCRIPT
scripts:
- DamageCylinder
- action: PLAY_ANIMATION
sValue: fire_zone
Target:
targetType: SELF
- action: SET_MOB_AI
duration: 100
bValue: false
Target:
targetType: SELF
Cooldowns:
local: 1200
global: 300
DamageCylinder:
Zone:
radius: 10.0
shape: CYLINDER
height: 10
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
offset: 0,-1,0
Actions:
- action: DAMAGE
wait: 60
repeatEvery: 10
times: 4
multiplier: 4
Target:
targetType: ZONE_FULL
track: false
- action: SET_ON_FIRE
wait: 60
duration: 80
Target:
targetType: ZONE_FULL
track: false

Этот скрипт делает много всего, но он разделён на два чётких скрипта: VisualCylinder и DamageCylinder.

VisualCylinder выполняется первым и содержит действие RUN_SCRIPT, которое сразу же также запускает DamageCylinder одновременно с выполнением VisualCylinder.

Однако каждое действие в DamageCylinder настроено на ожидание 60 тиков, или 3 секунды.

Это означает, что у босса есть фаза предупреждения длительностью 3 секунды, а затем он выполняет фазу урона, и даже несмотря на то, что зоны настроены так, чтобы не отслеживать, зона предупреждения и зона урона будут в одной и той же локации.

Свойства целей, специфичные для зон

Зоны имеют следующие специфичные свойства:

coverage

Задаёт процент зоны, который фактически будет использован для действия. Работает только для целей-локаций (не работает при нацеливании на игроков или другие сущности).

ValuesDetailsDefault
coverageЗадаёт процент зоны, который будет покрыт. Это значение можно рандомизировать с помощью ~, например: 1.0~0.3.1.0
Пример
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
coverage: 0.5

В этом случае только 50% зоны будет покрыто частицами.

Наследование целей

Когда скрипт запускает другой скрипт (или «вызывает» его), можно передать информацию о зоне и целях из первого скрипта во второй.

Примеры применения

  1. Улучшенные запускатели скриптов

Запускатели скриптов — это скрипты, единственная функция которых заключается в запуске множества других скриптов. Они используются для упрощения управления скриптами, особенно при работе с несколькими скриптами, требующими точного тайминга.

С наследованием целей несколько скриптов могут использовать одну и ту же зону или цель, сокращая потенциально сотни строк повторяющегося скриптинга.

  1. Фильтрация целей по принципу матрёшки

Условия фильтрации можно применять к целям в действии. Передавая цели другому скрипту с другими фильтрами, можно накладывать условия друг на друга и применять разные эффекты к одному и тому же набору целей на основе всё более конкретных критериев.

Например, можно создать зону, которая ищет игроков, и сделать действие, проверяющее, есть ли у всех игроков в зоне определённый тег. Допустимые цели затем можно передать другому скрипту, где другое действие может выполнить условие случайной проверки и применить эффект на основе этого шанса. Цели затем можно передать дальше другому скрипту, где другое условие может выполнить проверку того, живы ли ещё цели, и совершить какое-то особое поведение, если они мертвы.

Это, конечно, всего лишь примеры. Это очень гибкая система.

  1. Сложные зоны

Наконец, можно накладывать цели для создания сложных зон, при необходимости используя условия, и можно даже создавать частично рандомизированные зоны, используя условия скриптов и возможность запускать только один из перечисленных скриптов из действий скрипта.

Примечание: В этом разделе «родительский скрипт» означает скрипт, который запускает «наследующий скрипт», то есть скрипт, который будет использовать унаследованные цели.

При использовании наследования целей важно внимательно изучить родительский скрипт, чтобы убедиться, что передаются правильные данные.

INHERIT_SCRIPT_TARGET

При использовании INHERIT_SCRIPT_TARGET цели из родительского скрипта будут переданы наследующему скрипту. Здесь есть пара оговорок:

  • При передаче целей-сущностей можно выполнять действия, требующие локаций (например, спавн частиц), так как будет использоваться локация этих сущностей. Конечно, также можно использовать действия, которым нужны сущности.

  • При передаче целей-локаций можно использовать только локации. Единственный способ получить сущность из локации — это создать зону в этой локации и искать сущности. Так что, хотя передать локацию и затем получить сущности не невозможно, это потребует немного дополнительной работы.

Наследование зон

При использовании INHERIT_SCRIPT_ZONE_FULL или INHERIT_SCRIPT_ZONE_BORDER крайне важно, чтобы родительский скрипт определял зону, иначе наследующий скрипт не сможет работать корректно.

Кроме того, зоны можно при желании отслеживать. Это также будет передано вместе с зоной.

  • Неотслеживаемая зона всегда будет создаваться там, где определено наследующим скриптом. Это означает, что настройки зоны будут использоваться действиями в наследующих скриптах для создания совершенно новых зон каждый раз, когда выполняется действие, и локация этих зон будет определяться действием.

  • Отслеживаемая зона может передавать одну и ту же точную локацию зоны всем наследующим скриптам, если родительский скрипт настроен на нацеливание ZONE_FULL или ZONE_BORDER. Это означает, что все скрипты будут воздействовать на одни и те же локации.