Saltar al contenido principal

Scripting Lua: Jefe y Entidades

webapp_banner.jpg

Esta página cubre todo sobre los envoltorios (wrappers) de jefes y entidades en los poderes Lua de EliteMobs: context.boss, context.player, context.players, context.entities, y las tablas de envoltorio de entidad que devuelven. Si eres nuevo en los poderes Lua, comienza primero con Primeros pasos.


Envoltorios de entidad​

Cuando accedes a entidades a través de la API de Lua -- ya sea desde context.boss, context.player, resultados de consultas como context.players:nearby_players(), o campos de eventos -- siempre recibes tablas de envoltorio (wrappers). Estos no son objetos Bukkit en bruto. Cada envoltorio proporciona un conjunto de campos (valores de instantánea capturados en el momento de la creación) y métodos (llamadas en vivo que acceden al servidor).

Esta página describe los envoltorios nativos de los poderes de jefe de EliteMobs. Los ayudantes compartidos de MagmaCore, como context.world:get_entity(uuid), pueden devolver otro envoltorio con campos consultados en vivo y firmas distintas; consulta la referencia de la API compartida. Los métodos nativos aceptan dos puntos o un punto sin pasar un argumento self explícito. Asignar un campo solo cambia la tabla Lua; usa un método para modificar la entidad.

Dos reglas para recordar:

  • Los campos como health, current_location y maximum_health son instantáneas. Reflejan el estado en el momento en que se creó el envoltorio y no se actualizan automáticamente.
  • Los métodos como get_location(), get_health() e is_alive() realizan una comprobación en vivo cada vez que los llamas.

Campos comunes de entidad​

Cada envoltorio de entidad viva incluye estos campos.

CampoTipoNotas
entity.namestringNombre para mostrar
entity.uuidstringUUID como texto
entity.entity_typestringNombre del EntityType de Bukkit (p. ej. "ZOMBIE", "PLAYER")
entity.is_playerbooleantrue para jugadores
entity.is_elitebooleantrue si EliteMobs lo rastrea como una elite
entity.is_mountbooleantrue si este envoltorio representa una montura de jefe
entity.is_monsterbooleantrue para entidades de tipo monstruo
entity.healthnumberSalud actual (instantánea)
entity.maximum_healthnumberSalud máxima (instantánea)
entity.current_locationlocation tablePosición en el momento en que se creó el envoltorio
entity.is_validbooleanValidez de Bukkit al crear el envoltorio (instantánea)
En entidades vivas, is_valid es un campo, no un método

En los envoltorios de entidades vivas, incluidos context.player y context.boss, is_valid es un booleano capturado al crear el envoltorio. Llamar a entity:is_valid() provoca attempt to call a boolean value y deshabilita el poder.

  • Lee la instantánea con entity.is_valid, usando un punto.
  • Para una comprobación en vivo, usa entity:is_alive(), que consulta el servidor en cada llamada.

is_valid() sí es un método en los envoltorios de referencia de entidades no vivas que devuelven summon_projectile, spawn_falling_block_at_location y métodos similares. Úsalo para comprobar esas referencias cuando las conserves entre ticks.

Para leer datos específicos de elite, como el nivel del jefe, usa los campos y métodos de context.boss descritos en la sección context.boss a continuación. Para hacer desaparecer una elite desde un script, llama al método entity:remove_elite().

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
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 entidad​

Los métodos siguientes realizan llamadas en vivo al servidor. Los de movimiento, salud, equipo y efectos pertenecen a los envoltorios de entidades vivas. El chat, las barras de acción, los títulos, las barras de jefe y los comandos requieren un envoltorio de jugador. context.boss:send_message(...) es un método distinto que envía mensajes a los jugadores cercanos. Salvo que se documente un valor de retorno, los métodos que modifican entidades devuelven nil, no una confirmación de éxito.

Los cambios de IA, consciencia, invulnerabilidad y escala pertenecen al poder que los hizo. Cada uno registra el valor que sustituyó: una duración positiva restaura ese valor tras los ticks indicados, y cerrar el script restaura cualquier cambio que siga activo. Cuando varios poderes cambian la misma propiedad, al terminar un cambio se restaura el cambio restante más reciente, o el valor original si no queda ninguno. Si otro plugin o comando cambia la propiedad entretanto, se conserva su valor. Pausar el script no deshace estos cambios. Las duraciones de etiquetas, los empujes retrasados y las barras de jefe de jugadores usan tareas independientes del reloj de juego que siguen ejecutándose después de cerrar el script. Los demás cambios en entidades no se deshacen.


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 de ubicación.

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 de ubicación.

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 de 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 un jugador. Admite 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 a la barra de acción de un jugador mediante la fuente Lua de EliteMobs. Participa en el compositor de barras de acción; no reserva la pantalla para este script.

ParámetroTipoNotas
messagestringTexto de la barra de acción 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 un subtítulo opcional a un jugador con el formato de color de EliteMobs. Los argumentos de tiempo son ticks enteros.

ParámetroTipoPredeterminadoNotas
titlestringTexto del título
subtitlestring""Texto del subtítulo
fadeInnumber10Ticks de aparición gradual
staynumber40Ticks de permanencia
fadeOutnumber10Ticks de desvanecimiento
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])​

Crea una nueva barra de jefe para un jugador mediante el gestor de orden de barras. Los nombres de color y estilo no distinguen mayúsculas; los desconocidos usan WHITE y SOLID. Una duración positiva programa su retirada mediante un temporizador independiente. Los valores no positivos no añaden temporizador, y el método no devuelve una referencia ni una clave para retirarla después. Usa una duración positiva. Esta firma es distinta de la API compartida de MagmaCore, que identifica las barras mediante claves.

