Зоны Elite Script
Зоны — это местоположения, определяемые формой, которые могут использоваться скриптерами в качестве целей для выполнения любых действий.
В скрипте можно задать только одно отображение YAML Zone. На верхнем уровне соблюдайте именно этот регистр; имена внутренних полей не зависят от регистра, а значения перечислений формы и фильтра должны быть прописными. Несколько исходных целей могут создать несколько фигур из одного описания.
Чтобы нацелиться на зоны, можно использовать тип цели ZONE_FULL или ZONE_BORDER.
Сами зоны также используют Цели скриптов, чтобы определить, где зона появится.
Без Target зона использует SELF. Остальные значения парсера по умолчанию: shape: CYLINDER, filter: PLAYER, radius: 5, borderRadius: 1, height: 1, pointRadius: 0.5, animationDuration: 0 и ignoresSolidBlocks: true. Повороты и размеры параллелепипеда равны нулю. Явно задавайте подходящие размеры: значения по умолчанию не подтверждают корректность всей встречи. Таблицы отмечают поля, которые следует задать для каждой формы, а не только поля, отсутствие которых обязательно вызывает ошибку парсера.
Используйте конечные положительные размеры и разные конечные точки в одном мире для лучей и конусов. Предпочтительны фиксированные числа: дробный диапазон с ~ выбирает значения от min до max, не включая max, и может выбираться многократно. Обратный диапазон вроде 5~1 заставляет EliteMobs пропустить весь скрипт. Большие объёмы генерируют много позиций. Запросы сущностей для цилиндров, конусов, кубоидов и лучей ищут в параллелепипеде вокруг фигуры, если он не больше 256 блоков по каждой оси; сферы, купола и более крупные фигуры проверяют кандидатов по всему миру фигуры. Подбирайте размеры и частоту повторений соразмерно эффекту.
Действия частиц используют геометрические точки выборки, а не хитбоксы сущностей. Действие SPAWN_PARTICLE по зоне по умолчанию покрывает примерно 30% позиций; явно задайте coverage: 1.0 в его цели, чтобы сохранить все точки выборки. filter не меняет позиции частиц. Проверки нахождения сущностей внутри различаются по формам, как описано ниже; контур частиц не является точной границей столкновений.
shape
Устанавливает форму зоны. Допустимые формы:
| Тип формы | Подробности | Анимируемая | Граница |
|---|---|---|---|
CYLINDER | Цилиндрическая форма | ❌ | ✅ |
SPHERE | Сферическая форма | ❌ | ✅ |
DOME | Купол (полусфера) | ❌ | ✅ |
CUBOID | Параллелепипед | ❌ | ✅ |
STATIC_RAY | Линия между двумя определёнными точками без собственной анимации | ❌ | ❌ |
ROTATING_RAY | Вращающаяся линия между двумя точками | ✅ | ❌ |
TRANSLATING_RAY | Линия, перемещающаяся от двух начальных точек к двум конечным | ✅ | ❌ |
CONE | Конус | ❌ | ✅ |
Анимируемые
Анимированная фигура начинает движение, когда действие создаёт и кеширует её. При положительном animationDuration это обычно происходит при запуске действия, до его wait. Разные действия могут создавать отдельные анимированные фигуры.
Это означает, что если у действия есть время ожидания, то к моменту начала действия зона уже двигалась всё то время, пока действие ожидало.
Анимация зоны продвигается каждый тик. Для показа частиц каждый тик используйте SPAWN_PARTICLE с repeatEvery: 1. Более редкие действия показывают меньше кадров, пока зона продолжает двигаться.
Если вы хотите сделать действие с вращающейся зоной, но при этом подождать заданное количество тиков перед началом действия, вынесите это в отдельный скрипт и вызовите его через RUN_SCRIPT. Убедитесь, что у RUN_SCRIPT задано нужное вам время ожидания.
После завершения задачи анимации зоны сохраняют последнюю рассчитанную геометрию. Используйте положительную длительность. Последний кадр анимации применяет ровно настроенный поворот или точно достигает конечных целей.
При положительном animationDuration каждое действие кеширует свои фигуры в момент запуска независимо от настройки track. Кешированные фигуры анимируются от исходных концов, не следуя за движущимися боссами или игроками. Для статических фигур задайте track: false в Target действия, чтобы закрепить начало; настройка только в Zone.Target не фиксирует фигуру действия. Срок жизни кеша описан в руководстве по целям.
Граница
У некоторых зон может быть граница. Наличие границы означает, что в качестве цели зоны можно использовать ZONE_BORDER. Границы задаются созданием второй, меньшей формы внутри первой, большей формы. Область между меньшей и большей зоной и есть граница.
borderRadius — внутренний радиус, а не толщина границы. Он должен быть неотрицательным и меньше внешнего радиуса. Цилиндры вычитают внутренний цилиндр той же высоты, создавая боковое кольцо без верхней и нижней крышек. Выборка границы параллелепипеда использует отдельные правила и может отличаться от проверки сущностей на границе. У лучей нет результата границы; используйте ZONE_FULL.
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CYLINDER
radius: 4
borderRadius: 3
height: 8
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: SMOKE_LARGE
Target:
targetType: ZONE_BORDER
repeatEvery: 5
times: 20

