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

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

webapp_banner.jpg

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


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

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

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

  • Поля вроде 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_custom_bossbooleantrue, если сущность является пользовательским боссом (региональный, инстансированный и т. д.)
entity.is_significant_bossbooleantrue для пользовательских боссов с множителем здоровья выше 1 (то есть крупные боссы, а не мелкие подкрепления)
entity.is_monsterbooleantrue для сущностей-монстров
entity.is_validbooleanФлаг валидности (снимок)
entity.healthnumberТекущее здоровье (снимок)
entity.maximum_healthnumberМаксимальное здоровье (снимок)
entity.current_locationlocation tableПозиция на момент создания обёртки
entity.elitetable или nilПодтаблица только для элиток; присутствует только когда entity.is_elite равно true и у EliteMobs есть данные об элитке для сущности. См. Подтаблица Elite ниже.

Подтаблица Elite

Когда сущность является элиткой EliteMobs, у обёртки есть дополнительная таблица entity.elite с полями и методами, специфичными для элиток. У не-элиток это поле отсутствует (nil).

Поле / МетодТипПримечания
entity.elite.levelnumberУровень элитки
entity.elite.namestring или nilНастроенное отображаемое имя элитки
entity.elite.healthnumberСнимок текущего здоровья (то же значение, что и entity.health)
entity.elite.max_healthnumberСнимок максимального здоровья (то же значение, что и entity.maximum_health)
entity.elite.is_custom_bossbooleanЯвляется ли элитка пользовательским боссом
entity.elite.health_multipliernumberМножитель здоровья, настроенный у пользовательского босса (1.0 для обычных элиток)
entity.elite.damage_multipliernumberМножитель урона, настроенный у пользовательского босса (1.0 для обычных элиток)
entity.elite:remove()methodУдаляет элитку (с причиной удаления OTHER). Используйте для чистого деспавна из скриптов.
Пример
return {
api_version = 1,
on_enter_combat = function(context)
if context.boss.elite ~= nil then
context.log:info("Boss level: " .. context.boss.elite.level)
context.log:info("Health x" .. context.boss.elite.health_multiplier)
end
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
}

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

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


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()

Возвращает текущую живую локацию как location table.

Пример
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()

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

Пример
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()

Возвращает текущую скорость сущности как vector table.

Пример
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)

Отправляет сообщение в action bar сущности.

ПараметрТипПримечания
messagestringТекст action bar с цветовыми кодами
Пример
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])

Отправляет заголовок и необязательный подзаголовок сущности.

ПараметрТипПо умолчаниюПримечания
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])

Показывает временный boss bar сущности.

ПараметрТипПо умолчаниюПримечания
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)

Телепортирует сущность в локацию.

ПараметрТипПримечания
locationlocation tableТочка назначения
Пример
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)

Сразу задаёт скорость сущности.

ПараметрТипПримечания
vectorvector table{ 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 тик). Полезно для переопределения нокбэка.

ПараметрТипПо умолчаниюПримечания
vectorvector tableНаправление и сила
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)

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

ПараметрТипПримечания
directionOrLocationvector или location tableЦель, к которой повернуться
Пример
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)

Поджигает сущность на указанную длительность.

ПараметрТипПримечания
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])

Добавляет тики визуальной заморозки сущности (синий эффект-оверлей).

ПараметрТипПо умолчаниюПримечания
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])

Применяет эффект зелья к сущности.

ПараметрТипПо умолчаниюПримечания
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) недоступен в Lua-способностях EliteMobs. Он существует только в Magmacore/FMM. В качестве обходного пути используйте apply_potion_effect с длительностью 0 или проектируйте свою способность без необходимости снятия эффектов.


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

Наносит урон сущности. Доступны три варианта.

МетодПримечания
deal_damage(amount)Общий источник урона
deal_custom_damage(amount)Использует BossCustomAttackDamage от босса
deal_damage_from_boss(amount)Сущность-босс задана как наносящая урон
Пример
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)

Лечит сущность до её максимума здоровья.

ПараметрТипПримечания
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, чтобы включить неуязвимость
durationnumbernilАвтовозврат через указанное число тиков
Пример
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])

Переключает AI у сущности. По желанию возвращает к исходному состоянию по истечении длительности.

ПараметрТипПо умолчаниюПримечания
enabledbooleantrue, чтобы включить AI
durationnumbernilАвтовозврат через указанное число тиков
Пример
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 и сохраняются на всё время жизни сущности.

