Saltar al contenido principal

Scripting Lua: Jefe y Entidades

webapp_banner.jpg

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


Envoltorios de entidad

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

Dos reglas para recordar:

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

Campos comunes de entidad

Cada envoltorio de entidad viva incluye estos campos.

CampoTipoNotas
entity.namestringNombre para mostrar
entity.uuidstringUUID como texto
entity.entity_typestringNombre del EntityType de Bukkit (p. ej. "ZOMBIE", "PLAYER")
entity.is_playerbooleantrue para jugadores
entity.is_elitebooleantrue si EliteMobs lo rastrea como una elite
entity.is_mountbooleantrue si este envoltorio representa una montura de jefe
entity.is_monsterbooleantrue para entidades de tipo monstruo
entity.is_validbooleanBandera de validez de la instantánea
entity.healthnumberSalud actual (instantánea)
entity.maximum_healthnumberSalud máxima (instantánea)
entity.current_locationlocation tablePosición en el momento en que se creó el envoltorio

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ámetroTipoNotas
textstringMensaje con códigos de color
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&6[Boss] &fPrepare yourself!")
end
}

entity:show_action_bar(message)

Envía un mensaje de barra de acción a la entidad.

ParámetroTipoNotas
messagestringTexto de la barra de acción con códigos de color
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:show_action_bar("&c&lDANGER ZONE")
end
}

entity:show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])

Envía un título y un subtítulo opcional a la entidad.

ParámetroTipoPredeterminadoNotas
titlestringTexto del título
subtitlestring""Texto del subtítulo
fadeInnumber10Ticks de aparición gradual
staynumber40Ticks de permanencia
fadeOutnumber10Ticks de desvanecimiento
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_title("&4PHASE 2", "&7The boss is enraged!", 10, 40, 10)
end
end
}

entity:show_boss_bar(title[, color][, style][, duration])

Muestra una barra de jefe temporal a la entidad.

ParámetroTipoPredeterminadoNotas
titlestringTexto del título de la barra
colorstring"WHITE"Valor de BarColor
stylestring"SOLID"Valor de BarStyle
durationnumber40Duración en ticks
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_boss_bar("&cIncoming Attack!", "RED", "SOLID", 100)
end
end
}

entity:teleport_to_location(location)

Teletransporta la entidad a una ubicación.

ParámetroTipoNotas
locationlocation tableDestino
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}

entity:set_velocity_vector(vector)

Establece la velocidad de la entidad de inmediato.

ParámetroTipoNotas
vectorvector table{ x, y, z } o { x = 0, y = 1, z = 0 }
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("launch", 100) then return end
context.player:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
context.player:send_message("&cYou are launched into the air!")
end
}

entity:apply_push_vector(vector[, additive][, delay])

Aplica un empuje de velocidad tras un breve retraso (predeterminado 1 tick). Útil para anular el retroceso (knockback).

ParámetroTipoPredeterminadoNotas
vectorvector tableDirección y fuerza
additivebooleanfalseAñadir a la velocidad existente en lugar de reemplazarla
delaynumber1Retraso en ticks antes de aplicar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("push_up", 100) then return end
context.player:apply_push_vector({ x = 0, y = 2.0, z = 0 })
context.player:send_message("&cUpward blast!")
end
}

entity:face_direction_or_location(directionOrLocation)

Hace que la entidad mire hacia un vector de dirección o una ubicación.

ParámetroTipoNotas
directionOrLocationvector or location tableObjetivo a mirar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}

entity:set_fire_ticks(ticks)

Prende fuego a la entidad durante la duración indicada.

ParámetroTipoNotas
ticksnumberDuración del fuego en ticks (20 ticks = 1 segundo)
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}

entity:add_visual_freeze_ticks([ticks])

Añade ticks de congelación visual a la entidad (el efecto de superposición azul).

ParámetroTipoPredeterminadoNotas
ticksnumber1Cantidad de ticks de congelación
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("freeze", 200) then return end
context.player:add_visual_freeze_ticks(100)
context.player:send_message("&bYou feel a chilling frost!")
end
}

