Создание способностей
Два способа написать способность
Файловые способности находятся в plugins/EliteMobs/powers, включая подпапки. Есть два формата:
| Формат | Файл | Назначение |
|---|---|---|
| Lua | *.lua | Скриптовое поведение с хуками босса, циклами и состоянием. Этот формат используют большинство встроенных способностей. |
| EliteScript | *.yml | Поддерживаемый декларативный формат событий и действий, описанный ниже. |
Из 71 поставляемой способности 68 используют Lua. Только bonus_coins.yml, custom_summon.yml и elite_script.yml остаются Java-способностями на основе YAML. Для нового скриптового поведения начните с Начала работы с Lua и Хуков и жизненного цикла боссов.
Оба формата назначаются боссу одинаково, через список powers.
Используйте уникальные имена файлов во всех подпапках. Реестр использует имя файла, а не путь с папкой, поэтому подпапки не разделяют одинаковые имена. Если у двух файлов одинаковое имя, EliteMobs загружает тот, чей полный путь идёт первым при сортировке, а для другого выводит Duplicate content filename, если только содержимое файлов не совпадает. После редактирования выполните /em reload и проверьте предупреждения загрузки.
.lua имеет приоритет над одноимённой .ymlКогда босс запрашивает attack_fire.yml, EliteMobs сначала ищет успешно загруженную attack_fire.lua. То же правило действует для запроса .yaml. Старые ссылки сохраняются, если замена на Lua загрузилась. В новых конфигурациях указывайте .lua напрямую. Соблюдайте регистр зарегистрированного имени файла.
.lua записываются один раз, а изменённые файлы никогда не перезаписываютсяВстроенная Lua-способность записывается, только если соответствующий файл не найден внутри powers. Когда обновление исправляет встроенную способность, EliteMobs перечисляет контрольные суммы прежних встроенных версий. Неизменённая копия, совпадающая с одной из них, перемещается в plugins/MagmaCore/outdated files/EliteMobs/, и при том же запуске записывается текущая версия. Изменённый вами файл никогда не совпадает, поэтому остаётся как есть и не получает исправлений из основной версии. Давайте изменённым копиям собственные имена и сравнивайте сохранённые готовые файлы с версией, которую хотите использовать.
on_zone_enter / on_zone_leaveОба имени хуков принимаются, но создание зоны Lua их не вызывает. Встроенный источник — слушатель зоны EliteScript: он запускается, когда YAML-скрипт того же босса указывает ZoneEnterEvent или ZoneLeaveEvent в Events: и определяет пригодную зону. События поступают всем соответствующим способностям этого босса и не указывают, какая YAML-зона их вызвала. Объявления хуков на боссе, использующем только Lua, недостаточно.
Не стройте способность вокруг этих хуков, если не сочетаете её намеренно с таким YAML-скриптом зоны. Используйте context.zones:watch_zone(...) с напрямую вызываемыми коллбэками on_enter / on_leave, блок Zone в EliteScript или опрос из on_game_tick. См. Хуки и жизненный цикл и События скриптов.
Система скриптов EliteMobs
Остальная часть страницы описывает создание Elite-скриптов.
Это продвинутая функция, требующая глубокого знания EliteMobs.
Elite-скрипты можно добавлять как файлы способностей или внутрь файлов пользовательских боссов. Файл способности назначается боссу через обычный параметр powers.
Добавление EliteScript
Добавьте в файл босса следующую запись:
eliteScript:
Регистр и отступы важны. Соблюдайте пробелы, переносы строк и форматирование примеров.
Теперь добавьте конкретный скрипт. В примере он называется Example:
eliteScript:
Example:
У EliteScript пять разделов: Events, Conditions, Zone, Actions и Cooldowns. Для работающего скрипта нужен непустой список Actions. Раздел Events можно опустить у скриптов, вызываемых другими скриптами или коллбэками приземления; без вызывающей стороны такой скрипт сам не запускается. Conditions и Cooldowns — структуры ключей и значений, а не списки.
Простой пример:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
При подходящем ударе игрока скрипт толкает элита вверх и запускает локальную перезарядку на 60 тиков и глобальную на 20 тиков. При 20 TPS это три секунды и одна секунда. Глобальная перезарядка влияет только на способности, которые её проверяют, и не блокирует все хуки или действия. YAML-скрипты, запускаемые событиями, проверяют перезарядку, когда положительно локальное или глобальное значение. Поведение вызываемых скриптов описано в руководстве по перезарядке ниже.
Разобрав общий формат, изучите возможности каждого раздела.
События
По ссылке описано использование событий.
Цели
По ссылке описано использование целей.
Действия
По ссылке описано использование действий.
Зоны
По ссылке описано использование зон.
Условия
По ссылке описано использование условий.
Перезарядка
По ссылке описана настройка перезарядки.
Добавление нескольких EliteScripts
На одно событие можно назначить несколько действий. Чтобы добавить несколько скриптов одному боссу, создайте новую запись скрипта. Расширим предыдущий пример:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60
Example2 поджигает пострадавшего игрока на 20 тиков с помощью DIRECT_TARGET. Локальная перезарядка на 200 тиков предотвращает повторный запуск этого скрипта событием в течение десяти секунд при 20 TPS. Глобальная перезарядка на 60 тиков общая для способностей, проверяющих перезарядку босса. Другие скрипты по-прежнему могут независимо поджигать игроков.
Создание автономных способностей
Размещайте автономные YAML-способности в plugins/EliteMobs/powers. Блок eliteScript определяет поведение, а необязательные поля метаданных ниже управляют загрузкой, категорией, отображением и метаданными перезарядки. Пример:
isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20
isEnabled
Определяет, включена ли настроенная способность; по умолчанию true. Для пользовательского Lua отключённый сопутствующий файл метаданных предотвращает обнаружение этого Lua-файла. Встроенная Lua-способность с отключённым сопутствующим файлом всё равно загружается, но помечается как отключённая, как описано ниже.
powerType
Тип предоставляет метаданные категории для списков по умолчанию и классификации колец с предметами. Значения:
UNIQUE: Для явного назначения. Исключается из автоматически создаваемых общих списков, но его можно вручную добавить в список естественных способностей.DEFENSIVE/MISCELLANEOUS/OFFENSIVE: Используются при создании отсутствующего общего списка соответствующей категории. Возможность назначения зависит от настроенных списков, включённого состояния и уровня моба.MAJOR_ZOMBIE,MAJOR_SKELETON,MAJOR_BLAZE,MAJOR_ENDERMAN,MAJOR_GHAST: Эти пять считаются основными способностями, все остальные — второстепенными. Естественное назначение использует списокmajorPowersсущности, а не проверку совпадения суффикса типа с сущностью во время выполнения.
Как powerType влияет на естественных элитов: EliteMobPowers.yml
Естественные элиты выбирают способности из plugins/EliteMobs/EliteMobPowers.yml, а не только по powerType. Файл содержит:
| Ключ | Значение |
|---|---|
defensivePowers | Защитные способности для случайного выбора естественными элитами |
offensivePowers | Атакующие способности для случайного выбора естественными элитами |
miscellaneousPowers | Прочие способности для случайного выбора естественными элитами |
majorPowers.<ENTITY_TYPE> | Основные способности для случайного выбора этим типом сущности |
disabledPowers.<ENTITY_TYPE> | Способности, удаляемые у этого типа сущности после применения общих списков |
Отсутствующие общие списки защитных, атакующих и прочих способностей создаются из загруженных способностей соответствующего типа. Основные способности по умолчанию явно выбраны для каждого типа сущности. Существующие списки сохраняются, поэтому позднее добавленная способность автоматически в них не попадёт: отредактируйте нужный список. И наоборот, пользовательская Lua-способность, присутствующая при создании отсутствующего списка прочих способностей, может попасть в этот стандартный пул.
Списки принимают имена .lua и старые имена .yml; генерируемые значения по умолчанию используют алиас .yml. Если имя не соответствует способности, оно пропускается с предупреждением в консоли, указывающим файл и ключ.
Слоты естественных способностей открываются на уровнях 10, 20, 30 и 40 для защитных, атакующих, прочих и основных способностей соответственно. Второй слот каждой категории открывается на уровнях 50, 60, 70 и 80. Пустые или отключённые пулы могут дать меньше способностей. Изменение списков не меняет классификацию способности как основной или второстепенной.
effect
Задаёт материал предмета, вращающегося в кольце способности. Типы MAJOR_* используют основное кольцо, остальные — второстепенное. Значение должно быть материалом предмета или названием частицы, не требующей дополнительных данных; такая частица вращается вместо предмета. Любое другое значение отключает эффект и выводит в журнал Disabled invalid power trail.
Способность без effect или с пустым значением не добавляет предмет в кольцо. Это стандартное поведение пользовательского Lua без effect в необязательном YAML-файле метаданных.
Сейчас автономные YAML-EliteScripts не копируют эти метаданные в свой след во время выполнения. Поэтому effect у такой YAML-способности не добавляет предмет в кольцо. Пользовательские Lua-способности копируют effect из сопутствующего файла.
| Ключ | Значения | По умолчанию |
|---|---|---|
effect | Материал | нет |
powerCooldown
Задаёт перезарядку метаданных способности в тиках. YAML-EliteScripts используют собственные Cooldowns.local и Cooldowns.global, заменяющие эти метаданные при инициализации скрипта. Lua-способности должны проверять и устанавливать перезарядку через документированный API.
| Ключ | Значения | По умолчанию |
|---|---|---|
powerCooldown | Целое число | 0 |
globalCooldown
Задаёт метаданные глобальной перезарядки в тиках. Она блокирует только проверяющие её способности, а не безусловно все хуки или действия. Для YAML-скриптов настраивайте собственный раздел Cooldowns скрипта.
| Ключ | Значения | По умолчанию |
|---|---|---|
globalCooldown | Целое число | 0 |
Создание автономных Lua-способностей
Автономная Lua-способность — файл .lua в plugins/EliteMobs/powers, включая подпапки. YAML-файл метаданных необязателен.
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}
Без файла метаданных .yml с тем же базовым именем в той же папке пользовательская Lua-способность получает следующие значения:
powerTypeравенMISCELLANEOUS.effectне задан.
Рядом с пользовательской my_power.lua можно добавить my_power.yml с isEnabled, powerType, effect, powerCooldown и globalCooldown. Например, powerType: UNIQUE исключает её из стандартного пула прочих способностей. Отключённый файл метаданных предотвращает загрузку этой пользовательской Lua-способности.
Файл .yml или .yaml с тем же базовым именем рядом со встроенной готовой Lua-способностью тоже применяется к ней. Его значения isEnabled, effect, powerCooldown и globalCooldown заменяют встроенные, включая значения по умолчанию для пропущенных ключей, поэтому отсутствие effect убирает предмет способности из кольца. powerType заменяет встроенный тип, только если задан. Отключённый файл не мешает встроенной способности загрузиться.
Естественные элиты используют явные пулы в EliteMobPowers.yml; проверяйте эти списки при добавлении своих способностей. Для прямого назначения добавьте имя .lua в список powers: босса.
Хуки, доступные Lua-способностям боссов
| Хук | Когда срабатывает |
|---|---|
on_spawn | Босс появляется |
on_game_tick | Каждый тик сервера, пока среда выполнения активна, не приостановлена и не подавлена |
on_boss_damaged | Босс получает урон из любого источника |
on_boss_damaged_by_player | Босс получает урон от игрока |
on_reinforcement_damaged_by_player | Подкрепление получает урон от игрока; хук выполняется на его призывателе |
on_boss_damaged_by_elite | Босс получает урон от другого элита |
on_player_damaged_by_boss | Босс наносит урон игроку |
on_enter_combat | Босс вступает в бой |
on_exit_combat | Босс выходит из боя |
on_heal | Босс исцеляется |
on_boss_target_changed | Событие выбора игрока целью, включая первый выбор; не каждая смена или потеря цели |
on_death | Босс умирает |
on_phase_switch | Босс меняет фазу |
on_mind_action | Нативный Mind запрашивает действие у назначенных способностей |
Также принимаются on_zone_enter и on_zone_leave. Встроенный диспетчер получает их от слушателя зоны EliteScript того же босса, а не от наблюдателей зон Lua. См. предупреждение в начале страницы.
Каждая назначенная Lua-способность имеет собственную среду выполнения и состояние для этого босса. Пример выше намеренно не содержит перезарядки и выполняется при каждом переданном подходящем ударе. При необходимости явно добавьте проверки и установку перезарядки: одни метаданные не ограничивают Lua-хуки. Урон может вызвать и общий, и более специфичный хук; если определить оба, могут выполниться два обработчика. Отмена, удаление и ошибки описаны в руководстве по жизненному циклу.
Доступные внутри хуков вызовы описаны в Начале работы с Lua, Хуках и жизненном цикле боссов и Боссах и сущностях.
