Lua-скриптинг: Босс и сущности
Эта страница охватывает всё, что касается обёрток босса и сущностей в 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.name | string | Отображаемое имя |
entity.uuid | string | UUID в виде текста |
entity.entity_type | string | Имя Bukkit EntityType (например, "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true для игроков |
entity.is_elite | boolean | true, если EliteMobs отслеживает её как элитку |
entity.is_custom_boss | boolean | true, если сущность является пользовательским боссом (региональный, инстансированный и т. д.) |
entity.is_significant_boss | boolean | true для пользовательских боссов с множителем здоровья выше 1 (то есть крупные боссы, а не мелкие подкрепления) |
entity.is_monster | boolean | true для сущностей-монстров |
entity.is_valid | boolean | Флаг валидности (снимок) |
entity.health | number | Текущее здоровье (снимок) |
entity.maximum_health | number | Максимальное здоровье (снимок) |
entity.current_location | location table | Позиция на момент создания обёртки |
entity.elite | table или nil | Подтаблица только для элиток; присутствует только когда entity.is_elite равно true и у EliteMobs есть данные об элитке для сущности. См. Подтаблица Elite ниже. |
Подтаблица Elite
Когда сущность является элиткой EliteMobs, у обёртки есть дополнительная таблица entity.elite с полями и методами, специфичными для элиток. У не-элиток это поле отсутствует (nil).
| Поле / Метод | Тип | Примечания |
|---|---|---|
entity.elite.level | number | Уровень элитки |
entity.elite.name | string или nil | Настроенное отображаемое имя элитки |
entity.elite.health | number | Снимок текущего здоровья (то же значение, что и entity.health) |
entity.elite.max_health | number | Снимок максимального здоровья (то же значение, что и entity.maximum_health) |
entity.elite.is_custom_boss | boolean | Является ли элитка пользовательским боссом |
entity.elite.health_multiplier | number | Множитель здоровья, настроенный у пользовательского босса (1.0 для обычных элиток) |
entity.elite.damage_multiplier | number | Множитель урона, настроенный у пользовательского босса (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.
| Параметр | Тип | Примечания |
|---|---|---|
text | string | Сообщение с цветовыми кодами |
Пример
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 сущности.
| Параметр | Тип | Примечания |
|---|---|---|
message | string | Текст 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])
Отправляет заголовок и необязательный подзаголовок сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
title | string | Текст заголовка | |
subtitle | string | "" | Текст подзаголовка |
fadeIn | number | 10 | Тики появления |
stay | number | 40 | Тики удержания |
fadeOut | number | 10 | Тики исчезновения |
Пример
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 сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
title | string | Текст заголовка полосы | |
color | string | "WHITE" | Значение BarColor |
style | string | "SOLID" | Значение BarStyle |
duration | number | 40 | Длительность в тиках |
Пример
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)
Телепортирует сущность в локацию.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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)
Сразу задаёт скорость сущности.
| Параметр | Тип | Примечания |
|---|---|---|
vector | vector 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 тик). Полезно для переопределения нокбэка.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
vector | vector table | Направление и сила | |
additive | boolean | false | Добавлять к существующей скорости вместо замены |
delay | number | 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("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)
Заставляет сущность повернуться к вектору направления или локации.
| Параметр | Тип | Примечания |
|---|---|---|
directionOrLocation | vector или 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)
Поджигает сущность на указанную длительность.
| Параметр | Тип | Примечания |
|---|---|---|
ticks | number | Длительность горения в тиках (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])
Добавляет тики визуальной заморозки сущности (синий эффект-оверлей).
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
ticks | number | 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("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])
Применяет эффект зелья к сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
effect | string | Имя PotionEffectType | |
duration | number | Длительность в тиках | |
amplifier | number | 0 | Уровень эффекта (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)
Лечит сущность до её максимума здоровья.
| Параметр | Тип | Примечания |
|---|---|---|
amount | number | Количество лечения |
Пример
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])
Переключает неуязвимость сущности. По желанию возвращает к исходному состоянию по истечении длительности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
enabled | boolean | true, чтобы включить неуязвимость | |
duration | number | 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("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 у сущности. По желанию возвращает к исходному состоянию по истечении длительности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
enabled | boolean | true, чтобы включить AI | |
duration | number | nil | Автовозврат через указанное число тиков |
Пример
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)
Заставляет сущность выполнить команду. Для игроков выполняется от имени игрока; используйте текст команды без ведущего /.
| Параметр | Тип | Примечания |
|---|---|---|
command | string | Текст команды без ведущего / |
Пример
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 через указанное число тиков.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
scale | number | Множитель масштаба | |
duration | number | nil | Автовозврат через указанное число тиков |
Пример
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)
Переключает гравитацию у сущности.
| Параметр | Тип | Примечания |
|---|---|---|
enabled | boolean | true для обычной гравитации |
Пример
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])
Воспроизводит звук в локации сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
sound | string | Имя Bukkit Sound | |
volume | number | 1.0 | Громкость |
pitch | number | 1.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])
Спавнит частицы в локации сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
particleOrSpec | string или table | Имя частицы или spec-таблица | |
count | number | 1 | Количество частиц |
Пример
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 | location table | Целевая локация | |
particle | string | Имя типа частицы | |
count | number | 1 | Количество частиц |
Пример
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)
Воспроизводит анимацию пользовательской модели, если у сущности есть пользовательская модель, поддерживающая её.
| Параметр | Тип | Примечания |
|---|---|---|
name | string | Имя анимации |
Пример
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])
Толкает сущность от источника-локации или обёртки сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
source | location или обёртка | Источник толчка | |
strength | number | 1.0 | Множитель силы толчка |
xOffset | number | 0 | Дополнительное смещение по X |
yOffset | number | 0 | Дополнительное смещение по Y |
zOffset | number | 0 | Дополнительное смещение по 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])
Размещает временный блок в текущей локации сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
material | string | Имя материала блока | |
duration | number | 0 | Тиков до удаления |
requireAir | boolean | false | Размещать только если на месте сейчас воздух |
Пример
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])
Переключает осознанность моба. Влияет только на сущности-мобы. По желанию возвращает к исходному состоянию по истечении длительности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
aware | boolean | true, чтобы включить осознанность | |
duration | number | nil | Автовозврат через указанное число тиков |
entity:is_healing() / entity:set_healing(enabled)
Проверяет или переключает состояние лечения у элитной сущности.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Возвращает true, если ограничивающий бокс сущности пересекается с осенаправленным боксом в заданной локации.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
center | location table | Центр тестового бокса | |
halfX | number | 0.5 | Полуширина по оси X |
halfY | number | то же, что halfX | Полувысота по оси Y |
halfZ | number | то же, что halfX | Полуширина по оси Z |
entity:remove_elite()
Убирает элитную сущность из отслеживания EliteMobs. Если сущность — элитка, это корректно деспавнит её через EliteMobs.
entity:set_custom_name_visible(visible)
Задаёт, всегда ли видно пользовательское имя сущности или только при наведении.
| Параметр | Тип | Примечания |
|---|---|---|
visible | boolean | true для постоянной видимости |
entity:set_equipment(slot, material[, options])
Задаёт экипировку сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
slot | string | Слот экипировки: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Имя материала (например, "DIAMOND_SWORD", "IRON_HELMET") | |
options | table | {} | Необязательные настройки (см. ниже) |
Таблица options:
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
enchantments | массив таблиц | nil | Каждая запись: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Является ли предмет неразрушимым |
Пример
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_mode | string | Имя текущего игрового режима (например, "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.name | string | Отображаемое имя |
boss.uuid | string | UUID элитки-босса |
boss.entity_type | string | Имя Bukkit EntityType |
boss.is_monster | boolean | true, если базовая сущность — Monster |
boss.level | number | Уровень элитки |
boss.health | number | Текущее здоровье (снимок) |
boss.maximum_health | number | Максимальное здоровье (снимок) |
boss.damager_count | number | Количество атакующих (снимок) |
boss.is_in_combat | boolean | Состояние боя |
boss.exists | boolean | Существует ли ещё элитка |
boss.current_location | location 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 у босса. По желанию возвращает к исходному состоянию по истечении длительности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
enabled | boolean | true, чтобы включить AI | |
duration | number | nil | Автовозврат через указанное число тиков |
Пример
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)
Телепортирует босса в локацию.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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)
Сразу задаёт скорость босса.
| Параметр | Тип | Примечания |
|---|---|---|
vector | vector 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)
Лечит босса до его максимума здоровья.
| Параметр | Тип | Примечания |
|---|---|---|
amount | number | Количество лечения |
Пример
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])
Воспроизводит звук в локации босса.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
sound | string | Имя Bukkit Sound | |
volume | number | 1.0 | Громкость |
pitch | number | 1.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])
Спавнит частицы в локации босса.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
particleOrSpec | string или table | Имя частицы или spec-таблица | |
count | number | 1 | Количество частиц |
Пример
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)
Воспроизводит анимацию пользовательской модели у босса, если она доступна.
| Параметр | Тип | Примечания |
|---|---|---|
name | string | Имя анимации |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:face_direction_or_location(vectorOrLocation)
Заставляет босса повернуться к направлению или локации.
| Параметр | Тип | Примечания |
|---|---|---|
vectorOrLocation | vector или 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])
Использует поиск пути, чтобы заставить босса идти к локации.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table | Точка назначения | |
speed | number | 1.0 | Множитель скорости движения |
follow | boolean | false | Непрерывно следовать за целью |
timeout | number | 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])
Отправляет сообщение в чат всем игрокам поблизости.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
message | string | Текст сообщения с цветовыми кодами | |
range | number | 20 | Радиус в блоках |
Пример
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])
Запускает похожую на снаряд сущность от босса.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
entityType | string | Тип сущности (например, "FIREBALL", "ARROW") | |
origin | location table | Позиция запуска | |
destination | location table | Целевая позиция | |
speed | number | 1.0 | Скорость снаряда |
options | table | {} | См. опции ниже |
Таблица options:
| Ключ | Тип | Примечания |
|---|---|---|
duration | number | Автоматически удалять через тики |
max_ticks | number | Максимум тиков для отслеживания приземления |
custom_damage | number | Урон при столкновении |
detonation_power | string | Мощность взрыва при столкновении |
yield | number | Мощность взрыва (Fireball) |
persistent | boolean | Сохраняется ли снаряд (по умолчанию true) |
effect | string | Имя EntityEffect для воспроизведения при спавне |
incendiary | boolean | Зажигательный ли взрыв |
gravity | boolean | Действует ли на снаряд гравитация |
glowing | boolean | Эффект свечения |
invulnerable | boolean | Неуязвим ли снаряд |
track | boolean | Отслеживать ли цель |
spawn_at_origin | boolean | Спавнить в origin вместо смещения |
direction_only | boolean | Использовать только направление, игнорировать цель |
on_land | function | Колбэк (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])
Призывает подкрепление-босса из файла конфигурации.
| Параметр | Тип | Примечания |
|---|---|---|
filename | string | Имя файла конфигурации босса |
zoneOrLocation | location table или зона | Локация спавна или определение зоны |
duration | number | Необязательный автодеспавн через тики |
Пример
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)
Возвращает массив обёрток игроков в пределах радиуса от босса.
| Параметр | Тип | Примечания |
|---|---|---|
range | number | Радиус в блоках |
Пример
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 | таблица зоны | Форма зоны для заполнения |
particle | string | Имя типа частицы |
... | Дополнительные параметры частицы | |
coverage | number (опционально) | Коэффициент плотности покрытия частицами |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Обводит границу зоны частицами.
| Параметр | Тип | Примечания |
|---|---|---|
zone | таблица зоны | Форма зоны для обводки |
particle | string | Имя типа частицы |
... | Дополнительные параметры частицы | |
coverage | number (опционально) | Коэффициент плотности покрытия частицами |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Спавнит направленные частицы, движущиеся от босса к зоне.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
zone | таблица зоны | Целевая зона | |
particle | string | Имя типа частицы | |
speed | number | nil | Скорость движения частицы |
boss:get_particles_toward_self(zone, particle, speed?)
Спавнит направленные частицы, движущиеся от зоны к боссу.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
zone | таблица зоны | Исходная зона | |
particle | string | Имя типа частицы | |
speed | number | nil | Скорость движения частицы |
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.
| Параметр | Тип | Примечания |
|---|---|---|
phase | string | Имя EnderDragon.Phase (например, "CIRCLING", "CHARGE_PLAYER") |
Методы поддержки специальных способностей
Эти методы поддерживают встроенные механики способностей EliteMobs из Lua-скриптов.
boss:start_tracking_fireball_system(speed?)
Запускает у босса систему AI отслеживающих fireball'ов. Босс периодически запускает fireball'ы, отслеживающие его цель.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
speed | number | 0.5 | Скорость fireball'а |
boss:handle_spirit_walk_damage(cause)
Обрабатывает поведение spirit walk для указанной причины урона. Spirit walk делает босса невосприимчивым к определённым типам урона и телепортирует за спину атакующего.
| Параметр | Тип | Примечания |
|---|---|---|
cause | string | Имя Bukkit DamageCause (например, "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Возвращает true, если у босса в данный момент активна стена щита.
boss:initialize_shield_wall(charges?)
Активирует у босса стену щита, способную поглощать входящий урон.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
charges | number | 1 | Количество ударов, которое может поглотить щит |
boss:shield_wall_absorb_damage(player, damage)
Пытается поглотить урон стеной щита. Возвращает true, если урон поглощён, false, если щит неактивен или израсходован.
| Параметр | Тип | Примечания |
|---|---|---|
player | обёртка игрока | Атакующий игрок |
damage | number | Количество урона для поглощения |
boss:deactivate_shield_wall()
Деактивирует у босса стену щита, удаляя оставшиеся заряды.
boss:start_zombie_necronomicon(target, file)
Запускает у цели способность zombie necronomicon, спавня нежить-подкрепление из файла конфигурации.
| Параметр | Тип | Примечания |
|---|---|---|
target | обёртка сущности | Целевая сущность для necronomicon |
file | string | Имя файла конфигурации босса для призываемой нежити |
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
}