Скрипт создаёт 20 выбросов дыма в выбранных точках границы с интервалом 5 тиков. Первый происходит сразу, последний — через 95 тиков, примерно через 4,75 секунды при 20 тиках в секунду. Задача повторения заканчивается на следующем интервале. Время жизни самих частиц не зависит от расписания действия.
При ZONE_FULL точки для частиц выбираются по всей зоне, а не только на границе:

SPHERE
Начало координат — центр сферы. Позиции выбираются на сетке с целочисленным шагом внутри радиуса. Проверка сущностей приближает каждую сущность сферой с радиусом, равным половине высоты от ног до глаз. Поэтому сущность может пересекать зону, даже если её ноги снаружи. Проверка границы также исключает сущности, пересекающие внутреннюю сферу.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть SPHERE | ✅ |
target | Задаёт местоположение центра сферы | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
radius | Радиус сферы | ✅ |
borderRadius | Радиус внутренней сферы | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: SPHERE
radius: 4
borderRadius: 3
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 5
times: 20

Этот скрипт демонстрирует форму сферы с помощью частиц облака.
DOME
Частицы выбираются в верхней половине сферы, начиная с высоты её центра. Текущее ограничение: полный запрос сущностей наследует проверку сферы без ограничения полусферой, поэтому ZONE_FULL может выбрать сущности ниже купола. Запрос границы дополнительно требует, чтобы ноги были выше originY - 1; прямые проверки позиций используют тот же порог. Отображение купола частицами не доказывает, что область попадания ограничена верхней половиной.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть DOME | ✅ |
target | Задаёт местоположение центра купола | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
radius | Радиус купола | ✅ |
borderRadius | Радиус внутреннего купола | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: DOME
radius: 4
borderRadius: 3
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 5
times: 20

Этот скрипт демонстрирует форму купола с помощью частиц облака.
CONE
Для каждого начала конус использует первую определённую позицию Target2. Поиск ближайших игроков не сортирует по расстоянию; используйте одиночную цель, если конус должен смотреть на конкретную сущность.
Target задаёт вершину, а Target2 — центр основания; расстояние между ними определяет высоту конуса. Точки должны различаться и находиться в одном мире. Проверки сущностей тестируют ноги, центр и верх хитбокса, а не точное пересечение всего хитбокса. Позиции выборки используют мировую сетку целочисленных координат.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть CONE | ✅ |
target | Задаёт местоположение вершины (острия) конуса | ✅ |
target2 | Задаёт местоположение центра основания конуса | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
radius | Радиус основания конуса | ✅ |
borderRadius | Радиус внутреннего конуса | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CONE
radius: 10
Target:
targetType: SELF
offset: 0,0,0
Target2:
targetType: SELF
offset: 0,10,0
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
coverage: 0.8
repeatEvery: 5
times: 20
Этот скрипт демонстрирует форму конуса с помощью частиц облака. Учтите, что эта зона имеет форму CONE, то есть является трёхмерным объёмом, — это важно учитывать, если вы хотите создать эффекты размаха.
CYLINDER
Начало координат — центр нижней грани. Цилиндр простирается вверх на height, а не поровну вверх и вниз. Проверка сущности требует, чтобы вся высота её хитбокса помещалась между нижней и верхней гранями, а также выполнялась горизонтальная проверка. Поэтому визуальный цилиндр высотой 1 обычно не выбирает стоящего игрока. Для действий над сущностями задавайте достаточную высоту и подходящую исходную позицию.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть CYLINDER | ✅ |
target | Центр нижней грани | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
radius | Радиус цилиндра | ✅ |
borderRadius | Радиус внутреннего цилиндра | ❌ |
height | Высота цилиндра | ✅ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CYLINDER
radius: 4
borderRadius: 3
height: 8
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 5
times: 20