ParámetroTipoPredeterminadoNotas
titlestringTexto del título de la barra
colorstring"WHITE"Valor de BarColor
stylestring"SOLID"Valor de 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)​

Solicita un teletransporte de Bukkit y devuelve nil, sin indicar si tuvo éxito. La conversión nativa acepta x, y, z, yaw/pitch opcionales, el nombre de un world cargado o una tabla current_location anidada. Las coordenadas ausentes valen 0; si falta el mundo, se usa el del jefe que ejecuta el poder, no necesariamente el de la entidad objetivo. Un nombre de mundo desconocido hace fallar la conversión. nil o un valor que no sea una tabla usa la posición del jefe. No añade comprobaciones de destino seguro ni de protección de regiones.

ParámetroTipoNotas
locationlocation tableDestino
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 de inmediato.

ParámetroTipoNotas
vectorvector table{ 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 una velocidad capturada tras un retraso de 1 tick por defecto. El temporizador independiente comprueba que la entidad siga siendo válida. Con additive = true, suma el vector a la velocidad que tenga al ejecutarse; de lo contrario, la reemplaza. Pausar o cerrar el script no cancela el empuje.

ParámetroTipoPredeterminadoNotas
vectorvector tableDirecció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)​

Orienta la entidad teletransportándola a su posición actual con una nueva rotación. Una tabla con world de tipo string o con current_location anidado se interpreta como destino, que debe estar en el mundo de la entidad. Una tabla que solo tenga x/y/z se interpreta como vector de dirección. Una dirección de longitud cero no cambia nada.

ParámetroTipoNotas
directionOrLocationvector or location tableObjetivo 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)​

Establece los ticks de fuego de Bukkit. La política de efectos de instancia comprueba el objetivo en cada llamada. Los jugadores deben estar conectados, vivos y en el mundo de origen; dentro de una instancia deben pertenecer a la partida activa y a su lista de participantes. Las demás entidades vivas deben ser válidas. Esto no garantiza que el fuego cause daño.

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 al valor real de congelación de Bukkit, sujeto a la misma política de efectos de instancia que set_fire_ticks. Pese al nombre, no es una superposición visual enviada solo mediante paquetes ni detiene directamente la IA o el movimiento. Puede aplicar el comportamiento normal de congelación de Minecraft.

ParámetroTipoPredeterminadoNotas
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 de Bukkit después de la misma comprobación de instancia que set_fire_ticks. Los nombres no distinguen mayúsculas; los desconocidos generan una advertencia y no aplican nada. Se usan las reglas de sustitución de efectos de Bukkit, sin forzar la sustitución de cualquier efecto existente.

ParámetroTipoPredeterminadoNotas
effectstringNombre de 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 envoltorios nativos de poderes de jefe de EliteMobs. Sí existe en los envoltorios compartidos de MagmaCore. Aplica los efectos con una duración adecuada; aplicar otro efecto con duración cero no elimina de forma fiable uno existente.


entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)​

Envía una solicitud de daño a Bukkit. Los tres métodos devuelven nil; la cantidad solicitada no confirma la salud perdida. Las reglas de combate y los listeners posteriores pueden modificar o cancelar el golpe.

MétodoNotas
deal_damage(amount)Llama al daño de Bukkit sin atacante explícito
deal_custom_damage(amount)Usa BossCustomAttackDamage con el jefe que ejecuta el poder; rechaza autogolpes, objetivos invulnerables o muertos y jugadores fuera de Survival/Adventure, solicita un golpe personalizado y después elimina el tiempo de espera de daño nativo
deal_damage_from_boss(amount)Llama al daño de Bukkit con el jefe como atacante; puede aplicar el procesamiento normal de combate de EliteMobs
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)​

Para elites registradas, llama a la curación de EliteMobs y dispara el evento cancelable EliteMobHealEvent. Las demás entidades vivas se curan directamente hasta el valor base de su atributo de salud máxima, que puede diferir del máximo efectivo devuelto por get_maximum_health(). Indica una cantidad no negativa; este ayudante no es una API de daño que limite automáticamente los valores de entrada.

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])​

Establece la invulnerabilidad de la entidad y registra el valor que sustituyó. Una duración positiva restaura ese valor tras los ticks indicados; si no, el cambio dura hasta que este poder se apaga, lo que también lo restaura. Volver a llamarlo desde el mismo poder sustituye el cambio anterior de ese poder.

ParámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la invulnerabilidad
durationnumber0Restaura el valor sustituido tras estos ticks; 0 mantiene el cambio hasta que el poder se apaga
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])​

Establece la IA de la entidad y registra el valor que sustituyó. Una duración positiva restaura ese valor tras los ticks indicados; si no, el cambio dura hasta que este poder se apaga, lo que también lo restaura. Llamar a set_ai_enabled(true) mientras este poder mantiene un cambio de IA termina ese cambio y restaura el valor sustituido en lugar de aplicar uno nuevo.

ParámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la IA
durationnumber0Restaura el valor sustituido tras estos ticks; 0 mantiene el cambio hasta que el poder se apaga
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 de EliteMobs que distinguen mayúsculas en elites registradas y jugadores con datos de inventario de EliteMobs cargados. Los mobs ordinarios no registrados no guardan estas etiquetas. No son etiquetas del scoreboard de Bukkit. Una duración positiva programa una retirada independiente; añadir otra vez la misma etiqueta no cancela el temporizador anterior.

MétodoParámetroNotas
add_tag(tag[, duration])string, number opcionalAñade la etiqueta; opcionalmente la elimina automáticamente tras los 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)​

Ejecuta inmediatamente un comando como el jugador y con sus permisos. Usa texto sin / inicial. Este método exclusivo de jugadores devuelve nil, no informa del éxito del comando ni sustituye placeholders.

