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

Lua-скриптинг: Босс и сущности

webapp_banner.jpg

Эта страница охватывает всё, что касается обёрток босса и сущностей в Lua-способностях EliteMobs: context.boss, context.player, context.players, context.entities и таблиц-обёрток сущностей, которые они возвращают. Если вы новичок в Lua-способностях, начните сначала с Начало работы.


Обёртки сущностей​

Через context.boss, context.player, результаты запросов вроде context.players:nearby_players() и поля событий вы получаете таблицы-обёртки, а не объекты Bukkit. Поля содержат снимки на момент создания, а методы обращаются к серверу при вызове.

Эта страница описывает собственные обёртки способностей босса EliteMobs. Общие методы MagmaCore, например context.world:get_entity(uuid), могут возвращать другую обёртку с ленивым чтением текущих полей и другими сигнатурами. Для них используйте общий справочник API. Собственные методы принимают вызов через двоеточие или через точку без явного аргумента self. Присваивание полю меняет только Lua-таблицу; для изменения сущности вызывайте метод.

Два правила, которые нужно запомнить:

  • Поля, такие как health, current_location и maximum_health, являются снимками. Они отражают состояние на момент создания обёртки и не обновляются автоматически.
  • Методы, такие как get_location(), get_health() и is_alive(), выполняют живую проверку каждый раз при вызове.

Общие поля сущностей​

Каждая обёртка живой сущности включает эти поля.

ПолеТипПримечания
entity.namestringОтображаемое имя
entity.uuidstringUUID в виде текста
entity.entity_typestringИмя Bukkit EntityType (например, "ZOMBIE", "PLAYER")
entity.is_playerbooleantrue для игроков
entity.is_elitebooleantrue, если EliteMobs отслеживает её как элитку
entity.is_mountbooleantrue, если эта обёртка представляет ездовое животное босса
entity.is_monsterbooleantrue для сущностей типа «монстр»
entity.healthnumberТекущее здоровье (снимок)
entity.maximum_healthnumberМаксимальное здоровье (снимок)
entity.current_locationтаблица позицииПозиция на момент создания обёртки
entity.is_validbooleanВалидность Bukkit на момент создания обёртки, а не только наличие сущности; снимок
is_valid — это поле у живых сущностей, а не метод

У обёрток живых сущностей (включая context.player и context.boss) is_valid — это обычное булево значение, зафиксированное при создании обёртки. Вызов entity:is_valid() вызывает ошибку attempt to call a boolean value и отключает пауэр.

  • Читайте снимок через entity.is_valid (через точку).
  • Для живой проверки вместо этого вызывайте entity:is_alive() — она каждый раз заново опрашивает сервер.

is_valid() действительно является настоящим методом у более лёгких обёрток-ссылок на неживые сущности, возвращаемых summon_projectile, spawn_falling_block_at_location и им подобными. Именно эти обёртки вы, скорее всего, будете хранить между тиками, и именно там живая проверка имеет значение.

Чтобы прочитать специфичные для элитки данные, такие как уровень босса, используйте поля и методы context.boss, описанные в разделе context.boss ниже. Чтобы деспавнить элитку из скрипта, вызовите метод entity:remove_elite().

Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
end
}
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local target = context.players:current_target()
if target ~= nil then
context.log:info("Target: " .. target.name .. " HP: " .. target.health)
end
end
}

Общие методы сущностей​

Эти методы обращаются к текущему состоянию сервера. Перемещение, здоровье, экипировка и эффекты доступны обёрткам живых сущностей. Чат, строка действий, заголовки, полосы босса и команды игрока требуют обёртку игрока. context.boss:send_message(...) является отдельным методом босса для рассылки ближайшим игрокам. Если возврат не описан отдельно, изменяющие методы возвращают nil, а не признак успеха.

Изменения ИИ, осведомлённости, неуязвимости и масштаба принадлежат способности, которая их внесла. Каждое из них запоминает заменённое значение: положительная длительность восстанавливает его через указанное число тиков, а закрытие скрипта восстанавливает все ещё активные изменения. Если одно свойство меняют несколько способностей, завершение одного изменения восстанавливает самое последнее из оставшихся либо исходное значение, если других изменений нет. Если тем временем свойство изменит другой плагин или команда, его значение сохраняется. Приостановка скрипта эти изменения не отменяет. Длительности тегов, отложенные толчки и полосы босса игрока используют независимые задачи игровых часов, которые продолжают работать после закрытия скрипта. Прочие изменения сущностей не отменяются.


entity:is_alive()​

Возвращает true, если сущность всё ещё валидна и не мертва.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:is_alive() then
context.player:send_message("&aYou're still standing!")
end
end
}

entity:get_location()​

Возвращает текущую позицию в виде таблицы локации.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.world:play_sound_at_location(loc, "entity.experience_orb.pickup")
end
}

entity:get_eye_location()​

Возвращает локацию на уровне глаз в виде таблицы локации.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local eye = context.player:get_eye_location()
context.world:spawn_particle_at_location(eye, "FLAME")
end
}

entity:get_health() / entity:get_maximum_health()​

Читает текущее или максимальное здоровье непосредственно с сервера.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local pct = context.player:get_health() / context.player:get_maximum_health()
if pct < 0.25 then
context.player:send_message("&cYou're running low!")
end
end
}

entity:get_velocity()​

Возвращает текущую скорость сущности в виде таблицы вектора.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local vel = context.player:get_velocity()
context.log:info("Player speed Y: " .. vel.y)
end
}

entity:send_message(text)​

Отправляет сообщение в чат игрока с поддержкой цветов EliteMobs.

ПараметрТипПримечания
textstringСообщение с цветовыми кодами
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&6[Boss] &fPrepare yourself!")
end
}

entity:show_action_bar(message)​

Отправляет игроку сообщение через источник Lua в компоновщике строки действий EliteMobs. Скрипт не получает исключительное право на эту область экрана.

ПараметрТипПримечания
messagestringТекст строки действий с цветовыми кодами
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:show_action_bar("&c&lDANGER ZONE")
end
}

entity:show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])​

Отправляет игроку заголовок и необязательный подзаголовок с цветами EliteMobs. Время задаётся целым числом тиков.

ПараметрТипПо умолчаниюПримечания
titlestringТекст заголовка
subtitlestring""Текст подзаголовка
fadeInnumber10Тики появления
staynumber40Тики отображения
fadeOutnumber10Тики исчезновения
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_title("&4PHASE 2", "&7The boss is enraged!", 10, 40, 10)
end
end
}

entity:show_boss_bar(title[, color][, style][, duration])​

