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

Цели Elite Script

Цели выбирают сущности или позиции для действий, условий и зон. Записывайте Target как отображение YAML. Значения по умолчанию: targetType: SELF, range: 20.0, track: true. Регистр имён полей цели не важен; значения перечисления типов целей должны быть в верхнем регистре.

Типы целей​

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

DIRECT_TARGET — сущность из события: игрок, атакующий элитный моб или сущность, пересекающая зону. Используйте этот тип только с совместимым событием: без прямой цели он ничего не выбирает. Это не обязательно текущая боевая цель босса. Типы поиска поблизости проверяют параллелепипед вокруг босса, выровненный по осям мира, и не сортируют результаты по расстоянию.

Цели-сущности могут предоставлять действиям над позициями свои текущие координаты у ног. Обратного автоматического преобразования нет: LOCATION, LOCATIONS и LANDING_LOCATION не выбирают сущности, находящиеся в этих точках. Для поиска сущностей создайте там зону. Селекторы игроков сами не исключают наблюдателей или игроков из других боёв; конкретное действие может выполнять дополнительные проверки.

Тип целиПодробностиОсобое
NEARBY_PLAYERSИгроки в области поискаrange необязателен, по умолчанию 20.0
NEARBY_MOBSЖивые сущности, кроме игроков и самого босса, в области поискаrange необязателен, по умолчанию 20.0
NEARBY_ELITESОтслеживаемые элитные мобы, кроме самого босса, в области поискаrange необязателен, по умолчанию 20.0
WORLD_PLAYERSИгроки в мире❌
ALL_PLAYERSИгроки на сервере❌
DIRECT_TARGETСущность, предоставленная событиемТребует совместимого события
SELFЭлитка, использующая пауэр❌
SELF_SPAWNСохранённая позиция появления босса для действий над позициямиДействия над сущностями по-прежнему получают самого босса
LOCATIONКонкретная локацияТребует location
LOCATIONSНесколько конкретных локацийТребует locations
ZONE_FULLЦели внутри зоныТребует Zone
ZONE_BORDERЦели на границе зоныТребует Zone
ACTION_TARGETИспользует контекст цели окружающего действияТолько для условий действия в режиме FILTERING и относительных векторов; не является самостоятельной целью действия
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, оно будет отправлено всем игрокам в сети.


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

Эти настройки применяются при определении целевых позиций. Они не перемещают сущность и не меняют сущность, к которой применяется действие.

ПараметрОписаниеОсобенности
offsetЗадаёт смещение для локации цели.Нельзя целиться в сущности!
relativeOffsetСмещает целевые позиции по описанию относительного вектора. Направление задают его начальная и конечная цели.Нельзя целиться в сущности!

Смещения применяются к позициям, полученным от целей-сущностей, например SELF и DIRECT_TARGET, к SELF_SPAWN, LOCATION и LOCATIONS, а также к каждой позиции, выбранной из зоны через ZONE_FULL, ZONE_BORDER и их унаследованные варианты. Чтобы сместить всю зону, задайте смещение в собственном Target зоны, как в примерах ниже. Те же правила действуют в скриптовых утилитах Lua.

offset использует мировые оси X/Y/Z, а не направление взгляда сущности. Он применяется перед relativeOffset. Результаты LANDING_LOCATION и INHERIT_SCRIPT_TARGET обходят эти дополнительные смещения. Внутри относительного вектора ACTION_TARGET напрямую использует переданную позицию действия, игнорируя собственные настройки смещения.

Пример
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"

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

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


range​

Задаёт половину ширины области поиска для NEARBY_PLAYERS, NEARBY_MOBS и NEARBY_ELITES. Одно и то же фиксированное значение используется по осям X, Y и Z; это не сферическое ограничение расстояния. Поиск мобов и элитных мобов исключает самого босса.

Используйте фиксированное неотрицательное число для постоянной формы области. Диапазон с ~ может выбираться отдельно для каждой оси и использует описанный ниже в разделе покрытия генератор дробных значений; он не гарантирует куб с одним случайно выбранным радиусом.

ПараметрОписаниеПо умолчанию
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.

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

Используется формат location: worldname,x,y,z,yaw,pitch для локации. Также принимается worldname,x,y,z (тогда yaw и pitch по умолчанию равны 0), как и форма без мира x,y,z,yaw,pitch, хотя последняя оставляет локацию без мира и редко является тем, что вам нужно. Голая форма из трёх значений x,y,z не является допустимой и отвергается с сообщением Attempted to deserialize an invalid location! в консоли.

Указывайте загруженный мир или same_as_boss. Разбор настройки не загружает мир; неверный формат или не найденный мир могут вызвать ошибку при использовании цели. Координаты абсолютные, в том числе с same_as_boss: этот подстановочный параметр меняет только мир.

Если указанный мир не загружен, а босс находится в мире с именем <configuredWorld>_<number>, цель использует этот мир экземпляра подземелья. Этот запасной вариант не заменяет уже загруженный мир из настройки.

Обратите внимание, что 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.

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

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

Обратите внимание, что 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.


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

Зоны разделяют цели, задающие начало координат, и действия, использующие геометрию зоны. Zone.Target задаёт исходные позиции; цель действия ZONE_FULL или ZONE_BORDER выбирает результаты из полученных фигур. Несколько исходных позиций могут создать несколько фигур. Повторяющиеся сущности удаляются из результата, но пересекающиеся фигуры могут давать повторяющиеся позиции частиц.

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

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

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

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