Этот скрипт демонстрирует форму цилиндра с помощью частиц облака.
CUBOID
Текущая реализация параллелепипеда использует разные границы для выборки позиций, проверки отдельных точек и проверки сущностей. Точки охватывают x и z блоков вокруг центра и поднимаются на y блоков. Проверка пересечения сущностей использует полуширины x / 2 и z / 2, но лишь y / 2 вверх. Прямая проверка точки использует ±x, ±y и ±z. Не считайте объёмы частиц и запроса сущностей одинаковыми; проверьте нужную геометрию встречи на сервере. Это касается и нативных параллелепипедов Lua.
Для положительных целочисленных размеров координаты частиц идут от -floor(x / 2) до x - 1 - floor(x / 2), аналогично по Z, и от 0 до y - 1 по вертикали. Границы сущностей используют блочные координаты начала и округляют горизонтальные края вниз. Частицы границы сохраняют точки с Y <= yBorder, у которых X или Z находятся вне внутренней полуширины. Это не полная оболочка, полученная вычитанием внутреннего параллелепипеда из внешнего.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть CUBOID | ✅ |
target | Задаёт местоположение центра параллелепипеда | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
x | Задаёт длину параллелепипеда | ✅ |
y | Задаёт высоту параллелепипеда | ✅ |
z | Задаёт ширину параллелепипеда, по умолчанию равна x | ❌ |
xBorder | Задаёт длину внутреннего параллелепипеда | ❌ |
yBorder | Задаёт высоту внутреннего параллелепипеда | ❌ |
zBorder | Ширина внутреннего параллелепипеда; при 0 используется xBorder, если он не равен нулю | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CUBOID
x: 4
y: 4
z: 4
xBorder: 3
yBorder: 3
zBorder: 3
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 5
times: 20

Этот скрипт демонстрирует форму параллелепипеда с помощью частиц облака.
STATIC_RAY
Каждая определённая исходная позиция Target соединяется с каждой определённой конечной позицией Target2 в том же мире. У STATIC_RAY нет отдельной анимации, но при стандартном track: true в цели действия повторения заново создают его из текущих концов. Для фиксации концов задайте track: false в цели действия.
pointRadius управляет шагом выборки и радиусом проверки попадания, а не полным диаметром. Статичные и перемещающиеся лучи делают максимум 500 шагов, поэтому максимальная длина выборки составляет примерно 500 * pointRadius блоков. Вращающиеся лучи используют шаг 2 * pointRadius. Значение должно быть строго положительным. При ignoresSolidBlocks: false выборка останавливается на твёрдом блоке в проверяемой точке; это не непрерывная проверка столкновений, и большие шаги могут пропускать препятствия. Для сущностей проверяется пересечение со сферами вокруг выбранных точек.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть STATIC_RAY | ✅ |
target | Задаёт местоположение первой точки линии | ✅ |
target2 | Задаёт местоположение последней точки линии | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
ignoresSolidBlocks | Определяет, будет ли луч проходить сквозь твёрдые блоки. По умолчанию true | ❌ |
pointRadius | Задаёт толщину луча. По умолчанию 0.5 блока. | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: STATIC_RAY
Target2:
targetType: DIRECT_TARGET
offset: 0,1,0
Target:
targetType: SELF
offset: 0,1,0
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 5
times: 20

Этот скрипт демонстрирует форму статичного луча с помощью частиц облака.
На обоих концах используется offset: 0,1,0, размещающий луч на блок выше ног. Это не обязательно середина сущностей любой высоты.
ROTATING_RAY
Углы задаются в градусах, длительность — в тиках. Каждое начало соединяется с каждым допустимым Target2 в том же мире. Исходный конец остаётся неподвижным центром вращения. Начальные и анимированные повороты pitch/yaw принимают оба знака. Полный заранее повёрнутый луч существует до первого тика анимации, в том числе при нулевой длительности. Начальные концы должны различаться. Отрицательные длительности и не конечные значения отклоняются.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть ROTATING_RAY | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
target | Задаёт местоположение первой точки линии | ✅ |
target2 | Задаёт местоположение последней точки линии | ✅ |
animationDuration | Задаёт в тиках продолжительность вращения | ✅ |
pitchPreRotation | Применяет начальный поворот по тангажу до анимации | ❌ |
yawPreRotation | Применяет начальный поворот по рысканью до анимации | ❌ |
pitchRotation | Задаёт поворот по тангажу для анимации | ❌ |
yawRotation | Задаёт поворот по рысканью для анимации | ❌ |
ignoresSolidBlocks | Определяет, будет ли луч проходить сквозь твёрдые блоки. По умолчанию true | ❌ |
pointRadius | Задаёт толщину луча. По умолчанию 0.5 блока. | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: ROTATING_RAY
animationDuration: 100
pitchPrerotation: 0
yawPrerotation: 0
pitchRotation: 0
yawRotation: 360
ignoresSolidBlocks: true
Target:
targetType: SELF
offset: 0,1,0
Target2:
targetType: DIRECT_TARGET
offset: 0,1,0
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 1
times: 100

