Lua-скриптинг: Босс и сущности
Эта страница охватывает всё, что касается обёрток босса и сущностей в Lua-способностях EliteMobs: context.boss, context.player, context.players, context.entities и таблиц-обёрток сущностей, которые они возвращают. Если вы новичок в Lua-способностях, начните сначала с Начало работы.
Обёртки сущностей
Через context.boss, context.player, результаты запросов вроде context.players:nearby_players() и поля событий вы получаете таблицы-обёртки, а не объекты Bukkit. Поля содержат снимки на момент создания, а методы обращаются к серверу при вызове.
Эта страница описывает собственные обёртки способностей босса EliteMobs. Общие методы MagmaCore, например context.world:get_entity(uuid), могут возвращать другую обёртку с ленивым чтением текущих полей и другими сигнатурами. Для них используйте общий справочник API. Собственные методы принимают вызов через двоеточие или через точку без явного аргумента self. Присваивание полю меняет только Lua-таблицу; для изменения сущности вызывайте метод.
Два правила, которые нужно запомнить:
- Поля, такие как
health,current_locationиmaximum_health, являются снимками. Они отражают состояние на момент создания обёртки и не обновляются автоматически. - Методы, такие как
get_location(),get_health()иis_alive(), выполняют живую проверку каждый раз при вызове.
Общие поля сущностей
Каждая обёртка живой сущности включает эти поля.
| Поле | Тип | Примечания |
|---|---|---|
entity.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_mount | boolean | true, если эта обёртка представляет ездовое животное босса |
entity.is_monster | boolean | true для сущностей типа «монстр» |
entity.health | number | Текущее здоровье (снимок) |
entity.maximum_health | number | Максимальное здоровье (снимок) |
entity.current_location | таблица позиции | Позиция на момент создания обёртки |
entity.is_valid | boolean | Валидность Bukkit на момент создания обёртки, а не только наличие сущности; снимок |
is_valid — это поле у живых сущностей, а не методУ обёрток живых сущностей (включая context.player и context.boss) is_valid — это обычное булево значение, зафиксированное при создании обёртки. Вызов entity:is_valid() вызывает ошибку attempt to call a boolean value и отключает пауэр.
- Читайте снимок через
entity.is_valid(через точку). - Для живой проверки вместо этого вызывайте
entity:is_alive()— она каждый раз заново опрашивает сервер.
is_valid() действительно является настоящим методом у более лёгких обёрток-ссылок на неживые сущности, возвращаемых summon_projectile, spawn_falling_block_at_location и им подобными. Именно эти обёртки вы, скорее всего, будете хранить между тиками, и именно там живая проверка имеет значение.
Чтобы прочитать специфичные для элитки данные, такие как уровень босса, используйте поля и методы context.boss, описанные в разделе context.boss ниже. Чтобы деспавнить элитку из скрипта, вызовите метод entity:remove_elite().
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
end
}
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local target = context.players:current_target()
if target ~= nil then
context.log:info("Target: " .. target.name .. " HP: " .. target.health)
end
end
}
Общие методы сущностей
Эти методы обращаются к текущему состоянию сервера. Перемещение, здоровье, экипировка и эффекты доступны обёрткам живых сущностей. Чат, строка действий, заголовки, полосы босса и команды игрока требуют обёртку игрока. context.boss:send_message(...) является отдельным методом босса для рассылки ближайшим игрокам. Если возврат не описан отдельно, изменяющие методы возвращают nil, а не признак успеха.
Изменения ИИ, осведомлённости, неуязвимости и масштаба принадлежат способности, которая их внесла. Каждое из них запоминает заменённое значение: положительная длительность восстанавливает его через указанное число тиков, а закрытие скрипта восстанавливает все ещё активные изменения. Если одно свойство меняют несколько способностей, завершение одного изменения восстанавливает самое последнее из оставшихся либо исходное значение, если других изменений нет. Если тем временем свойство изменит другой плагин или команда, его значение сохраняется. Приостановка скрипта эти изменения не отменяет. Длительности тегов, отложенные толчки и полосы босса игрока используют независимые задачи игровых часов, которые продолжают работать после закрытия скрипта. Прочие изменения сущностей не отменяются.
entity:is_alive()
Возвращает true, если сущность всё ещё валидна и не мертва.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:is_alive() then
context.player:send_message("&aYou're still standing!")
end
end
}
entity:get_location()
Возвращает текущую позицию в виде таблицы локации.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.world:play_sound_at_location(loc, "entity.experience_orb.pickup")
end
}
entity:get_eye_location()
Возвращает локацию на уровне глаз в виде таблицы локации.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local eye = context.player:get_eye_location()
context.world:spawn_particle_at_location(eye, "FLAME")
end
}
entity:get_health() / entity:get_maximum_health()
Читает текущее или максимальное здоровье непосредственно с сервера.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local pct = context.player:get_health() / context.player:get_maximum_health()
if pct < 0.25 then
context.player:send_message("&cYou're running low!")
end
end
}
entity:get_velocity()
Возвращает текущую скорость сущности в виде таблицы вектора.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local vel = context.player:get_velocity()
context.log:info("Player speed Y: " .. vel.y)
end
}
entity:send_message(text)
Отправляет сообщение в чат игрока с поддержкой цветов EliteMobs.
| Параметр | Тип | Примечания |
|---|---|---|
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)
Отправляет игроку сообщение через источник Lua в компоновщике строки действий EliteMobs. Скрипт не получает исключительное право на эту область экрана.
| Параметр | Тип | Примечания |
|---|---|---|
message | string | Текст строки действий с цветовыми кодами |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:show_action_bar("&c&lDANGER ZONE")
end
}
entity:show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])
Отправляет игроку заголовок и необязательный подзаголовок с цветами EliteMobs. Время задаётся целым числом тиков.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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])
Создаёт новую полосу босса для игрока через менеджер порядка полос. Регистр названий цвета и стиля не учитывается; неизвестные значения заменяются на WHITE и SOLID. Положительная длительность запускает независимый таймер удаления. Неположительное значение не добавляет таймер, а метод не возвращает дескриптор или ключ для последующего удаления. Используйте положительную длительность. Сигнатура отличается от общего API MagmaCore с именованными полосами.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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)
Запрашивает телепортацию Bukkit и возвращает nil, не сообщая об успехе. Собственное преобразование позиции принимает x, y, z, необязательные yaw/pitch, имя загруженного world или вложенную таблицу current_location. Пропущенные координаты равны 0; пропущенный мир берётся у босса-заклинателя, а не обязательно у цели. Явно неизвестный мир не преобразуется. nil и значения не в виде таблицы используют позицию босса. Проверки безопасности точки назначения и защиты региона здесь не добавляются.
| Параметр | Тип | Примечания |
|---|---|---|
location | таблица позиции | Пункт назначения |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}
entity:set_velocity_vector(vector)
Немедленно задаёт скорость сущности.
| Параметр | Тип | Примечания |
|---|---|---|
vector | таблица вектора | { x, y, z } или { x = 0, y = 1, z = 0 } |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("launch", 100) then return end
context.player:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
context.player:send_message("&cYou are launched into the air!")
end
}
entity:apply_push_vector(vector[, additive][, delay])
Сохраняет переданный вектор и применяет его после задержки, по умолчанию 1 тик. Независимый таймер проверяет валидность сущности. При additive = true вектор добавляется к скорости на момент выполнения, иначе заменяет её. Приостановка или закрытие скрипта не отменяет толчок.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
vector | таблица вектора | Направление и сила | |
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)
Меняет направление взгляда телепортацией в текущую позицию с новым поворотом. Таблица со строковым world или вложенным current_location считается точкой назначения в том же мире, что и сущность. Обычная таблица x/y/z считается вектором направления. Нулевой вектор ничего не делает.
| Параметр | Тип | Примечания |
|---|---|---|
directionOrLocation | таблица вектора или позиции | Цель, к которой повернуться |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}
entity:set_fire_ticks(ticks)
Задаёт число тиков горения Bukkit. При вызове правила эффектов экземпляра подземелья повторно проверяют цель. Игрок должен быть онлайн, жив и в мире источника; в экземпляре он также должен входить в активный матч и список участников. Другие живые сущности должны быть валидны. Это не гарантирует урон от огня.
| Параметр | Тип | Примечания |
|---|---|---|
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])
Добавляет реальные тики замерзания Bukkit с теми же правилами целей, что и set_fire_ticks. Это не только экранный эффект через пакеты и не прямая остановка ИИ или движения. Возможно обычное поведение замерзания Minecraft.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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])
Применяет эффект Bukkit после той же проверки цели, что и set_fire_ticks. Регистр имени не учитывается; неизвестное имя вызывает предупреждение без применения эффекта. Замена существующих эффектов подчиняется правилам Bukkit и не является принудительной.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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) недоступен в собственных обёртках способностей босса EliteMobs, но присутствует в общих обёртках MagmaCore. При применении задавайте подходящую длительность. Эффект с нулевой длительностью не является надёжным способом удалить уже действующий эффект.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Передаёт урон в Bukkit. Все три метода возвращают nil; запрошенное количество не доказывает потерю здоровья. Боевые правила и последующие обработчики могут изменить или отменить удар.
| Метод | Примечания |
|---|---|
deal_damage(amount) | Вызывает урон Bukkit без явного атакующего |
deal_custom_damage(amount) | Использует BossCustomAttackDamage от босса-заклинателя: отклоняет себя, мёртвые и неуязвимые цели, игроков вне Survival/Adventure; передаёт особый удар, затем сбрасывает собственную задержку получения урона |
deal_damage_from_boss(amount) | Вызывает урон Bukkit от босса-заклинателя; может применяться обычная боевая обработка EliteMobs |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(10)
for _, p in ipairs(nearby) do
p:deal_custom_damage(10)
p:send_message("&cThe boss unleashes a shockwave!")
end
end
}
entity:restore_health(amount)
Для отслеживаемых элитных сущностей вызывает лечение EliteMobs и отменяемое событие EliteMobHealEvent. Остальные живые сущности лечатся напрямую до базового значения атрибута максимального здоровья, которое может отличаться от итогового значения get_maximum_health(). Передавайте неотрицательное количество. Это не API урона с автоматическим ограничением ввода.
| Параметр | Тип | Примечания |
|---|---|---|
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 | 0 | Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("shield", 200) then return end
context.player:set_invulnerable(true, 40)
context.player:send_message("&6A brief shield protects you!")
end
}
entity:set_ai_enabled(enabled[, duration])
Задаёт состояние ИИ сущности и запоминает заменённое значение. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Вызов set_ai_enabled(true), пока эта способность удерживает изменение ИИ, завершает это изменение и восстанавливает заменённое значение, а не применяет новое.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
enabled | boolean | true, чтобы включить ИИ | |
duration | number | 0 | Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Disable boss AI for 3 seconds at combat start
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned!")
end
}
entity:add_tag(tag[, duration]) / entity:remove_tag(tag) / entity:has_tag(tag)
Управляет тегами отслеживаемых элитных сущностей и игроков с загруженными данными инвентаря EliteMobs. Это не теги scoreboard Bukkit, и они не применяются к обычным неотслеживаемым мобам. Регистр учитывается. Таймеры удаления независимы: старый таймер может удалить повторно добавленный одноимённый тег.
| Метод | Параметр | Примечания |
|---|---|---|
add_tag(tag[, duration]) | string, опциональное number | Добавляет тег, опционально автоматически удаляя его через столько тиков |
remove_tag(tag) | string | Удаляет тег |
has_tag(tag) | string | Возвращает true, если тег присутствует |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}
entity:run_command(command)
Немедленно выполняет команду от имени игрока с его разрешениями и возвращает nil. Метод доступен только игроку, подстановки не раскрываются. Не добавляйте начальный /.
| Параметр | Тип | Примечания |
|---|---|---|
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])
Задаёт базовое значение атрибута масштаба, если он доступен, а не умножает текущий размер, и запоминает заменённое значение. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Модификаторы атрибута могут менять итоговый размер.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
scale | number | Базовое значение атрибута масштаба | |
duration | number | 0 | Восстановить заменённый масштаб через это число тиков; 0 сохраняет изменение до завершения работы способности |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss grows to double size for 5 seconds
context.boss:set_scale(2.0, 100)
context.boss:send_message("&4The boss grows in size!")
end
}
entity:set_gravity(enabled)
Задаёт гравитацию без автоматического восстановления. Обратный вызов ниже принадлежит экземпляру Lua и может не выполниться после закрытия скрипта.
| Параметр | Тип | Примечания |
|---|---|---|
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
-- Change the boss's gravity; the callback runs only while this script stays active.
context.boss:set_gravity(false)
context.scheduler:run_after(60, function(tick_context)
if tick_context.boss.exists then
tick_context.boss:set_gravity(true)
end
end)
end
}
entity:play_sound_at_entity(sound[, volume][, pitch])
Воспроизводит звук в локации сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
sound | string | Ключ звука Minecraft (например, "entity.ender_dragon.growl") или имя перечисления Spigot 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])
Создаёт частицы в текущей позиции сущности по той же спецификации частиц, что и собственный метод мира. amount в таблице имеет приоритет над запасным count. Имена переводятся в верхний регистр; неподдерживаемые частицы с дополнительными данными вызывают предупреждение и не создаются.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
particleOrSpec | string или table | Имя частицы или таблица спецификации | |
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 | таблица позиции | Целевая позиция | |
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)
Запрашивает анимацию, только если EliteMobs отслеживает сущность как пользовательского босса с пользовательской моделью. Возвращает nil, не ждёт завершения и не сообщает, существует ли такое имя анимации. Обычной сущности с моделью для этого метода недостаточно.
| Параметр | Тип | Примечания |
|---|---|---|
name | string | Имя анимации |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
Методы транспорта и пассажиров
Обёртки живых сущностей предоставляют методы транспорта и пассажиров Bukkit. Аргументы-обёртки разрешаются по Bukkit UUID; отдельные строки UUID не принимаются. Посадка отклоняет отсутствующие, одинаковые или невалидные сущности, временно обходит защиту EliteMobs от злоупотребления ездой и возвращает результат Bukkit. Эти методы не создают маршрут транспорта и не планируют очистку при закрытии скрипта.
| Метод | Возвращает | Примечания |
|---|---|---|
entity:is_inside_vehicle() | boolean | true, если сущность едет на другой сущности. |
entity:has_vehicle() | boolean | true, если у сущности в данный момент есть транспорт. |
entity:get_vehicle() | обёртка сущности или nil | Возвращает обёртку текущего транспорта. |
entity:set_vehicle(vehicle) | boolean | Заставляет эту сущность ехать на vehicle. |
entity:leave_vehicle() | boolean | Заставляет эту сущность покинуть текущий транспорт. |
entity:has_passengers() | boolean | true, если у этой сущности есть пассажиры. |
entity:get_passenger_count() | number | Количество пассажиров. |
entity:get_passengers() | table | Массив обёрток пассажиров. |
entity:add_passenger(passenger) | boolean | Добавляет пассажира этой сущности. |
entity:remove_passenger(passenger) | boolean | Удаляет пассажира из этой сущности. |
entity:eject_passengers() | boolean | Высаживает всех пассажиров. |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:has_vehicle() then
context.player:leave_vehicle()
end
end
}
entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])
Немедленно заменяет скорость нормализованным смещением от источника к сущности, умноженным на strength, с добавлением смещений по осям мира. При совпадении позиций смещения всё равно применяются. Обёртка даёт сохранённую current_location; для текущей позиции передавайте source:get_location(). Метод не сравнивает миры, поэтому используйте позиции из одного мира.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
source | позиция или обёртка | Источник толчка | |
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()
Задаёт пользовательское имя Bukkit с цветами. Сброс использует настроенное имя отслеживаемой элитной сущности, а для неотслеживаемой сущности её текущее getName(). Сохранённое исходное имя не восстанавливается. Имя учётной записи игрока и поле-снимок обёртки не меняются.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("mark", 200) then return end
context.boss:set_custom_name("&c&lEnraged Boss")
context.boss:send_message("&cThe boss is enraged!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function(tick_context)
if tick_context.boss:is_alive() then
tick_context.boss:reset_custom_name()
end
end)
end
}
entity:place_temporary_block(material[, duration][, requireAir])
Размещает временный блок в текущей позиции сущности и возвращает nil, в том числе при отказе из-за requireAir. При положительной длительности сохранённые данные блока, но не содержимое контейнера, восстанавливаются по окончании таймера, при выгрузке чанка или мира либо при выключении плагина, но только если на месте всё ещё стоит временный блок. Повторное размещение на том же временном блоке перезапускает его таймер. Блоки с сущностями блоков, например сундуки, и блоки, удерживаемые другим владельцем временных блоков, пропускаются. При разрушении блок ничего не выбрасывает. Неположительная длительность размещает блок навсегда без отслеживания. Используйте материал блока и самостоятельно проверяйте защиту.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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()
Возвращает текущий флаг Bukkit isOnGround(), не выполняя новый поиск блоков или свободного пространства над головой.
entity.is_valid
У обёртки живой сущности это булево поле, а не метод. Оно хранит валидность Bukkit при создании обёртки, а не только факт существования сущности. Читайте через точку entity.is_valid; вызов через двоеточие приведёт к ошибке.
Поскольку это снимок, он устаревает, поэтому он не заменяет живую проверку. Используйте entity:is_alive(), когда вам нужно текущее состояние, и is_valid() (метод) — у обёрток-ссылок на неживые сущности, которые вы сохранили между тиками.
entity:is_frozen()
Возвращает true, если у сущности (когда она отслеживается как пользовательский босс) установлен флаг заморозки.
entity:set_awareness_enabled(aware[, duration])
Задаёт осведомлённость моба и запоминает заменённое значение. Действует только на сущности типа Mob. Положительная длительность восстанавливает это значение через указанное число тиков; иначе изменение действует до завершения работы этой способности, которое тоже его восстанавливает. Вызов с true, пока эта способность удерживает изменение осведомлённости, завершает это изменение, а не применяет новое.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
aware | boolean | true, чтобы включить осведомлённость | |
duration | number | 0 | Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности |
entity:is_healing() / entity:set_healing(enabled)
Читает или задаёт флаг лечения отслеживаемой элитной сущности. Сам по себе не восстанавливает здоровье и не запускает таймер лечения. set_healing(true) помечает элитную сущность как лечащуюся, если она ещё не помечена; set_healing(false) снимает только флаг лечения, установленный этой способностью. При завершении работы способность снимает все ещё принадлежащие ей флаги лечения. Для неотслеживаемой сущности чтение возвращает false, запись ничего не меняет.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Проверяет числовое пересечение хитбокса сущности с прямоугольной областью, выровненной по осям. Миры не сравниваются, поэтому передавайте центр в мире сущности. Неразрешимый центр возвращает false.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
center | таблица позиции | Центр проверяемой области | |
halfX | number | 0.5 | Половина ширины по оси X |
halfY | number | как halfX | Половина высоты по оси Y |
halfZ | number | как halfX | Половина ширины по оси Z |
entity:remove_elite()
Удаляет elite-сущность из отслеживания EliteMobs. Если сущность является элиткой, это корректно деспавнит её через EliteMobs.
entity:remove()
Удаляет обычную живую сущность, заспавненную скриптом, например стойку для брони. Возвращает true, если сущность удалена. Игроки и элитки отклоняются с результатом false; деспавните элиток с помощью remove_elite().
entity:set_invisible(enabled) и entity:set_silent(enabled)
set_invisible скрывает тело сущности; надетые и удерживаемые предметы остаются видимыми. set_silent отключает собственные звуки сущности.
entity:set_marker(enabled)
Только для стоек для брони. Эти четыре метода есть у обёрток стоек для брони и отсутствуют у любых других сущностей.
| Метод | Эффект |
|---|---|
set_marker(enabled) | У стойки-маркера нет хитбокса, по ней нельзя попасть и с ней нельзя столкнуться |
set_small(enabled) | Стойка половинного размера |
set_base_plate(enabled) | Показывает или скрывает каменную базовую плиту |
set_arms(enabled) | Показывает или скрывает руки |
Для чисто визуального парящего предмета или блока лучше использовать world:spawn_display_at_location, которому ничего из этого не нужно.
entity:set_custom_name_visible(visible)
Задаёт, всегда ли видно пользовательское имя сущности или только при взгляде на неё.
| Параметр | Тип | Примечания |
|---|---|---|
visible | boolean | true для постоянной видимости |
entity:set_equipment(slot, material[, options])
Заменяет выбранный слот новым предметом указанного материала. Регистр названий слота, материала и зачарований не учитывается. Неизвестный слот или материал ничего не меняет; неизвестные зачарования пропускаются, известные добавляются без обычного ограничения уровня. Это не загрузчик файлов пользовательских предметов; метаданные прежнего предмета не сохраняются. Возвращает nil.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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:damage_equipment(slot, amount)
Повреждает предмет в HAND, OFF_HAND, HEAD, CHEST, LEGS или FEET и возвращает фактически применённую потерю прочности. Допустимый запрос за вызов: от 1 до 64. Отсутствующий, не имеющий прочности или неразрушимый предмет даёт 0.
Для игрока вызывает PlayerItemDamageEvent и учитывает отмену или изменённое количество. Обработчик может повысить его выше исходного предела 64, но результат ограничен оставшейся прочностью. При достижении максимального повреждения удаляется весь стек из слота и вызывается PlayerItemBreakEvent. Учитываются метаданные пользовательского максимального повреждения. Метод сам не рассчитывает снижение от зачарования «Прочность». Неверный слот или запрос вне 1..64 вызывает ошибку аргумента Lua.
entity:is_ai_enabled()
Возвращает true, если ИИ сейчас включён. Для отслеживаемых элитных сущностей читает логическое состояние ИИ EliteMobs, включая управление собственным поведением, а не только базовый флаг Bukkit.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.boss:is_ai_enabled() then
context.log:info("Boss AI is active")
else
context.log:info("Boss AI is disabled (stunned?)")
end
end
}
Обёртки-ссылки на неживые сущности
Когда заспавненная сущность не является LivingEntity — например, падающий блок, снаряд или огненный шар — вы получаете более лёгкую обёртку-ссылку. Они возвращаются методами вроде context.world:spawn_falling_block_at_location() или context.boss:summon_projectile().
Поля-снимки: name, uuid, entity_type, is_player (всегда false), is_elite (всегда false), is_mount (обычно false; boss:get_mount() устанавливает true), current_location
Методы:
| Метод | Примечания |
|---|---|
is_valid() | Проверка текущей валидности. Здесь это метод, в отличие от обёрток живых сущностей |
get_location() | Текущая живая локация |
get_velocity() | Текущий вектор скорости |
is_on_ground() | На земле ли |
teleport_to_location(location) | Телепортирует сущность |
set_velocity_vector(vector) | Задаёт скорость |
set_direction_vector(vector) | Задаёт направление (только Fireball) |
set_yield(value) | Задаёт мощность взрыва (только Fireball) |
set_gravity(enabled) | Переключает гравитацию |
detonate() | Запрашивает взрыв фейерверка; не действует на другие типы |
remove() | Удаляет сущность из мира |
unregister([reason]) | Выполняет удаление через трекер EliteMobs для распознанных отслеживаемых сущностей; неотслеживаемая сущность не меняется |
Эти обёртки также предоставляют все методы транспорта и пассажиров, включая is_inside_vehicle(), get_vehicle(), set_vehicle(v), add_passenger(p) и eject_passengers(). Так можно посадить босса на неживую сущность.
unregister принимает имя причины удаления без учёта регистра, по умолчанию OTHER. Это не запрос булева признака успеха. Методы сохраняют ссылку на сущность, поэтому перед использованием сохранённой обёртки проверяйте is_valid(). Отложенное удаление планировщиком Lua отменяется при закрытии экземпляра. Если очистка должна продолжаться после скрипта, используйте подходящую собственную длительность или отслеживание владельцем.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
local fb = context.boss:summon_projectile("FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5
)
if fb == nil then return end
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}
context.player
Доступен, когда прямая цель или действующее лицо события является игроком, включая on_boss_damaged_by_player и on_player_damaged_by_boss. Приоритет имеет прямая цель. Обёртка игрока включает общие методы живых сущностей, но операции, требующие отслеживаемую элитную сущность или пользовательского босса, ничего не делают для обычного игрока. Дополнения ниже доступны только игрокам.
context.player равен nil в хуках, у которых нет связанного игрока, таких как on_spawn, запланированные коллбэки и хуки таймеров. Всегда проверяйте на nil перед использованием.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}
Поля, доступные только для игрока
| Поле | Тип | Примечания |
|---|---|---|
game_mode | string | Снимок игрового режима при создании, имя в верхнем регистре, например "SURVIVAL" |
Методы, доступные только для игрока
| Метод | Примечания |
|---|---|
send_message(message) | Сообщение в чат с форматированием цветов EliteMobs |
show_action_bar(message) | Текст строки действий |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Наложение заголовка на экран |
show_boss_bar(title[, color][, style][, duration]) | Временная полоса босса |
run_command(command) | Выполнить команду от имени игрока (без ведущего /) |
Пример
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then return end
local hp_pct = context.player:get_health() / context.player:get_maximum_health()
if hp_pct < 0.3 then
context.player:show_title("&4LOW HEALTH", "&7Find cover!", 5, 30, 10)
context.player:show_boss_bar("&cBoss Enrage Incoming", "RED", "SEGMENTED_6", 80)
end
end
}
context.boss
Обёртка элитного моба, которому принадлежит эта Lua-способность. Если базовая сущность отсутствует, полный набор полей и методов живой сущности недоступен.
Пока базовая сущность существует, обёртка босса наследует общие операции живых сущностей, но не интерфейс и команды, доступные только игрокам. Методы этого раздела принадлежат боссу или иначе работают через слой EliteEntity.
Поля босса
| Поле | Тип | Примечания |
|---|---|---|
boss.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 | таблица позиции | Позиция на момент создания обёртки (снимок) |
Пример
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Методы босса
Методы движения патруля
Боссы с настроенным патрулём предоставляют patrol_pause(), patrol_resume(), walk_to(x, y, z), hold(x, y, z) и teleport(x, y, z). Координаты являются смещениями от точки появления, а каждый метод сообщает, принят ли запрос. walk_to возобновляет маршрут по прибытии; hold ждёт patrol_resume(); длинные пути используют автоматический решатель.
boss:is_alive()
Возвращает true, если сущность босса валидна, не мертва и элитка всё ещё существует. Используйте это вместо поля exists для живых проверок.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.boss:is_alive() then return end
context.boss:send_message("&cI still live!")
end
}
boss:get_location()
Возвращает текущую живую локацию босса в виде таблицы локации.
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
context.world:spawn_particle_at_location(loc, "FLAME")
end
}
boss:get_eye_location()
Возвращает локацию босса на уровне глаз.
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local eye = context.boss:get_eye_location()
context.world:spawn_particle_at_location(eye, "SMOKE")
end
}
boss:set_ai_enabled(enabled[, duration])
Задаёт состояние ИИ босса по тем же правилам принадлежащих изменений, что и entity:set_ai_enabled: положительная длительность восстанавливает заменённое значение, а закрытие способности восстанавливает все ещё активные изменения.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
enabled | boolean | true, чтобы включить ИИ | |
duration | number | 0 | Восстановить заменённое значение через это число тиков; 0 сохраняет изменение до завершения работы способности |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("stun", 200) then return end
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned for 3 seconds!")
end
}
boss:teleport_to_location(location)
Запрашивает телепортацию босса, не меняя настроенную точку появления или патрульный маршрут. Возвращает nil, а не признак успеха.
| Параметр | Тип | Примечания |
|---|---|---|
location | таблица позиции | Пункт назначения |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}
boss:set_velocity_vector(vector)
Немедленно задаёт скорость босса.
| Параметр | Тип | Примечания |
|---|---|---|
vector | таблица вектора | { x, y, z } или { x = 0, y = 1, z = 0 } |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss leaps into the air at combat start
context.boss:set_velocity_vector({ x = 0, y = 2.0, z = 0 })
context.boss:send_message("&cThe boss leaps!")
end
}
boss:restore_health(amount)
Лечит босса на неотрицательное количество, до меньшего из максимума EliteMobs и базового атрибута максимального здоровья. Вызывает отменяемое событие EliteMobHealEvent и возвращает nil.
| Параметр | Тип | Примечания |
|---|---|---|
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 | Ключ звука Minecraft (например, "entity.wither.spawn") или имя перечисления Spigot 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 | Имя частицы или таблица спецификации | |
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:has_mount() / boss:get_mount()
Проверяет или возвращает сущность, на которой босс в данный момент едет. boss:get_mount() возвращает nil, если у босса нет ездового животного. Когда возвращается ездовое животное, у его обёртки is_mount = true.
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local mount = context.boss:get_mount()
if mount ~= nil then
context.log:info("Boss is mounted on " .. mount.entity_type)
end
end
}
boss:set_mount(entity) / boss:clear_mount() / boss:dismount()
Сажает или снимает босса с ездового животного. boss:set_mount(entity) заставляет босса ехать на предоставленной обёртке сущности и возвращает true, если Bukkit принял изменение пассажира. boss:clear_mount() и boss:dismount() оба заставляют босса покинуть текущий транспорт.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("mount_check", 100) then return end
if context.boss:has_mount() then
context.boss:dismount()
end
end
}
boss:face_direction_or_location(vectorOrLocation)
Заставляет босса повернуться к направлению или локации.
| Параметр | Тип | Примечания |
|---|---|---|
vectorOrLocation | таблица вектора или позиции | Направление, к которому повернуться |
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}
boss:navigate_to_location(location[, speed][, forceTeleport][, timeout])
Использует поиск пути, чтобы привести босса к позиции. Работает только с пользовательскими боссами.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | таблица позиции | Пункт назначения | |
speed | number | 1.0 | Множитель скорости передвижения |
forceTeleport | boolean | false | Телепортировать босса к цели, если timeout истечёт до прибытия |
timeout | number | 0 | Время до прекращения движения в тиках. 0 использует стандартные 100 тиков (5 секунд) |
Навигация также прекращается, когда босс подходит к цели ближе чем на один блок, перестаёт существовать или покидает мир назначения. Новый запрос навигации отменяет уже выполняющуюся навигацию этого босса. Это независимая задача Bukkit, которую приостановка или закрытие Lua не отменяет. Позиция назначения сохраняется при вызове; метод возвращает nil, а не результат прибытия.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("charge", 200) then return end
context.boss:navigate_to_location(context.player:get_location(), 1.5)
context.boss:send_message("&cThe boss charges at you!")
end
}
boss:add_tag(tag[, duration]) / boss:remove_tag(tag) / boss:has_tag(tag)
Управляет тегами босса.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.5 and not context.boss:has_tag("phase2") then
context.boss:add_tag("phase2")
context.boss:send_message("&4Entering Phase 2!")
end
end
}
boss:send_message(message[, range])
Отправляет форматированное сообщение всем игрокам в сферическом трёхмерном радиусе в мире босса. Не фильтрует по режиму игры, прямой видимости, участию в бою или экземпляре подземелья.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
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])
Создаёт сущность и возвращает её собственную обёртку, либо nil при неразрешимой позиции или неизвестном типе. Распознанный, но несоздаваемый тип тоже может завершиться ошибкой. Обычные снаряды Bukkit выпускаются от босса, если не задано spawn_at_origin = true; переданная исходная позиция всё равно определяет направление к цели. Миры позиций не сравниваются, поэтому используйте один мир. Типы, не являющиеся снарядами, создаются в переданной исходной позиции и получают соответствующую обёртку живой или неживой сущности.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
entityType | string | Тип сущности (например, "FIREBALL", "ARROW") | |
origin | таблица позиции | Позиция запуска | |
destination | таблица позиции | Целевая позиция | |
speed | number | 1.0 | Скорость снаряда |
options | table | {} | См. опции ниже |
Таблица options:
| Ключ | Тип | Примечания |
|---|---|---|
duration | number | Положительное значение запускает независимое удаление через столько тиков; неположительное не добавляет таймер |
max_ticks | number | Предел наблюдения за приземлением, по умолчанию 6000 |
custom_damage | number | Метаданные особого урона для обработки боя снаряда, а не гарантированная потеря здоровья |
detonation_power | string | Имя файла способности в метаданных взрывного снаряда, а не числовая сила взрыва |
yield | number | Мощность взрыва (Fireball) |
persistent | boolean | При передаче задаёт сохраняемость Bukkit; не отменяет длительность, столкновение или удаление владельцем |
effect | string | Имя EntityEffect для воспроизведения при спавне |
incendiary | boolean | Является ли взрыв зажигательным |
gravity | boolean | Есть ли у снаряда гравитация |
glowing | boolean | Эффект свечения |
invulnerable | boolean | Является ли снаряд неуязвимым |
track | boolean | По умолчанию true: регистрирует снаряд в EliteMobs, но не включает наведение на цель. |
spawn_at_origin | boolean | По умолчанию false: обычные снаряды выпускает босс. Значение true создаёт снаряд в указанной исходной точке. |
direction_only | boolean | Для огненного шара в явной исходной позиции задаёт направление без дополнительного присваивания скорости |
on_land | function | Обратный вызов (landing_location, spawned_entity) при приземлении, невалидности или превышении max_ticks; не только при попадании |
direction_only пропускает дополнительное присваивание скорости огненным шарам, созданным в явной исходной позиции. Направление по-прежнему задаётся целью. Стрелком снаряда Bukkit становится босс. При track = true снаряд регистрируется в EliteMobs и включается в жизненный цикл подкреплений босса. Это не применяется к другим типам сущностей. track = false отключает такую очистку владельцем, поэтому предусмотрите другой способ удаления.
Наблюдатель on_land принадлежит экземпляру Lua и останавливается при его закрытии. Он один раз вызывает (landing_location, spawned_entity) при приземлении, невалидности или превышении счётчика, сам не удаляя сущность. Таймер положительной duration независим и продолжает работать после закрытия скрипта. Поэтому обратный вызов не доказывает попадание снаряда во что-либо.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}
boss:summon_reinforcement(filename[, zoneOrLocation][, duration])
Без объявления призывает подкрепление из файла пользовательского босса, записывает призывателя и наследует нормализованный бой, если пользовательский босс-призыватель его использует. Уровень определяется настройками самого подкрепления и правилами динамического уровня. В зоне выбирается случайная точка выборки, а при отсутствии точек её центр. Неразрешимый результат заменяется позицией босса. Возвращает обёртку живой сущности подкрепления или nil, если живое подкрепление не создано.
| Параметр | Тип | Примечания |
|---|---|---|
filename | string | Имя конфигурационного файла босса |
zoneOrLocation | таблица позиции или зона | Необязательная позиция появления или определение зоны. По умолчанию позиция босса |
duration | number | Необязательное положительное время до ухода в тиках. По умолчанию 0, без таймера этого метода; это не переопределение уровня |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 0)
context.boss:send_message("&cMinions, come to my aid!")
end
}
boss:despawn()
Удаляет босса через EliteMobs с причиной OTHER. boss:remove() является псевдонимом с тем же жизненным циклом. Это не удар и не запрос обычной награды за смерть.
Пример
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.1 then
context.boss:send_message("&7The boss vanishes into thin air!")
context.boss:despawn()
end
end
}
boss:get_nearby_players(range)
Возвращает обёртки игроков в сферическом трёхмерном радиусе в мире босса. Не фильтрует по режиму игры, прямой видимости или участию в экземпляре и не сортирует по расстоянию.
| Параметр | Тип | Примечания |
|---|---|---|
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_nearby_elites(radius)
Возвращает до 32 живых отслеживаемых элитных сущностей в мире босса, исключая его самого. Радиус должен быть конечным, больше 0 и не больше 64 блоков. Результаты используют обёртки живых сущностей, отсортированы по расстоянию, при равенстве по UUID элитной сущности. Сам запрос не означает, что эффект разрешено применять ко всем результатам.
boss:get_target_player()
Возвращает текущую цель моба-босса в виде обёртки игрока или nil, если цель не является игроком или не задана.
Методы зон и частиц
Эти методы сочетают зоны с эффектами частиц. Им требуется таблица зоны в качестве входных данных.
boss:get_nearby_players_in_zone(zone)
Возвращает игроков, соответствующих собственной форме зоны в мире босса. Не фильтрует по режиму игры или участию в экземпляре. Это новый запрос при каждом вызове, а не постоянный наблюдатель.
| Параметр | Тип | Примечания |
|---|---|---|
zone | таблица зоны | Определение формы зоны |
boss:spawn_particles_in_zone(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
Заполняет внутреннюю часть зоны частицами. Аргументы передаются по порядку; таблица спецификации здесь не принимается.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
zone | таблица зоны | Собственная форма зоны с kind; см. Зоны и выбор целей | |
particle | string | Имя типа частицы | |
amount | number | 1 | Число частиц в каждой выбранной позиции |
x, y, z | number | 0 | Разброс, либо направление при amount = 0 |
speed | number | 0 | Скорость частиц |
coverage | number | 1.0 | Независимая вероятность выбора каждой позиции, ограниченная диапазоном 0.01–1.0; из непустого набора выбирается хотя бы одна позиция |
boss:spawn_particles_in_zone_border(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
Работает как предыдущий метод, но выбирает позиции на границе зоны, а не внутри неё.
boss:get_particles_from_self_toward_zone(zone, particle[, speed])
Возвращает массив спецификаций частиц в выбранных позициях зоны, направленных от босса. Не создаёт частицы у босса и не анимирует путь от него. Передайте результат в boss:spawn_particles_with_vector(...).
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
zone | таблица зоны | Целевая зона | |
particle | string | Имя типа частицы | |
speed | number | 0.1 | Скорость движения частиц |
Каждая запись имеет вид { location = ..., particle = ..., amount = 0, x/y/z = <unit direction>, speed = ... }. Каждая точка выбирается с вероятностью 20 %, из непустого набора берётся хотя бы одна. Затем позиции, совпадающие с боссом, пропускаются. Реальное поведение направления зависит от типа частицы.
boss:get_particles_toward_self(zone, particle, speed)
Возвращает массив описаний частиц, направленных от зоны к боссу, но не создаёт их. Передайте результат в boss:spawn_particles_with_vector(...).
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
zone | таблица зоны | Исходная зона | |
particle | string | Имя типа частицы | |
speed | number | Передайте явное значение, например 0.1; иначе метод попытается прочитать имя частицы как число и завершится ошибкой. |
boss:spawn_particles_with_vector(particles)
Спавнит массив направленных частиц, каждая со своей собственной позицией и вектором скорости.
| Параметр | Тип | Примечания |
|---|---|---|
particles | массив таблиц | Каждая запись определяет частицу с позицией и направлением |
Методы Эндер-дракона
Эти методы применяются только когда сущность босса является Эндер-драконом.
boss:get_ender_dragon_phase()
Возвращает имя текущей фазы EnderDragon.Phase в виде строки или nil, если босс не является Эндер-драконом.
boss:set_ender_dragon_phase(phase)
Задаёт фазу Эндер-дракона.
| Параметр | Тип | Примечания |
|---|---|---|
phase | string | Имя EnderDragon.Phase (например, "CIRCLING", "CHARGE_PLAYER") |
Методы поддержки особых способностей
Эти методы поддерживают встроенные механики пауэров EliteMobs из Lua-скриптов.
boss:start_tracking_fireball_system(speed?)
Запускает один контроллер этой способности на боссе типа Monster. При первом выполнении (на следующем тике) и затем каждые 8 секунд, пока у монстра есть цель, выпускает самонаводящиеся огненные шары в игроков Survival/Adventure в пределах 20 блоков по каждой оси. Выполнение без цели останавливает контроллер, в том числе первое; новый вызов может запустить его снова. Повторный вызов во время работы не меняет скорость. Контроллер принадлежит скрипту способности: приостановка скрипта приостанавливает его, а закрытие скрипта останавливает. Если вызов запускает контроллер, скорость должна быть конечной и положительной, иначе вызов завершается ошибкой.
Шары имеют мощность 3 и поджигают. Задача наведения каждого шара не зависит от скрипта. Она прекращается примерно через 3 минуты или при недействительном контексте, но сама остановка не удаляет шар. Неотменённый удар по отслеживаемому шару переключает преследование между игроком и заклинателем.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
speed | number | 0.5 | Скорость огненного шара; должна быть конечной и положительной |
boss:handle_spirit_walk_damage(cause)
Передаёт причину урона в Spirit Walk. Огонь, тики горения, яд, иссушение, шипы и размашистые атаки не увеличивают счётчик. Утопление и удушье немедленно запускают уход; остальные принимаемые причины запускают его при каждом девятом ударе. Метод ищет подходящую точку поблизости и анимирует перемещение с временной неуязвимостью. Он не отменяет переданное событие урона и не гарантирует позицию за спиной атакующего.
| Параметр | Тип | Примечания |
|---|---|---|
cause | string | Имя Bukkit DamageCause (например, "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Возвращает флаг активности контроллера щита. Не гарантирует, что запас щита конкретного направления ещё положителен.
boss:initialize_shield_wall(openingDirection?)
Инициализирует запасы щита по направлениям и визуальные эффекты, если стена ещё не активна. Каждая защищённая сторона получает запас, равный уровню босса. Аргумент выбирает незащищённый проход, а не количество зарядов. Метод возвращает nil и не устанавливает обработчик события урона.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
openingDirection | number | 1 | 1 = север, 2 = восток, 3 = юг, 4 = запад; другие целые числа оставляют защищёнными все четыре стороны |
boss:shield_wall_absorb_damage(player, damage)
Определяет направление по позиции атакующего относительно босса и вычитает переданный урон из запаса этой стороны. Возвращает true, если запас был положительным до вычитания, даже когда удар превышает остаток. Возвращает false при отсутствии игрока или состояния, другом мире, истощённой или открытой стороне. Событие урона не отменяется. Если результат true, ваш обработчик должен вызвать context.event.cancel_event(), чтобы заблокировать удар. Передавайте неотрицательное количество урона.
| Параметр | Тип | Примечания |
|---|---|---|
player | обёртка игрока | Атакующий игрок |
damage | number | Количество урона для поглощения |
boss:deactivate_shield_wall()
Останавливает независимую задачу отображения стены, удаляет состояние и стойки для брони щита. Одного закрытия экземпляра Lua недостаточно; явно вызывайте метод при завершении механики.
boss:start_zombie_necronomicon(target, chant)
Запускает контроллер Necronomicon с живой целью и прокручиваемым текстом заклинания. Второй аргумент является отображаемым текстом, а не именем файла босса. Каждые 60 тиков призывает одно подкрепление уровня заклинателя из фиксированного файла necronomicon_zombie.yml с вероятностью 80 % или necronomicon_skeleton.yml с вероятностью 20 %. Новый запуск принимается только при не более девяти отслеживаемых подкреплениях и отсутствии активного контроллера. Работающий контроллер доводит количество до одиннадцати, включает ИИ при полном составе и возобновляет заклинание после уменьшения числа.
Во время заклинания ИИ босса отключается и меняется отображаемое имя; предупреждающие эффекты учитывают соответствующую настройку. Цель должна оставаться валидной, в том же мире и не дальше 30 блоков. Недействительный контекст или удаление владельца останавливает контроллеры, восстанавливает отображение и удаляет их подкрепления. Это независимые задачи Bukkit, поэтому закрытие Lua само по себе их не останавливает. Метод возвращает nil.
| Параметр | Тип | Примечания |
|---|---|---|
target | обёртка сущности | Целевая сущность для некрономикона |
chant | string | Прокручиваемый текст; пустой текст заменяется именем босса, короткий дополняется |
context.players
Помощники запросов игроков, центрированные вокруг босса. Используйте их, чтобы находить игроков, не нуждаясь в конкретном игроке из события.
Запросы не фильтруют по режиму игры, прямой видимости, состоянию жизни, участию в бою или экземпляре и не сортируют по расстоянию. current_target() отдаёт приоритет действующему лицу события, тогда как context.player предпочитает прямую цель. Свежий контекст планировщика не содержит действующего лица события и использует текущую цель моба.
| Метод | Возвращает | Примечания |
|---|---|---|
players:current_target() | обёртка игрока или nil | Игрок из события или цель моба-босса, если это игрок |
players:nearby_players(radius) | массив обёрток игроков | Все игроки в пределах радиуса от босса |
players:all_players_in_world() | массив обёрток игроков | Все игроки в мире босса |
Пример
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
Пример
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}
context.entities
Общие помощники запросов сущностей, центрированные вокруг босса.
| Метод | Возвращает | Примечания |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | массив обёрток сущностей | Ближайшие к боссу сущности |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | массив обёрток сущностей | Живые сущности в мире центра, чья позиция ног внутри области с включёнными границами; это не проверка пересечения хитбоксов |
entities:get_all_entities([filter]) | массив обёрток сущностей | Все подходящие сущности в мире босса |
entities:get_direct_target_entity() | обёртка сущности или nil | Прямая цель для текущего события |
entities:get_boss_spawn_location() | таблица позиции | Изначальная позиция появления босса |
Допустимые фильтры: living (по умолчанию), player / players, elite / elites, mob / mobs, all / entities
all / entities учитывается только в get_nearby_entities. Он включает неживые сущности, например выброшенные предметы и снаряды, в виде облегчённых ссылочных обёрток. Живые результаты по-прежнему используют полные обёртки живых сущностей. Этот фильтр ищет в прямоугольной области с заданным радиусом по каждой оси, а фильтры живых сущностей используют сферическое расстояние. В остальных запросах all / entities сводится к living. Сам босс исключается из всех результатов.
Регистр фильтров не учитывается; неизвестные значения тоже сводятся к living. mob означает любую живую сущность, кроме игрока, а не только враждебного монстра. Автоматической фильтрации участников экземпляра, ограничения числа результатов и сортировки по расстоянию нет. Широкие запросы живых сущностей обходят загруженные живые сущности мира, поэтому ограничивайте радиус и избегайте ненужных повторных обходов. get_direct_target_entity() использует прямую цель события и может вернуть nil; к текущей боевой цели моба он не переходит.
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Damage all nearby elites
local elites = context.entities:get_nearby_entities(10, "elites")
for _, elite in ipairs(elites) do
elite:deal_damage(5)
end
end
}
Пример
return {
api_version = 1,
on_enter_combat = function(context)
-- Find players in a box area
local center = context.boss:get_location()
local players = context.entities:get_entities_in_box(center, 10, 5, 10, "players")
for _, p in ipairs(players) do
p:send_message("&eYou are in the danger zone!")
end
end
}