ParámetroTipoNotas
commandstringTexto del comando sin la / 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 valor base del atributo de escala cuando está disponible y registra el valor que sustituyó. Una duración positiva restaura ese valor tras los ticks indicados; si no, el cambio dura hasta que este poder se apaga, lo que también lo restaura. Los modificadores de atributos pueden cambiar el tamaño efectivo.

ParámetroTipoPredeterminadoNotas
scalenumberMultiplicador de escala
durationnumber0Restaura la escala sustituida tras estos ticks; 0 mantiene el cambio hasta que el poder se apaga
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 de la entidad. No se restaura automáticamente al cerrar el script. Un callback retrasado del script puede no ejecutarse tras su cierre; no dependas de él para garantizar la restauración de entidades que sobrevivan.

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
-- Change the boss's gravity; the callback runs only while this script stays active.
context.boss:set_gravity(false)
context.scheduler:run_after(60, function(tick_context)
if tick_context.boss.exists then
tick_context.boss:set_gravity(true)
end
end)
end
}

entity:play_sound_at_entity(sound[, volume][, pitch])​

Reproduce un sonido en la ubicación de la entidad.

ParámetroTipoPredeterminadoNotas
soundstringClave de sonido de Minecraft (por ejemplo, "entity.ender_dragon.growl") o un nombre de enum Sound de Spigot. Las claves de paquete de recursos también funcionan.
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 de play_sound_at_entity. Reproduce un sonido en la ubicación de la entidad.


entity:spawn_particle_at_self(particleOrSpec[, count])​

Genera partículas en la ubicación actual de la entidad. Usa la misma especificación de partículas que el ayudante nativo de mundo. El amount de una tabla tiene prioridad sobre count; los nombres se convierten a mayúsculas y las partículas que requieren datos no admitidos generan una advertencia en lugar de aparecer.

ParámetroTipoPredeterminadoNotas
particleOrSpecstring or tableNombre de la partícula o tabla de especificación
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ámetroTipoPredeterminadoNotas
locationlocation tableUbicació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)​

Solicita una animación solo si EliteMobs registra la entidad como jefe personalizado con modelo personalizado. Devuelve nil; no espera a que termine ni informa de si existe ese nombre de animación. Tener un modelo en una entidad genérica no basta para este ayudante nativo.

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
}

Métodos de vehículo y pasajero​

Los envoltorios de entidades vivas también exponen ayudantes de vehículo y pasajero de Bukkit. Resuelven los envoltorios recibidos mediante su UUID de Bukkit; no aceptan strings de UUID directamente. Montar rechaza entidades ausentes, idénticas o inválidas, omite temporalmente la protección de EliteMobs contra abusos de monturas y devuelve si Bukkit aceptó el cambio. Estos métodos no registran una ruta de transporte ni organizan la limpieza al cerrar el script.

MétodoDevuelveNotas
entity:is_inside_vehicle()booleanVerdadero si la entidad está montada sobre otra entidad.
entity:has_vehicle()booleanVerdadero si la entidad tiene actualmente un vehículo.
entity:get_vehicle()entity wrapper or nilDevuelve el envoltorio del vehículo actual.
entity:set_vehicle(vehicle)booleanHace que esta entidad monte sobre vehicle.
entity:leave_vehicle()booleanHace que esta entidad abandone su vehículo actual.
entity:has_passengers()booleanVerdadero si esta entidad tiene pasajeros.
entity:get_passenger_count()numberNúmero de pasajeros.
entity:get_passengers()tableArray de envoltorios de pasajeros.
entity:add_passenger(passenger)booleanAñade un pasajero a esta entidad.
entity:remove_passenger(passenger)booleanElimina un pasajero de esta entidad.
entity:eject_passengers()booleanExpulsa a todos los pasajeros.
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:has_vehicle() then
context.player:leave_vehicle()
end
end
}

entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])​

Reemplaza inmediatamente la velocidad por el desplazamiento normalizado del origen a la entidad, multiplicado por strength, y añade los desplazamientos en los ejes del mundo. Las posiciones coincidentes también reciben estos desplazamientos. Un envoltorio aporta su current_location guardado; pasa source:get_location() si necesitas la posición actual. Este ayudante no compara mundos, así que usa únicamente posiciones del mismo mundo.

ParámetroTipoPredeterminadoNotas
sourcelocation or wrapperOrigen del empuje
strengthnumber1.0Multiplicador de la fuerza del empuje
xOffsetnumber0Desplazamiento X adicional
yOffsetnumber0Desplazamiento Y adicional
zOffsetnumber0Desplazamiento Z adicional
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 el nombre personalizado de Bukkit con formato de color. Al restablecerlo, usa el nombre configurado de la elite registrada; para una entidad no registrada usa su getName() actual, sin recuperar un nombre original guardado. No cambia el nombre de cuenta del jugador ni el campo de instantánea del envoltorio.

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.boss:set_custom_name("&c&lEnraged Boss")
context.boss:send_message("&cThe boss is enraged!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function(tick_context)
if tick_context.boss:is_alive() then
tick_context.boss:reset_custom_name()
end
end)
end
}

entity:place_temporary_block(material[, duration][, requireAir])​

Coloca un bloque temporal en la ubicación actual de la entidad y devuelve nil, incluso si requireAir impide colocarlo. Con una duración positiva se restauran los datos del bloque guardados, no el contenido de contenedores, cuando termina el temporizador, cuando se descarga el chunk o el mundo, o cuando se apaga el plugin, pero solo mientras el bloque siga conteniendo el bloque temporal. Colocar de nuevo sobre el mismo bloque temporal reinicia su temporizador. Se omiten los bloques con entidades de bloque, como los cofres, y los bloques que mantiene otro propietario de bloques temporales. Romper el bloque no suelta nada. Una duración no positiva coloca el bloque de forma permanente y sin registrarlo. Usa un material de bloque y comprueba tú las protecciones.

