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

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

webapp_banner.jpg

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


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

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

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

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

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

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

FieldTypeNotes
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.is_validbooleanФлаг валидности снимка
entity.healthnumberТекущее здоровье (снимок)
entity.maximum_healthnumberМаксимальное здоровье (снимок)
entity.current_locationlocation tableПозиция на момент создания обёртки

Чтобы прочитать специфичные для элитки данные, такие как уровень босса, используйте поля и методы 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
}

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

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


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.

ParameterTypeNotes
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) сущности.

ParameterTypeNotes
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])

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

ParameterTypeDefaultNotes
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).

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

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

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

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

ParameterTypeNotes
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 тик). Полезно для переопределения отбрасывания.

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

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

ParameterTypeNotes
directionOrLocationvector or 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)

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

ParameterTypeNotes
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])

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

ParameterTypeDefaultNotes
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])

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

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

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

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

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

ParameterTypeNotes
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])

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

ParameterTypeDefaultNotes
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])

Переключает ИИ сущности. Опционально возвращается обратно через длительность.

ParameterTypeDefaultNotes
enabledbooleantrue, чтобы включить ИИ
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 и сохраняются на протяжении всего времени жизни сущности.

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

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

ParameterTypeNotes
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 через длительность.

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

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

ParameterTypeNotes
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
local player = context.player
player:set_gravity(false)
player:send_message("&dYou begin to float!")
context.scheduler:run_after(60, function()
if player:is_alive() then
player:set_gravity(true)
end
end)
end
}

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

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

ParameterTypeDefaultNotes
soundstringКлюч звука Minecraft (например, "entity.ender_dragon.growl")
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])

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

ParameterTypeDefaultNotes
particleOrSpecstring or 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])

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

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

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

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

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

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

MethodReturnsNotes
entity:is_inside_vehicle()booleanTrue, если сущность едет на другой сущности.
entity:has_vehicle()booleanTrue, если у сущности в данный момент есть транспорт.
entity:get_vehicle()entity wrapper or 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])

Отталкивает сущность прочь от исходной локации или обёртки сущности.

ParameterTypeDefaultNotes
sourcelocation or wrapperИсточник толчка
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
local player = context.player
player:set_custom_name("&c&lMarked Target")
player:send_message("&cYou have been marked!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function()
if player:is_alive() then
player:reset_custom_name()
end
end)
end
}

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

Размещает временный блок в текущей локации сущности.

ParameterTypeDefaultNotes
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])

Переключает осведомлённость моба (mob awareness). Влияет только на сущности типа «моб». Опционально возвращается обратно через длительность.

ParameterTypeDefaultNotes
awarebooleantrue, чтобы включить осведомлённость
durationnumbernilАвтоматический возврат через столько тиков

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

Проверяет или переключает состояние исцеления у elite-сущности.


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

Возвращает true, если ограничивающая рамка (bounding box) сущности пересекается с осевыравненной рамкой (axis-aligned box) в заданной локации.

ParameterTypeDefaultNotes
centerlocation tableЦентр тестовой рамки
halfXnumber0.5Половина ширины по оси X
halfYnumbersame as halfXПоловина высоты по оси Y
halfZnumbersame as halfXПоловина ширины по оси Z

entity:remove_elite()

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


entity:set_custom_name_visible(visible)

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

ParameterTypeNotes
visiblebooleantrue для постоянной видимости

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

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

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

Таблица options:

KeyTypeDefaultNotes
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, если у сущности в данный момент включён ИИ.

Пример
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, is_elite, current_location

Методы:

MethodNotes
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
}

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

FieldTypeNotes
game_modestringИмя текущего игрового режима (например, "SURVIVAL")

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

MethodNotes
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

Обёртка босса для elite-моба, которому принадлежит эта Lua-способность. Всегда доступна в каждом хуке.

подсказка

Обёртка босса наследует все общие методы сущностей, перечисленные выше (например, push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location и т. д.). Методы, описанные в этом разделе, либо специфичны для босса, либо имеют другое поведение через слой EliteEntity.

Поля босса

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

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

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

Переключает ИИ босса. Опционально возвращается обратно через длительность.

ParameterTypeDefaultNotes
enabledbooleantrue, чтобы включить ИИ
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)

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

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

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

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

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

ParameterTypeNotes
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])

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

ParameterTypeDefaultNotes
soundstringКлюч звука Minecraft (например, "entity.wither.spawn")
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])

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

ParameterTypeDefaultNotes
particleOrSpecstring or 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)

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

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

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

ParameterTypeNotes
vectorOrLocationvector or 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])

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

ParameterTypeDefaultNotes
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])

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

ParameterTypeDefaultNotes
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])

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

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

Таблица options:

KeyTypeNotes
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][, level])

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

ParameterTypeNotes
filenamestringИмя конфигурационного файла босса
zoneOrLocationlocation table or zoneОпциональная локация спавна или определение зоны. По умолчанию — локация босса.
levelnumberОпциональный уровень подкрепления. По умолчанию 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()

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

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

Возвращает массив обёрток игроков в пределах радиуса от босса.

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

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

ParameterTypeNotes
zonezone tableОпределение формы зоны

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

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

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

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

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

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

boss:get_particles_from_self_toward_zone(zone, particle, speed?)

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

ParameterTypeDefaultNotes
zonezone tableЦелевая зона
particlestringИмя типа частицы
speednumbernilСкорость движения частиц

boss:get_particles_toward_self(zone, particle, speed?)

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

ParameterTypeDefaultNotes
zonezone tableИсходная зона
particlestringИмя типа частицы
speednumbernilСкорость движения частиц

boss:spawn_particles_with_vector(particles)

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

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

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

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


boss:get_ender_dragon_phase()

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


boss:set_ender_dragon_phase(phase)

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

ParameterTypeNotes
phasestringИмя EnderDragon.Phase (например, "CIRCLING", "CHARGE_PLAYER")

Методы поддержки особых пауэров

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


boss:start_tracking_fireball_system(speed?)

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

ParameterTypeDefaultNotes
speednumber0.5Скорость огненного шара

boss:handle_spirit_walk_damage(cause)

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

ParameterTypeNotes
causestringИмя Bukkit DamageCause (например, "ENTITY_ATTACK", "PROJECTILE")

boss:shield_wall_is_active()

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


boss:initialize_shield_wall(charges?)

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

ParameterTypeDefaultNotes
chargesnumber1Количество ударов, которое может поглотить щит

boss:shield_wall_absorb_damage(player, damage)

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

ParameterTypeNotes
playerplayer wrapperАтакующий игрок
damagenumberКоличество урона для поглощения

boss:deactivate_shield_wall()

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


boss:start_zombie_necronomicon(target, file)

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

ParameterTypeNotes
targetentity wrapperЦелевая сущность для некрономикона
filestringИмя конфигурационного файла босса для призываемой нежити

context.players

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

MethodReturnsNotes
players:current_target()player wrapper or 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

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

MethodReturnsNotes
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()entity wrapper or 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
}

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