Этот скрипт показывает, как выглядит вращающийся луч с частицами облака.
Сначала он создаёт луч от босса к игроку, который нанёс ему урон, используя частицы облака. Затем он немного смещает позиции вверх на один блок с помощью offset.
Далее луч поворачивается на 360 градусов за 100 тиков вокруг исходной точки со стороны босса. Игрок задаёт начальное направление, а не центр вращения. Отрицательные значения pitch/yaw вращают луч в обратном направлении.
TRANSLATING_RAY
Каждая исходная пара Target / Target2 использует первые определённые FinalTarget и FinalTarget2. Если конечная цель опущена, соответствующий конец остаётся в начальной позиции. Держите все точки в одном мире. Положительная длительность анимирует луч точно до конечных позиций; нулевая длительность оставляет исходный луч неподвижным. Отрицательная длительность отклоняется.
| Ключ | Подробности | Задать явно |
|---|---|---|
shape | Задаёт форму зоны. Должно быть TRANSLATING_RAY | ✅ |
filter | Задаёт, какие типы сущностей берутся в цель | ❌ |
animationDuration | Задаёт в тиках продолжительность перемещения | ✅ |
target | Задаёт местоположение первой точки линии | ✅ |
finalTarget | Задаёт местоположение конечной точки для первой точки линии | ✅ |
target2 | Задаёт местоположение второй точки линии | ✅ |
finalTarget2 | Задаёт местоположение конечной точки для второй точки линии | ✅ |
ignoresSolidBlocks | Определяет, будет ли луч проходить сквозь твёрдые блоки. По умолчанию true | ❌ |
pointRadius | Задаёт толщину луча. По умолчанию 0.5 блока. | ❌ |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: TRANSLATING_RAY
Target:
targetType: SELF
FinalTarget:
targetType: SELF
offset: 0,10,0
Target2:
targetType: DIRECT_TARGET
FinalTarget2:
targetType: DIRECT_TARGET
offset: 0,10,0
animationDuration: 100
ignoresSolidBlocks: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
repeatEvery: 1
times: 100

Этот скрипт показывает, как выглядит перемещающийся луч с частицами облака.
Сначала он создаёт луч от босса к игроку, который нанёс ему урон, используя частицы облака.
Затем луч перемещается на 10 блоков вверх с помощью смещений в FinalTarget и FinalTarget2.
Настроенная длительность — 100 тиков, примерно 5 секунд при 20 тиках в секунду. Последний кадр приходится точно на конечные цели.
Мы легко можем заставить луч двигаться вбок, задав offset по оси Z, например offset: 0,0,10:

Смещения используют мировые оси; смена направления взгляда меняет только вид движения на экране. Смещение X движется по мировой оси X независимо от того, куда вы смотрите.
filter
Свойство filter можно использовать, чтобы брать в цель только определённые сущности внутри зоны. Такими сущностями могут быть:
Эти фильтры применяются к запросам сущностей, а не к позициям частиц. ELITE и LIVING могут включать самого босса, применяющего способность, если он проходит проверку фигуры. PLAYER сам не исключает наблюдателей или игроков из других встреч. Дополнительные правила доступности конкретного действия всё ещё могут применяться.
| Значение | Подробности |
|---|---|
PLAYER | Только игроки в зоне (по умолчанию) |
ELITE | Живые сущности, отслеживаемые как элитные, внутри зоны |
LIVING | Живые сущности внутри зоны, включая игроков |
Пример
eliteScript:
FilterExample:
Events:
- PlayerDamagedByEliteMobEvent
Zone:
shape: SPHERE
radius: 12
borderRadius: 11
filter: ELITE
Target:
targetType: SELF
track: false
Этот фрагмент задаёт фильтр сущностей зоны на элитных мобов. В нём ещё нет Actions, поэтому это не полный исполняемый скрипт. Показанное track: false на исходной цели не фиксирует зону действия; при добавлении действий с фиксированным началом задайте этот параметр в их цели ZONE_FULL или ZONE_BORDER.