ParámetroTipoPredeterminadoNotas
materialstringNombre del material del bloque
durationnumber0Ticks positivos hasta restaurar; los valores no positivos colocan el bloque de forma permanente
requireAirbooleanfalseColocar solo 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 la bandera actual isOnGround() de Bukkit. No realiza una nueva consulta de bloques ni de espacio libre superior.


entity.is_valid​

En un envoltorio de entidad viva, es un campo booleano que registra la validez de Bukkit al crear el envoltorio. Léelo con un punto (entity.is_valid); llamarlo como método provoca un error.

La instantánea puede quedar desactualizada. Para conocer el estado actual, usa entity:is_alive(). En los envoltorios de referencia de entidades no vivas guardados entre ticks, usa el método is_valid().


entity:is_frozen()​

Devuelve true si la entidad (cuando se rastrea como jefe personalizado) tiene la bandera de congelado activada.


entity:set_awareness_enabled(aware[, duration])​

Establece la consciencia del mob y registra el valor que sustituyó. Solo afecta a entidades de tipo mob. Una duración positiva restaura ese valor tras los ticks indicados; si no, el cambio dura hasta que este poder se apaga, lo que también lo restaura. Llamarlo con true mientras este poder mantiene un cambio de consciencia termina ese cambio en lugar de aplicar uno nuevo.

ParámetroTipoPredeterminadoNotas
awarebooleantrue para activar la consciencia
durationnumber0Restaura el valor sustituido tras estos ticks; 0 mantiene el cambio hasta que el poder se apaga

entity:is_healing() / entity:set_healing(enabled)​

Consulta o establece la bandera de curación de una elite registrada. Esto no restaura salud ni inicia un temporizador de curación. set_healing(true) marca la elite como en curación cuando todavía no lo está; set_healing(false) solo borra la curación que estableció este poder. Cuando el poder se apaga, borra cualquier bandera de curación que siga siendo suya. Las entidades no registradas devuelven false en la consulta y no cambian al llamar al setter.


entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])​

Devuelve true si la caja delimitadora se solapa con la caja numérica alineada con los ejes. No compara mundos; indica un centro en el mundo de la entidad. Si no puede resolver el centro, devuelve false.

ParámetroTipoPredeterminadoNotas
centerlocation tableCentro de la caja 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 una elite, esto la hace desaparecer correctamente a través de EliteMobs.


entity:remove()​

Elimina una entidad viva simple que haya generado un script, como un soporte de armadura. Devuelve true si se eliminó. Los jugadores y las elites se rechazan con false; haz desaparecer las elites con remove_elite().


entity:set_invisible(enabled) y entity:set_silent(enabled)​

set_invisible oculta el cuerpo de la entidad; los objetos que lleva puestos o en la mano siguen siendo visibles. set_silent silencia los sonidos propios de la entidad.


entity:set_marker(enabled)​

Solo para soportes de armadura. Estos cuatro métodos existen en los envoltorios de soportes de armadura y no están presentes en ninguna otra entidad.

MétodoEfecto
set_marker(enabled)Un soporte marcador no tiene hitbox y no se le puede golpear ni chocar con él
set_small(enabled)Soporte de la mitad de tamaño
set_base_plate(enabled)Muestra u oculta la base de piedra
set_arms(enabled)Muestra u oculta los brazos

Para un objeto o bloque flotante puramente visual, prefiere world:spawn_display_at_location, que no necesita ninguno de estos.


entity:set_custom_name_visible(visible)​

Establece si el nombre personalizado de la entidad es siempre visible o solo cuando se la mira.

ParámetroTipoNotas
visiblebooleantrue para siempre visible

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

Reemplaza la ranura elegida por un objeto nuevo del material indicado. Los nombres de ranura, material y encantamiento no distinguen mayúsculas. Una ranura o material desconocido no cambia nada; los encantamientos desconocidos se omiten, mientras que los reconocidos usan niveles sin las restricciones normales. No carga archivos de objetos personalizados ni conserva los metadatos del objeto anterior. Devuelve nil.

ParámetroTipoPredeterminadoNotas
slotstringRanura de equipo: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND"
materialstringNombre del material (p. ej. "DIAMOND_SWORD", "IRON_HELMET")
optionstable{}Ajustes opcionales (ver abajo)

Tabla de opciones:

ClaveTipoPredeterminadoNotas
enchantmentsarray of tablesnilCada 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:damage_equipment(slot, amount)​

Daña el objeto en HAND, OFF_HAND, HEAD, CHEST, LEGS o FEET y devuelve el daño de durabilidad aplicado. Solicita entre 1 y 64 puntos por llamada. Los objetos ausentes, no dañables o irrompibles devuelven 0.

Para jugadores, dispara PlayerItemDamageEvent y respeta su cancelación o cantidad modificada. Un listener puede elevar la cantidad por encima del límite inicial de 64 puntos; el resultado sigue limitado por la durabilidad restante. Un objeto que alcanza su daño máximo se elimina de la ranura, incluida toda su pila, y dispara PlayerItemBreakEvent. Respeta los metadatos de daño máximo personalizado. El método no calcula reducciones de Unbreaking. Las ranuras inválidas y las solicitudes fuera de 1..64 provocan un error de argumento Lua.

entity:is_ai_enabled()​

Devuelve true si la entidad tiene la IA activada. Para elites registradas, consulta el estado lógico de IA de EliteMobs, incluida la gestión del comportamiento nativo, en lugar de depender solo de la bandera de IA de Bukkit.

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
}

