Создание способностей
Два способа написать способность
Каждая способность находится в ~/plugins/EliteMobs/powers (подпапки тоже сканируются), и существуют два формата:
| Формат | Файл | Для чего использовать |
|---|---|---|
| Lua | *.lua | Для всего нового. Полноценный язык скриптинга, все хуки боссов, циклы и состояние. Именно его используют поставляемые способности. |
| EliteScript | *.yml | Декларативный формат событий/действий, описанный на остальной части этой страницы. По-прежнему полностью поддерживается. |
Почти все 68 способностей, поставляемых с EliteMobs, теперь на Lua. Только bonus_coins.yml, custom_summon.yml и elite_script.yml остаются Java-способностями на YAML. Если вы пишете новую способность с нуля, Lua — это путь с наибольшими возможностями; начните с Начала работы с Lua и Хуков и жизненного цикла боссов.
На оба формата ссылаются из босса одинаково — через список powers.
.lua имеет приоритет над одноимённой .ymlКогда босс запрашивает attack_fire.yml, EliteMobs сначала ищет attack_fire.lua и использует его, если он существует. Именно поэтому старые конфиги боссов, написанные под до-Lua имена способностей, продолжают работать без изменений — переписывать списки powers: не нужно. В новых конфигах следует указывать файл .lua напрямую.
.lua записываются один раз и никогда не перезаписываютсяКаждая поставляемая Lua-способность записывается в папку powers, только если такого файла ещё нет. Как только вы отредактируете один из них, EliteMobs не перезапишет вашу версию при обновлении — но вы также перестанете получать исправления из апстрима для неё. Если вам нужна изменённая копия, лучше дайте ей новое имя файла.
on_zone_enter / on_zone_leave не вызываются зонами LuaОба имени хуков принимаются провайдером скриптов боссов и не вызовут ошибку загрузки, но ничто в Lua-способности не может заставить их сработать. Они диспетчеризуются только из слушателя зон EliteScript, который запускается, когда YAML-eliteScript: на том же боссе перечисляет ZoneEnterEvent или ZoneLeaveEvent в своих Events:. Босс, у которого есть только Lua-способности, загрузит файл с этими хуками и затем никогда их не вызовет.
Не стройте Lua-способность вокруг этих двух хуков, если только вы намеренно не сочетаете её с таким YAML-скриптом зон. Вместо этого используйте context.zones:watch_zone(...) (чьи собственные коллбэки on_enter / on_leave вызываются напрямую), блок Zone в EliteScript или опрос из on_game_tick. См. Хуки и жизненный цикл и События скриптов.
Система скриптов EliteMobs
На остальной части этой страницы описано, как создавать Elite-скрипты!
Это продвинутая функция, требующая глубоких знаний EliteMobs.
Примечание: Elite-скрипты можно добавлять как файлы способностей или в файлы пользовательских боссов! При использовании в качестве файлов способностей вы можете добавлять их как обычные способности к боссам, используя параметр конфигурации powers пользовательских боссов, как обычно.
Добавление EliteScript
Чтобы начать добавление EliteScript к боссу, добавьте следующую запись в файл босса:
eliteScript:
Примечание: Следующее крайне чувствительно к регистру и пробелам! Убедитесь, что ваши пробелы, переносы строк и общее форматирование соответствуют примерам!
После объявления начала скрипта вы можете добавить свой конкретный скрипт. В этом примере мы создадим скрипт с именем Example:
eliteScript:
Example:
EliteScripts имеют 5 различных разделов: Events, Conditions, Zones, Actions и Cooldowns. Обязательным является только Actions.
Рассмотрим простой пример:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Этот скрипт заставляет элитного моба отлетать вверх при ударе игроком и не повторяет это в течение 3 секунд (а также блокирует срабатывание других способностей на 1 секунду из-за настроек в разделе Cooldowns).
Теперь, когда вы знаете общий формат структуры скриптов, пора узнать, что можно делать с каждым разделом!
Events
Нажмите на ссылку выше, чтобы узнать, как использовать события!
Targets
Нажмите на ссылку выше, чтобы узнать, как использовать цели!
Actions
Нажмите на ссылку выше, чтобы узнать, как использовать действия!
Zones
Нажмите на ссылку выше, чтобы узнать, как использовать зоны!
Conditions
Нажмите на ссылку выше, чтобы узнать, как использовать условия!
Cooldowns
Нажмите на ссылку выше, чтобы узнать, как использовать перезарядку!
Добавление нескольких 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
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60
В этом примере мы добавили второй скрипт под названием Example2. Example2 подожжёт игрока, получившего урон от босса, поскольку targetType установлен на DIRECT_TARGET.
Перезарядка этого скрипта установлена на 200 тиков, что означает, что босс сможет поджигать игроков только каждые 10 секунд.
Создание автономных способностей
Автономные способности почти полностью состоят из Elite Script. Есть только два необязательных поля. Не забывайте, что для работы автономных способностей они должны быть размещены в папке ~plugins/EliteMobs/powers.
Пример автономной способности:
isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20
isEnabled
Как и везде в плагине, определяет, включена ли способность.
powerType
Тип способности определяет, как она назначается. Значения:
UNIQUE: Способность будет применяться только к пользовательским боссам, у которых она указана в разделе способностей.DEFENSIVE/MISCELLANEOUS/OFFENSIVE: ЛЮБОЙ элитный моб сможет получить эти способности, и они будут относиться к определённой подкатегории способностей.MAJOR_ZOMBIE,MAJOR_SKELETON,MAJOR_BLAZE,MAJOR_ENDERMAN,MAJOR_GHAST: Только элиты соответствующего типа сущности смогут естественно появляться с этими способностями, и они будут считаться основными способностями. Эти пять типов — единственные, что считаются основными (major) способностями; всё остальное считается второстепенной способностью.
Как powerType доходит до естественных элит: EliteMobPowers.yml
powerType сам по себе не помещает способность в распоряжение естественного элита. Естественные элиты на самом деле разыгрывают способности из ~/plugins/EliteMobs/EliteMobPowers.yml, где есть следующие списки:
| Ключ | Значение |
|---|---|
defensivePowers | Защитные способности, которые естественные элиты могут случайно получить |
offensivePowers | Атакующие способности, которые естественные элиты могут случайно получить |
miscellaneousPowers | Прочие способности, которые естественные элиты могут случайно получить |
majorPowers.<ENTITY_TYPE> | Основные способности, которые может случайно получить этот тип сущности |
disabledPowers.<ENTITY_TYPE> | Способности, убираемые у этого типа сущности после применения общих списков |
При первой генерации файла каждый список заполняется всеми загруженными способностями соответствующего powerType. После этого файл становится источником истины и никогда не пересоздаётся заново, поэтому способность, добавленная вами позже — включая любой файл .lua, который вы кладёте в папку powers, — не начнёт появляться у естественных элит, пока вы сами не добавите её в нужный список.
В этих списках принимаются как имена файлов .lua, так и устаревшие имена .yml; сгенерированные значения по умолчанию записываются с использованием алиаса .yml. Имя, которое не разрешается ни в одну способность, пропускается с предупреждением в консоли, называющим файл и ключ.
effect
Устанавливает визуальный эффект или материал, используемый способностью. Это используется некоторыми жёстко закодированными способностями для определения их визуального эффекта частиц или материала.
| Ключ | Значения | По умолчанию |
|---|---|---|
effect | String | none |
powerCooldown
Устанавливает перезарядку в тиках для отдельной способности. Это контролирует, как часто эта конкретная способность может срабатывать.
| Ключ | Значения | По умолчанию |
|---|---|---|
powerCooldown | Integer | 0 |
globalCooldown
Устанавливает глобальную перезарядку в тиках, общую для всех способностей. После срабатывания этой способности никакая другая способность не может сработать, пока не истечёт глобальная перезарядка.
| Ключ | Значения | По умолчанию |
|---|---|---|
globalCooldown | Integer | 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
}
Поскольку нет YAML-заголовка, откуда их можно прочитать, обнаруженная таким образом Lua-способность получает фиксированные метаданные:
powerTypeравенMISCELLANEOUS. Задать его равнымUNIQUEиз файла нельзя. (Lua-способности, поставляемые с EliteMobs, несут свой тип в Java, поэтому они могут бытьUNIQUE,OFFENSIVE,MAJOR_*и так далее.)effectне задан.
На практике это не приводит к утечке вашей способности к случайным элитам, потому что пулы розыгрыша для естественных элит берутся из EliteMobPowers.yml, а этот файл не пересоздаётся, если он уже существует — см. выше. Чтобы использовать способность, добавьте её в список powers: босса.
Хуки, доступные Lua-способностям боссов
| Хук | Когда срабатывает |
|---|---|
on_spawn | Босс появляется |
on_game_tick | Каждый тик сервера |
on_boss_damaged | Босс получает урон из любого источника |
on_boss_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_zone_enter и on_zone_leave также принимаются парсером, но ничто в Lua-способности не может заставить их сработать — они диспетчеризуются только из слушателя зон EliteScript на том же боссе. См. предупреждение в начале этой страницы.
О том, что именно можно вызывать внутри этих хуков, см. Начало работы с Lua, Хуки и жизненный цикл боссов и Босс и сущности.
