Saltar al contenido principal

Scripting Lua: Jefe y Entidades

webapp_banner.jpg

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_location y maximum_health son 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() e is_alive() realizan una verificación en vivo cada vez que los llamas.

Campos Comunes de Entidades

Cada wrapper de entidad viva incluye estos campos.

CampoTipoNotas
entity.namestringNombre de visualización
entity.uuidstringUUID como texto
entity.entity_typestringNombre EntityType de Bukkit (p. ej. "ZOMBIE", "PLAYER")
entity.is_playerbooleantrue para jugadores
entity.is_elitebooleantrue si EliteMobs lo rastrea como elite
entity.is_custom_bossbooleantrue si la entidad es un Jefe Personalizado (regional, instanciado, etc.)
entity.is_significant_bossbooleantrue para Jefes Personalizados con un multiplicador de salud superior a 1 (es decir, jefes principales, no refuerzos menores)
entity.is_monsterbooleantrue para entidades de tipo monstruo
entity.is_validbooleanBandera de validez instantánea
entity.healthnumberSalud actual (instantánea)
entity.maximum_healthnumberSalud máxima (instantánea)
entity.current_locationtabla locationPosición en el momento en que se creó el wrapper
entity.elitetabla o nilSub-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étodoTipoNotas
entity.elite.levelnumberEl nivel del elite
entity.elite.namestring o nilEl nombre de visualización configurado del elite
entity.elite.healthnumberInstantánea de la salud actual (mismo valor que entity.health)
entity.elite.max_healthnumberInstantánea de la salud máxima (mismo valor que entity.maximum_health)
entity.elite.is_custom_bossbooleanSi el elite es un Jefe Personalizado
entity.elite.health_multipliernumberMultiplicador de salud configurado en el Jefe Personalizado (1.0 para elites regulares)
entity.elite.damage_multipliernumberMultiplicador de daño configurado en el Jefe Personalizado (1.0 para elites regulares)
entity.elite:remove()métodoElimina 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ámetroTipoNotas
textstringMensaje 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ámetroTipoNotas
messagestringTexto 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ámetroTipoPor defectoNotas
titlestringTexto del título
subtitlestring""Texto del subtítulo
fadeInnumber10Ticks de fade-in
staynumber40Ticks de permanencia
fadeOutnumber10Ticks 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ámetroTipoPor defectoNotas
titlestringTexto del título de la barra
colorstring"WHITE"Valor BarColor
stylestring"SOLID"Valor BarStyle
durationnumber40Duració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ámetroTipoNotas
locationtabla locationDestino
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ámetroTipoNotas
vectortabla 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ámetroTipoPor defectoNotas
vectortabla vectorDirección y fuerza
additivebooleanfalseAñadir a la velocidad existente en lugar de reemplazarla
delaynumber1Retraso 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ámetroTipoNotas
directionOrLocationtabla vector o locationObjetivo 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ámetroTipoNotas
ticksnumberDuració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ámetroTipoPor defectoNotas
ticksnumber1Cantidad 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ámetroTipoPor defectoNotas
effectstringNombre del PotionEffectType
durationnumberDuración en ticks
amplifiernumber0Nivel 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
}

precaución

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étodoNotas
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ámetroTipoNotas
amountnumberCantidad 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ámetroTipoPor defectoNotas
enabledbooleantrue para habilitar invulnerabilidad
durationnumbernilAuto-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ámetroTipoPor defectoNotas
enabledbooleantrue para habilitar IA
durationnumbernilAuto-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étodoParámetroNotas
add_tag(tag[, duration])string, número opcionalAñade etiqueta, opcionalmente la elimina automáticamente después de ticks
remove_tag(tag)stringElimina la etiqueta
has_tag(tag)stringDevuelve 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ámetroTipoNotas
commandstringTexto 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ámetroTipoPor defectoNotas
scalenumberMultiplicador de escala
durationnumbernilAuto-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ámetroTipoNotas
enabledbooleantrue 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ámetroTipoPor defectoNotas
soundstringNombre del Sound de Bukkit
volumenumber1.0Volumen
pitchnumber1.0Tono
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ámetroTipoPor defectoNotas
particleOrSpecstring o tablaNombre de partícula o tabla de especificaciones
countnumber1Nú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ámetroTipoPor defectoNotas
locationtabla locationUbicación objetivo
particlestringNombre del tipo de partícula
countnumber1Nú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ámetroTipoNotas
namestringNombre 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ámetroTipoPor defectoNotas
sourcelocation o wrapperOrigen del empuje
strengthnumber1.0Multiplicador de la fuerza de empuje
xOffsetnumber0Desplazamiento extra en X
yOffsetnumber0Desplazamiento extra en Y
zOffsetnumber0Desplazamiento 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ámetroTipoPor defectoNotas
materialstringNombre del material del bloque
durationnumber0Ticks antes de la eliminación
requireAirbooleanfalseSolo 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ámetroTipoPor defectoNotas
awarebooleantrue para habilitar conciencia
durationnumbernilAuto-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ámetroTipoPor defectoNotas
centertabla locationCentro del cuadro de prueba
halfXnumber0.5Media anchura en el eje X
halfYnumberigual que halfXMedia altura en el eje Y
halfZnumberigual que halfXMedia 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ámetroTipoNotas
visiblebooleantrue para siempre visible

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

Establece equipamiento en la entidad.

ParámetroTipoPor defectoNotas
slotstringSlot de equipamiento: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND"
materialstringNombre del material (p. ej. "DIAMOND_SWORD", "IRON_HELMET")
optionstabla{}Ajustes opcionales (ver más abajo)