Envoltorios 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 envoltorio 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 de instantánea: name, uuid, entity_type, is_player (siempre false), is_elite (siempre false), is_mount (normalmente false; boss:get_mount() lo establece en true), current_location.

Métodos:

MétodoNotas
is_valid()Comprobación de validez en vivo. En estos envoltorios sí es un método, a diferencia de los de entidades vivas
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 rendimiento de la explosión (solo Fireball)
set_gravity(enabled)Alterna la gravedad
detonate()Solicita la detonación de fuegos artificiales; no afecta a otros tipos
remove()Elimina la entidad del mundo
unregister([reason])Ejecuta la retirada del rastreador de EliteMobs para entidades registradas reconocidas; no cambia las no registradas

Estos envoltorios también incluyen todos los métodos de vehículo y pasajero, como is_inside_vehicle(), get_vehicle(), set_vehicle(v), add_passenger(p) y eject_passengers(). Así puede montarse un jefe sobre una entidad no viva.

unregister acepta un motivo de retirada sin distinguir mayúsculas y usa OTHER por defecto; no es una consulta booleana de éxito. Los métodos conservan la referencia a la entidad subyacente, así que comprueba is_valid() antes de usar una referencia guardada. Una retirada retrasada programada por la instancia Lua se cancela si esta se cierra. Usa una duración nativa adecuada o el registro con el propietario cuando la limpieza deba sobrevivir al script.

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
)
if fb == nil then return end
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}

context.player​

Disponible cuando el objetivo directo o el actor del evento se resuelve como jugador, incluidos on_boss_damaged_by_player y on_player_damaged_by_boss. Los envoltorios de jugador incluyen los métodos comunes de entidades vivas, aunque los que requieren una elite registrada o un jefe personalizado no afectan a un jugador ordinario. Los extras siguientes son exclusivos de jugadores.

precaución

context.player es nil en los hooks que no tienen un jugador asociado, como on_spawn, los callbacks programados y los hooks de temporizador. Comprueba siempre que no sea 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_modestringInstantánea del modo de juego en mayúsculas (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 la barra de acción
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)Ejecuta 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 envoltorio del jefe para la elite mob que posee este poder Lua. Siempre disponible en cada hook.

consejo

Mientras exista una entidad viva subyacente, el envoltorio del jefe hereda los métodos comunes de entidades vivas, incluidos push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self y overlaps_box_at_location. No hereda la interfaz ni los comandos exclusivos de jugadores. Los métodos siguientes son específicos del jefe o usan la capa EliteEntity. Si falta la entidad subyacente, la tabla sigue existiendo, pero no se garantiza el conjunto completo de métodos heredados.

Campos del jefe​

CampoTipoNotas
boss.namestringNombre para mostrar
boss.uuidstringUUID de la elite jefe
boss.entity_typestringNombre del EntityType de Bukkit
boss.is_monsterbooleantrue si la entidad subyacente es un Monster
boss.levelnumberNivel de la elite
boss.healthnumberSalud actual (instantánea)
boss.maximum_healthnumberSalud máxima (instantánea)
boss.damager_countnumberNúmero de atacantes (instantánea)
boss.is_in_combatbooleanInstantánea del estado de combate
boss.existsbooleanSi la elite existía al crear esta tabla
boss.current_locationlocation tablePosición en el momento de la creación del envoltorio (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​


Métodos de movimiento de patrulla​

Los jefes con una patrulla configurada exponen patrol_pause(), patrol_resume(), walk_to(x, y, z), hold(x, y, z) y teleport(x, y, z). Las coordenadas son desplazamientos desde el punto de aparición y cada método devuelve si se aceptó la solicitud. walk_to reanuda la ruta al llegar; hold espera a patrol_resume(); los trayectos largos usan el solucionador automático.


boss:is_alive()​

Devuelve true si la entidad jefe es válida, no está muerta y la elite aún 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 de ubicación.

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])​

Establece la IA del jefe con las mismas reglas de cambios propios que entity:set_ai_enabled: una duración positiva restaura el valor sustituido, y cerrar el poder restaura cualquier cambio que siga activo.

ParámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la IA
durationnumber0Restaura el valor sustituido tras estos ticks; 0 mantiene el cambio hasta que el poder se apaga
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)​

Solicita un teletransporte de Bukkit con las reglas nativas de conversión de ubicación descritas arriba. Devuelve nil, sin confirmar el éxito. No cambia la ubicación de aparición configurada ni establece un destino de patrulla.

ParámetroTipoNotas
locationlocation tableDestino
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 de inmediato.

ParámetroTipoNotas
vectorvector table{ 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)​

Llama a la curación de EliteMobs, que dispara el evento cancelable EliteMobHealEvent y limita la salud al menor valor entre el máximo de EliteMobs y el atributo base de salud máxima de Bukkit. Devuelve nil; la cancelación puede impedir la curación.

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ámetroTipoPredeterminadoNotas
soundstringClave de sonido de Minecraft (por ejemplo, "entity.wither.spawn") o un nombre de enum Sound de Spigot. Las claves de paquete de recursos también funcionan.
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ámetroTipoPredeterminadoNotas
particleOrSpecstring or tableNombre de la partícula o tabla de especificación
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:has_mount() / boss:get_mount()​

Comprueba o devuelve la entidad sobre la que está montado actualmente este jefe. boss:get_mount() devuelve nil si el jefe no tiene montura. Cuando se devuelve una montura, su envoltorio tiene is_mount = true.

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local mount = context.boss:get_mount()
if mount ~= nil then
context.log:info("Boss is mounted on " .. mount.entity_type)
end
end
}

boss:set_mount(entity) / boss:clear_mount() / boss:dismount()​