Создаёт новую полосу босса для игрока через менеджер порядка полос. Регистр названий цвета и стиля не учитывается; неизвестные значения заменяются на WHITE и SOLID. Положительная длительность запускает независимый таймер удаления. Неположительное значение не добавляет таймер, а метод не возвращает дескриптор или ключ для последующего удаления. Используйте положительную длительность. Сигнатура отличается от общего API MagmaCore с именованными полосами.

ПараметрТипПо умолчаниюПримечания
titlestringТекст заголовка полосы
colorstring"WHITE"Значение BarColor
stylestring"SOLID"Значение BarStyle
durationnumber40Длительность в тиках
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_boss_bar("&cIncoming Attack!", "RED", "SOLID", 100)
end
end
}

entity:teleport_to_location(location)​

Запрашивает телепортацию Bukkit и возвращает nil, не сообщая об успехе. Собственное преобразование позиции принимает x, y, z, необязательные yaw/pitch, имя загруженного world или вложенную таблицу current_location. Пропущенные координаты равны 0; пропущенный мир берётся у босса-заклинателя, а не обязательно у цели. Явно неизвестный мир не преобразуется. nil и значения не в виде таблицы используют позицию босса. Проверки безопасности точки назначения и защиты региона здесь не добавляются.

ПараметрТипПримечания
locationтаблица позицииПункт назначения
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}

entity:set_velocity_vector(vector)​

Немедленно задаёт скорость сущности.

ПараметрТипПримечания
vectorтаблица вектора{ x, y, z } или { x = 0, y = 1, z = 0 }
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("launch", 100) then return end
context.player:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
context.player:send_message("&cYou are launched into the air!")
end
}

entity:apply_push_vector(vector[, additive][, delay])​

Сохраняет переданный вектор и применяет его после задержки, по умолчанию 1 тик. Независимый таймер проверяет валидность сущности. При additive = true вектор добавляется к скорости на момент выполнения, иначе заменяет её. Приостановка или закрытие скрипта не отменяет толчок.

ПараметрТипПо умолчаниюПримечания
vectorтаблица вектораНаправление и сила
additivebooleanfalseДобавить к существующей скорости вместо замены
delaynumber1Задержка в тиках перед применением
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("push_up", 100) then return end
context.player:apply_push_vector({ x = 0, y = 2.0, z = 0 })
context.player:send_message("&cUpward blast!")
end
}

entity:face_direction_or_location(directionOrLocation)​

Меняет направление взгляда телепортацией в текущую позицию с новым поворотом. Таблица со строковым world или вложенным current_location считается точкой назначения в том же мире, что и сущность. Обычная таблица x/y/z считается вектором направления. Нулевой вектор ничего не делает.

ПараметрТипПримечания
directionOrLocationтаблица вектора или позицииЦель, к которой повернуться
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}

entity:set_fire_ticks(ticks)​

Задаёт число тиков горения Bukkit. При вызове правила эффектов экземпляра подземелья повторно проверяют цель. Игрок должен быть онлайн, жив и в мире источника; в экземпляре он также должен входить в активный матч и список участников. Другие живые сущности должны быть валидны. Это не гарантирует урон от огня.

ПараметрТипПримечания
ticksnumberДлительность горения в тиках (20 тиков = 1 секунда)
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}

entity:add_visual_freeze_ticks([ticks])​

Добавляет реальные тики замерзания Bukkit с теми же правилами целей, что и set_fire_ticks. Это не только экранный эффект через пакеты и не прямая остановка ИИ или движения. Возможно обычное поведение замерзания Minecraft.

ПараметрТипПо умолчаниюПримечания
ticksnumber1Количество тиков заморозки
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("freeze", 200) then return end
context.player:add_visual_freeze_ticks(100)
context.player:send_message("&bYou feel a chilling frost!")
end
}

entity:apply_potion_effect(effect, duration[, amplifier])​

Применяет эффект Bukkit после той же проверки цели, что и set_fire_ticks. Регистр имени не учитывается; неизвестное имя вызывает предупреждение без применения эффекта. Замена существующих эффектов подчиняется правилам Bukkit и не является принудительной.

ПараметрТипПо умолчаниюПримечания
effectstringИмя PotionEffectType
durationnumberДлительность в тиках
amplifiernumber0Уровень эффекта (0 = уровень I)
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("slow", 200) then return end
context.player:apply_potion_effect("SLOWNESS", 60, 1)
context.player:send_message("&7You feel sluggish...")
end
}

предупреждение

remove_potion_effect(effect) недоступен в собственных обёртках способностей босса EliteMobs, но присутствует в общих обёртках MagmaCore. При применении задавайте подходящую длительность. Эффект с нулевой длительностью не является надёжным способом удалить уже действующий эффект.


entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)​

Передаёт урон в Bukkit. Все три метода возвращают nil; запрошенное количество не доказывает потерю здоровья. Боевые правила и последующие обработчики могут изменить или отменить удар.

МетодПримечания
deal_damage(amount)Вызывает урон Bukkit без явного атакующего
deal_custom_damage(amount)Использует BossCustomAttackDamage от босса-заклинателя: отклоняет себя, мёртвые и неуязвимые цели, игроков вне Survival/Adventure; передаёт особый удар, затем сбрасывает собственную задержку получения урона
deal_damage_from_boss(amount)Вызывает урон Bukkit от босса-заклинателя; может применяться обычная боевая обработка EliteMobs
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(10)
for _, p in ipairs(nearby) do
p:deal_custom_damage(10)
p:send_message("&cThe boss unleashes a shockwave!")
end
end
}

entity:restore_health(amount)​

Для отслеживаемых элитных сущностей вызывает лечение EliteMobs и отменяемое событие EliteMobHealEvent. Остальные живые сущности лечатся напрямую до базового значения атрибута максимального здоровья, которое может отличаться от итогового значения get_maximum_health(). Передавайте неотрицательное количество. Это не API урона с автоматическим ограничением ввода.

ПараметрТипПримечания
amountnumberКоличество исцеления
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}

entity:set_invulnerable(enabled[, duration])​

Задаёт неуязвимость сущности и запоминает заменённое значение. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Повторный вызов из той же способности заменяет её прежнее изменение.

ПараметрТипПо умолчаниюПримечания
enabledbooleantrue, чтобы включить неуязвимость
durationnumber0Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("shield", 200) then return end
context.player:set_invulnerable(true, 40)
context.player:send_message("&6A brief shield protects you!")
end
}

entity:set_ai_enabled(enabled[, duration])​

Задаёт состояние ИИ сущности и запоминает заменённое значение. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Вызов set_ai_enabled(true), пока эта способность удерживает изменение ИИ, завершает это изменение и восстанавливает заменённое значение, а не применяет новое.

ПараметрТипПо умолчаниюПримечания
enabledbooleantrue, чтобы включить ИИ
durationnumber0Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Disable boss AI for 3 seconds at combat start
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned!")
end
}