entity:apply_potion_effect(effect, duration[, amplifier])

Aplica un efecto de poción a la entidad.

ParámetroTipoPredeterminadoNotas
effectstringNombre de PotionEffectType
durationnumberDuración en ticks
amplifiernumber0Nivel del efecto (0 = nivel I)
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("slow", 200) then return end
context.player:apply_potion_effect("SLOWNESS", 60, 1)
context.player:send_message("&7You feel sluggish...")
end
}

precaución

remove_potion_effect(effect) no está disponible en los poderes Lua de EliteMobs. Solo existe en Magmacore/FMM. Usa apply_potion_effect con una duración de 0 como solución alternativa, o diseña tu poder sin necesidad de eliminar efectos.


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

Inflige daño a la entidad. Hay tres variantes disponibles.

MétodoNotas
deal_damage(amount)Fuente de daño genérica
deal_custom_damage(amount)Usa BossCustomAttackDamage del jefe
deal_damage_from_boss(amount)La entidad jefe se establece como 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ámetroTipoNotas
amountnumberCantidad a curar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}

entity:set_invulnerable(enabled[, duration])

Alterna la invulnerabilidad de la entidad. Opcionalmente, revierte tras una duración.

ParámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la invulnerabilidad
durationnumbernilAuto-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ámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la IA
durationnumbernilAuto-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étodoParámetroNotas
add_tag(tag[, duration])string, number opcionalAñade la etiqueta; opcionalmente la elimina automáticamente tras los ticks
remove_tag(tag)stringElimina la etiqueta
has_tag(tag)stringDevuelve true si la etiqueta está presente
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}

entity:run_command(command)

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ámetroTipoNotas
commandstringTexto del comando sin la / inicial
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("curse_cmd", 200) then return end
context.player:run_command("say I have been cursed!")
end
}

entity:set_scale(scale[, duration])

Establece el atributo generic_scale de la entidad. Opcionalmente, revierte a 1.0 tras una duración.

ParámetroTipoPredeterminadoNotas
scalenumberMultiplicador de escala
durationnumbernilAuto-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ámetroTipoNotas
enabledbooleantrue para gravedad normal
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- Disable player gravity briefly and re-enable after 3 seconds
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ámetroTipoPredeterminadoNotas
soundstringClave de sonido de Minecraft (por ejemplo, "entity.ender_dragon.growl")
volumenumber1.0Volumen
pitchnumber1.0Tono
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:play_sound_at_entity("entity.ender_dragon.growl", 1.0, 0.5)
end
}

entity:play_sound_at_self(sound[, volume][, pitch])

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


entity:spawn_particle_at_self(particleOrSpec[, count])

Genera partículas en la ubicación de la entidad.

ParámetroTipoPredeterminadoNotas
particleOrSpecstring or tableNombre de la partícula o tabla de especificación
countnumber1Número de partículas
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:spawn_particle_at_self("HEART", 5)
end
}

entity:spawn_particles_at_location(location, particle[, count])

Genera partículas en una ubicación específica.

ParámetroTipoPredeterminadoNotas
locationlocation tableUbicación objetivo
particlestringNombre del tipo de partícula
countnumber1Número de partículas
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.player:spawn_particles_at_location(loc, "FLAME", 10)
end
}

entity:play_model_animation(name)

Reproduce una animación de modelo personalizado si la entidad tiene un modelo personalizado que lo admite.

ParámetroTipoNotas
namestringNombre de la animación
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}

Métodos de vehículo y pasajero

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

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

Empuja a la entidad alejándola de una ubicación de origen o de un envoltorio de entidad.

ParámetroTipoPredeterminadoNotas
sourcelocation or wrapperOrigen del empuje
strengthnumber1.0Multiplicador de la fuerza del empuje
xOffsetnumber0Desplazamiento X adicional
yOffsetnumber0Desplazamiento Y adicional
zOffsetnumber0Desplazamiento Z adicional
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("knockback", 60) then return end
context.player:push_relative_to(context.boss:get_location(), 2.0, 0, 0.5, 0)
context.player:send_message("&cThe boss knocks you back!")
end
}