Monta o desmonta al jefe. boss:set_mount(entity) hace que el jefe monte sobre el envoltorio de entidad proporcionado y devuelve true si Bukkit aceptó el cambio de pasajero. boss:clear_mount() y boss:dismount() ambos hacen que el jefe abandone su vehículo actual.

Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("mount_check", 100) then return end
if context.boss:has_mount() then
context.boss:dismount()
end
end
}

boss:face_direction_or_location(vectorOrLocation)​

Hace que el jefe mire hacia una dirección o ubicación.

ParámetroTipoNotas
vectorOrLocationvector or location tableDirecció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][, forceTeleport][, timeout])​

Usa la búsqueda de rutas para llevar al jefe hasta una ubicación. Solo funciona con jefes personalizados.

ParámetroTipoPredeterminadoNotas
locationlocation tableDestino
speednumber1.0Multiplicador de velocidad de movimiento
forceTeleportbooleanfalseTeletransporta al jefe al destino si transcurre timeout antes de que llegue
timeoutnumber0Tiempo máximo en ticks. 0 usa el valor predeterminado de 100 ticks (5 segundos)

La navegación también termina cuando el jefe está a menos de un bloque del destino, deja de existir o sale del mundo del destino. Iniciar una nueva navegación cancela la que ya estuviera activa en ese jefe. Usa una tarea independiente de Bukkit, por lo que pausar o cerrar la instancia Lua no la cancela. Devuelve nil, no un resultado de llegada; el destino se captura al llamar al método.

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 las etiquetas del 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 con formato a todos los jugadores dentro del radio esférico 3D en el mundo del jefe. No filtra por modo de juego, línea de visión, participación en combate ni pertenencia a una instancia.

ParámetroTipoPredeterminadoNotas
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])​

Crea una entidad y devuelve su envoltorio nativo, o nil si no puede resolver una posición o desconoce el tipo de entidad. Los tipos reconocidos que no se pueden generar también pueden fallar. Los proyectiles normales de Bukkit salen del jefe salvo con spawn_at_origin = true; el origen indicado sigue determinando la dirección hacia el destino. Mantén ambas posiciones en el mismo mundo, ya que el ayudante no lo comprueba. Los tipos que no son proyectiles aparecen en el origen indicado y reciben el envoltorio correspondiente de entidad viva o no viva.

ParámetroTipoPredeterminadoNotas
entityTypestringTipo de entidad (p. ej. "FIREBALL", "ARROW")
originlocation tablePosición de lanzamiento
destinationlocation tablePosición objetivo
speednumber1.0Velocidad del proyectil
optionstable{}Ver opciones a continuación

Tabla de opciones:

ClaveTipoNotas
durationnumberLos valores positivos programan una retirada independiente tras estos ticks; los no positivos no añaden temporizador
max_ticksnumberLímite del monitor de aterrizaje; por defecto 6000
custom_damagenumberMetadatos de daño personalizado para el combate del proyectil, sin garantizar la salud perdida
detonation_powerstringArchivo de poder usado como metadato de proyectil explosivo, no una fuerza numérica de explosión
yieldnumberRendimiento de la explosión (Fireball)
persistentbooleanEstablece la persistencia de Bukkit si se indica; no anula la duración, las colisiones ni la retirada por el propietario
effectstringNombre de EntityEffect a reproducir al aparecer
incendiarybooleanSi la explosión es incendiaria
gravitybooleanSi el proyectil tiene gravedad
glowingbooleanEfecto de brillo
invulnerablebooleanSi el proyectil es invulnerable
trackbooleanPor defecto true: registra el proyectil en EliteMobs; no le hace perseguir al objetivo.
spawn_at_originbooleanPor defecto false: los proyectiles normales salen del jefe. Usa true para generarlos en el origen indicado.
direction_onlybooleanPara bolas de fuego generadas en un origen explícito, establece la dirección sin asignar una velocidad adicional
on_landfunctionCallback (landing_location, spawned_entity) al tocar el suelo, quedar inválido o superar max_ticks; no es exclusivamente un callback de impacto

direction_only afecta a bolas de fuego generadas explícitamente en el origen indicado; omite la asignación adicional de velocidad después de establecer la dirección. El destino sigue determinando esa dirección. Los proyectiles de Bukkit reciben al jefe como tirador. Con track = true, un proyectil se registra en EliteMobs y queda vinculado al ciclo de vida de los refuerzos del jefe. Esto no se aplica a tipos que no son proyectiles. track = false desactiva esa limpieza por el propietario; organiza otra forma de retirada.

El monitor on_land pertenece a la instancia Lua y se detiene al cerrarla. Llama una vez a (landing_location, spawned_entity) al tocar el suelo, quedar inválido o superar su contador, sin eliminar por sí mismo la entidad. El temporizador de duration positiva es independiente y continúa después del cierre. Por tanto, recibir el callback no demuestra que el proyectil haya impactado en algo.

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 silenciosamente un refuerzo desde un archivo de jefe personalizado, registra quién lo invocó y hereda el combate normalizado si el jefe invocador lo usa. La configuración propia del refuerzo y sus reglas de nivel dinámico determinan su nivel. Una zona elige una ubicación muestreada aleatoria o su centro si no hay ubicaciones; un resultado sin resolver usa la ubicación del jefe. Devuelve el envoltorio de entidad viva, o nil si no produjo un refuerzo vivo.

ParámetroTipoNotas
filenamestringNombre del archivo de configuración del jefe
zoneOrLocationlocation table or zoneUbicación o definición de zona de aparición opcional. Por defecto, la ubicación del jefe.
durationnumberTiempo positivo opcional hasta escapar, en ticks. Por defecto 0, sin temporizador añadido por este ayudante; no modifica el nivel.
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 0)
context.boss:send_message("&cMinions, come to my aid!")
end
}