entity:add_tag(tag[, duration]) / entity:remove_tag(tag) / entity:has_tag(tag)​

Управляет тегами отслеживаемых элитных сущностей и игроков с загруженными данными инвентаря EliteMobs. Это не теги scoreboard Bukkit, и они не применяются к обычным неотслеживаемым мобам. Регистр учитывается. Таймеры удаления независимы: старый таймер может удалить повторно добавленный одноимённый тег.

МетодПараметрПримечания
add_tag(tag[, duration])string, опциональное numberДобавляет тег, опционально автоматически удаляя его через столько тиков
remove_tag(tag)stringУдаляет тег
has_tag(tag)stringВозвращает true, если тег присутствует
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}

entity:run_command(command)​

Немедленно выполняет команду от имени игрока с его разрешениями и возвращает nil. Метод доступен только игроку, подстановки не раскрываются. Не добавляйте начальный /.

ПараметрТипПримечания
commandstringТекст команды без ведущего /
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("curse_cmd", 200) then return end
context.player:run_command("say I have been cursed!")
end
}

entity:set_scale(scale[, duration])​

Задаёт базовое значение атрибута масштаба, если он доступен, а не умножает текущий размер, и запоминает заменённое значение. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Модификаторы атрибута могут менять итоговый размер.

ПараметрТипПо умолчаниюПримечания
scalenumberБазовое значение атрибута масштаба
durationnumber0Восстановить заменённый масштаб через это число тиков; 0 сохраняет изменение до завершения работы способности
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss grows to double size for 5 seconds
context.boss:set_scale(2.0, 100)
context.boss:send_message("&4The boss grows in size!")
end
}

entity:set_gravity(enabled)​

Задаёт гравитацию без автоматического восстановления. Обратный вызов ниже принадлежит экземпляру Lua и может не выполниться после закрытия скрипта.

ПараметрТипПримечания
enabledbooleantrue для обычной гравитации
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- Change the boss's gravity; the callback runs only while this script stays active.
context.boss:set_gravity(false)
context.scheduler:run_after(60, function(tick_context)
if tick_context.boss.exists then
tick_context.boss:set_gravity(true)
end
end)
end
}

entity:play_sound_at_entity(sound[, volume][, pitch])​

Воспроизводит звук в локации сущности.

ПараметрТипПо умолчаниюПримечания
soundstringКлюч звука Minecraft (например, "entity.ender_dragon.growl") или имя перечисления Spigot Sound. Ключи из ресурс-пака тоже работают.
volumenumber1.0Громкость
pitchnumber1.0Высота тона
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:play_sound_at_entity("entity.ender_dragon.growl", 1.0, 0.5)
end
}

entity:play_sound_at_self(sound[, volume][, pitch])​

Псевдоним для play_sound_at_entity. Воспроизводит звук в локации сущности.


entity:spawn_particle_at_self(particleOrSpec[, count])​

Создаёт частицы в текущей позиции сущности по той же спецификации частиц, что и собственный метод мира. amount в таблице имеет приоритет над запасным count. Имена переводятся в верхний регистр; неподдерживаемые частицы с дополнительными данными вызывают предупреждение и не создаются.

ПараметрТипПо умолчаниюПримечания
particleOrSpecstring или tableИмя частицы или таблица спецификации
countnumber1Количество частиц
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:spawn_particle_at_self("HEART", 5)
end
}

entity:spawn_particles_at_location(location, particle[, count])​

Спавнит частицы в конкретной локации.

ПараметрТипПо умолчаниюПримечания
locationтаблица позицииЦелевая позиция
particlestringИмя типа частицы
countnumber1Количество частиц
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.player:spawn_particles_at_location(loc, "FLAME", 10)
end
}

entity:play_model_animation(name)​

Запрашивает анимацию, только если EliteMobs отслеживает сущность как пользовательского босса с пользовательской моделью. Возвращает nil, не ждёт завершения и не сообщает, существует ли такое имя анимации. Обычной сущности с моделью для этого метода недостаточно.

ПараметрТипПримечания
namestringИмя анимации
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}

Методы транспорта и пассажиров​

Обёртки живых сущностей предоставляют методы транспорта и пассажиров Bukkit. Аргументы-обёртки разрешаются по Bukkit UUID; отдельные строки UUID не принимаются. Посадка отклоняет отсутствующие, одинаковые или невалидные сущности, временно обходит защиту EliteMobs от злоупотребления ездой и возвращает результат Bukkit. Эти методы не создают маршрут транспорта и не планируют очистку при закрытии скрипта.

МетодВозвращаетПримечания
entity:is_inside_vehicle()booleantrue, если сущность едет на другой сущности.
entity:has_vehicle()booleantrue, если у сущности в данный момент есть транспорт.
entity:get_vehicle()обёртка сущности или nilВозвращает обёртку текущего транспорта.
entity:set_vehicle(vehicle)booleanЗаставляет эту сущность ехать на vehicle.
entity:leave_vehicle()booleanЗаставляет эту сущность покинуть текущий транспорт.
entity:has_passengers()booleantrue, если у этой сущности есть пассажиры.
entity:get_passenger_count()numberКоличество пассажиров.
entity:get_passengers()tableМассив обёрток пассажиров.
entity:add_passenger(passenger)booleanДобавляет пассажира этой сущности.
entity:remove_passenger(passenger)booleanУдаляет пассажира из этой сущности.
entity:eject_passengers()booleanВысаживает всех пассажиров.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:has_vehicle() then
context.player:leave_vehicle()
end
end
}

entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])​

Немедленно заменяет скорость нормализованным смещением от источника к сущности, умноженным на strength, с добавлением смещений по осям мира. При совпадении позиций смещения всё равно применяются. Обёртка даёт сохранённую current_location; для текущей позиции передавайте source:get_location(). Метод не сравнивает миры, поэтому используйте позиции из одного мира.

ПараметрТипПо умолчаниюПримечания
sourceпозиция или обёрткаИсточник толчка
strengthnumber1.0Множитель силы толчка
xOffsetnumber0Дополнительное смещение по X
yOffsetnumber0Дополнительное смещение по Y
zOffsetnumber0Дополнительное смещение по Z
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("knockback", 60) then return end
context.player:push_relative_to(context.boss:get_location(), 2.0, 0, 0.5, 0)
context.player:send_message("&cThe boss knocks you back!")
end
}

entity:set_custom_name(name) / entity:reset_custom_name()​

Задаёт пользовательское имя Bukkit с цветами. Сброс использует настроенное имя отслеживаемой элитной сущности, а для неотслеживаемой сущности её текущее getName(). Сохранённое исходное имя не восстанавливается. Имя учётной записи игрока и поле-снимок обёртки не меняются.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("mark", 200) then return end
context.boss:set_custom_name("&c&lEnraged Boss")
context.boss:send_message("&cThe boss is enraged!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function(tick_context)
if tick_context.boss:is_alive() then
tick_context.boss:reset_custom_name()
end
end)
end
}