Здесь показан цилиндр радиусом 10 и высотой 1, начинающийся у ног босса и направленный вверх. Действий ещё нет: это только фрагмент, а для запуска скрипта нужны показанные ниже Actions. filter: PLAYER применяется к поиску сущностей, а не к геометрическим позициям для частиц.

Некоторые зоны, такие как 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

Частицы появляются в выбранных точках по всему цилиндру, а не в позициях игроков. Действие выполняется 12 раз с интервалом 5 тиков. Для частиц в зоне покрытие по умолчанию составляет примерно 30%, если coverage не задан явно. filter: PLAYER не ограничивает эти частицы игроками.

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

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

Задавайте track в Target действия, как показано ниже. При true фигуры зоны обычно заново определяют движущиеся исходные позиции при запросе. При false действие кеширует фигуры перед своим wait, фиксируя их начало; последующие запросы сущностей всё равно находят тех, кто находится в кешированной фигуре на момент запроса. Игроки, присутствовавшие при применении способности, не фиксируются.

ПараметрОписаниеПо умолчанию
trackЗаново определять цель действия вместо кеширования начала зоны и выбранных позиций.true

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

Пример
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 также откладывает запуск вызываемого скрипта и подготовку его кеша.

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

Ниже приведён правильный пример пауэра с фазой предупреждения и фазой урона, взятый из 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 секунды, после чего начинаются отложенные эффекты. При немедленном запуске оба скрипта сохраняют одинаковую горизонтальную позицию босса. Их объёмы различаются: визуальный цилиндр имеет высоту 1 и начинается у ног, а цилиндр урона начинается на блок ниже и имеет высоту 10. DAMAGE выполняется четыре раза с интервалом 10 тиков; SET_ON_FIRE выполняется один раз после ожидания и запрашивает 80 тиков горения. Анимации нужна совместимая пользовательская модель с fire_zone.

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

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

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

coverage​

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

ПараметрОписаниеПо умолчанию
coverageДоля сохраняемых позиций зоны, например 0.5 для примерно половины. Предпочтительно фиксированное значение от 0 до 1.1.0

Диапазон вроде 0.3~1.0 выбирает значение от 0.3 до 1.0, не включая 1.0, а покрытие может выбираться отдельно для каждой точки. Для предсказуемого покрытия используйте фиксированную долю. Явное coverage: 1.0 сохраняет все выбранные позиции; без этого параметра действие SPAWN_PARTICLE по зоне использует 0.3. Покрытие не сокращает результаты поиска сущностей. При track: false набор позиций статической зоны кешируется и используется повторно, а не выбирается заново при каждом повторении.

Пример
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. Фильтрация целей по принципу матрёшки

Родительское действие, которое действительно определяет и фильтрует цели-сущности, может передать кешированный результат дочернему скрипту через свой список scripts. Типы целей родителя и потомка должны быть совместимы. Сам RUN_SCRIPT не выполняет обработку фильтрации каждой цели, поэтому добавление к нему условия FILTERING не создаёт отфильтрованный список для наследования.

Для проверки тегов используйте ACTION_TARGET с FILTERING на действии над сущностями. Случайный шанс требует условий уровня скрипта или BLOCKING; это не отдельная случайная проверка для каждой сущности при фильтрации. isAlive проверяет действительность сущности в Bukkit, поэтому его инверсия не является надёжным способом запустить поведение при смерти игрока.

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

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

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

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

INHERIT_SCRIPT_TARGET​

INHERIT_SCRIPT_TARGET читает механизм определения цели или кеш конкретного родительского действия, вызвавшего дочерний скрипт, а не объединение всех целей родительского скрипта. Указывайте его в действиях или исходных целях зон потомка, но не в его верхнеуровневых Conditions: те проверяются до появления унаследованных данных действия, и унаследованная цель там завершается ошибкой.

Родитель передаёт свои определённые и отфильтрованные условиями цели, только если в его Target задано track: false. При значении по умолчанию track: true потомок заново определяет цель родителя, без его фильтрации. Родитель RUN_SCRIPT никогда не определяет собственные цели, поэтому его потомок всегда заново определяет сущности. При track: false потомок повторно использует позиции, которые родитель кешировал при запуске своего действия. Есть следующие особенности:

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

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

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

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

Действие с track: false кеширует фигуры зоны до начала ожидания. Действие с отслеживанием обычно не кеширует их и заново определяет движущиеся исходные позиции. Переданные данные родительского действия позволяют повторно использовать кешированные фигуры; track: true не фиксирует общую позицию.

Унаследованные цели зон используют собственную Zone родительского скрипта и фигуры, кешированные вызывающим действием, если оно их кешировало. Запросы сущностей INHERIT_SCRIPT_ZONE_FULL используют проверку полного объёма, как ZONE_FULL. Если у родительского скрипта нет допустимой зоны или скрипт не был вызван другим скриптом, действие завершается ошибкой.

Чтобы использовать общую фиксированную исходную позицию, задайте track: false в Target вызывающего действия. Тогда потомок повторно использует фигуры, которые родитель кешировал при запуске своего действия, даже если собственные действия потомка ждут.