Scripting Lua: Jefe y Entidades
Esta página cubre todo sobre los wrappers de jefes y entidades en los poderes Lua de EliteMobs: context.boss, context.player, context.players, context.entities, y las tablas wrapper de entidades que devuelven. Si eres nuevo en los poderes Lua, comienza primero con Primeros pasos.
Wrappers de Entidades
Cuando accedes a entidades a través de la API Lua -- ya sea desde context.boss, context.player, resultados de consultas como context.players:nearby_players(), o campos de eventos -- siempre recibes tablas wrapper. Estos no son objetos Bukkit en bruto. Cada wrapper proporciona un conjunto de campos (valores instantáneos capturados en el momento de la creación) y métodos (llamadas en vivo que llegan al servidor).
Dos reglas a recordar:
- Los campos como
health,current_locationymaximum_healthson instantáneas. Reflejan el estado en el momento en que se creó el wrapper y no se actualizan automáticamente. - Los métodos como
get_location(),get_health()eis_alive()realizan una verificación en vivo cada vez que los llamas.
Campos Comunes de Entidades
Cada wrapper de entidad viva incluye estos campos.
| Campo | Tipo | Notas |
|---|---|---|
entity.name | string | Nombre de visualización |
entity.uuid | string | UUID como texto |
entity.entity_type | string | Nombre EntityType de Bukkit (p. ej. "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true para jugadores |
entity.is_elite | boolean | true si EliteMobs lo rastrea como elite |
entity.is_custom_boss | boolean | true si la entidad es un Jefe Personalizado (regional, instanciado, etc.) |
entity.is_significant_boss | boolean | true para Jefes Personalizados con un multiplicador de salud superior a 1 (es decir, jefes principales, no refuerzos menores) |
entity.is_monster | boolean | true para entidades de tipo monstruo |
entity.is_valid | boolean | Bandera de validez instantánea |
entity.health | number | Salud actual (instantánea) |
entity.maximum_health | number | Salud máxima (instantánea) |
entity.current_location | tabla location | Posición en el momento en que se creó el wrapper |
entity.elite | tabla o nil | Sub-tabla específica de elite; presente solo cuando entity.is_elite es true y EliteMobs tiene datos de elite para la entidad. Ver Sub-Tabla Elite más abajo. |
Sub-Tabla Elite
Cuando una entidad es un elite de EliteMobs, el wrapper tiene una tabla entity.elite adicional con campos y métodos específicos de elite. En no-elites este campo está ausente (nil).
| Campo / Método | Tipo | Notas |
|---|---|---|
entity.elite.level | number | El nivel del elite |
entity.elite.name | string o nil | El nombre de visualización configurado del elite |
entity.elite.health | number | Instantánea de la salud actual (mismo valor que entity.health) |
entity.elite.max_health | number | Instantánea de la salud máxima (mismo valor que entity.maximum_health) |
entity.elite.is_custom_boss | boolean | Si el elite es un Jefe Personalizado |
entity.elite.health_multiplier | number | Multiplicador de salud configurado en el Jefe Personalizado (1.0 para elites regulares) |
entity.elite.damage_multiplier | number | Multiplicador de daño configurado en el Jefe Personalizado (1.0 para elites regulares) |
entity.elite:remove() | método | Elimina el elite (usando la razón de eliminación OTHER). Usa esto para despawns limpios desde scripts. |
Ejemplo
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
}
Ejemplo
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 Comunes de Entidades
Cada wrapper de entidad viva soporta estos métodos. Cada método realiza una llamada en vivo al servidor.
entity:is_alive()
Devuelve true si la entidad sigue siendo válida y no está muerta.
Ejemplo
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()
Devuelve la ubicación actual en vivo como una tabla location.
Ejemplo
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()
Devuelve la ubicación a nivel de los ojos como una tabla location.
Ejemplo
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()
Devuelve la salud actual o máxima en vivo.
Ejemplo
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()
Devuelve la velocidad actual de la entidad como una tabla vector.
Ejemplo
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)
Envía un mensaje de chat a la entidad. Soporta el formato de color de EliteMobs.
| Parámetro | Tipo | Notas |
|---|---|---|
text | string | Mensaje con códigos de color |
Ejemplo
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)
Envía un mensaje de action bar a la entidad.
| Parámetro | Tipo | Notas |
|---|---|---|
message | string | Texto de action bar con códigos de color |
Ejemplo
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])
Envía un título y subtítulo opcional a la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
title | string | Texto del título | |
subtitle | string | "" | Texto del subtítulo |
fadeIn | number | 10 | Ticks de fade-in |
stay | number | 40 | Ticks de permanencia |
fadeOut | number | 10 | Ticks de fade-out |
Ejemplo
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])
Muestra una barra de jefe temporal a la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
title | string | Texto del título de la barra | |
color | string | "WHITE" | Valor BarColor |
style | string | "SOLID" | Valor BarStyle |
duration | number | 40 | Duración en ticks |
Ejemplo
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)
Teletransporta la entidad a una ubicación.
| Parámetro | Tipo | Notas |
|---|---|---|
location | tabla location | Destino |
Ejemplo
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)
Establece la velocidad de la entidad inmediatamente.
| Parámetro | Tipo | Notas |
|---|---|---|
vector | tabla vector | { x, y, z } o { x = 0, y = 1, z = 0 } |
Ejemplo
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 un empuje de velocidad después de un breve retraso (por defecto 1 tick). Útil para anular el knockback.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
vector | tabla vector | Dirección y fuerza | |
additive | boolean | false | Añadir a la velocidad existente en lugar de reemplazarla |
delay | number | 1 | Retraso en ticks antes de aplicar |
Ejemplo
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)
Hace que la entidad mire hacia un vector de dirección o una ubicación.
| Parámetro | Tipo | Notas |
|---|---|---|
directionOrLocation | tabla vector o location | Objetivo a mirar |
Ejemplo
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)
Prende fuego a la entidad durante la duración dada.
| Parámetro | Tipo | Notas |
|---|---|---|
ticks | number | Duración del fuego en ticks (20 ticks = 1 segundo) |
Ejemplo
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])
Añade ticks de congelación visual a la entidad (el efecto de superposición azul).
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
ticks | number | 1 | Cantidad de ticks de congelación |
Ejemplo
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 un efecto de poción a la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
effect | string | Nombre del PotionEffectType | |
duration | number | Duración en ticks | |
amplifier | number | 0 | Nivel del efecto (0 = nivel I) |
Ejemplo
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) no está disponible en los poderes Lua de EliteMobs. Solo existe en Magmacore/FMM. Usa apply_potion_effect con una duración de 0 como solución alternativa, o diseña tu poder sin necesidad de eliminar efectos.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Inflige daño a la entidad. Hay tres variantes disponibles.
| Método | Notas |
|---|---|
deal_damage(amount) | Fuente de daño genérica |
deal_custom_damage(amount) | Usa BossCustomAttackDamage del jefe |
deal_damage_from_boss(amount) | La entidad jefe se establece como dañador |
Ejemplo
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 la entidad hasta su salud máxima.
| Parámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
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 la invulnerabilidad en la entidad. Opcionalmente revierte después de una duración.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
enabled | boolean | true para habilitar invulnerabilidad | |
duration | number | nil | Auto-revertir después de estos ticks |
Ejemplo
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 la IA en la entidad. Opcionalmente revierte después de una duración.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
enabled | boolean | true para habilitar IA | |
duration | number | nil | Auto-revertir después de estos ticks |
Ejemplo
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)
Gestiona etiquetas en la entidad. Las etiquetas son rastreadas por EliteMobs y persisten durante la vida útil de la entidad.
| Método | Parámetro | Notas |
|---|---|---|
add_tag(tag[, duration]) | string, número opcional | Añade etiqueta, opcionalmente la elimina automáticamente después de ticks |
remove_tag(tag) | string | Elimina la etiqueta |
has_tag(tag) | string | Devuelve true si la etiqueta está presente |
Ejemplo
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)
Hace que la entidad ejecute un comando. Para los jugadores, esto se ejecuta como el jugador; usa el texto del comando sin un / inicial.
| Parámetro | Tipo | Notas |
|---|---|---|
command | string | Texto del comando sin / inicial |
Ejemplo
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])
Establece el atributo generic_scale de la entidad. Opcionalmente revierte a 1.0 después de una duración.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
scale | number | Multiplicador de escala | |
duration | number | nil | Auto-revertir después de estos ticks |
Ejemplo
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 la gravedad en la entidad.
| Parámetro | Tipo | Notas |
|---|---|---|
enabled | boolean | true para gravedad normal |
Ejemplo
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])
Reproduce un sonido en la ubicación de la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
sound | string | Nombre del Sound de Bukkit | |
volume | number | 1.0 | Volumen |
pitch | number | 1.0 | Tono |
Ejemplo
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. Reproduce un sonido en la ubicación de la entidad. Ambos nombres funcionan de forma idéntica.
entity:spawn_particle_at_self(particleOrSpec[, count])
Genera partículas en la ubicación de la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
particleOrSpec | string o tabla | Nombre de partícula o tabla de especificaciones | |
count | number | 1 | Número de partículas |
Ejemplo
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])
Genera partículas en una ubicación específica.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
location | tabla location | Ubicación objetivo | |
particle | string | Nombre del tipo de partícula | |
count | number | 1 | Número de partículas |
Ejemplo
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)
Reproduce una animación de modelo personalizado si la entidad tiene un modelo personalizado que la soporta.
| Parámetro | Tipo | Notas |
|---|---|---|
name | string | Nombre de la animación |
Ejemplo
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])
Empuja la entidad lejos de una ubicación de origen o wrapper de entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
source | location o wrapper | Origen del empuje | |
strength | number | 1.0 | Multiplicador de la fuerza de empuje |
xOffset | number | 0 | Desplazamiento extra en X |
yOffset | number | 0 | Desplazamiento extra en Y |
zOffset | number | 0 | Desplazamiento extra en Z |
Ejemplo
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()
Establece o restablece el nombre de visualización personalizado de la entidad. Soporta códigos de color.
Ejemplo
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 un bloque temporal en la ubicación actual de la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
material | string | Nombre del material del bloque | |
duration | number | 0 | Ticks antes de la eliminación |
requireAir | boolean | false | Solo colocar si el bloque es actualmente aire |
Ejemplo
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()
Devuelve la altura de la entidad en bloques.
entity:is_on_ground()
Devuelve true si la entidad está actualmente parada en suelo sólido.
entity:is_frozen()
Devuelve true si la entidad (cuando es rastreada como un jefe personalizado) tiene la bandera de congelación activada.
entity:set_awareness_enabled(aware[, duration])
Alterna la conciencia del mob. Solo afecta a entidades de tipo mob. Opcionalmente revierte después de una duración.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
aware | boolean | true para habilitar conciencia | |
duration | number | nil | Auto-revertir después de estos ticks |
entity:is_healing() / entity:set_healing(enabled)
Comprueba o alterna el estado de curación en una entidad elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Devuelve true si la bounding box de la entidad se superpone con un cuadro alineado a ejes en la ubicación dada.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
center | tabla location | Centro del cuadro de prueba | |
halfX | number | 0.5 | Media anchura en el eje X |
halfY | number | igual que halfX | Media altura en el eje Y |
halfZ | number | igual que halfX | Media anchura en el eje Z |
entity:remove_elite()
Elimina la entidad elite del rastreo de EliteMobs. Si la entidad es un elite, esto la desaparece correctamente a través de EliteMobs.
entity:set_custom_name_visible(visible)
Establece si el nombre personalizado de la entidad es siempre visible o solo cuando se mira.
| Parámetro | Tipo | Notas |
|---|---|---|
visible | boolean | true para siempre visible |
entity:set_equipment(slot, material[, options])
Establece equipamiento en la entidad.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
slot | string | Slot de equipamiento: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Nombre del material (p. ej. "DIAMOND_SWORD", "IRON_HELMET") | |
options | tabla | {} | Ajustes opcionales (ver más abajo) |
Tabla de opciones:
| Clave | Tipo | Por defecto | Notas |
|---|---|---|---|
enchantments | array de tablas | nil | Cada entrada: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Si el objeto es irrompible |
Ejemplo
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
Un método que devuelve true si la entidad tiene actualmente la IA habilitada.
Ejemplo
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 Referencia de Entidades No Vivas
Cuando una entidad generada no es una LivingEntity -- por ejemplo, un bloque que cae, un proyectil o una bola de fuego -- recibes un wrapper de referencia más ligero. Estos son devueltos por métodos como context.world:spawn_falling_block_at_location() o context.boss:summon_projectile().
Campos: name, uuid, entity_type, is_player, is_elite, current_location
Métodos:
| Método | Notas |
|---|---|
is_valid() | Comprobación de validez en vivo |
get_location() | Ubicación actual en vivo |
get_velocity() | Vector de velocidad actual |
is_on_ground() | Si está en el suelo |
teleport_to_location(location) | Teletransporta la entidad |
set_velocity_vector(vector) | Establece la velocidad |
set_direction_vector(vector) | Establece la dirección (solo Fireball) |
set_yield(value) | Establece el yield de explosión (solo Fireball) |
set_gravity(enabled) | Alterna la gravedad |
detonate() | Detona entidades firework |
remove() | Elimina la entidad del mundo |
unregister([reason]) | Desregistra del rastreador de entidades |
Ejemplo
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
Disponible en hooks donde un jugador está directamente involucrado (on_boss_damaged_by_player, on_player_damaged_by_boss, etc.). Los wrappers de jugador incluyen todos los campos y métodos comunes de entidad listados arriba, además de los extras a continuación.
context.player es nil en hooks que no tienen un jugador asociado, como on_spawn, callbacks programados y hooks de temporizador. Siempre comprueba si es nil antes de usarlo.
Ejemplo
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 jugador
| Campo | Tipo | Notas |
|---|---|---|
game_mode | string | Nombre del modo de juego actual (p. ej. "SURVIVAL") |
Métodos exclusivos de jugador
| Método | Notas |
|---|---|
send_message(message) | Mensaje de chat con formato de color de EliteMobs |
show_action_bar(message) | Texto de action bar |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Superposición de pantalla de título |
show_boss_bar(title[, color][, style][, duration]) | Barra de jefe temporal |
run_command(command) | Ejecutar un comando como el jugador (sin / inicial) |
Ejemplo
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
El wrapper del jefe para el elite mob que posee este poder Lua. Siempre disponible en cada hook.
El wrapper del jefe hereda todos los métodos de entidad comunes listados arriba (p. ej. push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location, etc.). Los métodos documentados en esta sección son específicos del jefe o tienen un comportamiento diferente a través de la capa EliteEntity.
Campos del Jefe
| Campo | Tipo | Notas |
|---|---|---|
boss.name | string | Nombre de visualización |
boss.uuid | string | UUID del elite jefe |
boss.entity_type | string | Nombre EntityType de Bukkit |
boss.is_monster | boolean | true si la entidad subyacente es un Monster |
boss.level | number | Nivel del elite |
boss.health | number | Salud actual (instantánea) |
boss.maximum_health | number | Salud máxima (instantánea) |
boss.damager_count | number | Número de dañadores (instantánea) |
boss.is_in_combat | boolean | Estado de combate |
boss.exists | boolean | Si el elite todavía existe |
boss.current_location | tabla location | Posición en la creación del wrapper (instantánea) |
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Métodos del Jefe
boss:is_alive()
Devuelve true si la entidad jefe es válida, no está muerta y el elite todavía existe. Usa esto en lugar del campo exists para comprobaciones en vivo.
Ejemplo
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()
Devuelve la ubicación actual en vivo del jefe como una tabla location.
Ejemplo
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()
Devuelve la ubicación a nivel de los ojos del jefe.
Ejemplo
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 la IA en el jefe. Opcionalmente revierte después de una duración.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
enabled | boolean | true para habilitar IA | |
duration | number | nil | Auto-revertir después de estos ticks |
Ejemplo
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)
Teletransporta el jefe a una ubicación.
| Parámetro | Tipo | Notas |
|---|---|---|
location | tabla location | Destino |
Ejemplo
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)
Establece la velocidad del jefe inmediatamente.
| Parámetro | Tipo | Notas |
|---|---|---|
vector | tabla vector | { x, y, z } o { x = 0, y = 1, z = 0 } |
Ejemplo
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 al jefe hasta su salud máxima.
| Parámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
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])
Reproduce un sonido en la ubicación del jefe.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
sound | string | Nombre del Sound de Bukkit | |
volume | number | 1.0 | Volumen |
pitch | number | 1.0 | Tono |
Ejemplo
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])
Genera partículas en la ubicación del jefe.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
particleOrSpec | string o tabla | Nombre de partícula o tabla de especificaciones | |
count | number | 1 | Número de partículas |
Ejemplo
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)
Reproduce una animación de modelo personalizado en el jefe si está disponible.
| Parámetro | Tipo | Notas |
|---|---|---|
name | string | Nombre de la animación |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:face_direction_or_location(vectorOrLocation)
Hace que el jefe mire hacia una dirección o ubicación.
| Parámetro | Tipo | Notas |
|---|---|---|
vectorOrLocation | tabla vector o location | Dirección a mirar |
Ejemplo
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 caminar al jefe a una ubicación.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
location | tabla location | Destino | |
speed | number | 1.0 | Multiplicador de velocidad de movimiento |
follow | boolean | false | Seguir continuamente el objetivo |
timeout | number | nil | Cancelar la navegación después de estos ticks |
Ejemplo
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)
Gestiona etiquetas en el jefe.
Ejemplo
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])
Envía un mensaje de chat a todos los jugadores cercanos.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
message | string | Texto del mensaje con códigos de color | |
range | number | 20 | Radio en bloques |
Ejemplo
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])
Lanza una entidad similar a un proyectil desde el jefe.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
entityType | string | Tipo de entidad (p. ej. "FIREBALL", "ARROW") | |
origin | tabla location | Posición de lanzamiento | |
destination | tabla location | Posición objetivo | |
speed | number | 1.0 | Velocidad del proyectil |
options | tabla | {} | Ver opciones a continuación |
Tabla de opciones:
| Clave | Tipo | Notas |
|---|---|---|
duration | number | Auto-eliminar después de estos ticks |
max_ticks | number | Ticks máximos para monitorear el aterrizaje |
custom_damage | number | Daño al impactar |
detonation_power | string | Potencia de explosión al impactar |
yield | number | Yield de explosión (Fireball) |
persistent | boolean | Si el proyectil persiste (por defecto true) |
effect | string | Nombre EntityEffect para reproducir al generar |
incendiary | boolean | Si la explosión es incendiaria |
gravity | boolean | Si el proyectil tiene gravedad |
glowing | boolean | Efecto brillante |
invulnerable | boolean | Si el proyectil es invulnerable |
track | boolean | Si se debe rastrear el objetivo |
spawn_at_origin | boolean | Generar en el origen en lugar de desplazamiento |
direction_only | boolean | Usar solo dirección, ignorar el objetivo |
on_land | function | Callback (landing_location, spawned_entity) |
Ejemplo
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 un jefe de refuerzo desde un archivo de configuración.
| Parámetro | Tipo | Notas |
|---|---|---|
filename | string | Nombre del archivo de configuración del jefe |
zoneOrLocation | tabla location o zona | Ubicación de spawn o definición de zona |
duration | number | Opcional auto-despawn después de ticks |
Ejemplo
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()
Elimina al jefe del mundo.
Ejemplo
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)
Devuelve un array de wrappers de jugadores dentro del rango del jefe.
| Parámetro | Tipo | Notas |
|---|---|---|
range | number | Radio en bloques |
Ejemplo
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()
Devuelve el número en vivo de jugadores que han dañado a este jefe. A diferencia del campo damager_count, esto realiza una comprobación en vivo.
boss:get_target_player()
Devuelve el objetivo mob actual del jefe como un wrapper de jugador, o nil si el objetivo no es un jugador o no está establecido.
Métodos de Zona y Partículas
Estos métodos combinan zonas con efectos de partículas. Requieren una tabla de zona como entrada.
boss:get_nearby_players_in_zone(zone)
Devuelve un array de wrappers de jugadores para todos los jugadores actualmente dentro de la zona dada.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | tabla zona | Una definición de forma de zona |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Rellena el interior de una zona con partículas.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | tabla zona | Forma de zona a rellenar |
particle | string | Nombre del tipo de partícula |
... | Parámetros adicionales de partícula | |
coverage | number (opcional) | Factor de cobertura de densidad de partículas |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Contornea el borde de una zona con partículas.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | tabla zona | Forma de zona a contornear |
particle | string | Nombre del tipo de partícula |
... | Parámetros adicionales de partícula | |
coverage | number (opcional) | Factor de cobertura de densidad de partículas |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Genera partículas direccionales que viajan desde el jefe hacia una zona.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
zone | tabla zona | Zona objetivo | |
particle | string | Nombre del tipo de partícula | |
speed | number | nil | Velocidad de viaje de la partícula |
boss:get_particles_toward_self(zone, particle, speed?)
Genera partículas direccionales que viajan desde una zona hacia el jefe.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
zone | tabla zona | Zona de origen | |
particle | string | Nombre del tipo de partícula | |
speed | number | nil | Velocidad de viaje de la partícula |
boss:spawn_particles_with_vector(particles)
Genera un array de partículas direccionales, cada una con su propia posición y vector de velocidad.
| Parámetro | Tipo | Notas |
|---|---|---|
particles | array de tablas | Cada entrada define una partícula con posición y dirección |
Métodos del Ender Dragon
Estos métodos solo se aplican cuando la entidad jefe es un Ender Dragon.
boss:get_ender_dragon_phase()
Devuelve el nombre de la fase EnderDragon.Phase actual como una cadena, o nil si el jefe no es un Ender Dragon.
boss:set_ender_dragon_phase(phase)
Establece la fase del Ender Dragon.
| Parámetro | Tipo | Notas |
|---|---|---|
phase | string | Nombre de EnderDragon.Phase (p. ej. "CIRCLING", "CHARGE_PLAYER") |
Métodos de soporte de poderes especiales
Estos métodos soportan las mecánicas de poderes integradas de EliteMobs desde scripts Lua.
boss:start_tracking_fireball_system(speed?)
Inicia el sistema de IA de bolas de fuego rastreadoras en el jefe. El jefe lanzará periódicamente bolas de fuego que rastrean a su objetivo.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
speed | number | 0.5 | Velocidad de la bola de fuego |
boss:handle_spirit_walk_damage(cause)
Maneja el comportamiento de spirit walk para la causa de daño dada. Spirit walk hace que el jefe sea inmune a ciertos tipos de daño y se teletransporte detrás del atacante.
| Parámetro | Tipo | Notas |
|---|---|---|
cause | string | Nombre de DamageCause de Bukkit (p. ej. "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Devuelve true si el jefe tiene actualmente un muro de escudo activo.
boss:initialize_shield_wall(charges?)
Activa un muro de escudo en el jefe que puede absorber daño entrante.
| Parámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
charges | number | 1 | Número de golpes que el escudo puede absorber |
boss:shield_wall_absorb_damage(player, damage)
Intenta absorber daño con el muro de escudo. Devuelve true si el daño fue absorbido, false si el escudo está inactivo o agotado.
| Parámetro | Tipo | Notas |
|---|---|---|
player | wrapper de jugador | El jugador atacante |
damage | number | Cantidad de daño a absorber |
boss:deactivate_shield_wall()
Desactiva el muro de escudo del jefe, eliminando cualquier carga restante.
boss:start_zombie_necronomicon(target, file)
Inicia el poder zombie necronomicon en un objetivo, generando refuerzos no-muertos desde un archivo de configuración.
| Parámetro | Tipo | Notas |
|---|---|---|
target | wrapper de entidad | Entidad objetivo para el necronomicon |
file | string | Nombre del archivo de configuración del jefe para los no-muertos invocados |
context.players
Helpers de consulta de jugadores centrados en el jefe. Úsalos para encontrar jugadores sin necesidad de un jugador específico del evento.
| Método | Devuelve | Notas |
|---|---|---|
players:current_target() | wrapper de jugador o nil | El jugador del evento o el objetivo mob del jefe si es un jugador |
players:nearby_players(radius) | array de wrappers de jugador | Todos los jugadores dentro del radio del jefe |
players:all_players_in_world() | array de wrappers de jugador | Todos los jugadores en el mundo del jefe |
Ejemplo
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
}
Ejemplo
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 de consulta general de entidades centrados en el jefe.
| Método | Devuelve | Notas |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | array de wrappers de entidad | Entidades cercanas alrededor del jefe |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | array de wrappers de entidad | Entidades dentro de un cuadro alineado a ejes |
entities:get_all_entities([filter]) | array de wrappers de entidad | Todas las entidades coincidentes en el mundo del jefe |
entities:get_direct_target_entity() | wrapper de entidad o nil | Objetivo directo para el evento actual |
entities:get_boss_spawn_location() | tabla location | La ubicación original de spawn del jefe |
Filtros válidos: living (por defecto), player / players, elite / elites, mob / mobs, all / entities
Ejemplo
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
}
Ejemplo
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
}
