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

Создание способностей

webapp_banner.jpg

Два способа написать способность​

Файловые способности находятся в 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/, и при том же запуске записывается текущая версия. Изменённый вами файл никогда не совпадает, поэтому остаётся как есть и не получает исправлений из основной версии. Давайте изменённым копиям собственные имена и сравнивайте сохранённые готовые файлы с версией, которую хотите использовать.

Зоны Lua не вызывают 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, Хуках и жизненном цикле боссов и Боссах и сущностях.