Scripting Lua: Boss e Entidades
Esta página cobre tudo sobre wrappers de boss e entidade nos poderes Lua do EliteMobs: context.boss, context.player, context.players, context.entities, e as tabelas wrapper de entidade que eles retornam. Se você é novo nos poderes Lua, comece pelo Getting Started primeiro.
Wrappers de Entidade
Quando você acessa entidades através da API Lua -- seja de context.boss, context.player, resultados de query como context.players:nearby_players(), ou campos de evento -- você sempre recebe tabelas wrapper. Esses não são objetos Bukkit puros. Cada wrapper fornece um conjunto de campos (valores de snapshot capturados no momento da criação) e métodos (chamadas em tempo real que acessam o servidor).
Duas regras para lembrar:
- Campos como
health,current_location, emaximum_healthsão snapshots. Eles refletem o estado no momento em que o wrapper foi criado e não atualizam automaticamente. - Métodos como
get_location(),get_health(), eis_alive()realizam uma verificação em tempo real toda vez que você os chama.
Campos Comuns de Entidade
Todo wrapper de entidade viva inclui esses campos.
| Campo | Tipo | Observações |
|---|---|---|
entity.name | string | Nome de exibição |
entity.uuid | string | UUID como texto |
entity.entity_type | string | Nome do EntityType do Bukkit (ex.: "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true para jogadores |
entity.is_elite | boolean | true se o EliteMobs o rastreia como um elite |
entity.is_custom_boss | boolean | true se a entidade é um Custom Boss (regional, instanciado, etc.) |
entity.is_significant_boss | boolean | true para Custom Bosses com um multiplicador de vida acima de 1 (ou seja, grandes bosses, não pequenos reforços) |
entity.is_monster | boolean | true para entidades do tipo monstro |
entity.is_valid | boolean | Flag de validade do snapshot |
entity.health | number | Vida atual (snapshot) |
entity.maximum_health | number | Vida máxima (snapshot) |
entity.current_location | tabela de localização | Posição no momento em que o wrapper foi criado |
entity.elite | tabela ou nil | Subtabela só para elites; presente apenas quando entity.is_elite é true e o EliteMobs tem dados de elite para a entidade. Veja Subtabela de Elite abaixo. |
Subtabela de Elite
Quando uma entidade é um elite do EliteMobs, o wrapper tem uma tabela adicional entity.elite com campos e métodos específicos de elite. Em não-elites esse campo está ausente (nil).
| Campo / Método | Tipo | Observações |
|---|---|---|
entity.elite.level | number | O nível do elite |
entity.elite.name | string ou nil | O nome de exibição configurado do elite |
entity.elite.health | number | Snapshot da vida atual (mesmo valor de entity.health) |
entity.elite.max_health | number | Snapshot da vida máxima (mesmo valor de entity.maximum_health) |
entity.elite.is_custom_boss | boolean | Se o elite é um Custom Boss |
entity.elite.health_multiplier | number | Multiplicador de vida configurado no Custom Boss (1.0 para elites comuns) |
entity.elite.damage_multiplier | number | Multiplicador de dano configurado no Custom Boss (1.0 para elites comuns) |
entity.elite:remove() | método | Remove o elite (usando o motivo de remoção OTHER). Use isso para despawns limpos a partir de scripts. |
Exemplo
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
}
Exemplo
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
}
Métodos Comuns de Entidade
Todo wrapper de entidade viva suporta esses métodos. Cada método realiza uma chamada em tempo real ao servidor.
entity:is_alive()
Retorna true se a entidade ainda é válida e não está morta.
Exemplo
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()
Retorna a localização atual em tempo real como uma tabela de localização.
Exemplo
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()
Retorna a localização ao nível dos olhos como uma tabela de localização.
Exemplo
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()
Retorna a vida atual ou máxima em tempo real.
Exemplo
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()
Retorna a velocidade atual da entidade como uma tabela de vetor.
Exemplo
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)
Envia uma mensagem de chat para a entidade. Suporta formatação de cor do EliteMobs.
| Parâmetro | Tipo | Observações |
|---|---|---|
text | string | Mensagem com códigos de cor |
Exemplo
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)
Envia uma mensagem na action bar para a entidade.
| Parâmetro | Tipo | Observações |
|---|---|---|
message | string | Texto da action bar com códigos de cor |
Exemplo
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])
Envia um título e subtítulo opcional para a entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
title | string | Texto do título | |
subtitle | string | "" | Texto do subtítulo |
fadeIn | number | 10 | Ticks de fade-in |
stay | number | 40 | Ticks de permanência |
fadeOut | number | 10 | Ticks de fade-out |
Exemplo
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])
Mostra uma boss bar temporária para a entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
title | string | Texto do título da barra | |
color | string | "WHITE" | Valor de BarColor |
style | string | "SOLID" | Valor de BarStyle |
duration | number | 40 | Duração em ticks |
Exemplo
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)
Teleporta a entidade para uma localização.
| Parâmetro | Tipo | Observações |
|---|---|---|
location | tabela de localização | Destino |
Exemplo
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)
Define a velocidade da entidade imediatamente.
| Parâmetro | Tipo | Observações |
|---|---|---|
vector | tabela de vetor | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemplo
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])
Aplica um empurrão de velocidade após um pequeno atraso (padrão 1 tick). Útil para sobrescrever knockback.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
vector | tabela de vetor | Direção e força | |
additive | boolean | false | Adicionar à velocidade existente em vez de substituí-la |
delay | number | 1 | Atraso em ticks antes de aplicar |
Exemplo
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)
Faz a entidade olhar em direção a um vetor de direção ou uma localização.
| Parâmetro | Tipo | Observações |
|---|---|---|
directionOrLocation | tabela de vetor ou localização | Alvo para olhar |
Exemplo
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)
Coloca a entidade em chamas pela duração dada.
| Parâmetro | Tipo | Observações |
|---|---|---|
ticks | number | Duração do fogo em ticks (20 ticks = 1 segundo) |
Exemplo
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])
Adiciona ticks de freeze visual à entidade (o efeito de sobreposição azul).
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
ticks | number | 1 | Quantidade de ticks de freeze |
Exemplo
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])
Aplica um efeito de poção à entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
effect | string | Nome do PotionEffectType | |
duration | number | Duração em ticks | |
amplifier | number | 0 | Nível do efeito (0 = nível I) |
Exemplo
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) não está disponível nos poderes Lua do EliteMobs. Ele existe apenas no Magmacore/FMM. Use apply_potion_effect com uma duração de 0 como workaround, ou projete seu poder sem precisar remover efeitos.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Causa dano à entidade. Três variantes estão disponíveis.
| Método | Observações |
|---|---|
deal_damage(amount) | Fonte de dano genérica |
deal_custom_damage(amount) | Usa BossCustomAttackDamage do boss |
deal_damage_from_boss(amount) | A entidade do boss é definida como o causador do dano |
Exemplo
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)
Cura a entidade até sua vida máxima.
| Parâmetro | Tipo | Observações |
|---|---|---|
amount | number | Quantidade a curar |
Exemplo
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])
Alterna invulnerabilidade na entidade. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
enabled | boolean | true para habilitar invulnerabilidade | |
duration | number | nil | Auto-reverter após esses ticks |
Exemplo
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])
Alterna a IA na entidade. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
enabled | boolean | true para habilitar a IA | |
duration | number | nil | Auto-reverter após esses ticks |
Exemplo
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)
Gerencia tags na entidade. As tags são rastreadas pelo EliteMobs e persistem durante a vida da entidade.
| Método | Parâmetro | Observações |
|---|---|---|
add_tag(tag[, duration]) | string, number opcional | Adiciona tag, opcionalmente removendo automaticamente após ticks |
remove_tag(tag) | string | Remove a tag |
has_tag(tag) | string | Retorna true se a tag estiver presente |
Exemplo
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)
Faz a entidade executar um comando. Para jogadores, isso roda como o jogador; use o texto do comando sem uma / no início.
| Parâmetro | Tipo | Observações |
|---|---|---|
command | string | Texto do comando sem / no início |
Exemplo
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])
Define o atributo generic_scale da entidade. Opcionalmente reverte para 1.0 após uma duração.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
scale | number | Multiplicador de escala | |
duration | number | nil | Auto-reverter após esses ticks |
Exemplo
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)
Alterna a gravidade na entidade.
| Parâmetro | Tipo | Observações |
|---|---|---|
enabled | boolean | true para gravidade normal |
Exemplo
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])
Toca um som na localização da entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
sound | string | Nome do Sound do Bukkit | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Pitch |
Exemplo
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])
Alias para play_sound_at_entity. Toca um som na localização da entidade. Ambos os nomes funcionam de maneira idêntica.
entity:spawn_particle_at_self(particleOrSpec[, count])
Spawna partículas na localização da entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
particleOrSpec | string ou tabela | Nome da partícula ou tabela de especificação | |
count | number | 1 | Número de partículas |
Exemplo
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])
Spawna partículas em uma localização específica.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
location | tabela de localização | Localização alvo | |
particle | string | Nome do tipo de partícula | |
count | number | 1 | Número de partículas |
Exemplo
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)
Toca uma animação de modelo customizado se a entidade tiver um modelo customizado que suporte isso.
| Parâmetro | Tipo | Observações |
|---|---|---|
name | string | Nome da animação |
Exemplo
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])
Empurra a entidade para longe de uma localização de origem ou wrapper de entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
source | localização ou wrapper | Origem do empurrão | |
strength | number | 1.0 | Multiplicador de força do empurrão |
xOffset | number | 0 | Offset extra em X |
yOffset | number | 0 | Offset extra em Y |
zOffset | number | 0 | Offset extra em Z |
Exemplo
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()
Define ou reseta o nome de exibição customizado da entidade. Suporta códigos de cor.
Exemplo
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])
Coloca um bloco temporário na localização atual da entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
material | string | Nome do material do bloco | |
duration | number | 0 | Ticks antes da remoção |
requireAir | boolean | false | Colocar apenas se o bloco for ar no momento |
Exemplo
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()
Retorna a altura da entidade em blocos.
entity:is_on_ground()
Retorna true se a entidade está em pé sobre solo sólido no momento.
entity:is_frozen()
Retorna true se a entidade (quando rastreada como custom boss) tem a flag de congelado definida.
entity:set_awareness_enabled(aware[, duration])
Alterna a awareness do mob. Afeta apenas entidades do tipo mob. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
aware | boolean | true para habilitar a awareness | |
duration | number | nil | Auto-reverter após esses ticks |
entity:is_healing() / entity:set_healing(enabled)
Verifica ou alterna o estado de cura em uma entidade elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Retorna true se a bounding box da entidade se sobrepõe a uma caixa alinhada com os eixos na localização dada.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
center | tabela de localização | Centro da caixa de teste | |
halfX | number | 0.5 | Meia-largura no eixo X |
halfY | number | igual ao halfX | Meia-altura no eixo Y |
halfZ | number | igual ao halfX | Meia-largura no eixo Z |
entity:remove_elite()
Remove a entidade elite do rastreamento do EliteMobs. Se a entidade é um elite, isso a despawna corretamente através do EliteMobs.
entity:set_custom_name_visible(visible)
Define se o nome customizado da entidade está sempre visível ou apenas quando olhado.
| Parâmetro | Tipo | Observações |
|---|---|---|
visible | boolean | true para sempre visível |
entity:set_equipment(slot, material[, options])
Define equipamento na entidade.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
slot | string | Slot de equipamento: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Nome do material (ex.: "DIAMOND_SWORD", "IRON_HELMET") | |
options | tabela | {} | Configurações opcionais (veja abaixo) |
Tabela de opções:
| Chave | Tipo | Padrão | Observações |
|---|---|---|---|
enchantments | array de tabelas | nil | Cada entrada: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Se o item é inquebrável |
Exemplo
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
Um método que retorna true se a entidade atualmente tem a IA habilitada.
Exemplo
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
}
Wrappers de Referência de Entidade Não-Viva
Quando uma entidade spawnada não é uma LivingEntity -- por exemplo, um bloco caindo, projétil ou fireball -- você recebe um wrapper de referência mais leve. Eles são retornados por métodos como context.world:spawn_falling_block_at_location() ou context.boss:summon_projectile().
Campos: name, uuid, entity_type, is_player, is_elite, current_location
Métodos:
| Método | Observações |
|---|---|
is_valid() | Verificação de validade em tempo real |
get_location() | Localização atual em tempo real |
get_velocity() | Vetor de velocidade atual |
is_on_ground() | Se está no chão |
teleport_to_location(location) | Teleporta a entidade |
set_velocity_vector(vector) | Define a velocidade |
set_direction_vector(vector) | Define a direção (apenas Fireball) |
set_yield(value) | Define o yield da explosão (apenas Fireball) |
set_gravity(enabled) | Alterna a gravidade |
detonate() | Detona entidades de firework |
remove() | Remove a entidade do mundo |
unregister([reason]) | Remove do rastreador de entidades |
Exemplo
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
Disponível em hooks onde um jogador está diretamente envolvido (on_boss_damaged_by_player, on_player_damaged_by_boss, etc.). Wrappers de jogador incluem todos os campos e métodos comuns de entidade listados acima, mais os extras abaixo.
context.player é nil em hooks que não têm um jogador associado, como on_spawn, callbacks agendados e hooks de timer. Sempre verifique se é nil antes de usar.
Exemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}
Campos Exclusivos de Jogador
| Campo | Tipo | Observações |
|---|---|---|
game_mode | string | Nome do modo de jogo atual (ex.: "SURVIVAL") |
Métodos Exclusivos de Jogador
| Método | Observações |
|---|---|
send_message(message) | Mensagem de chat com formatação de cor do EliteMobs |
show_action_bar(message) | Texto da action bar |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Sobreposição na tela de título |
show_boss_bar(title[, color][, style][, duration]) | Boss bar temporária |
run_command(command) | Executa um comando como o jogador (sem / no início) |
Exemplo
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
O wrapper de boss para o elite mob que possui esse poder Lua. Sempre disponível em todo hook.
O wrapper de boss herda todos os métodos comuns de entidade listados acima (ex.: push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location, etc.). Os métodos documentados nesta seção são específicos de boss ou têm comportamento diferente através da camada EliteEntity.
Campos do Boss
| Campo | Tipo | Observações |
|---|---|---|
boss.name | string | Nome de exibição |
boss.uuid | string | UUID do elite do boss |
boss.entity_type | string | Nome do EntityType do Bukkit |
boss.is_monster | boolean | true se a entidade subjacente é um Monstro |
boss.level | number | Nível do elite |
boss.health | number | Vida atual (snapshot) |
boss.maximum_health | number | Vida máxima (snapshot) |
boss.damager_count | number | Número de causadores de dano (snapshot) |
boss.is_in_combat | boolean | Estado de combate |
boss.exists | boolean | Se o elite ainda existe |
boss.current_location | tabela de localização | Posição na criação do wrapper (snapshot) |
Exemplo
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Métodos do Boss
boss:is_alive()
Retorna true se a entidade do boss for válida, não estiver morta e o elite ainda existir. Use isso em vez do campo exists para verificações em tempo real.
Exemplo
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()
Retorna a localização atual em tempo real do boss como uma tabela de localização.
Exemplo
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()
Retorna a localização ao nível dos olhos do boss.
Exemplo
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])
Alterna a IA no boss. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
enabled | boolean | true para habilitar a IA | |
duration | number | nil | Auto-reverter após esses ticks |
Exemplo
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)
Teleporta o boss para uma localização.
| Parâmetro | Tipo | Observações |
|---|---|---|
location | tabela de localização | Destino |
Exemplo
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)
Define a velocidade do boss imediatamente.
| Parâmetro | Tipo | Observações |
|---|---|---|
vector | tabela de vetor | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemplo
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)
Cura o boss até sua vida máxima.
| Parâmetro | Tipo | Observações |
|---|---|---|
amount | number | Quantidade a curar |
Exemplo
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])
Toca um som na localização do boss.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
sound | string | Nome do Sound do Bukkit | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Pitch |
Exemplo
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])
Spawna partículas na localização do boss.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
particleOrSpec | string ou tabela | Nome da partícula ou tabela de especificação | |
count | number | 1 | Número de partículas |
Exemplo
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)
Toca uma animação de modelo customizado no boss, se disponível.
| Parâmetro | Tipo | Observações |
|---|---|---|
name | string | Nome da animação |
Exemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:face_direction_or_location(vectorOrLocation)
Faz o boss olhar para uma direção ou localização.
| Parâmetro | Tipo | Observações |
|---|---|---|
vectorOrLocation | tabela de vetor ou localização | Direção para olhar |
Exemplo
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])
Usa pathfinding para fazer o boss caminhar até uma localização.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
location | tabela de localização | Destino | |
speed | number | 1.0 | Multiplicador de velocidade de movimento |
follow | boolean | false | Seguir o alvo continuamente |
timeout | number | nil | Cancelar a navegação após esses ticks |
Exemplo
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)
Gerencia tags no boss.
Exemplo
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])
Envia uma mensagem de chat para todos os jogadores próximos.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
message | string | Texto da mensagem com códigos de cor | |
range | number | 20 | Raio em blocos |
Exemplo
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])
Lança uma entidade do tipo projétil a partir do boss.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
entityType | string | Tipo de entidade (ex.: "FIREBALL", "ARROW") | |
origin | tabela de localização | Posição de lançamento | |
destination | tabela de localização | Posição alvo | |
speed | number | 1.0 | Velocidade do projétil |
options | tabela | {} | Veja as opções abaixo |
Tabela de opções:
| Chave | Tipo | Observações |
|---|---|---|
duration | number | Auto-remover após ticks |
max_ticks | number | Máximo de ticks para monitorar o pouso |
custom_damage | number | Dano no impacto |
detonation_power | string | Poder da explosão no impacto |
yield | number | Yield da explosão (Fireball) |
persistent | boolean | Se o projétil persiste (padrão true) |
effect | string | Nome do EntityEffect a tocar no spawn |
incendiary | boolean | Se a explosão é incendiária |
gravity | boolean | Se o projétil tem gravidade |
glowing | boolean | Efeito de brilho |
invulnerable | boolean | Se o projétil é invulnerável |
track | boolean | Se deve rastrear o alvo |
spawn_at_origin | boolean | Spawnar na origem em vez de offset |
direction_only | boolean | Usar apenas a direção, ignorar o alvo |
on_land | function | Callback (landing_location, spawned_entity) |
Exemplo
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])
Invoca um boss de reforço a partir de um arquivo de configuração.
| Parâmetro | Tipo | Observações |
|---|---|---|
filename | string | Nome do arquivo de configuração do boss |
zoneOrLocation | tabela de localização ou zona | Localização de spawn ou definição de zona |
duration | number | Despawn automático opcional após ticks |
Exemplo
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()
Remove o boss do mundo.
Exemplo
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)
Retorna um array de wrappers de jogador dentro do alcance do boss.
| Parâmetro | Tipo | Observações |
|---|---|---|
range | number | Raio em blocos |
Exemplo
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()
Retorna o número em tempo real de jogadores que causaram dano a esse boss. Diferente do campo damager_count, este realiza uma verificação em tempo real.
boss:get_target_player()
Retorna o alvo atual do mob do boss como um wrapper de jogador, ou nil se o alvo não for um jogador ou não estiver definido.
Métodos de Zona e Partícula
Esses métodos combinam zonas com efeitos de partícula. Eles exigem uma tabela de zona como entrada.
boss:get_nearby_players_in_zone(zone)
Retorna um array de wrappers de jogador para todos os jogadores atualmente dentro da zona dada.
| Parâmetro | Tipo | Observações |
|---|---|---|
zone | tabela de zona | Uma definição de forma de zona |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Preenche o interior de uma zona com partículas.
| Parâmetro | Tipo | Observações |
|---|---|---|
zone | tabela de zona | Forma da zona a preencher |
particle | string | Nome do tipo de partícula |
... | Parâmetros adicionais de partícula | |
coverage | number (opcional) | Fator de cobertura de densidade de partícula |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Desenha a borda de uma zona com partículas.
| Parâmetro | Tipo | Observações |
|---|---|---|
zone | tabela de zona | Forma da zona a delimitar |
particle | string | Nome do tipo de partícula |
... | Parâmetros adicionais de partícula | |
coverage | number (opcional) | Fator de cobertura de densidade de partícula |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Spawna partículas direcionais que viajam do boss em direção a uma zona.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
zone | tabela de zona | Zona alvo | |
particle | string | Nome do tipo de partícula | |
speed | number | nil | Velocidade de viagem da partícula |
boss:get_particles_toward_self(zone, particle, speed?)
Spawna partículas direcionais que viajam de uma zona em direção ao boss.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
zone | tabela de zona | Zona de origem | |
particle | string | Nome do tipo de partícula | |
speed | number | nil | Velocidade de viagem da partícula |
boss:spawn_particles_with_vector(particles)
Spawna um array de partículas direcionais, cada uma com sua própria posição e vetor de velocidade.
| Parâmetro | Tipo | Observações |
|---|---|---|
particles | array de tabelas | Cada entrada define uma partícula com posição e direção |
Métodos do Ender Dragon
Esses métodos só se aplicam quando a entidade do boss é um Ender Dragon.
boss:get_ender_dragon_phase()
Retorna o nome da fase atual EnderDragon.Phase como uma string, ou nil se o boss não for um Ender Dragon.
boss:set_ender_dragon_phase(phase)
Define a fase do Ender Dragon.
| Parâmetro | Tipo | Observações |
|---|---|---|
phase | string | Nome do EnderDragon.Phase (ex.: "CIRCLING", "CHARGE_PLAYER") |
Métodos de Suporte a Poderes Especiais
Esses métodos suportam mecânicas de poder embutidas do EliteMobs a partir de scripts Lua.
boss:start_tracking_fireball_system(speed?)
Inicia o sistema de IA de fireball de rastreamento no boss. O boss lançará periodicamente fireballs que rastreiam seu alvo.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
speed | number | 0.5 | Velocidade do fireball |
boss:handle_spirit_walk_damage(cause)
Lida com o comportamento de spirit walk para a causa de dano dada. O spirit walk torna o boss imune a certos tipos de dano e o teleporta atrás do atacante.
| Parâmetro | Tipo | Observações |
|---|---|---|
cause | string | Nome do DamageCause do Bukkit (ex.: "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Retorna true se o boss atualmente tem uma shield wall ativa.
boss:initialize_shield_wall(charges?)
Ativa uma shield wall no boss que pode absorver dano recebido.
| Parâmetro | Tipo | Padrão | Observações |
|---|---|---|---|
charges | number | 1 | Número de golpes que o escudo pode absorver |
boss:shield_wall_absorb_damage(player, damage)
Tenta absorver dano com a shield wall. Retorna true se o dano foi absorvido, false se o escudo está inativo ou esgotado.
| Parâmetro | Tipo | Observações |
|---|---|---|
player | wrapper de jogador | O jogador atacante |
damage | number | Quantidade de dano a absorver |
boss:deactivate_shield_wall()
Desativa a shield wall do boss, removendo quaisquer cargas restantes.
boss:start_zombie_necronomicon(target, file)
Inicia o poder zombie necronomicon em um alvo, spawnando reforços mortos-vivos a partir de um arquivo de configuração.
| Parâmetro | Tipo | Observações |
|---|---|---|
target | wrapper de entidade | Entidade alvo para o necronomicon |
file | string | Nome do arquivo de configuração do boss para os mortos-vivos invocados |
context.players
Helpers de query de jogadores centrados ao redor do boss. Use-os para encontrar jogadores sem precisar de um jogador específico do evento.
| Método | Retorna | Observações |
|---|---|---|
players:current_target() | wrapper de jogador ou nil | O jogador do evento ou alvo do mob do boss se for um jogador |
players:nearby_players(radius) | array de wrappers de jogador | Todos os jogadores dentro do raio do boss |
players:all_players_in_world() | array de wrappers de jogador | Todos os jogadores no mundo do boss |
Exemplo
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
}
Exemplo
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
Helpers gerais de query de entidades centrados ao redor do boss.
| Método | Retorna | Observações |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | array de wrappers de entidade | Entidades próximas ao boss |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | array de wrappers de entidade | Entidades dentro de uma caixa alinhada aos eixos |
entities:get_all_entities([filter]) | array de wrappers de entidade | Todas as entidades correspondentes no mundo do boss |
entities:get_direct_target_entity() | wrapper de entidade ou nil | Alvo direto para o evento atual |
entities:get_boss_spawn_location() | tabela de localização | A localização original de spawn do boss |
Filtros válidos: living (padrão), player / players, elite / elites, mob / mobs, all / entities
Exemplo
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
}
Exemplo
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
}