entity:set_custom_name(name) / entity:reset_custom_name()

Establece 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ámetroTipoPredeterminadoNotas
materialstringNombre del material del bloque
durationnumber0Ticks antes de la eliminación
requireAirbooleanfalseColocar solo si el bloque es actualmente aire
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ice_trap", 200) then return end
context.player:place_temporary_block("ICE", 60, true)
context.player:send_message("&bIce forms at your feet!")
end
}

entity:get_height()

Devuelve la altura de la entidad en bloques.


entity:is_on_ground()

Devuelve 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ámetroTipoPredeterminadoNotas
awarebooleantrue para activar la consciencia
durationnumbernilAuto-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ámetroTipoPredeterminadoNotas
centerlocation tableCentro de la caja de prueba
halfXnumber0.5Media anchura en el eje X
halfYnumberigual que halfXMedia altura en el eje Y
halfZnumberigual que halfXMedia anchura en el eje Z

entity:remove_elite()

Elimina la entidad elite del rastreo de EliteMobs. Si la entidad es una elite, esto la hace desaparecer correctamente a través de EliteMobs.


entity:set_custom_name_visible(visible)

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

ParámetroTipoNotas
visiblebooleantrue para siempre visible

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

Establece el equipo de la entidad.

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

Tabla de opciones:

ClaveTipoPredeterminadoNotas
enchantmentsarray of tablesnilCada entrada: { type = "SHARPNESS", level = 2 }
unbreakablebooleanfalseSi el objeto es irrompible
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Give the boss a glowing diamond sword
context.boss:set_equipment("HAND", "DIAMOND_SWORD", {
unbreakable = true,
enchantments = {
{ type = "SHARPNESS", level = 5 }
}
})
end
}

entity: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étodoNotas
is_valid()Comprobación de validez en vivo
get_location()Ubicación actual en vivo
get_velocity()Vector de velocidad actual
is_on_ground()Si está en el suelo
teleport_to_location(location)Teletransporta la entidad
set_velocity_vector(vector)Establece la velocidad
set_direction_vector(vector)Establece la dirección (solo Fireball)
set_yield(value)Establece el 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.

precaución

context.player es nil en los hooks que no tienen un jugador asociado, como on_spawn, los callbacks programados y los hooks de temporizador. Comprueba siempre que no sea nil antes de usarlo.

Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}

Campos exclusivos de jugador

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

Métodos exclusivos de jugador

MétodoNotas
send_message(message)Mensaje de chat con formato de color de EliteMobs
show_action_bar(message)Texto de la barra de acción
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])Superposición de pantalla de título
show_boss_bar(title[, color][, style][, duration])Barra de jefe temporal
run_command(command)Ejecuta un comando como el jugador (sin / inicial)
Ejemplo
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then return end
local hp_pct = context.player:get_health() / context.player:get_maximum_health()
if hp_pct < 0.3 then
context.player:show_title("&4LOW HEALTH", "&7Find cover!", 5, 30, 10)
context.player:show_boss_bar("&cBoss Enrage Incoming", "RED", "SEGMENTED_6", 80)
end
end
}

context.boss

El envoltorio del jefe para la elite mob que posee este poder Lua. Siempre disponible en cada hook.

consejo

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

CampoTipoNotas
boss.namestringNombre para mostrar
boss.uuidstringUUID de la elite jefe
boss.entity_typestringNombre del EntityType de Bukkit
boss.is_monsterbooleantrue si la entidad subyacente es un Monster
boss.levelnumberNivel de la elite
boss.healthnumberSalud actual (instantánea)
boss.maximum_healthnumberSalud máxima (instantánea)
boss.damager_countnumberNúmero de atacantes (instantánea)
boss.is_in_combatbooleanEstado de combate
boss.existsbooleanSi la elite aún existe
boss.current_locationlocation tablePosición en el momento de la creación del envoltorio (instantánea)
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}

