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

Условия 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 и при каждом повторении; провал отменяет оставшиеся повторения этого действия. Удаление всех целей фильтром само по себе не отменяет будущие повторения. Провал условия скрипта не даёт начаться его перезарядке; провал условия действия не отменяет перезарядку скрипта.


Размещение блоков условий​

Блоки условий можно размещать или вкладывать двумя способами:

  1. Под отдельными действиями — условие будет применяться только к конкретному действию. Если условие выполнено, действие срабатывает; в противном случае — нет.

  2. Под всем скриптом — условие применяется ко всем действиям внутри скрипта. Если условие не выполнено, ни одно из действий не сработает.

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

Под отдельными действиями:

Пример
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 ....

УсловиеПарный ключПримечания
isAliverunIfAliveIs⚠️ Не runIfIsAliveIs
hasTagsrunIfHasTagIs⚠️ Единственное число Tag
doesNotHaveTagsrunIfDoesNotHaveTagIs⚠️ Единственное число Tag
locationIsAirrunIfLocationIsAirIs
isOnFloorrunIfIsOnFloorIs
isStandingOnMaterialrunIfIsStandingOnMaterialIs
randomChancerunIfRandomChanceIs
targetCountLowerThanrunIfTargetCountLowerThanIs
targetCountGreaterThanrunIfTargetCountGreaterThanIs

Имена ключей условий к регистру не чувствительны, поэтому 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, чтобы потребовать непустую выборку.