entity:place_temporary_block(material[, duration][, requireAir])​

Размещает временный блок в текущей позиции сущности и возвращает nil, в том числе при отказе из-за requireAir. При положительной длительности сохранённые данные блока, но не содержимое контейнера, восстанавливаются по окончании таймера, при выгрузке чанка или мира либо при выключении плагина, но только если на месте всё ещё стоит временный блок. Повторное размещение на том же временном блоке перезапускает его таймер. Блоки с сущностями блоков, например сундуки, и блоки, удерживаемые другим владельцем временных блоков, пропускаются. При разрушении блок ничего не выбрасывает. Неположительная длительность размещает блок навсегда без отслеживания. Используйте материал блока и самостоятельно проверяйте защиту.

ПараметрТипПо умолчаниюПримечания
materialstringИмя материала блока
durationnumber0Положительное число тиков до восстановления; неположительное значение размещает блок навсегда
requireAirbooleanfalseРазмещать только если блок в данный момент является воздухом
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ice_trap", 200) then return end
context.player:place_temporary_block("ICE", 60, true)
context.player:send_message("&bIce forms at your feet!")
end
}

entity:get_height()​

Возвращает высоту сущности в блоках.


entity:is_on_ground()​

Возвращает текущий флаг Bukkit isOnGround(), не выполняя новый поиск блоков или свободного пространства над головой.


entity.is_valid​

У обёртки живой сущности это булево поле, а не метод. Оно хранит валидность Bukkit при создании обёртки, а не только факт существования сущности. Читайте через точку entity.is_valid; вызов через двоеточие приведёт к ошибке.

Поскольку это снимок, он устаревает, поэтому он не заменяет живую проверку. Используйте entity:is_alive(), когда вам нужно текущее состояние, и is_valid() (метод) — у обёрток-ссылок на неживые сущности, которые вы сохранили между тиками.


entity:is_frozen()​

Возвращает true, если у сущности (когда она отслеживается как пользовательский босс) установлен флаг заморозки.


entity:set_awareness_enabled(aware[, duration])​

Задаёт осведомлённость моба и запоминает заменённое значение. Действует только на сущности типа Mob. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Вызов с true, пока эта способность удерживает изменение осведомлённости, завершает это изменение, а не применяет новое.

ПараметрТипПо умолчаниюПримечания
awarebooleantrue, чтобы включить осведомлённость
durationnumber0Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности

entity:is_healing() / entity:set_healing(enabled)​

Читает или задаёт флаг лечения отслеживаемой элитной сущности. Сам по себе не восстанавливает здоровье и не запускает таймер лечения. set_healing(true) помечает элитную сущность как лечащуюся, если она ещё не помечена; set_healing(false) снимает только флаг лечения, установленный этой способностью. При завершении работы способность снимает все ещё принадлежащие ей флаги лечения. Для неотслеживаемой сущности чтение возвращает false, запись ничего не меняет.


entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])​

Проверяет числовое пересечение хитбокса сущности с прямоугольной областью, выровненной по осям. Миры не сравниваются, поэтому передавайте центр в мире сущности. Неразрешимый центр возвращает false.

ПараметрТипПо умолчаниюПримечания
centerтаблица позицииЦентр проверяемой области
halfXnumber0.5Половина ширины по оси X
halfYnumberкак halfXПоловина высоты по оси Y
halfZnumberкак halfXПоловина ширины по оси Z

entity:remove_elite()​

Удаляет elite-сущность из отслеживания EliteMobs. Если сущность является элиткой, это корректно деспавнит её через EliteMobs.


entity:remove()​

Удаляет обычную живую сущность, заспавненную скриптом, например стойку для брони. Возвращает true, если сущность удалена. Игроки и элитки отклоняются с результатом false; деспавните элиток с помощью remove_elite().


entity:set_invisible(enabled) и entity:set_silent(enabled)​

set_invisible скрывает тело сущности; надетые и удерживаемые предметы остаются видимыми. set_silent отключает собственные звуки сущности.


entity:set_marker(enabled)​

Только для стоек для брони. Эти четыре метода есть у обёрток стоек для брони и отсутствуют у любых других сущностей.

МетодЭффект
set_marker(enabled)У стойки-маркера нет хитбокса, по ней нельзя попасть и с ней нельзя столкнуться
set_small(enabled)Стойка половинного размера
set_base_plate(enabled)Показывает или скрывает каменную базовую плиту
set_arms(enabled)Показывает или скрывает руки

Для чисто визуального парящего предмета или блока лучше использовать world:spawn_display_at_location, которому ничего из этого не нужно.


entity:set_custom_name_visible(visible)​

Задаёт, всегда ли видно пользовательское имя сущности или только при взгляде на неё.

ПараметрТипПримечания
visiblebooleantrue для постоянной видимости

entity:set_equipment(slot, material[, options])​

Заменяет выбранный слот новым предметом указанного материала. Регистр названий слота, материала и зачарований не учитывается. Неизвестный слот или материал ничего не меняет; неизвестные зачарования пропускаются, известные добавляются без обычного ограничения уровня. Это не загрузчик файлов пользовательских предметов; метаданные прежнего предмета не сохраняются. Возвращает nil.

ПараметрТипПо умолчаниюПримечания
slotstringСлот экипировки: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND"
materialstringИмя материала (например, "DIAMOND_SWORD", "IRON_HELMET")
optionstable{}Опциональные настройки (см. ниже)

Таблица options:

КлючТипПо умолчаниюПримечания
enchantmentsмассив таблицnilКаждая запись: { type = "SHARPNESS", level = 2 }
unbreakablebooleanfalseЯвляется ли предмет неразрушимым
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Give the boss a glowing diamond sword
context.boss:set_equipment("HAND", "DIAMOND_SWORD", {
unbreakable = true,
enchantments = {
{ type = "SHARPNESS", level = 5 }
}
})
end
}

entity:damage_equipment(slot, amount)​

Повреждает предмет в HAND, OFF_HAND, HEAD, CHEST, LEGS или FEET и возвращает фактически применённую потерю прочности. Допустимый запрос за вызов: от 1 до 64. Отсутствующий, не имеющий прочности или неразрушимый предмет даёт 0.

Для игрока вызывает PlayerItemDamageEvent и учитывает отмену или изменённое количество. Обработчик может повысить его выше исходного предела 64, но результат ограничен оставшейся прочностью. При достижении максимального повреждения удаляется весь стек из слота и вызывается PlayerItemBreakEvent. Учитываются метаданные пользовательского максимального повреждения. Метод сам не рассчитывает снижение от зачарования «Прочность». Неверный слот или запрос вне 1..64 вызывает ошибку аргумента Lua.

