Условия Elite Script
Условия позволяют скриптерам делать так, чтобы скрипты и / или действия не выполнялись при определённых обстоятельствах.
Conditions уровня скрипта с заглавной буквыНа уровне скрипта ключ учитывает регистр. Написанный там строчными буквами conditions: игнорируется, поэтому скрипт выполняется вообще без условий, и в журнал ничего не записывается. Внутри действия ключ читается в любом регистре, но если действие содержит одновременно Conditions: и conditions:, EliteMobs пропускает весь скрипт. Используйте отображение YAML, а не список. Внутренние ключи (isAlive, conditionType, Target, ...) не учитывают регистр, но значения перечислений, например BLOCKING и FILTERING, нужно писать заглавными буквами.
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Conditions:
isAlive: true
conditionType: BLOCKING
Target:
targetType: SELF
Actions:
- action: PLACE_BLOCK
Target:
targetType: SELF
offset: 0,3,0
duration: 20
material: DIRT
Conditions:
locationIsAir: true
conditionType: FILTERING
Target:
targetType: ACTION_TARGET
Cooldowns:
local: 60
global: 20
Example требует валидную сущность босса. Действие проверяет блок на 3 блока выше его позиции и размещает там землю на 20 тиков, только если там воздух. У каждого действия могут быть свои условия.
Цель
Условия используют систему целей. Их Target независим от Target действия и по умолчанию равен SELF. Используйте ACTION_TARGET с условиями FILTERING внутри действия, чтобы проверять каждую из его определённых целей отдельно.
Условия скрипта и условия действия типа BLOCKING определяют собственную Target. Цели-сущности, например SELF или NEARBY_PLAYERS, предоставляют сущности для всех проверок. LOCATION и LOCATIONS не предоставляют сущностей: к их позициям применяются только проверки местоположения, а число целей равно 0. ACTION_TARGET на этом пути ничего не определяет, поэтому применяются только randomChance и проверки числа целей. LANDING_LOCATION не работает в условиях уровня скрипта, потому что они выполняются раньше, чем появляется место приземления.
Тип условия
| Ключ | Описание | Значения |
|---|---|---|
conditionType | Задаёт тип условия | BLOCKING / FILTERING |
BLOCKING запрещает выполнение всего скрипта или отдельного действия, где размещено условие. Блокировка одного действия не блокирует остальные. FILTERING с ACTION_TARGET удаляет цели, не прошедшие применимые проверки.
Условия вне действий всегда являются BLOCKING. Условия внутри действий могут быть BLOCKING или FILTERING.
Примечание: если цель — SELF (босс), а проверка условия — isAlive, то проверка всегда является BLOCKING! Это можно поместить внутрь условия FILTERING, и эта конкретная часть всё равно будет вести себя как BLOCKING.
По умолчанию условия внутри действий имеют тип FILTERING.
Используйте ACTION_TARGET с FILTERING для проверки каждой определённой цели действия. BLOCKING требует конкретную цель условия, например SELF или NEARBY_PLAYERS: его подсчёт сущностей не обрабатывает ACTION_TARGET.
randomChance, targetCountLowerThan и targetCountGreaterThan проверяются на уровне скрипта или в условиях действия типа BLOCKING. Поцелевая фильтрация FILTERING их не оценивает.
Применимые проверки объединяются через И: все должны пройти. Блокирующая проверка требует успеха для всех выбранных сущностей и позиций. Пустая выборка сама по себе не означает провал; используйте targetCountGreaterThan: 0, если нужна хотя бы одна сущность. Если вместо ACTION_TARGET задана конкретная цель условия, фильтрация проверяет эту отдельную выборку, а затем сохраняет все исходные цели действия либо удаляет их все.
Фильтрация зависит от того, что запрашивает действие: действия над сущностями проверяют валидность, теги и позицию ног без смещения; действия над позициями проверяют только условия позиции. Теги и isAlive не фильтруют коллекцию позиций, кроме описанной выше особой блокирующей проверки валидности для SELF.
Условия скрипта проверяются до запуска действий. Блокирующие условия действия проверяются после wait и при каждом повторении; провал отменяет оставшиеся повторения этого действия. Удаление всех целей фильтром само по себе не отменяет будущие повторения. Провал условия скрипта не даёт начаться его перезарядке; провал условия действия не отменяет перезарядку скрипта.
Размещение блоков условий
Блоки условий можно размещать или вкладывать двумя способами:
-
Под отдельными действиями — условие будет применяться только к конкретному действию. Если условие выполнено, действие срабатывает; в противном случае — нет.
-
Под всем скриптом — условие применяется ко всем действиям внутри скрипта. Если условие не выполнено, ни одно из действий не сработает.
Ниже приведены примеры, демонстрирующие, как вкладывать блоки условий как для отдельных действий, так и для всего скрипта.
Под отдельными действиями:
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"
Для выполнения SET_WEATHER воздух должен быть и в позиции ног босса, и на 3 блока выше. Блокирующие условия сначала проверяют позицию сущности, затем позицию со смещением. MESSAGE всё равно выполняется, поскольку у него нет условия.
Под всем скриптом:
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"
Оба блока — в позиции ног босса и на 3 блока выше — должны быть воздухом, чтобы при ударе выполнились оба действия. Иначе блокируется весь скрипт, включая SET_WEATHER и MESSAGE.
Инвертирование условия через runIf...Is
У каждого условия есть парный ключ runIf...Is, который его переворачивает. Все они булевы и все по умолчанию равны true (то есть «выполнять, когда условие истинно»). Установка любого из них в false инвертирует это условие.
Общего ключа runIfConditionIs не существует — у каждого условия своё точное имя, и три из них не следуют очевидному шаблону. Нераспознанный ключ не игнорируется молча: при запуске он выводит Failed to read key ... for script ....
| Условие | Парный ключ | Примечания |
|---|---|---|
isAlive | runIfAliveIs | ⚠️ Не runIfIsAliveIs |
hasTags | runIfHasTagIs | ⚠️ Единственное число Tag |
doesNotHaveTags | runIfDoesNotHaveTagIs | ⚠️ Единственное число Tag |
locationIsAir | runIfLocationIsAirIs | |
isOnFloor | runIfIsOnFloorIs | |
isStandingOnMaterial | runIfIsStandingOnMaterialIs | |
randomChance | runIfRandomChanceIs | |
targetCountLowerThan | runIfTargetCountLowerThanIs | |
targetCountGreaterThan | runIfTargetCountGreaterThanIs |
Имена ключей условий к регистру не чувствительны, поэтому runifaliveis тоже работает.
runIfConditionTypeIs ничего не делаетrunIfConditionTypeIs принимается парсером без предупреждения, но никто его не читает. Для выбора BLOCKING или FILTERING используйте conditionType; инвертировать его никак нельзя.
Например, locationIsAir: true требует воздух. Добавление runIfLocationIsAirIs: false инвертирует сравнение и требует блок, отличный от воздуха. Инвертируется настроенное сравнение: если и булево условие, и его парный ключ равны false, результат снова переворачивается.
Пример:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
runIfLocationIsAirIs: false
Target:
targetType: SELF
Это действие устанавливает грозу, только если блок в позиции ног босса не является воздухом, например когда босс в воде. Инверсия isAlive проверяет валидность Bukkit, а не создаёт триггер смерти. Отсутствующая сущность не проходит проверку даже с инверсией.
Условия на основе локации
locationIsAir
Проверяет, является ли целевой блок воздухом, включая пещерный воздух и воздух пустоты. Значение false требует блок, отличный от воздуха.
| Ключ | Описание | Значения |
|---|---|---|
locationIsAir | Задаёт проверку того, является ли локация блоком воздуха (или наоборот). | Boolean |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"
Действие погоды требует воздух и в позиции ног босса, и на 3 блока выше. Чтобы действие над позициями проверяло только свою фактическую цель, используйте FILTERING с ACTION_TARGET, как в первом примере.
isOnFloor
Проверяет, что блок в указанной позиции не твёрдый, а блок на одну единицу ниже — твёрдый. Это проверка материала, а не фактического контакта сущности с землёй или формы коллизии.
| Ключ | Описание | Значения |
|---|---|---|
isOnFloor | Задаёт проверку того, является ли локация локацией пола (или наоборот). | Boolean |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isOnFloor: true
Target:
targetType: SELF
Действие погоды требует нетвёрдый блок в позиции ног босса и твёрдый блок на одну единицу ниже. Провал блокирует это действие.
isStandingOnMaterial
Проверяет точный материал блока на одну единицу ниже целевой позиции.
| Ключ | Описание | Значения |
|---|---|---|
isStandingOnMaterial | Задаёт, какой тип материала следует проверять. | Material |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isStandingOnMaterial: BIRCH_WOOD
Target:
targetType: SELF
Действие погоды требует BIRCH_WOOD на одну единицу ниже ног босса. BIRCH_LOG и BIRCH_PLANKS не подходят. Провал блокирует это действие.
Условия на основе сущностей
isAlive
Проверяет Bukkit-состояние isValid() целевой сущности. Это проверка валидности, а не прямое сравнение здоровья; отсутствующая сущность не проходит проверку.
| Ключ | Описание | Значения |
|---|---|---|
isAlive | Ожидаемая валидность сущности Bukkit. | Булево значение |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isAlive: true
Target:
targetType: SELF
Действие погоды выполняется, только пока Bukkit-сущность босса валидна. Провал блокирует это действие.
hasTags
Требует все перечисленные теги в хранилище EliteMobs отслеживаемого элитного моба или игрока. Теги — строки с учётом регистра, задаваемые действиями вроде TAG и UNTAG. Ванильные теги scoreboard не читаются; у обычных мобов такого хранилища нет. Без него hasTags проваливается, а doesNotHaveTags проходит до применения инверсии.
| Ключ | Описание | Значения |
|---|---|---|
hasTags | Задаёт проверку того, есть ли у сущности список тегов. | String List |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
hasTags:
- isCool
- hasANiceBeard
Target:
targetType: SELF
Действие погоды требует у босса одновременно isCool и hasANiceBeard. Провал блокирует это действие.
doesNotHaveTags
Проходит, если у цели нет всех перечисленных тегов одновременно. Достаточно отсутствия одного; отсутствие каждого тега не требуется.
| Ключ | Описание | Значения |
|---|---|---|
doesNotHaveTags | Задаёт проверку того, что у сущности нет списка тегов. | String List |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
doesNotHaveTags:
- isStinky
- isSus
Target:
targetType: SELF
Действие выполняется, если у босса нет одновременно isStinky и isSus. Наличие только одного из этих тегов не мешает пройти условие.
Прочие условия
randomChance
Генерирует новое случайное число каждый раз, когда блокирующие проверки доходят до этого условия. Используйте одно число от 0.0 (никогда) до 1.0 (всегда), а не диапазон с ~. runIfRandomChanceIs: false инвертирует результат. У повторяющегося действия неудачный бросок отменяет оставшиеся повторения.
| Ключ | Описание | Значения |
|---|---|---|
randomChance | Шанс того, что условие будет истинным. | Число от 0.0 до 1.0 |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
randomChance: 0.1
Target: # Not required
targetType: SELF # Not required
При каждой проверке действие погоды имеет 10% шанс выполниться. Провал блокирует это действие.
Явный Target условия необязателен, поскольку по умолчанию используется SELF. Его отсутствие не отключает другие условия в том же блоке.
Фильтрация NEARBY по тегам
Чтобы отфильтровать NEARBY_MOBS или NEARBY_PLAYERS по определённым тегам, используйте ACTION_TARGET в качестве цели условия (если условие применяется к действию, а не к самому скрипту). Это гарантирует, что скрипт точно отфильтрует только мобов/игроков с указанными тегами.
Пример
eliteScript:
Example:
Actions:
- action: SET_MOB_AI
Target:
targetType: NEARBY_MOBS
range: 40
bValue: false
Conditions:
conditionType: FILTERING
hasTags:
- TurnOff
Target:
targetType: ACTION_TARGET
Скрипт отключает ИИ отслеживаемых элитных мобов с тегом TurnOff в прямоугольной области, простирающейся на 40 блоков по каждой оси; сам босс исключён. У обычных мобов такого хранилища тегов нет. В примере отсутствует Events: вызовите его из другого скрипта или добавьте событие запуска.
targetCountLowerThan и targetCountGreaterThan
Сравнивает количество сущностей цели условия до проверки тегов и других условий для отдельных сущностей. Это не число отфильтрованных целей действия. Сравнения строгие: равенство не подходит.
| Ключ | Описание | Значения |
|---|---|---|
targetCountLowerThan | Требует количество сущностей цели условия строго меньше порога. | Целое число |
| Ключ | Описание | Значения |
|---|---|---|
targetCountGreaterThan | Требует количество сущностей цели условия строго больше порога. | Целое число |
Пример
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
targetCountGreaterThan: 2
Target:
targetType: NEARBY_MOBS
range: 15
Действие погоды выполняется, если в прямоугольной области, простирающейся на 15 блоков по каждой оси, больше 2 живых сущностей, не являющихся игроками. Сам босс исключён.
Задайте Target условия явно, чтобы считать нужную группу. Если его опустить, считается выборка SELF по умолчанию. Используйте targetCountGreaterThan: 0, чтобы потребовать непустую выборку.