Tabla de opciones:

ClaveTipoPor defectoNotas
enchantmentsarray de tablasnilCada entrada: { type = "SHARPNESS", level = 2 }
unbreakablebooleanfalseSi 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étodoNotas
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.

precaució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

CampoTipoNotas
game_modestringNombre del modo de juego actual (p. ej. "SURVIVAL")

Métodos exclusivos de jugador

MétodoNotas
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.

consejo

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

CampoTipoNotas
boss.namestringNombre de visualización
boss.uuidstringUUID del elite jefe
boss.entity_typestringNombre EntityType de Bukkit
boss.is_monsterbooleantrue si la entidad subyacente es un Monster
boss.levelnumberNivel del elite
boss.healthnumberSalud actual (instantánea)
boss.maximum_healthnumberSalud máxima (instantánea)
boss.damager_countnumberNúmero de dañadores (instantánea)
boss.is_in_combatbooleanEstado de combate
boss.existsbooleanSi el elite todavía existe
boss.current_locationtabla locationPosició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ámetroTipoPor defectoNotas
enabledbooleantrue para habilitar IA
durationnumbernilAuto-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ámetroTipoNotas
locationtabla locationDestino
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ámetroTipoNotas
vectortabla 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ámetroTipoNotas
amountnumberCantidad 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ámetroTipoPor defectoNotas
soundstringNombre del Sound de Bukkit
volumenumber1.0Volumen
pitchnumber1.0Tono
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ámetroTipoPor defectoNotas
particleOrSpecstring o tablaNombre de partícula o tabla de especificaciones
countnumber1Nú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ámetroTipoNotas
namestringNombre 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ámetroTipoNotas
vectorOrLocationtabla vector o locationDirecció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ámetroTipoPor defectoNotas
locationtabla locationDestino
speednumber1.0Multiplicador de velocidad de movimiento
followbooleanfalseSeguir continuamente el objetivo
timeoutnumbernilCancelar 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ámetroTipoPor defectoNotas
messagestringTexto del mensaje con códigos de color
rangenumber20Radio 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ámetroTipoPor defectoNotas
entityTypestringTipo de entidad (p. ej. "FIREBALL", "ARROW")
origintabla locationPosición de lanzamiento
destinationtabla locationPosición objetivo
speednumber1.0Velocidad del proyectil
optionstabla{}Ver opciones a continuación

Tabla de opciones:

ClaveTipoNotas
durationnumberAuto-eliminar después de estos ticks
max_ticksnumberTicks máximos para monitorear el aterrizaje
custom_damagenumberDaño al impactar
detonation_powerstringPotencia de explosión al impactar
yieldnumberYield de explosión (Fireball)
persistentbooleanSi el proyectil persiste (por defecto true)
effectstringNombre EntityEffect para reproducir al generar
incendiarybooleanSi la explosión es incendiaria
gravitybooleanSi el proyectil tiene gravedad
glowingbooleanEfecto brillante
invulnerablebooleanSi el proyectil es invulnerable
trackbooleanSi se debe rastrear el objetivo
spawn_at_originbooleanGenerar en el origen en lugar de desplazamiento
direction_onlybooleanUsar solo dirección, ignorar el objetivo
on_landfunctionCallback (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ámetroTipoNotas
filenamestringNombre del archivo de configuración del jefe
zoneOrLocationtabla location o zonaUbicación de spawn o definición de zona
durationnumberOpcional 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ámetroTipoNotas
rangenumberRadio 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ámetroTipoNotas
zonetabla zonaUna definición de forma de zona

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

Rellena el interior de una zona con partículas.

ParámetroTipoNotas
zonetabla zonaForma de zona a rellenar
particlestringNombre del tipo de partícula
...Parámetros adicionales de partícula
coveragenumber (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ámetroTipoNotas
zonetabla zonaForma de zona a contornear
particlestringNombre del tipo de partícula
...Parámetros adicionales de partícula
coveragenumber (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ámetroTipoPor defectoNotas
zonetabla zonaZona objetivo
particlestringNombre del tipo de partícula
speednumbernilVelocidad 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ámetroTipoPor defectoNotas
zonetabla zonaZona de origen
particlestringNombre del tipo de partícula
speednumbernilVelocidad 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ámetroTipoNotas
particlesarray de tablasCada 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ámetroTipoNotas
phasestringNombre 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ámetroTipoPor defectoNotas
speednumber0.5Velocidad 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ámetroTipoNotas
causestringNombre 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ámetroTipoPor defectoNotas
chargesnumber1Nú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ámetroTipoNotas
playerwrapper de jugadorEl jugador atacante
damagenumberCantidad 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ámetroTipoNotas
targetwrapper de entidadEntidad objetivo para el necronomicon
filestringNombre 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étodoDevuelveNotas
players:current_target()wrapper de jugador o nilEl jugador del evento o el objetivo mob del jefe si es un jugador
players:nearby_players(radius)array de wrappers de jugadorTodos los jugadores dentro del radio del jefe
players:all_players_in_world()array de wrappers de jugadorTodos 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étodoDevuelveNotas
entities:get_nearby_entities(radius[, filter])array de wrappers de entidadEntidades cercanas alrededor del jefe
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter])array de wrappers de entidadEntidades dentro de un cuadro alineado a ejes
entities:get_all_entities([filter])array de wrappers de entidadTodas las entidades coincidentes en el mundo del jefe
entities:get_direct_target_entity()wrapper de entidad o nilObjetivo directo para el evento actual
entities:get_boss_spawn_location()tabla locationLa 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
}

Próximos Pasos