МетодПараметрПримечания
add_tag(tag[, duration])string, optional 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)

Заставляет сущность выполнить команду. Для игроков выполняется от имени игрока; используйте текст команды без ведущего /.

ПараметрТипПримечания
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])

Задаёт атрибут generic_scale сущности. По желанию возвращает к 1.0 через указанное число тиков.

ПараметрТипПо умолчаниюПримечания
scalenumberМножитель масштаба
durationnumbernilАвтовозврат через указанное число тиков
Пример
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)

Переключает гравитацию у сущности.

ПараметрТипПримечания
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
-- Disable player gravity briefly and re-enable after 3 seconds
context.player:set_gravity(false)
context.player:send_message("&dYou begin to float!")
context.scheduler:run_after(60, function()
if context.player ~= nil and context.player:is_alive() then
context.player:set_gravity(true)
end
end)
end
}

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

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

ПараметрТипПо умолчаниюПримечания
soundstringИмя Bukkit 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])

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

ПараметрТипПо умолчаниюПримечания
particleOrSpecstring или tableИмя частицы или spec-таблица
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])

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

ПараметрТипПо умолчаниюПримечания
locationlocation tableЦелевая локация
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)

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

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

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

Толкает сущность от источника-локации или обёртки сущности.

ПараметрТипПо умолчаниюПримечания
sourcelocation или обёрткаИсточник толчка
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()

Задаёт или сбрасывает пользовательское отображаемое имя сущности. Поддерживает цветовые коды.

Пример
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.player:set_custom_name("&c&lMarked Target")
context.player:send_message("&cYou have been marked!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function()
if context.player ~= nil and context.player:is_alive() then
context.player:reset_custom_name()
end
end)
end
}

entity:place_temporary_block(material[, duration][, 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()

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


entity:is_frozen()

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


entity:set_awareness_enabled(aware[, duration])

Переключает осознанность моба. Влияет только на сущности-мобы. По желанию возвращает к исходному состоянию по истечении длительности.

ПараметрТипПо умолчаниюПримечания
awarebooleantrue, чтобы включить осознанность
durationnumbernilАвтовозврат через указанное число тиков

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

Проверяет или переключает состояние лечения у элитной сущности.


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

Возвращает true, если ограничивающий бокс сущности пересекается с осенаправленным боксом в заданной локации.

ПараметрТипПо умолчаниюПримечания
centerlocation tableЦентр тестового бокса
halfXnumber0.5Полуширина по оси X
halfYnumberто же, что halfXПолувысота по оси Y
halfZnumberто же, что halfXПолуширина по оси Z

entity:remove_elite()

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


entity:set_custom_name_visible(visible)

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

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

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

Задаёт экипировку сущности.

ПараметрТипПо умолчаниюПримечания
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.is_ai_enabled

Метод, возвращающий true, если у сущности в данный момент включён AI.

Пример
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 — например, падающий блок, снаряд или fireball — вы получаете более лёгкую обёртку-ссылку. Они возвращаются методами вроде context.world:spawn_falling_block_at_location() или context.boss:summon_projectile().

Поля: name, uuid, entity_type, is_player, is_elite, 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])Снимает с регистрации в трекере сущностей
Пример
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
)
-- 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)Текст action bar
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])Оверлей заголовка на экране
show_boss_bar(title[, color][, style][, duration])Временный boss bar
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-способностью. Всегда доступна в каждом хуке.

подсказка

Обёртка босса наследует все общие методы сущности, перечисленные выше (например, push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location и т. д.). Методы, документированные в этом разделе, либо специфичны для боссов, либо имеют другое поведение через слой 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_locationlocation tableПозиция на момент создания обёртки (снимок)
Пример
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}

Методы босса


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()

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

Пример
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])

Переключает AI у босса. По желанию возвращает к исходному состоянию по истечении длительности.

ПараметрТипПо умолчаниюПримечания
enabledbooleantrue, чтобы включить AI
durationnumbernilАвтовозврат через указанное число тиков
Пример
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)

Телепортирует босса в локацию.

ПараметрТипПримечания
locationlocation tableТочка назначения
Пример
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)

Сразу задаёт скорость босса.

ПараметрТипПримечания
vectorvector table{ 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)

Лечит босса до его максимума здоровья.

