Перезарядка Elite Script
Перезарядки определяют, когда событие может снова запустить тот же скрипт и когда могут начинаться другие участвующие способности. Они не влияют на скрипты, обходящие перезарядку, и Lua-колбэки без её проверки.
Расположение в конфигурации
Перезарядки настраиваются в разделе Cooldowns elite-скрипта:
eliteScript:
ScriptName:
Events:
- [event configuration]
Actions:
- [action configuration]
Cooldowns:
local: [value or range]
global: [value or range]
Название раздела должно быть точно Cooldowns, с учётом регистра. Ключи внутри него к регистру нечувствительны (local, Local, LOCAL работают). Используйте целое число тиков или диапазон целых чисел, а не дробные значения. Дробное число, обратный диапазон вроде 80~40 или текст, не являющийся числом, заставляют EliteMobs пропустить весь скрипт и записать в журнал Skipped script <name> in <file>.
Примечание о единицах измерения: все значения перезарядки указываются в тиках. В Minecraft 20 тиков в секунду, поэтому:
- 20 тиков = 1 секунда
- 60 тиков = 3 секунды
- 100 тиков = 5 секунд
- 99999 тиков ≈ 83 минуты
Значения по умолчанию
Если раздел Cooldowns опущен, и local, и global по умолчанию равны 0, то есть скрипт полностью обходит систему перезарядки.
Обход перезарядки
Скрипт ограничивается системой перезарядки, когда local или global больше 0. Такой скрипт не запускается, пока активна его собственная локальная перезарядка или пока босс находится в глобальной перезарядке. Если оба значения отсутствуют, равны нулю или отрицательны, проверка перезарядки пропускается; проверки события, условий и подавления способностей сохраняются. Используйте неотрицательные значения.
Один local: 200 ограничивает запуск скрипта одним разом за 200 тиков. Кроме того, скрипт будет ждать, пока любая другая способность удерживает глобальную перезарядку босса.
Один global: 20 задерживает другие участвующие способности на 20 тиков после запуска скрипта. Сам скрипт ждёт ту же глобальную перезарядку, поэтому тоже не сможет запуститься снова в течение 20 тиков.
Этот обход сделан намеренно для обработки событий, которая должна выполняться независимо от перезарядки босса.
Пример:
eliteScript:
AlwaysTeleportOnCombatEnter:
Events:
- EliteMobEnterCombatEvent
Actions:
- action: TELEPORT
Target:
targetType: SELF
FinalTarget:
targetType: SELF_SPAWN
# No Cooldowns section - script always executes when event fires
У перезарядки есть два значения:
local
local задаёт время в тиках, прежде чем тот же самый скрипт сможет сработать снова. Пример:
Пример
local: 60
Позволяет повторить способность через 3 секунды, если босс не находится в глобальной перезарядке и пройдены остальные проверки.
global
global задаёт время в тиках, прежде чем сможет сработать любой другой скрипт или способность[1]. Пример:
Пример
global: 20
Запрещает другим участвующим способностям запускаться в течение 1 секунды.
[1] global задаёт общий флаг перезарядки босса. Другие способности учитывают его, только если их собственные проверки участвуют в системе. Способности EliteMobs написаны как EliteScript или Lua-способности; Lua-способность использует тот же период, вызывая context.cooldowns:set_global(ticks) и проверяя context.cooldowns:global_ready() перед запуском. Часто срабатывающий скрипт может заставить более медленные участвующие способности ждать.
Локальная перезарядка длиннее глобальной оставляет время другим подходящим способностям. Чередование не гарантируется: каждой способности по-прежнему нужны своё событие и успешные проверки условий и перезарядки.
Кроме того, если у вашей способности есть определённая длительность, в течение которой она активна, вам следует использовать эту систему, чтобы предотвратить одновременное выполнение других способностей, которые могут испортить вашу способность.
Перезарядки начинаются при запуске действий скрипта, а не после завершения их wait, повторений или длительности. Невыполненные условия самого скрипта не запускают перезарядку, но отдельные действия, не прошедшие свои проверки, всё равно могут оставить перезарядку скрипта активной.
Каждая перезарядка хранит тик, на котором она заканчивается. При повторном применении перезарядки сохраняется более поздний тик окончания, поэтому более короткая глобальная перезарядка от другой способности никогда не обрывает более длинную. Локальные перезарядки ведут себя так же, когда другой скрипт напрямую вызывает тот же скрипт.
Рандомизация
И local, и global перезарядки поддерживают рандомизацию с помощью синтаксиса диапазона. Это позволяет длительности перезарядки варьироваться, добавляя непредсказуемости поведению босса.
Пример:
Cooldowns:
local: 40~80
global: 10~30
Задаёт локальную перезарядку случайным образом в диапазоне от 40 до 80 тиков (2–4 секунды), а глобальную — случайным образом от 10 до 30 тиков (0,5–1,5 секунды).
Текущая реализация выбирает каждое значение диапазона при создании экземпляра скрипта и сохраняет его в этом экземпляре способности. При каждом применении перезарядки нового выбора нет.
Запуск скриптов один раз с помощью перезарядки
Чтобы гарантировать, что скрипты срабатывают только один раз, при этом всё ещё используя событие, которое может произойти несколько раз за бой, установите локальную перезарядку на большое число, например 99999. Этот пример демонстрирует концепцию:
Пример
eliteScript:
SetMeOnFireOnlyOnce:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_ON_FIRE
duration: 60
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 99999
В этом сценарии событие EliteMobDamagedByPlayerEvent запускает действие SET_ON_FIRE. Без перезарядки это действие активировалось бы каждый раз, когда игрок ударяет моба.
При local: 99999 действие может сработать не чаще одного раза за 99999 тиков, около 83 минут. Обычно это предотвращает второй запуск за бой, но не является флагом «один раз за встречу»: выход из боя и возвращение не сбрасывают таймер в том же экземпляре способности.
Одного local достаточно для включения проверки, поэтому этому скрипту не нужно значение global. Без global он также никогда не задерживает другие способности босса.
Устранение неполадок
Недопустимые ключи перезарядки
Если вы используете нераспознанный ключ в разделе Cooldowns, в логах сервера появится предупреждение:
Failed to parse cooldown entry for script name [ScriptName] in config file [FileName]
Допустимые ключи: local, global (без учёта регистра)
Описанная проверка применяется к обычной обработке событий. Скрипты, вызванные через RUN_SCRIPT или колбэк приземления, проверяют условия, но не выполняют ту же проверку перезарядки перед запуском. После запуска они всё равно применяют настроенные перезарядки.