entity:is_ai_enabled()​

Возвращает true, если ИИ сейчас включён. Для отслеживаемых элитных сущностей читает логическое состояние ИИ EliteMobs, включая управление собственным поведением, а не только базовый флаг Bukkit.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.boss:is_ai_enabled() then
context.log:info("Boss AI is active")
else
context.log:info("Boss AI is disabled (stunned?)")
end
end
}

Обёртки-ссылки на неживые сущности​

Когда заспавненная сущность не является LivingEntity — например, падающий блок, снаряд или огненный шар — вы получаете более лёгкую обёртку-ссылку. Они возвращаются методами вроде context.world:spawn_falling_block_at_location() или context.boss:summon_projectile().

Поля-снимки: name, uuid, entity_type, is_player (всегда false), is_elite (всегда false), is_mount (обычно false; boss:get_mount() устанавливает true), current_location

Методы:

МетодПримечания
is_valid()Проверка текущей валидности. Здесь это метод, в отличие от обёрток живых сущностей
get_location()Текущая живая локация
get_velocity()Текущий вектор скорости
is_on_ground()На земле ли
teleport_to_location(location)Телепортирует сущность
set_velocity_vector(vector)Задаёт скорость
set_direction_vector(vector)Задаёт направление (только Fireball)
set_yield(value)Задаёт мощность взрыва (только Fireball)
set_gravity(enabled)Переключает гравитацию
detonate()Запрашивает взрыв фейерверка; не действует на другие типы
remove()Удаляет сущность из мира
unregister([reason])Выполняет удаление через трекер EliteMobs для распознанных отслеживаемых сущностей; неотслеживаемая сущность не меняется

Эти обёртки также предоставляют все методы транспорта и пассажиров, включая is_inside_vehicle(), get_vehicle(), set_vehicle(v), add_passenger(p) и eject_passengers(). Так можно посадить босса на неживую сущность.

unregister принимает имя причины удаления без учёта регистра, по умолчанию OTHER. Это не запрос булева признака успеха. Методы сохраняют ссылку на сущность, поэтому перед использованием сохранённой обёртки проверяйте is_valid(). Отложенное удаление планировщиком Lua отменяется при закрытии экземпляра. Если очистка должна продолжаться после скрипта, используйте подходящую собственную длительность или отслеживание владельцем.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
local fb = context.boss:summon_projectile("FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5
)
if fb == nil then return end
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}

context.player​

Доступен, когда прямая цель или действующее лицо события является игроком, включая on_boss_damaged_by_player и on_player_damaged_by_boss. Приоритет имеет прямая цель. Обёртка игрока включает общие методы живых сущностей, но операции, требующие отслеживаемую элитную сущность или пользовательского босса, ничего не делают для обычного игрока. Дополнения ниже доступны только игрокам.

предупреждение

context.player равен nil в хуках, у которых нет связанного игрока, таких как on_spawn, запланированные коллбэки и хуки таймеров. Всегда проверяйте на nil перед использованием.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}

Поля, доступные только для игрока​

ПолеТипПримечания
game_modestringСнимок игрового режима при создании, имя в верхнем регистре, например "SURVIVAL"

Методы, доступные только для игрока​

МетодПримечания
send_message(message)Сообщение в чат с форматированием цветов EliteMobs
show_action_bar(message)Текст строки действий
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])Наложение заголовка на экран
show_boss_bar(title[, color][, style][, duration])Временная полоса босса
run_command(command)Выполнить команду от имени игрока (без ведущего /)
Пример
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then return end
local hp_pct = context.player:get_health() / context.player:get_maximum_health()
if hp_pct < 0.3 then
context.player:show_title("&4LOW HEALTH", "&7Find cover!", 5, 30, 10)
context.player:show_boss_bar("&cBoss Enrage Incoming", "RED", "SEGMENTED_6", 80)
end
end
}

context.boss​

Обёртка элитного моба, которому принадлежит эта Lua-способность. Если базовая сущность отсутствует, полный набор полей и методов живой сущности недоступен.

подсказка

Пока базовая сущность существует, обёртка босса наследует общие операции живых сущностей, но не интерфейс и команды, доступные только игрокам. Методы этого раздела принадлежат боссу или иначе работают через слой EliteEntity.

Поля босса​

ПолеТипПримечания
boss.namestringОтображаемое имя
boss.uuidstringUUID элитки-босса
boss.entity_typestringИмя Bukkit EntityType
boss.is_monsterbooleantrue, если базовая сущность является монстром (Monster)
boss.levelnumberУровень элитки
boss.healthnumberТекущее здоровье (снимок)
boss.maximum_healthnumberМаксимальное здоровье (снимок)
boss.damager_countnumberКоличество наносящих урон (снимок)
boss.is_in_combatbooleanСнимок состояния боя
boss.existsbooleanСнимок существования элитной сущности
boss.current_locationтаблица позицииПозиция на момент создания обёртки (снимок)
Пример
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}

Методы босса​


Методы движения патруля​

Боссы с настроенным патрулём предоставляют patrol_pause(), patrol_resume(), walk_to(x, y, z), hold(x, y, z) и teleport(x, y, z). Координаты являются смещениями от точки появления, а каждый метод сообщает, принят ли запрос. walk_to возобновляет маршрут по прибытии; hold ждёт patrol_resume(); длинные пути используют автоматический решатель.


boss:is_alive()​

Возвращает true, если сущность босса валидна, не мертва и элитка всё ещё существует. Используйте это вместо поля exists для живых проверок.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.boss:is_alive() then return end
context.boss:send_message("&cI still live!")
end
}

boss:get_location()​

Возвращает текущую живую локацию босса в виде таблицы локации.

Пример
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
context.world:spawn_particle_at_location(loc, "FLAME")
end
}

boss:get_eye_location()​

Возвращает локацию босса на уровне глаз.

Пример
return {
api_version = 1,
on_enter_combat = function(context)
local eye = context.boss:get_eye_location()
context.world:spawn_particle_at_location(eye, "SMOKE")
end
}

boss:set_ai_enabled(enabled[, duration])​

Задаёт состояние ИИ босса по тем же правилам принадлежащих изменений, что и entity:set_ai_enabled: положительная длительность восстанавливает заменённое значение, а закрытие способности восстанавливает все ещё активные изменения.

ПараметрТипПо умолчаниюПримечания
enabledbooleantrue, чтобы включить ИИ
durationnumber0Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("stun", 200) then return end
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned for 3 seconds!")
end
}

boss:teleport_to_location(location)​

Запрашивает телепортацию босса, не меняя настроенную точку появления или патрульный маршрут. Возвращает nil, а не признак успеха.

ПараметрТипПримечания
locationтаблица позицииПункт назначения
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}

boss:set_velocity_vector(vector)​