ПараметрТипПримечания
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Имя Bukkit 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Имя частицы или spec-таблица
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:face_direction_or_location(vectorOrLocation)

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

ПараметрТипПримечания
vectorOrLocationvector или location tableНаправление, к которому повернуться
Пример
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][, follow][, timeout])

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

ПараметрТипПо умолчаниюПримечания
locationlocation tableТочка назначения
speednumber1.0Множитель скорости движения
followbooleanfalseНепрерывно следовать за целью
timeoutnumbernilОтменить навигацию через указанное число тиков
Пример
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])

Запускает похожую на снаряд сущность от босса.

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

Таблица options:

КлючТипПримечания
durationnumberАвтоматически удалять через тики
max_ticksnumberМаксимум тиков для отслеживания приземления
custom_damagenumberУрон при столкновении
detonation_powerstringМощность взрыва при столкновении
yieldnumberМощность взрыва (Fireball)
persistentbooleanСохраняется ли снаряд (по умолчанию true)
effectstringИмя EntityEffect для воспроизведения при спавне
incendiarybooleanЗажигательный ли взрыв
gravitybooleanДействует ли на снаряд гравитация
glowingbooleanЭффект свечения
invulnerablebooleanНеуязвим ли снаряд
trackbooleanОтслеживать ли цель
spawn_at_originbooleanСпавнить в origin вместо смещения
direction_onlybooleanИспользовать только направление, игнорировать цель
on_landfunctionКолбэк (landing_location, spawned_entity)
Пример
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])

Призывает подкрепление-босса из файла конфигурации.

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

boss:despawn()

Удаляет босса из мира.

Пример
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_target_player()

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


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

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


boss:get_nearby_players_in_zone(zone)

Возвращает массив обёрток игроков для всех игроков, находящихся в данный момент внутри указанной зоны.

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

boss:spawn_particles_in_zone(zone, particle, ..., coverage?)

Заполняет внутренность зоны частицами.

ПараметрТипПримечания
zoneтаблица зоныФорма зоны для заполнения
particlestringИмя типа частицы
...Дополнительные параметры частицы
coveragenumber (опционально)Коэффициент плотности покрытия частицами

boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)

Обводит границу зоны частицами.

ПараметрТипПримечания
zoneтаблица зоныФорма зоны для обводки
particlestringИмя типа частицы
...Дополнительные параметры частицы
coveragenumber (опционально)Коэффициент плотности покрытия частицами

boss:get_particles_from_self_toward_zone(zone, particle, speed?)

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

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

boss:get_particles_toward_self(zone, particle, speed?)

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

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

boss:spawn_particles_with_vector(particles)

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

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

Методы Ender Dragon

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


boss:get_ender_dragon_phase()

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


boss:set_ender_dragon_phase(phase)

Задаёт фазу Ender Dragon.

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

Методы поддержки специальных способностей

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


boss:start_tracking_fireball_system(speed?)

Запускает у босса систему AI отслеживающих fireball'ов. Босс периодически запускает fireball'ы, отслеживающие его цель.

ПараметрТипПо умолчаниюПримечания
speednumber0.5Скорость fireball'а

boss:handle_spirit_walk_damage(cause)

Обрабатывает поведение spirit walk для указанной причины урона. Spirit walk делает босса невосприимчивым к определённым типам урона и телепортирует за спину атакующего.

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

boss:shield_wall_is_active()

Возвращает true, если у босса в данный момент активна стена щита.


boss:initialize_shield_wall(charges?)

Активирует у босса стену щита, способную поглощать входящий урон.

ПараметрТипПо умолчаниюПримечания
chargesnumber1Количество ударов, которое может поглотить щит

boss:shield_wall_absorb_damage(player, damage)

Пытается поглотить урон стеной щита. Возвращает true, если урон поглощён, false, если щит неактивен или израсходован.

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

boss:deactivate_shield_wall()

Деактивирует у босса стену щита, удаляя оставшиеся заряды.


boss:start_zombie_necronomicon(target, file)

Запускает у цели способность zombie necronomicon, спавня нежить-подкрепление из файла конфигурации.

ПараметрТипПримечания
targetобёртка сущностиЦелевая сущность для necronomicon
filestringИмя файла конфигурации босса для призываемой нежити

context.players

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

МетодВозвращаетПримечания
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()location tableИсходная локация спавна босса

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

Пример
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
}

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