Scripting Lua: Jefe y Entidades
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_locationymaximum_healthson 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()eis_alive()realizan una comprobación en vivo cada vez que los llamas.
Campos comunes de entidad
Cada envoltorio de entidad viva incluye estos campos.
| Campo | Tipo | Notas |
|---|---|---|
entity.name | string | Nombre para mostrar |
entity.uuid | string | UUID como texto |
entity.entity_type | string | Nombre del EntityType de Bukkit (p. ej. "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true para jugadores |
entity.is_elite | boolean | true si EliteMobs lo rastrea como una elite |
entity.is_mount | boolean | true si este envoltorio representa una montura de jefe |
entity.is_monster | boolean | true para entidades de tipo monstruo |
entity.health | number | Salud actual (instantánea) |
entity.maximum_health | number | Salud máxima (instantánea) |
entity.current_location | location table | Posición en el momento en que se creó el envoltorio |
entity.is_valid | boolean | Validez de Bukkit al crear el envoltorio (instantánea) |
is_valid es un campo, no un métodoEn 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ámetro | Tipo | Notas |
|---|---|---|
text | string | Mensaje con códigos de color |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&6[Boss] &fPrepare yourself!")
end
}
entity:show_action_bar(message)
Envía un mensaje 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ámetro | Tipo | Notas |
|---|---|---|
message | string | Texto 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
title | string | Texto del título | |
subtitle | string | "" | Texto del subtítulo |
fadeIn | number | 10 | Ticks de aparición gradual |
stay | number | 40 | Ticks de permanencia |
fadeOut | number | 10 | Ticks 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
title | string | Texto del título de la barra | |
color | string | "WHITE" | Valor de BarColor |
style | string | "SOLID" | Valor de BarStyle |
duration | number | 40 | Duración en ticks |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_boss_bar("&cIncoming Attack!", "RED", "SOLID", 100)
end
end
}
entity:teleport_to_location(location)
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ámetro | Tipo | Notas |
|---|---|---|
location | location table | Destino |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}
entity:set_velocity_vector(vector)
Establece la velocidad de la entidad de inmediato.
| Parámetro | Tipo | Notas |
|---|---|---|
vector | vector 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
vector | vector table | Dirección y fuerza | |
additive | boolean | false | Añadir a la velocidad existente en lugar de reemplazarla |
delay | number | 1 | Retraso en ticks antes de aplicar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("push_up", 100) then return end
context.player:apply_push_vector({ x = 0, y = 2.0, z = 0 })
context.player:send_message("&cUpward blast!")
end
}
entity:face_direction_or_location(directionOrLocation)
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ámetro | Tipo | Notas |
|---|---|---|
directionOrLocation | vector or location table | Objetivo a mirar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}
entity:set_fire_ticks(ticks)
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ámetro | Tipo | Notas |
|---|---|---|
ticks | number | Duración del fuego en ticks (20 ticks = 1 segundo) |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}
entity:add_visual_freeze_ticks([ticks])
Añade ticks 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
ticks | number | 1 | Cantidad de ticks de congelación |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("freeze", 200) then return end
context.player:add_visual_freeze_ticks(100)
context.player:send_message("&bYou feel a chilling frost!")
end
}
entity:apply_potion_effect(effect, duration[, amplifier])
Aplica un efecto de poción 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
effect | string | Nombre de PotionEffectType | |
duration | number | Duración en ticks | |
amplifier | number | 0 | Nivel del efecto (0 = nivel I) |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("slow", 200) then return end
context.player:apply_potion_effect("SLOWNESS", 60, 1)
context.player:send_message("&7You feel sluggish...")
end
}
remove_potion_effect(effect) no está disponible en los 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étodo | Notas |
|---|---|
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ámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}
entity:set_invulnerable(enabled[, duration])
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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la invulnerabilidad | |
duration | number | 0 | Restaura 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la IA | |
duration | number | 0 | Restaura 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étodo | Parámetro | Notas |
|---|---|---|
add_tag(tag[, duration]) | string, number opcional | Añade la etiqueta; opcionalmente la elimina automáticamente tras los ticks |
remove_tag(tag) | string | Elimina la etiqueta |
has_tag(tag) | string | Devuelve true si la etiqueta está presente |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}
entity:run_command(command)
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ámetro | Tipo | Notas |
|---|---|---|
command | string | Texto 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
scale | number | Multiplicador de escala | |
duration | number | 0 | Restaura 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ámetro | Tipo | Notas |
|---|---|---|
enabled | boolean | true para gravedad normal |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
sound | string | Clave 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. | |
volume | number | 1.0 | Volumen |
pitch | number | 1.0 | Tono |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:play_sound_at_entity("entity.ender_dragon.growl", 1.0, 0.5)
end
}
entity:play_sound_at_self(sound[, volume][, pitch])
Alias 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
particleOrSpec | string or table | Nombre de la partícula o tabla de especificación | |
count | number | 1 | Número de partículas |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:spawn_particle_at_self("HEART", 5)
end
}
entity:spawn_particles_at_location(location, particle[, count])
Genera partículas en una ubicación específica.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
location | location table | Ubicación objetivo | |
particle | string | Nombre del tipo de partícula | |
count | number | 1 | Número de partículas |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.player:spawn_particles_at_location(loc, "FLAME", 10)
end
}
entity:play_model_animation(name)
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ámetro | Tipo | Notas |
|---|---|---|
name | string | Nombre de la animación |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
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étodo | Devuelve | Notas |
|---|---|---|
entity:is_inside_vehicle() | boolean | Verdadero si la entidad está montada sobre otra entidad. |
entity:has_vehicle() | boolean | Verdadero si la entidad tiene actualmente un vehículo. |
entity:get_vehicle() | entity wrapper or nil | Devuelve el envoltorio del vehículo actual. |
entity:set_vehicle(vehicle) | boolean | Hace que esta entidad monte sobre vehicle. |
entity:leave_vehicle() | boolean | Hace que esta entidad abandone su vehículo actual. |
entity:has_passengers() | boolean | Verdadero si esta entidad tiene pasajeros. |
entity:get_passenger_count() | number | Número de pasajeros. |
entity:get_passengers() | table | Array de envoltorios de pasajeros. |
entity:add_passenger(passenger) | boolean | Añade un pasajero a esta entidad. |
entity:remove_passenger(passenger) | boolean | Elimina un pasajero de esta entidad. |
entity:eject_passengers() | boolean | Expulsa 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
source | location or wrapper | Origen del empuje | |
strength | number | 1.0 | Multiplicador de la fuerza del empuje |
xOffset | number | 0 | Desplazamiento X adicional |
yOffset | number | 0 | Desplazamiento Y adicional |
zOffset | number | 0 | Desplazamiento 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
material | string | Nombre del material del bloque | |
duration | number | 0 | Ticks positivos hasta restaurar; los valores no positivos colocan el bloque de forma permanente |
requireAir | boolean | false | Colocar 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
aware | boolean | true para activar la consciencia | |
duration | number | 0 | Restaura 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
center | location table | Centro de la caja de prueba | |
halfX | number | 0.5 | Media anchura en el eje X |
halfY | number | igual que halfX | Media altura en el eje Y |
halfZ | number | igual que halfX | Media anchura en el eje Z |
entity:remove_elite()
Elimina la entidad elite del rastreo de EliteMobs. Si la entidad es 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étodo | Efecto |
|---|---|
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ámetro | Tipo | Notas |
|---|---|---|
visible | boolean | true 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
slot | string | Ranura de equipo: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Nombre del material (p. ej. "DIAMOND_SWORD", "IRON_HELMET") | |
options | table | {} | Ajustes opcionales (ver abajo) |
Tabla de opciones:
| Clave | Tipo | Predeterminado | Notas |
|---|---|---|---|
enchantments | array of tables | nil | Cada entrada: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Si el objeto es irrompible |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Give the boss a glowing diamond sword
context.boss:set_equipment("HAND", "DIAMOND_SWORD", {
unbreakable = true,
enchantments = {
{ type = "SHARPNESS", level = 5 }
}
})
end
}
entity: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étodo | Notas |
|---|---|
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.
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
| Campo | Tipo | Notas |
|---|---|---|
game_mode | string | Instantánea del modo de juego en mayúsculas (p. ej. "SURVIVAL") |
Métodos exclusivos de jugador
| Método | Notas |
|---|---|
send_message(message) | Mensaje de chat con formato de color de EliteMobs |
show_action_bar(message) | Texto de 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.
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
| Campo | Tipo | Notas |
|---|---|---|
boss.name | string | Nombre para mostrar |
boss.uuid | string | UUID de la elite jefe |
boss.entity_type | string | Nombre del EntityType de Bukkit |
boss.is_monster | boolean | true si la entidad subyacente es un Monster |
boss.level | number | Nivel de la elite |
boss.health | number | Salud actual (instantánea) |
boss.maximum_health | number | Salud máxima (instantánea) |
boss.damager_count | number | Número de atacantes (instantánea) |
boss.is_in_combat | boolean | Instantánea del estado de combate |
boss.exists | boolean | Si la elite existía al crear esta tabla |
boss.current_location | location table | Posició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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la IA | |
duration | number | 0 | Restaura 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ámetro | Tipo | Notas |
|---|---|---|
location | location table | Destino |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}
boss:set_velocity_vector(vector)
Establece la velocidad del jefe de inmediato.
| Parámetro | Tipo | Notas |
|---|---|---|
vector | vector 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ámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}
boss:play_sound_at_self(sound[, volume][, pitch])
Reproduce un sonido en la ubicación del jefe.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
sound | string | Clave 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. | |
volume | number | 1.0 | Volumen |
pitch | number | 1.0 | Tono |
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
context.boss:play_sound_at_self("entity.wither.spawn", 1.0, 0.8)
end
}
boss:spawn_particle_at_self(particleOrSpec[, count])
Genera partículas en la ubicación del jefe.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
particleOrSpec | string or table | Nombre de la partícula o tabla de especificación | |
count | number | 1 | Número de partículas |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:spawn_particle_at_self("SMOKE", 20)
context.boss:send_message("&8Smoke billows from the boss!")
end
}
boss:play_model_animation(name)
Reproduce una animación de modelo personalizado en el jefe si está disponible.
| Parámetro | Tipo | Notas |
|---|---|---|
name | string | Nombre de la animación |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss: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ámetro | Tipo | Notas |
|---|---|---|
vectorOrLocation | vector or location table | Dirección a mirar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}
boss:navigate_to_location(location[, speed][, forceTeleport][, timeout])
Usa la búsqueda de rutas para llevar al jefe hasta una ubicación. Solo funciona con jefes personalizados.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
location | location table | Destino | |
speed | number | 1.0 | Multiplicador de velocidad de movimiento |
forceTeleport | boolean | false | Teletransporta al jefe al destino si transcurre timeout antes de que llegue |
timeout | number | 0 | Tiempo 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
message | string | Texto del mensaje con códigos de color | |
range | number | 20 | Radio en bloques |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:send_message("&4You dare challenge me?!")
end
}
boss:summon_projectile(entityType, origin, destination[, speed][, options])
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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
entityType | string | Tipo de entidad (p. ej. "FIREBALL", "ARROW") | |
origin | location table | Posición de lanzamiento | |
destination | location table | Posición objetivo | |
speed | number | 1.0 | Velocidad del proyectil |
options | table | {} | Ver opciones a continuación |
Tabla de opciones:
| Clave | Tipo | Notas |
|---|---|---|
duration | number | Los valores positivos programan una retirada independiente tras estos ticks; los no positivos no añaden temporizador |
max_ticks | number | Límite del monitor de aterrizaje; por defecto 6000 |
custom_damage | number | Metadatos de daño personalizado para el combate del proyectil, sin garantizar la salud perdida |
detonation_power | string | Archivo de poder usado como metadato de proyectil explosivo, no una fuerza numérica de explosión |
yield | number | Rendimiento de la explosión (Fireball) |
persistent | boolean | Establece la persistencia de Bukkit si se indica; no anula la duración, las colisiones ni la retirada por el propietario |
effect | string | Nombre de EntityEffect a reproducir al aparecer |
incendiary | boolean | Si la explosión es incendiaria |
gravity | boolean | Si el proyectil tiene gravedad |
glowing | boolean | Efecto de brillo |
invulnerable | boolean | Si el proyectil es invulnerable |
track | boolean | Por defecto true: registra el proyectil en EliteMobs; no le hace perseguir al objetivo. |
spawn_at_origin | boolean | Por defecto false: los proyectiles normales salen del jefe. Usa true para generarlos en el origen indicado. |
direction_only | boolean | Para bolas de fuego generadas en un origen explícito, establece la dirección sin asignar una velocidad adicional |
on_land | function | Callback (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ámetro | Tipo | Notas |
|---|---|---|
filename | string | Nombre del archivo de configuración del jefe |
zoneOrLocation | location table or zone | Ubicación o definición de zona de aparición opcional. Por defecto, la ubicación del jefe. |
duration | number | Tiempo 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ámetro | Tipo | Notas |
|---|---|---|
range | number | Radio en bloques |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}
boss:get_damager_count()
Devuelve el 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ámetro | Tipo | Notas |
|---|---|---|
zone | zone table | Una 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
zone | zone table | Forma de zona nativa con kind; consulta Zonas y selección de objetivos | |
particle | string | Nombre del tipo de partícula | |
amount | number | 1 | Partículas por ubicación muestreada |
x, y, z | number | 0 | Dispersión, o dirección cuando amount es 0 |
speed | number | 0 | Velocidad de las partículas |
coverage | number | 1.0 | Probabilidad 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
zone | zone table | Zona objetivo | |
particle | string | Nombre del tipo de partícula | |
speed | number | 0.1 | Velocidad 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
zone | zone table | Zona de origen | |
particle | string | Nombre del tipo de partícula | |
speed | number | Indica 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ámetro | Tipo | Notas |
|---|---|---|
particles | array of tables | Cada 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ámetro | Tipo | Notas |
|---|---|---|
phase | string | Nombre 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
speed | number | 0.5 | Velocidad 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ámetro | Tipo | Notas |
|---|---|---|
cause | string | Nombre 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ámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
openingDirection | number | 1 | 1 = 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ámetro | Tipo | Notas |
|---|---|---|
player | player wrapper | El jugador atacante |
damage | number | Cantidad 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ámetro | Tipo | Notas |
|---|---|---|
target | entity wrapper | Entidad objetivo para el necronomicón |
chant | string | Texto 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étodo | Devuelve | Notas |
|---|---|---|
players:current_target() | player wrapper o nil | El jugador del evento o el objetivo del mob jefe si es un jugador |
players:nearby_players(radius) | array of player wrappers | Todos los jugadores dentro del radio del jefe |
players:all_players_in_world() | array of player wrappers | Todos los jugadores en el mundo del jefe |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}
context.entities
Ayudantes generales de consulta de entidades centrados en el jefe.
| Método | Devuelve | Notas |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | array of entity wrappers | Entidades cercanas alrededor del jefe |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | array of entity wrappers | Entidades 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 wrappers | Todas las entidades coincidentes en el mundo del jefe |
entities:get_direct_target_entity() | entity wrapper o nil | Objetivo directo para el evento actual |
entities:get_boss_spawn_location() | location table | La 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
}