Немедленно задаёт скорость босса.

ПараметрТипПримечания
vectorтаблица вектора{ x, y, z } или { x = 0, y = 1, z = 0 }
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss leaps into the air at combat start
context.boss:set_velocity_vector({ x = 0, y = 2.0, z = 0 })
context.boss:send_message("&cThe boss leaps!")
end
}

boss:restore_health(amount)​

Лечит босса на неотрицательное количество, до меньшего из максимума EliteMobs и базового атрибута максимального здоровья. Вызывает отменяемое событие EliteMobHealEvent и возвращает nil.

ПараметрТипПримечания
amountnumberКоличество исцеления
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}

boss:play_sound_at_self(sound[, volume][, pitch])​

Воспроизводит звук в локации босса.

ПараметрТипПо умолчаниюПримечания
soundstringКлюч звука Minecraft (например, "entity.wither.spawn") или имя перечисления Spigot Sound. Ключи из ресурс-пака тоже работают.
volumenumber1.0Громкость
pitchnumber1.0Высота тона
Пример
return {
api_version = 1,
on_spawn = function(context)
context.boss:play_sound_at_self("entity.wither.spawn", 1.0, 0.8)
end
}

boss:spawn_particle_at_self(particleOrSpec[, count])​

Спавнит частицы в локации босса.

ПараметрТипПо умолчаниюПримечания
particleOrSpecstring или tableИмя частицы или таблица спецификации
countnumber1Количество частиц
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:spawn_particle_at_self("SMOKE", 20)
context.boss:send_message("&8Smoke billows from the boss!")
end
}

boss:play_model_animation(name)​

Воспроизводит анимацию пользовательской модели на боссе, если она доступна.

ПараметрТипПримечания
namestringИмя анимации
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}

boss:has_mount() / boss:get_mount()​

Проверяет или возвращает сущность, на которой босс в данный момент едет. boss:get_mount() возвращает nil, если у босса нет ездового животного. Когда возвращается ездовое животное, у его обёртки is_mount = true.

Пример
return {
api_version = 1,
on_enter_combat = function(context)
local mount = context.boss:get_mount()
if mount ~= nil then
context.log:info("Boss is mounted on " .. mount.entity_type)
end
end
}

boss:set_mount(entity) / boss:clear_mount() / boss:dismount()​

Сажает или снимает босса с ездового животного. boss:set_mount(entity) заставляет босса ехать на предоставленной обёртке сущности и возвращает true, если Bukkit принял изменение пассажира. boss:clear_mount() и boss:dismount() оба заставляют босса покинуть текущий транспорт.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("mount_check", 100) then return end
if context.boss:has_mount() then
context.boss:dismount()
end
end
}

boss:face_direction_or_location(vectorOrLocation)​

Заставляет босса повернуться к направлению или локации.

ПараметрТипПримечания
vectorOrLocationтаблица вектора или позицииНаправление, к которому повернуться
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}

boss:navigate_to_location(location[, speed][, forceTeleport][, timeout])​

Использует поиск пути, чтобы привести босса к позиции. Работает только с пользовательскими боссами.

ПараметрТипПо умолчаниюПримечания
locationтаблица позицииПункт назначения
speednumber1.0Множитель скорости передвижения
forceTeleportbooleanfalseТелепортировать босса к цели, если timeout истечёт до прибытия
timeoutnumber0Время до прекращения движения в тиках. 0 использует стандартные 100 тиков (5 секунд)

Навигация также прекращается, когда босс подходит к цели ближе чем на один блок, перестаёт существовать или покидает мир назначения. Новый запрос навигации отменяет уже выполняющуюся навигацию этого босса. Это независимая задача Bukkit, которую приостановка или закрытие Lua не отменяет. Позиция назначения сохраняется при вызове; метод возвращает nil, а не результат прибытия.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("charge", 200) then return end
context.boss:navigate_to_location(context.player:get_location(), 1.5)
context.boss:send_message("&cThe boss charges at you!")
end
}

boss:add_tag(tag[, duration]) / boss:remove_tag(tag) / boss:has_tag(tag)​

Управляет тегами босса.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.5 and not context.boss:has_tag("phase2") then
context.boss:add_tag("phase2")
context.boss:send_message("&4Entering Phase 2!")
end
end
}

boss:send_message(message[, range])​

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

ПараметрТипПо умолчаниюПримечания
messagestringТекст сообщения с цветовыми кодами
rangenumber20Радиус в блоках
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:send_message("&4You dare challenge me?!")
end
}

boss:summon_projectile(entityType, origin, destination[, speed][, options])​

Создаёт сущность и возвращает её собственную обёртку, либо nil при неразрешимой позиции или неизвестном типе. Распознанный, но несоздаваемый тип тоже может завершиться ошибкой. Обычные снаряды Bukkit выпускаются от босса, если не задано spawn_at_origin = true; переданная исходная позиция всё равно определяет направление к цели. Миры позиций не сравниваются, поэтому используйте один мир. Типы, не являющиеся снарядами, создаются в переданной исходной позиции и получают соответствующую обёртку живой или неживой сущности.

ПараметрТипПо умолчаниюПримечания
entityTypestringТип сущности (например, "FIREBALL", "ARROW")
originтаблица позицииПозиция запуска
destinationтаблица позицииЦелевая позиция
speednumber1.0Скорость снаряда
optionstable{}См. опции ниже

Таблица options:

КлючТипПримечания
durationnumberПоложительное значение запускает независимое удаление через столько тиков; неположительное не добавляет таймер
max_ticksnumberПредел наблюдения за приземлением, по умолчанию 6000
custom_damagenumberМетаданные особого урона для обработки боя снаряда, а не гарантированная потеря здоровья
detonation_powerstringИмя файла способности в метаданных взрывного снаряда, а не числовая сила взрыва
yieldnumberМощность взрыва (Fireball)
persistentbooleanПри передаче задаёт сохраняемость Bukkit; не отменяет длительность, столкновение или удаление владельцем
effectstringИмя EntityEffect для воспроизведения при спавне
incendiarybooleanЯвляется ли взрыв зажигательным
gravitybooleanЕсть ли у снаряда гравитация
glowingbooleanЭффект свечения
invulnerablebooleanЯвляется ли снаряд неуязвимым
trackbooleanПо умолчанию true: регистрирует снаряд в EliteMobs, но не включает наведение на цель.
spawn_at_originbooleanПо умолчанию false: обычные снаряды выпускает босс. Значение true создаёт снаряд в указанной исходной точке.
direction_onlybooleanДля огненного шара в явной исходной позиции задаёт направление без дополнительного присваивания скорости
on_landfunctionОбратный вызов (landing_location, spawned_entity) при приземлении, невалидности или превышении max_ticks; не только при попадании