boss:despawn()​

Retira al jefe mediante EliteMobs con el motivo OTHER. boss:remove() es un alias con el mismo ciclo de retirada. No es un golpe ni una solicitud de recompensas de muerte normal.

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 envoltorios de jugadores dentro del radio esférico 3D en el mundo del jefe. No filtra por modo de juego, línea de visión ni participación en una instancia, ni ordena por distancia.

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 tamaño actual del registro de atacantes del jefe. A diferencia del campo damager_count, es una consulta en vivo; no cuenta solo participantes cercanos o conectados actualmente.

boss:get_nearby_elites(radius)​

Devuelve hasta 32 elites vivas registradas en el mundo del jefe, excluyendo al propio jefe. El radio debe ser finito, mayor que 0 y de como máximo 64 bloques. Los resultados usan envoltorios de entidades vivas y se ordenan por distancia, con el UUID de la elite para desempatar. Esta consulta no determina por sí sola si un efecto puede afectar a todos los resultados.


boss:get_target_player()​

Devuelve el objetivo actual del mob jefe como un envoltorio 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 envoltorios de jugadores cuyas entidades cumplen la forma de zona nativa en el mundo del jefe. No filtra por modo de juego ni participación en una instancia. Es una consulta nueva, no un monitor persistente.

ParámetroTipoNotas
zonezone tableUna definición de forma de zona

boss:spawn_particles_in_zone(zone, particle[, amount][, x][, y][, z][, speed][, coverage])​

Rellena el interior de una zona con partículas. Los argumentos son posicionales; este método no acepta una tabla de especificación.

ParámetroTipoPredeterminadoNotas
zonezone tableForma de zona nativa con kind; consulta Zonas y selección de objetivos
particlestringNombre del tipo de partícula
amountnumber1Partículas por ubicación muestreada
x, y, znumber0Dispersión, o dirección cuando amount es 0
speednumber0Velocidad de las partículas
coveragenumber1.0Probabilidad independiente de muestreo por ubicación, limitada a 0.01–1.0; un conjunto no vacío aporta al menos una ubicación

boss:spawn_particles_in_zone_border(zone, particle[, amount][, x][, y][, z][, speed][, coverage])​

Igual que el método anterior, pero muestrea el borde de la zona en lugar del interior.


boss:get_particles_from_self_toward_zone(zone, particle[, speed])​

Devuelve un array de especificaciones de partículas situadas en las posiciones muestreadas de la zona y orientadas alejándose del jefe. No genera partículas en el jefe ni anima su viaje desde él. Pasa el resultado a boss:spawn_particles_with_vector(...).

ParámetroTipoPredeterminadoNotas
zonezone tableZona objetivo
particlestringNombre del tipo de partícula
speednumber0.1Velocidad de viaje escrita en cada especificación

Cada entrada tiene la forma { location = ..., particle = ..., amount = 0, x/y/z = <unit direction>, speed = ... }. Cada posición tiene un 20 % de probabilidad de selección, con al menos una elegida si el conjunto no está vacío; después se omiten las posiciones coincidentes con el jefe. El comportamiento direccional real depende del tipo de partícula.


boss:get_particles_toward_self(zone, particle, speed)​

Hace lo mismo con la dirección invertida; cada partícula apunta desde su ubicación en la zona hacia el jefe. También devuelve el array en lugar de generar las partículas.

ParámetroTipoPredeterminadoNotas
zonezone tableZona de origen
particlestringNombre del tipo de partícula
speednumberIndica un valor explícito como 0.1; si se omite, el método intenta leer el nombre de partícula como número y falla.

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 of tablesCada entrada define una partícula con posición y dirección

Métodos del Dragón del End​

Estos métodos solo se aplican cuando la entidad jefe es un Dragón del End (Ender Dragon).


boss:get_ender_dragon_phase()​

Devuelve el nombre de la EnderDragon.Phase actual como una cadena, o nil si el jefe no es un Dragón del End.


boss:set_ender_dragon_phase(phase)​

Establece la fase del Dragón del End.

ParámetroTipoNotas
phasestringNombre de EnderDragon.Phase (p. ej. "CIRCLING", "CHARGE_PLAYER")

Métodos de soporte de poderes especiales​

Estos métodos dan soporte a las mecánicas de poderes integradas de EliteMobs desde los scripts Lua.


boss:start_tracking_fireball_system(speed?)​

Inicia un controlador para este poder en un jefe de tipo monstruo. En su primera ejecución, en el tick siguiente, y después cada 8 segundos, lanza bolas de fuego rastreadoras hacia jugadores de Survival y Adventure a 20 bloques o menos en cada eje mientras el monstruo tenga objetivo. Una ejecución sin objetivo detiene el controlador, incluida la primera; otra llamada puede reiniciarlo. Repetir la llamada mientras está activo no cambia la velocidad. El controlador pertenece al script del poder: pausar el script lo pausa y cerrar el script lo detiene. Cuando la llamada inicia un controlador, la velocidad debe ser finita y positiva, o la llamada provoca un error.

Las bolas tienen potencia de explosión 3 y son incendiarias. La tarea de seguimiento de cada bola es independiente del script. Termina tras unos 3 minutos o un contexto inválido, pero eso no elimina la bola. Un golpe no cancelado contra una bola rastreada alterna su persecución entre el jugador y el invocador.

ParámetroTipoPredeterminadoNotas
speednumber0.5Velocidad de la bola de fuego; debe ser finita y positiva

boss:handle_spirit_walk_damage(cause)​