Métodos del jefe


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ámetroTipoPredeterminadoNotas
enabledbooleantrue para activar la IA
durationnumbernilAuto-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ámetroTipoNotas
locationlocation tableDestino
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}

boss:set_velocity_vector(vector)

Establece la velocidad del jefe de inmediato.

ParámetroTipoNotas
vectorvector table{ x, y, z } o { x = 0, y = 1, z = 0 }
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss leaps into the air at combat start
context.boss:set_velocity_vector({ x = 0, y = 2.0, z = 0 })
context.boss:send_message("&cThe boss leaps!")
end
}

boss:restore_health(amount)

Cura al jefe hasta su salud máxima.

ParámetroTipoNotas
amountnumberCantidad a curar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}

boss:play_sound_at_self(sound[, volume][, pitch])

Reproduce un sonido en la ubicación del jefe.

ParámetroTipoPredeterminadoNotas
soundstringClave de sonido de Minecraft (por ejemplo, "entity.wither.spawn")
volumenumber1.0Volumen
pitchnumber1.0Tono
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
context.boss:play_sound_at_self("entity.wither.spawn", 1.0, 0.8)
end
}

boss:spawn_particle_at_self(particleOrSpec[, count])

Genera partículas en la ubicación del jefe.

ParámetroTipoPredeterminadoNotas
particleOrSpecstring or tableNombre de la partícula o tabla de especificación
countnumber1Número de partículas
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:spawn_particle_at_self("SMOKE", 20)
context.boss:send_message("&8Smoke billows from the boss!")
end
}

boss:play_model_animation(name)

Reproduce una animación de modelo personalizado en el jefe si está disponible.

ParámetroTipoNotas
namestringNombre de la animación
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}

boss:has_mount() / boss:get_mount()

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

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

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

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

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

boss:face_direction_or_location(vectorOrLocation)

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

ParámetroTipoNotas
vectorOrLocationvector or location tableDirección a mirar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}

boss:navigate_to_location(location[, speed][, follow][, timeout])

Usa la búsqueda de rutas (pathfinding) para caminar al jefe hasta una ubicación.

ParámetroTipoPredeterminadoNotas
locationlocation tableDestino
speednumber1.0Multiplicador de velocidad de movimiento
followbooleanfalseSeguir continuamente al objetivo
timeoutnumbernilCancela 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ámetroTipoPredeterminadoNotas
messagestringTexto del mensaje con códigos de color
rangenumber20Radio en bloques
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:send_message("&4You dare challenge me?!")
end
}

boss:summon_projectile(entityType, origin, destination[, speed][, options])

Lanza una entidad similar a un proyectil desde el jefe.

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

Tabla de opciones:

ClaveTipoNotas
durationnumberAuto-elimina tras los ticks
max_ticksnumberTicks máximos para monitorizar el aterrizaje
custom_damagenumberDaño al impactar
detonation_powerstringPotencia de la explosión al impactar
yieldnumberRendimiento de la explosión (Fireball)
persistentbooleanSi el proyectil persiste (predeterminado true)
effectstringNombre de EntityEffect a reproducir al aparecer
incendiarybooleanSi la explosión es incendiaria
gravitybooleanSi el proyectil tiene gravedad
glowingbooleanEfecto de brillo
invulnerablebooleanSi el proyectil es invulnerable
trackbooleanSi debe rastrear al objetivo
spawn_at_originbooleanAparecer en el origen en lugar de con desplazamiento
direction_onlybooleanUsar solo la dirección, ignorar el objetivo
on_landfunctionCallback (landing_location, spawned_entity)
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}

boss:summon_reinforcement(filename[, zoneOrLocation][, level])

Invoca un jefe de refuerzo desde un archivo de configuración.

ParámetroTipoNotas
filenamestringNombre del archivo de configuración del jefe
zoneOrLocationlocation table or zoneUbicación o definición de zona de aparición opcional. Por defecto, la ubicación del jefe.
levelnumberNivel 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ámetroTipoNotas
rangenumberRadio en bloques
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}