direction_only пропускает дополнительное присваивание скорости огненным шарам, созданным в явной исходной позиции. Направление по-прежнему задаётся целью. Стрелком снаряда Bukkit становится босс. При track = true снаряд регистрируется в EliteMobs и включается в жизненный цикл подкреплений босса. Это не применяется к другим типам сущностей. track = false отключает такую очистку владельцем, поэтому предусмотрите другой способ удаления.

Наблюдатель on_land принадлежит экземпляру Lua и останавливается при его закрытии. Он один раз вызывает (landing_location, spawned_entity) при приземлении, невалидности или превышении счётчика, сам не удаляя сущность. Таймер положительной duration независим и продолжает работать после закрытия скрипта. Поэтому обратный вызов не доказывает попадание снаряда во что-либо.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}

boss:summon_reinforcement(filename[, zoneOrLocation][, duration])​

Без объявления призывает подкрепление из файла пользовательского босса, записывает призывателя и наследует нормализованный бой, если пользовательский босс-призыватель его использует. Уровень определяется настройками самого подкрепления и правилами динамического уровня. В зоне выбирается случайная точка выборки, а при отсутствии точек её центр. Неразрешимый результат заменяется позицией босса. Возвращает обёртку живой сущности подкрепления или nil, если живое подкрепление не создано.

ПараметрТипПримечания
filenamestringИмя конфигурационного файла босса
zoneOrLocationтаблица позиции или зонаНеобязательная позиция появления или определение зоны. По умолчанию позиция босса
durationnumberНеобязательное положительное время до ухода в тиках. По умолчанию 0, без таймера этого метода; это не переопределение уровня
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 0)
context.boss:send_message("&cMinions, come to my aid!")
end
}

boss:despawn()​

Удаляет босса через EliteMobs с причиной OTHER. boss:remove() является псевдонимом с тем же жизненным циклом. Это не удар и не запрос обычной награды за смерть.

Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.1 then
context.boss:send_message("&7The boss vanishes into thin air!")
context.boss:despawn()
end
end
}

boss:get_nearby_players(range)​

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

ПараметрТипПримечания
rangenumberРадиус в блоках
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}

boss:get_damager_count()​

Возвращает текущий размер сохранённой карты атакующих босса. В отличие от поля damager_count, читает состояние сейчас; это не число ближайших или находящихся онлайн участников боя.

boss:get_nearby_elites(radius)​

Возвращает до 32 живых отслеживаемых элитных сущностей в мире босса, исключая его самого. Радиус должен быть конечным, больше 0 и не больше 64 блоков. Результаты используют обёртки живых сущностей, отсортированы по расстоянию, при равенстве по UUID элитной сущности. Сам запрос не означает, что эффект разрешено применять ко всем результатам.


boss:get_target_player()​

Возвращает текущую цель моба-босса в виде обёртки игрока или nil, если цель не является игроком или не задана.


Методы зон и частиц​

Эти методы сочетают зоны с эффектами частиц. Им требуется таблица зоны в качестве входных данных.


boss:get_nearby_players_in_zone(zone)​

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

ПараметрТипПримечания
zoneтаблица зоныОпределение формы зоны

boss:spawn_particles_in_zone(zone, particle[, amount][, x][, y][, z][, speed][, coverage])​

Заполняет внутреннюю часть зоны частицами. Аргументы передаются по порядку; таблица спецификации здесь не принимается.

ПараметрТипПо умолчаниюПримечания
zoneтаблица зоныСобственная форма зоны с kind; см. Зоны и выбор целей
particlestringИмя типа частицы
amountnumber1Число частиц в каждой выбранной позиции
x, y, znumber0Разброс, либо направление при amount = 0
speednumber0Скорость частиц
coveragenumber1.0Независимая вероятность выбора каждой позиции, ограниченная диапазоном 0.01–1.0; из непустого набора выбирается хотя бы одна позиция

boss:spawn_particles_in_zone_border(zone, particle[, amount][, x][, y][, z][, speed][, coverage])​

Работает как предыдущий метод, но выбирает позиции на границе зоны, а не внутри неё.


boss:get_particles_from_self_toward_zone(zone, particle[, speed])​

Возвращает массив спецификаций частиц в выбранных позициях зоны, направленных от босса. Не создаёт частицы у босса и не анимирует путь от него. Передайте результат в boss:spawn_particles_with_vector(...).

ПараметрТипПо умолчаниюПримечания
zoneтаблица зоныЦелевая зона
particlestringИмя типа частицы
speednumber0.1Скорость движения частиц

Каждая запись имеет вид { location = ..., particle = ..., amount = 0, x/y/z = <unit direction>, speed = ... }. Каждая точка выбирается с вероятностью 20 %, из непустого набора берётся хотя бы одна. Затем позиции, совпадающие с боссом, пропускаются. Реальное поведение направления зависит от типа частицы.


boss:get_particles_toward_self(zone, particle, speed)​

Возвращает массив описаний частиц, направленных от зоны к боссу, но не создаёт их. Передайте результат в boss:spawn_particles_with_vector(...).

ПараметрТипПо умолчаниюПримечания
zoneтаблица зоныИсходная зона
particlestringИмя типа частицы
speednumberПередайте явное значение, например 0.1; иначе метод попытается прочитать имя частицы как число и завершится ошибкой.

boss:spawn_particles_with_vector(particles)​

Спавнит массив направленных частиц, каждая со своей собственной позицией и вектором скорости.

ПараметрТипПримечания
particlesмассив таблицКаждая запись определяет частицу с позицией и направлением

Методы Эндер-дракона​

Эти методы применяются только когда сущность босса является Эндер-драконом.


boss:get_ender_dragon_phase()​

Возвращает имя текущей фазы EnderDragon.Phase в виде строки или nil, если босс не является Эндер-драконом.


boss:set_ender_dragon_phase(phase)​

Задаёт фазу Эндер-дракона.

ПараметрТипПримечания
phasestringИмя EnderDragon.Phase (например, "CIRCLING", "CHARGE_PLAYER")

Методы поддержки особых способностей​

Эти методы поддерживают встроенные механики пауэров EliteMobs из Lua-скриптов.


boss:start_tracking_fireball_system(speed?)​

Запускает один контроллер этой способности на боссе типа Monster. При первом выполнении (на следующем тике) и затем каждые 8 секунд, пока у монстра есть цель, выпускает самонаводящиеся огненные шары в игроков Survival/Adventure в пределах 20 блоков по каждой оси. Выполнение без цели останавливает контроллер, в том числе первое; новый вызов может запустить его снова. Повторный вызов во время работы не меняет скорость. Контроллер принадлежит скрипту способности: приостановка скрипта приостанавливает его, а закрытие скрипта останавливает. Если вызов запускает контроллер, скорость должна быть конечной и положительной, иначе вызов завершается ошибкой.