Pasa una causa de daño al ayudante Spirit Walk. El fuego, los ticks de fuego, el veneno, wither, las espinas y los ataques de barrido no avanzan su contador. Ahogarse o asfixiarse inicia una huida inmediata; las demás causas aceptadas la inician cada noveno golpe. Busca un destino válido cercano y anima el movimiento hasta él con invulnerabilidad temporal. No cancela el evento de daño recibido ni garantiza una posición detrás del atacante.

ParámetroTipoNotas
causestringNombre de DamageCause de Bukkit (p. ej. "ENTITY_ATTACK", "PROJECTILE")

boss:shield_wall_is_active()​

Devuelve la bandera de actividad del controlador de escudos. No garantiza que una dirección concreta conserve una reserva positiva.


boss:initialize_shield_wall(openingDirection?)​

Inicializa las reservas direccionales y los efectos visuales salvo que ya haya un muro activo. Cada dirección protegida empieza con salud igual al nivel del jefe. El argumento elige la abertura sin protección; no indica un número de cargas. Devuelve nil y no instala un manejador de eventos de daño.

ParámetroTipoPredeterminadoNotas
openingDirectionnumber11 = norte, 2 = este, 3 = sur, 4 = oeste; otros enteros protegen los cuatro lados

boss:shield_wall_absorb_damage(player, damage)​

Comprueba la posición del atacante respecto al jefe y resta el daño indicado de la reserva de esa dirección. Devuelve true si la reserva era positiva antes de restar, incluso si el golpe supera lo que quedaba. Devuelve false si falta el jugador o el estado, si está en otro mundo o si la dirección está agotada o abierta. No cancela el evento de daño. Cuando devuelva true, tu hook debe llamar a context.event.cancel_event() para bloquear el golpe. Indica una cantidad de daño no negativa.

ParámetroTipoNotas
playerplayer wrapperEl jugador atacante
damagenumberCantidad de daño a absorber

boss:deactivate_shield_wall()​

Detiene la tarea visual independiente del muro y elimina su estado y sus soportes de armadura. Cerrar la instancia Lua no llama a este método; desactiva explícitamente el muro al terminar la mecánica.


boss:start_zombie_necronomicon(target, chant)​

Inicia el controlador Necronomicon con un objetivo vivo y un cántico que se desplaza por pantalla. El segundo argumento es texto para mostrar, no un archivo de jefe. Invoca los archivos fijos necronomicon_zombie.yml con un 80 % de probabilidad y necronomicon_skeleton.yml con un 20 %, al nivel del invocador, uno cada 60 ticks. Una activación nueva solo se acepta con un máximo de nueve refuerzos registrados y sin controlador activo. El controlador en marcha llena el grupo hasta once, activa la IA mientras está lleno y reanuda la invocación cuando baja esa cantidad.

La invocación desactiva la IA del jefe y cambia su nombre visible; los efectos de aviso respetan el ajuste de efectos de advertencia. El objetivo debe seguir siendo válido, estar en el mismo mundo y a un máximo de 30 bloques. Un contexto inválido o la retirada del propietario detiene los controladores, restaura la presentación y elimina sus refuerzos. Son tareas independientes de Bukkit; cerrar Lua por sí solo no las detiene. Devuelve nil.

ParámetroTipoNotas
targetentity wrapperEntidad objetivo para el necronomicón
chantstringTexto visible que se desplaza; si está vacío, usa el nombre del jefe, y si es corto, añade relleno

context.players​

Ayudantes de consulta de jugadores centrados en el jefe. Úsalos para encontrar jugadores sin necesitar un jugador específico del evento.

Estas consultas no filtran por modo de juego, línea de visión, estado vivo, participación en combate ni pertenencia a una instancia, y no ordenan por distancia. current_target() da prioridad al actor del evento, a diferencia de la prioridad del objetivo directo en context.player. Un contexto programado nuevo no tiene actor de evento y recurre al objetivo actual del mob.

MétodoDevuelveNotas
players:current_target()player wrapper o nilEl jugador del evento o el objetivo del mob jefe si es un jugador
players:nearby_players(radius)array of player wrappersTodos los jugadores dentro del radio del jefe
players:all_players_in_world()array of player wrappersTodos 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​

Ayudantes generales de consulta de entidades centrados en el jefe.

MétodoDevuelveNotas
entities:get_nearby_entities(radius[, filter])array of entity wrappersEntidades cercanas alrededor del jefe
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter])array of entity wrappersEntidades vivas cuyos pies están dentro de los límites inclusivos de una caja en el mundo del centro; no comprueba el solapamiento de cajas delimitadoras
entities:get_all_entities([filter])array of entity wrappersTodas las entidades coincidentes en el mundo del jefe
entities:get_direct_target_entity()entity wrapper o nilObjetivo directo para el evento actual
entities:get_boss_spawn_location()location tableLa ubicación de aparición original del jefe

Filtros válidos: living (predeterminado), player / players, elite / elites, mob / mobs, all / entities

Solo get_nearby_entities respeta all / entities. Incluye entidades no vivas, como objetos soltados y proyectiles, devueltas como envoltorios de referencia más ligeros. Las entidades vivas siguen usando sus envoltorios completos. Este filtro busca en una caja alineada con los ejes, con el radio indicado en cada eje; los filtros de entidades vivas usan distancia esférica. En las otras consultas, all / entities recae en living. El propio jefe queda excluido de todos los resultados.

Los filtros no distinguen mayúsculas; los desconocidos también recurren a living. mob significa cualquier entidad viva que no sea jugador, no solo monstruos hostiles. Estas consultas no filtran automáticamente participantes de instancias, no limitan la cantidad ni ordenan por distancia. Las consultas amplias recorren las entidades vivas cargadas del mundo; usa un radio limitado y evita recorridos repetidos innecesarios. get_direct_target_entity() usa el objetivo directo del evento y puede ser nil; no recurre al objetivo de combate actual del mob.

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​