boss:get_damager_count()

Devuelve el número en vivo de jugadores que han dañado a este jefe. A diferencia del campo damager_count, esto realiza una comprobación en vivo.


boss:get_target_player()

Devuelve el objetivo 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ámetroTipoNotas
zonezone tableUna definición de forma de zona

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

Rellena el interior de una zona con partículas.

ParámetroTipoNotas
zonezone tableForma de zona a rellenar
particlestringNombre del tipo de partícula
...Parámetros de partícula adicionales
coveragenumber (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ámetroTipoNotas
zonezone tableForma de zona a delinear
particlestringNombre del tipo de partícula
...Parámetros de partícula adicionales
coveragenumber (opcional)Factor de cobertura de densidad de partículas

boss:get_particles_from_self_toward_zone(zone, particle, speed?)

Genera partículas direccionales que viajan desde el jefe hacia una zona.

ParámetroTipoPredeterminadoNotas
zonezone tableZona objetivo
particlestringNombre del tipo de partícula
speednumbernilVelocidad de viaje de la partícula

boss:get_particles_toward_self(zone, particle, speed?)

Genera partículas direccionales que viajan desde una zona hacia el jefe.

ParámetroTipoPredeterminadoNotas
zonezone tableZona de origen
particlestringNombre del tipo de partícula
speednumbernilVelocidad de viaje de la partícula

boss:spawn_particles_with_vector(particles)

Genera un array de partículas direccionales, cada una con su propia posición y vector de velocidad.

ParámetroTipoNotas
particlesarray of tablesCada entrada define una partícula con posición y dirección

Métodos del Dragón del End

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


boss:get_ender_dragon_phase()

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


boss:set_ender_dragon_phase(phase)

Establece la fase del Dragón del End.

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

Métodos de soporte de poderes especiales

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


boss:start_tracking_fireball_system(speed?)

Inicia 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ámetroTipoPredeterminadoNotas
speednumber0.5Velocidad 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ámetroTipoNotas
causestringNombre de DamageCause de Bukkit (p. ej. "ENTITY_ATTACK", "PROJECTILE")

boss:shield_wall_is_active()

Devuelve true si el jefe tiene actualmente un muro de escudos activo.


boss:initialize_shield_wall(charges?)

Activa un muro de escudos en el jefe que puede absorber el daño entrante.

ParámetroTipoPredeterminadoNotas
chargesnumber1Nú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ámetroTipoNotas
playerplayer wrapperEl jugador atacante
damagenumberCantidad 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ámetroTipoNotas
targetentity wrapperEntidad objetivo para el necronomicón
filestringNombre 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étodoDevuelveNotas
players:current_target()player wrapper o nilEl jugador del evento o el objetivo del mob jefe si es un jugador
players:nearby_players(radius)array of player wrappersTodos los jugadores dentro del radio del jefe
players:all_players_in_world()array of player wrappersTodos los jugadores en el mundo del jefe
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}

context.entities

Ayudantes generales de consulta de entidades centrados en el jefe.

MétodoDevuelveNotas
entities:get_nearby_entities(radius[, filter])array of entity wrappersEntidades cercanas alrededor del jefe
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter])array of entity wrappersEntidades dentro de una caja alineada con los ejes
entities:get_all_entities([filter])array of entity wrappersTodas las entidades coincidentes en el mundo del jefe
entities:get_direct_target_entity()entity wrapper o nilObjetivo directo para el evento actual
entities:get_boss_spawn_location()location tableLa ubicación de aparición original del jefe

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

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Damage all nearby elites
local elites = context.entities:get_nearby_entities(10, "elites")
for _, elite in ipairs(elites) do
elite:deal_damage(5)
end
end
}
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Find players in a box area
local center = context.boss:get_location()
local players = context.entities:get_entities_in_box(center, 10, 5, 10, "players")
for _, p in ipairs(players) do
p:send_message("&eYou are in the danger zone!")
end
end
}

Próximos pasos