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).
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.is_valid | boolean | Bandera de validez de la instantánea |
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 |
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
Cada envoltorio de entidad viva admite estos métodos. Cada método realiza una llamada en vivo al servidor.
entity:is_alive()
Devuelve true si la entidad sigue siendo válida y no está muerta.
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:is_alive() then
context.player:send_message("&aYou're still standing!")
end
end
}
entity:get_location()
Devuelve la ubicación actual en vivo como una tabla 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 la entidad. 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 de barra de acción a la entidad.
| 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 la entidad.
| 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])
Muestra una barra de jefe temporal a la entidad.
| 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)
Teletransporta la entidad a una ubicación.
| 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 un empuje de velocidad tras un breve retraso (predeterminado 1 tick). Útil para anular el retroceso (knockback).
| 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)
Hace que la entidad mire hacia un vector de dirección o una ubicación.
| 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)
Prende fuego a la entidad durante la duración indicada.
| Parámetro | Tipo | Notas |
|---|---|---|
ticks | number | Duración del fuego en ticks (20 ticks = 1 segundo) |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}
entity:add_visual_freeze_ticks([ticks])
Añade ticks de congelación visual a la entidad (el efecto de superposición azul).
| Parámetro | Tipo | 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 a la entidad.
| 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 poderes Lua de EliteMobs. Solo existe en Magmacore/FMM. Usa apply_potion_effect con una duración de 0 como solución alternativa, o diseña tu poder sin necesidad de eliminar efectos.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Inflige daño a la entidad. Hay tres variantes disponibles.
| Método | Notas |
|---|---|
deal_damage(amount) | Fuente de daño genérica |
deal_custom_damage(amount) | Usa BossCustomAttackDamage del jefe |
deal_damage_from_boss(amount) | La entidad jefe se establece como la fuente del daño |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(10)
for _, p in ipairs(nearby) do
p:deal_custom_damage(10)
p:send_message("&cThe boss unleashes a shockwave!")
end
end
}
entity:restore_health(amount)
Cura a la entidad hasta su salud máxima.
| Parámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}
entity:set_invulnerable(enabled[, duration])
Alterna la invulnerabilidad de la entidad. Opcionalmente, revierte tras una duración.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la invulnerabilidad | |
duration | number | nil | Auto-revierte tras esta cantidad de ticks |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("shield", 200) then return end
context.player:set_invulnerable(true, 40)
context.player:send_message("&6A brief shield protects you!")
end
}
entity:set_ai_enabled(enabled[, duration])
Alterna la IA de la entidad. Opcionalmente, revierte tras una duración.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la IA | |
duration | number | nil | Auto-revierte tras esta cantidad de ticks |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Disable boss AI for 3 seconds at combat start
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned!")
end
}
entity:add_tag(tag[, duration]) / entity:remove_tag(tag) / entity:has_tag(tag)
Gestiona las etiquetas de la entidad. Las etiquetas son rastreadas por EliteMobs y persisten durante toda la vida de la entidad.
| 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)
Hace que la entidad ejecute un comando. Para los jugadores, esto se ejecuta como el jugador; usa el texto del comando sin la / inicial.
| 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 atributo generic_scale de la entidad. Opcionalmente, revierte a 1.0 tras una duración.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
scale | number | Multiplicador de escala | |
duration | number | nil | Auto-revierte tras esta cantidad de ticks |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss grows to double size for 5 seconds
context.boss:set_scale(2.0, 100)
context.boss:send_message("&4The boss grows in size!")
end
}
entity:set_gravity(enabled)
Alterna la gravedad de la entidad.
| Parámetro | Tipo | Notas |
|---|---|---|
enabled | boolean | true para gravedad normal |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- Disable player gravity briefly and re-enable after 3 seconds
local player = context.player
player:set_gravity(false)
player:send_message("&dYou begin to float!")
context.scheduler:run_after(60, function()
if player:is_alive() then
player:set_gravity(true)
end
end)
end
}
entity:play_sound_at_entity(sound[, volume][, pitch])
Reproduce un sonido en la ubicación de la entidad.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
sound | string | Clave de sonido de Minecraft (por ejemplo, "entity.ender_dragon.growl") | |
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 de la entidad.
| 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)
Reproduce una animación de modelo personalizado si la entidad tiene un modelo personalizado que lo admite.
| 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 entidad viva también exponen ayudantes de vehículo/pasajero de Bukkit. Estos son útiles para monturas con script, efectos de montura temporales y para comprobar si una entidad ya está unida a otra entidad.
| 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])
Empuja a la entidad alejándola de una ubicación de origen o de un envoltorio de entidad.
| 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 o restablece el nombre personalizado para mostrar de la entidad. Admite códigos de color.
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("mark", 200) then return end
local player = context.player
player:set_custom_name("&c&lMarked Target")
player:send_message("&cYou have been marked!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function()
if player:is_alive() then
player:reset_custom_name()
end
end)
end
}
entity:place_temporary_block(material[, duration][, requireAir])
Coloca un bloque temporal en la ubicación actual de la entidad.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
material | string | Nombre del material del bloque | |
duration | number | 0 | Ticks antes de la eliminación |
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 true si la entidad está actualmente parada sobre suelo sólido.
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])
Alterna la consciencia (awareness) del mob. Solo afecta a las entidades de tipo mob. Opcionalmente, revierte tras una duración.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
aware | boolean | true para activar la consciencia | |
duration | number | nil | Auto-revierte tras esta cantidad de ticks |
entity:is_healing() / entity:set_healing(enabled)
Comprueba o alterna el estado de curación de una entidad elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Devuelve true si la caja delimitadora de la entidad se solapa con una caja alineada con los ejes en la ubicación dada.
| 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: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])
Establece el equipo de la entidad.
| 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:is_ai_enabled()
Un método que devuelve true si la entidad tiene actualmente la IA activada.
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: name, uuid, entity_type, is_player, is_elite, current_location
Métodos:
| Método | Notas |
|---|---|
is_valid() | Comprobación de validez en vivo |
get_location() | Ubicación actual en vivo |
get_velocity() | Vector de velocidad actual |
is_on_ground() | Si está en el suelo |
teleport_to_location(location) | Teletransporta la entidad |
set_velocity_vector(vector) | Establece la velocidad |
set_direction_vector(vector) | Establece la dirección (solo Fireball) |
set_yield(value) | Establece el rendimiento de la explosión (solo Fireball) |
set_gravity(enabled) | Alterna la gravedad |
detonate() | Detona entidades de fuegos artificiales |
remove() | Elimina la entidad del mundo |
unregister([reason]) | Da de baja del rastreador de entidades |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
local fb = context.boss:summon_projectile("FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5
)
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}
context.player
Disponible en los hooks donde un jugador está directamente involucrado (on_boss_damaged_by_player, on_player_damaged_by_boss, etc.). Los envoltorios de jugador incluyen todos los campos y métodos comunes de entidad listados anteriormente, además de los extras a continuació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
| Campo | Tipo | Notas |
|---|---|---|
game_mode | string | Nombre del modo de juego actual (p. ej. "SURVIVAL") |
Métodos exclusivos de jugador
| Método | Notas |
|---|---|
send_message(message) | Mensaje de chat con formato de color de EliteMobs |
show_action_bar(message) | Texto de 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.
El envoltorio del jefe hereda todos los métodos comunes de entidad listados anteriormente (p. ej. push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location, etc.). Los métodos documentados en esta sección son o bien específicos del jefe o tienen un comportamiento diferente a través de la capa EliteEntity.
Campos del jefe
| Campo | Tipo | Notas |
|---|---|---|
boss.name | string | Nombre 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 | Estado de combate |
boss.exists | boolean | Si la elite aún existe |
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
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])
Alterna la IA del jefe. Opcionalmente, revierte tras una duración.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
enabled | boolean | true para activar la IA | |
duration | number | nil | Auto-revierte tras esta cantidad de ticks |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("stun", 200) then return end
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned for 3 seconds!")
end
}
boss:teleport_to_location(location)
Teletransporta al jefe a una ubicación.
| 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)
Cura al jefe hasta su salud máxima.
| Parámetro | Tipo | Notas |
|---|---|---|
amount | number | Cantidad a curar |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}
boss:play_sound_at_self(sound[, volume][, pitch])
Reproduce un sonido en la ubicación del jefe.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
sound | string | Clave de sonido de Minecraft (por ejemplo, "entity.wither.spawn") | |
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][, follow][, timeout])
Usa la búsqueda de rutas (pathfinding) para caminar al jefe hasta una ubicación.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
location | location table | Destino | |
speed | number | 1.0 | Multiplicador de velocidad de movimiento |
follow | boolean | false | Seguir continuamente al objetivo |
timeout | number | nil | Cancela la navegación tras esta cantidad de ticks |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("charge", 200) then return end
context.boss:navigate_to_location(context.player:get_location(), 1.5)
context.boss:send_message("&cThe boss charges at you!")
end
}
boss:add_tag(tag[, duration]) / boss:remove_tag(tag) / boss:has_tag(tag)
Gestiona 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 a todos los jugadores cercanos.
| 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])
Lanza una entidad similar a un proyectil desde el jefe.
| 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 | Auto-elimina tras los ticks |
max_ticks | number | Ticks máximos para monitorizar el aterrizaje |
custom_damage | number | Daño al impactar |
detonation_power | string | Potencia de la explosión al impactar |
yield | number | Rendimiento de la explosión (Fireball) |
persistent | boolean | Si el proyectil persiste (predeterminado true) |
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 | Si debe rastrear al objetivo |
spawn_at_origin | boolean | Aparecer en el origen en lugar de con desplazamiento |
direction_only | boolean | Usar solo la dirección, ignorar el objetivo |
on_land | function | Callback (landing_location, spawned_entity) |
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}
boss:summon_reinforcement(filename[, zoneOrLocation][, level])
Invoca un jefe de refuerzo desde un archivo de configuración.
| Parámetro | Tipo | Notas |
|---|---|---|
filename | string | Nombre del archivo de configuración del jefe |
zoneOrLocation | location table or zone | Ubicación o definición de zona de aparición opcional. Por defecto, la ubicación del jefe. |
level | number | Nivel de refuerzo opcional. Por defecto 0, lo que permite que el ayudante de invocación herede/resuelva el nivel normalmente. |
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()
Elimina al jefe del mundo.
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.1 then
context.boss:send_message("&7The boss vanishes into thin air!")
context.boss:despawn()
end
end
}
boss:get_nearby_players(range)
Devuelve un array de envoltorios de jugador dentro del rango del jefe.
| Parámetro | Tipo | Notas |
|---|---|---|
range | number | Radio en bloques |
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}
boss:get_damager_count()
Devuelve el número en vivo de jugadores que han dañado a este jefe. A diferencia del campo damager_count, esto realiza una comprobación en vivo.
boss:get_target_player()
Devuelve el objetivo 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 un array de envoltorios de jugador para todos los jugadores que estén actualmente dentro de la zona dada.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | zone table | Una definición de forma de zona |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Rellena el interior de una zona con partículas.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | zone table | Forma de zona a rellenar |
particle | string | Nombre del tipo de partícula |
... | Parámetros de partícula adicionales | |
coverage | number (opcional) | Factor de cobertura de densidad de partículas |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Delinea el borde de una zona con partículas.
| Parámetro | Tipo | Notas |
|---|---|---|
zone | zone table | Forma de zona a delinear |
particle | string | Nombre del tipo de partícula |
... | Parámetros de partícula adicionales | |
coverage | number (opcional) | Factor de cobertura de densidad de partículas |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Genera partículas direccionales que viajan desde el jefe hacia una zona.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
zone | zone table | Zona objetivo | |
particle | string | Nombre del tipo de partícula | |
speed | number | nil | Velocidad de viaje de la partícula |
boss:get_particles_toward_self(zone, particle, speed?)
Genera partículas direccionales que viajan desde una zona hacia el jefe.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
zone | zone table | Zona de origen | |
particle | string | Nombre del tipo de partícula | |
speed | number | nil | Velocidad de viaje de la partícula |
boss:spawn_particles_with_vector(particles)
Genera un array de partículas direccionales, cada una con su propia posición y vector de velocidad.
| Parámetro | Tipo | Notas |
|---|---|---|
particles | array 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 el sistema de IA de bolas de fuego rastreadoras en el jefe. El jefe lanzará periódicamente bolas de fuego que rastrean a su objetivo.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
speed | number | 0.5 | Velocidad de la bola de fuego |
boss:handle_spirit_walk_damage(cause)
Maneja el comportamiento de paseo espiritual (spirit walk) para la causa de daño dada. El paseo espiritual hace que el jefe sea inmune a ciertos tipos de daño y se teletransporte detrás del atacante.
| Parámetro | Tipo | Notas |
|---|---|---|
cause | string | Nombre de DamageCause de Bukkit (p. ej. "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Devuelve true si el jefe tiene actualmente un muro de escudos activo.
boss:initialize_shield_wall(charges?)
Activa un muro de escudos en el jefe que puede absorber el daño entrante.
| Parámetro | Tipo | Predeterminado | Notas |
|---|---|---|---|
charges | number | 1 | Número de golpes que el escudo puede absorber |
boss:shield_wall_absorb_damage(player, damage)
Intenta absorber daño con el muro de escudos. Devuelve true si el daño fue absorbido, false si el escudo está inactivo o agotado.
| Parámetro | Tipo | Notas |
|---|---|---|
player | player wrapper | El jugador atacante |
damage | number | Cantidad de daño a absorber |
boss:deactivate_shield_wall()
Desactiva el muro de escudos del jefe, eliminando cualquier carga restante.
boss:start_zombie_necronomicon(target, file)
Inicia el poder del necronomicón zombi (zombie necronomicon) sobre un objetivo, generando refuerzos no muertos desde un archivo de configuración.
| Parámetro | Tipo | Notas |
|---|---|---|
target | entity wrapper | Entidad objetivo para el necronomicón |
file | string | Nombre del archivo de configuración del jefe para los no muertos invocados |
context.players
Ayudantes de consulta de jugadores centrados en el jefe. Úsalos para encontrar jugadores sin necesitar un jugador específico del evento.
| 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 dentro de una caja alineada con los ejes |
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
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
}