Шары имеют мощность 3 и поджигают. Задача наведения каждого шара не зависит от скрипта. Она прекращается примерно через 3 минуты или при недействительном контексте, но сама остановка не удаляет шар. Неотменённый удар по отслеживаемому шару переключает преследование между игроком и заклинателем.

ПараметрТипПо умолчаниюПримечания
speednumber0.5Скорость огненного шара; должна быть конечной и положительной

boss:handle_spirit_walk_damage(cause)​

Передаёт причину урона в Spirit Walk. Огонь, тики горения, яд, иссушение, шипы и размашистые атаки не увеличивают счётчик. Утопление и удушье немедленно запускают уход; остальные принимаемые причины запускают его при каждом девятом ударе. Метод ищет подходящую точку поблизости и анимирует перемещение с временной неуязвимостью. Он не отменяет переданное событие урона и не гарантирует позицию за спиной атакующего.

ПараметрТипПримечания
causestringИмя Bukkit DamageCause (например, "ENTITY_ATTACK", "PROJECTILE")

boss:shield_wall_is_active()​

Возвращает флаг активности контроллера щита. Не гарантирует, что запас щита конкретного направления ещё положителен.


boss:initialize_shield_wall(openingDirection?)​

Инициализирует запасы щита по направлениям и визуальные эффекты, если стена ещё не активна. Каждая защищённая сторона получает запас, равный уровню босса. Аргумент выбирает незащищённый проход, а не количество зарядов. Метод возвращает nil и не устанавливает обработчик события урона.

ПараметрТипПо умолчаниюПримечания
openingDirectionnumber11 = север, 2 = восток, 3 = юг, 4 = запад; другие целые числа оставляют защищёнными все четыре стороны

boss:shield_wall_absorb_damage(player, damage)​

Определяет направление по позиции атакующего относительно босса и вычитает переданный урон из запаса этой стороны. Возвращает true, если запас был положительным до вычитания, даже когда удар превышает остаток. Возвращает false при отсутствии игрока или состояния, другом мире, истощённой или открытой стороне. Событие урона не отменяется. Если результат true, ваш обработчик должен вызвать context.event.cancel_event(), чтобы заблокировать удар. Передавайте неотрицательное количество урона.

ПараметрТипПримечания
playerобёртка игрокаАтакующий игрок
damagenumberКоличество урона для поглощения

boss:deactivate_shield_wall()​

Останавливает независимую задачу отображения стены, удаляет состояние и стойки для брони щита. Одного закрытия экземпляра Lua недостаточно; явно вызывайте метод при завершении механики.


boss:start_zombie_necronomicon(target, chant)​

Запускает контроллер Necronomicon с живой целью и прокручиваемым текстом заклинания. Второй аргумент является отображаемым текстом, а не именем файла босса. Каждые 60 тиков призывает одно подкрепление уровня заклинателя из фиксированного файла necronomicon_zombie.yml с вероятностью 80 % или necronomicon_skeleton.yml с вероятностью 20 %. Новый запуск принимается только при не более девяти отслеживаемых подкреплениях и отсутствии активного контроллера. Работающий контроллер доводит количество до одиннадцати, включает ИИ при полном составе и возобновляет заклинание после уменьшения числа.

Во время заклинания ИИ босса отключается и меняется отображаемое имя; предупреждающие эффекты учитывают соответствующую настройку. Цель должна оставаться валидной, в том же мире и не дальше 30 блоков. Недействительный контекст или удаление владельца останавливает контроллеры, восстанавливает отображение и удаляет их подкрепления. Это независимые задачи Bukkit, поэтому закрытие Lua само по себе их не останавливает. Метод возвращает nil.

ПараметрТипПримечания
targetобёртка сущностиЦелевая сущность для некрономикона
chantstringПрокручиваемый текст; пустой текст заменяется именем босса, короткий дополняется

context.players​

Помощники запросов игроков, центрированные вокруг босса. Используйте их, чтобы находить игроков, не нуждаясь в конкретном игроке из события.

Запросы не фильтруют по режиму игры, прямой видимости, состоянию жизни, участию в бою или экземпляре и не сортируют по расстоянию. current_target() отдаёт приоритет действующему лицу события, тогда как context.player предпочитает прямую цель. Свежий контекст планировщика не содержит действующего лица события и использует текущую цель моба.

МетодВозвращаетПримечания
players:current_target()обёртка игрока или nilИгрок из события или цель моба-босса, если это игрок
players:nearby_players(radius)массив обёрток игроковВсе игроки в пределах радиуса от босса
players:all_players_in_world()массив обёрток игроковВсе игроки в мире босса
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
Пример
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}

context.entities​

Общие помощники запросов сущностей, центрированные вокруг босса.

МетодВозвращаетПримечания
entities:get_nearby_entities(radius[, filter])массив обёрток сущностейБлижайшие к боссу сущности
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter])массив обёрток сущностейЖивые сущности в мире центра, чья позиция ног внутри области с включёнными границами; это не проверка пересечения хитбоксов
entities:get_all_entities([filter])массив обёрток сущностейВсе подходящие сущности в мире босса
entities:get_direct_target_entity()обёртка сущности или nilПрямая цель для текущего события
entities:get_boss_spawn_location()таблица позицииИзначальная позиция появления босса

Допустимые фильтры: living (по умолчанию), player / players, elite / elites, mob / mobs, all / entities

all / entities учитывается только в get_nearby_entities. Он включает неживые сущности, например выброшенные предметы и снаряды, в виде облегчённых ссылочных обёрток. Живые результаты по-прежнему используют полные обёртки живых сущностей. Этот фильтр ищет в прямоугольной области с заданным радиусом по каждой оси, а фильтры живых сущностей используют сферическое расстояние. В остальных запросах all / entities сводится к living. Сам босс исключается из всех результатов.

Регистр фильтров не учитывается; неизвестные значения тоже сводятся к living. mob означает любую живую сущность, кроме игрока, а не только враждебного монстра. Автоматической фильтрации участников экземпляра, ограничения числа результатов и сортировки по расстоянию нет. Широкие запросы живых сущностей обходят загруженные живые сущности мира, поэтому ограничивайте радиус и избегайте ненужных повторных обходов. get_direct_target_entity() использует прямую цель события и может вернуть nil; к текущей боевой цели моба он не переходит.

Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Damage all nearby elites
local elites = context.entities:get_nearby_entities(10, "elites")
for _, elite in ipairs(elites) do
elite:deal_damage(5)
end
end
}
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Find players in a box area
local center = context.boss:get_location()
local players = context.entities:get_entities_in_box(center, 10, 5, 10, "players")
for _, p in ipairs(players) do
p:send_message("&eYou are in the danger zone!")
end
end
}

Дальнейшие шаги​