Saltar al contenido principal

Scripting Lua: Mundo y entorno

webapp_banner.jpg

Esta página explica los métodos disponibles en context.world, context.vectors, context.settings y context.event. Permiten que tus poderes Lua interactúen con el mundo de Minecraft: generar entidades, reproducir efectos, consultar bloques y más. Si estás empezando a crear poderes Lua, lee primero Primeros pasos.

Contexto de jefe de EliteMobs

Los poderes de jefe de EliteMobs reutilizan el entorno aislado Lua de MagmaCore. La tabla context.world del jefe parte de la tabla de mundo compartida de MagmaCore, por lo que las funciones genéricas de coordenadas, como get_block_at(...), set_block_at(...) y spawn_particle(...), siguen disponibles. Esta página se centra en las adiciones y sustituciones de EliteMobs para context.world, context.vectors, context.settings y context.event en poderes de jefe. Para la API genérica del mundo, consulta Motor de scripting Lua de MagmaCore.

Cuando existe un método con el mismo nombre en ambas tablas, prevalece la versión de EliteMobs. Los métodos de abajo conservan su comportamiento: omisión de protecciones al generar rayos, especificaciones ampliadas de partículas y seguimiento de bloques temporales. Los demás métodos compartidos siguen disponibles, incluidos get_entity(uuid), block_is_passable(x, y, z), location_is_protected(location), spawn_dust(...) y raycast(...). Consulta sus argumentos y comportamiento con chunks descargados en la referencia de la API compartida; esas garantías no se aplican automáticamente a una sustitución de EliteMobs.

Las funciones de botín de FreeMinecraftModels no están disponibles aquí

FreeMinecraftModels añade drop_elitemobs_procedural_loot, drop_elitemobs_random_loot, drop_elitemobs_custom_loot y start_elitemobs_transport a context.world solo en sus propios scripts de props. Cada plugin lleva una copia independiente de la biblioteca de scripting compartida, por lo que estas funciones no aparecen en los poderes de jefe ni en los scripts de NPC de EliteMobs, aunque FreeMinecraftModels esté instalado. Los poderes de jefe usan generate_player_loot y drop_bonus_coins en su lugar.


context.world​

La tabla de mundo permite generar entidades, reproducir efectos, modificar bloques y cambiar el mundo. Estos métodos admiten dos puntos (world:method()) o un punto sin pasar explícitamente el argumento self.

Las sustituciones de jefe descritas abajo convierten tablas con x, y, z, yaw/pitch opcionales y el nombre de un mundo cargado en world. Las coordenadas ausentes valen 0; omitir el mundo usa el mundo actual del jefe, pero un nombre explícito desconocido impide la conversión. También aceptan una tabla anidada current_location. Una ubicación nil o que no sea una tabla usa la ubicación del jefe. Los métodos compartidos conservan su contrato de ubicación y el mundo capturado al crear la tabla.

Cerrar la instancia Lua no deshace automáticamente los cambios del mundo ni elimina las entidades generadas. Se detienen los monitores del script, pero los temporizadores independientes de eliminación, regeneración de explosiones, rayos potenciados y proyectiles de oro tienen sus propios ciclos de vida. Las sustituciones de bloques y generación no aplican automáticamente location_is_protected ni las comprobaciones compartidas de chunks cargados; comprueba las condiciones pertinentes antes de modificar el mundo.


world:spawn_particle_at_location(location, particleSpec)​

Genera partículas en una ubicación. El segundo argumento acepta un nombre o una tabla de especificación. Un tercer argumento entero opcional indica la cantidad cuando falta amount; su valor predeterminado es 1. Los nombres se convierten a mayúsculas antes de buscarlos. Un nombre no válido o datos de partícula no admitidos producen una advertencia y ninguna partícula.

ParámetroTipoNotas
locationtabla de ubicaciónDónde generar las partículas
particleSpeccadena o tablaNombre de partícula o tabla de especificación de partículas (véase abajo)
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Simple particle by name
context.world:spawn_particle_at_location(context.boss:get_location(), "FLAME")

-- Full particle spec table with red dust
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "DUST",
amount = 10,
x = 0.5,
y = 0.5,
z = 0.5,
speed = 0.02,
red = 255,
green = 0,
blue = 0,
})
end
}

Formato de la tabla de partículas​

ClaveTipoValor predeterminadoNotas
particlecadenaobligatorioNombre de partícula
amountentero1Número de partículas
x, y, znúmero0Dispersión/desplazamiento en cada eje
speednúmero0Velocidad de las partículas
red, green, blueentero255Color RGB para DUST y DUST_COLOR_TRANSITION
toRed, toGreen, toBlueentero255Color final de la transición para DUST_COLOR_TRANSITION
consejo

Para DUST_COLOR_TRANSITION, también puedes usar to_red, to_green, to_blue; las claves camelCase tienen prioridad. Ambos tipos de polvo usan un tamaño fijo de 1 y componentes RGB entre 0..255. Las demás partículas no reciben datos adicionales, por lo que esta función no admite todas las partículas que los requieren.

aviso

A diferencia de las configuraciones YAML de EliteScript, los nombres de partículas en Lua no admiten la conversión de nombres antiguos. Debes usar los nombres actuales de la API de Spigot (por ejemplo, FIREWORK en vez de FIREWORKS_SPARK, SMOKE en vez de SMOKE_NORMAL y DUST en vez de REDSTONE). Consulta la lista de partículas válidas para ver todos los nombres actuales y sus equivalentes antiguos.


world:play_sound_at_location(location, sound, volume, pitch)​

Reproduce un sonido en una ubicación.

ParámetroTipoValor predeterminadoNotas
locationtabla de ubicaciónDónde reproducir el sonido
soundcadenaClave de sonido de Minecraft (p. ej., "entity.blaze.shoot") o nombre del enum Sound de Spigot. También admite claves de paquetes de recursos.
volumenúmero1.0Volumen
pitchnúmero1.0Tono
Ejemplo
return {
api_version = 1,
on_spawn = function(context)
context.world:play_sound_at_location(
context.boss:get_location(),
"entity.wither.spawn",
1.0,
0.5
)
end
}

world:strike_lightning_at_location(location)​

Genera un rayo real que causa daño y activa la omisión de cancelaciones de aparición de rayos de EliteMobs. No es la función compartida de rayos solo visuales, ni garantiza que se ignoren todas las reglas de daño o protección de otros plugins.

ParámetroTipoNotas
locationtabla de ubicaciónDónde hacer caer el rayo
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("lightning", 100) then return end
context.world:strike_lightning_at_location(context.player:get_location())
context.player:send_message("&eA bolt of lightning strikes you!")
end
}

world:spawn_entity_at_location(entityType, location, options)​

Genera una entidad vanilla directamente en el mundo de la ubicación. Un nombre desconocido devuelve nil; un tipo reconocido que no pueda generarse aún puede causar un error. No asigna automáticamente un tirador al proyectil ni registra la entidad como refuerzo élite.

ParámetroTipoNotas
entityTypecadenaNombre del tipo de entidad (p. ej., "FIREBALL", "ARROW")
locationtabla de ubicaciónDónde generar la entidad
optionstabla (opcional)Opciones de generación (véase abajo)

Opciones de generación de entidades​

ClaveTipoValor predeterminadoNotas
velocitytabla vectorialnilVelocidad inicial {x, y, z}
effectcadenanilEntityEffect que se reproduce al aparecer
durationentero0Un valor positivo programa la eliminación tras estos ticks; un valor no positivo no añade temporizador
on_landfunciónnilfunction(land_location, entity_ref) al tocar suelo, dejar de ser válida o superar max_ticks; no es un evento de impacto ni prueba de aterrizaje
max_ticksentero6000Máximo de ticks de seguimiento antes de forzar la función on_land
persistentbooleanoel valor predeterminado de Minecraftfalse mantiene a la entidad fuera del guardado del chunk, de modo que un apagado o la descarga de un chunk a mitad del efecto no pueda dejarla en el mundo

Devuelve una tabla que representa a la entidad. Las entidades no vivas (FIREBALL, ARROW, TNT, ...) devuelven una tabla de referencia de entidad no viva, donde is_valid() es un método. Los tipos de entidad viva (ZOMBIE, GIANT, ...) devuelven una tabla completa de entidad viva, donde is_valid es un campo booleano. Llamar a entity:is_valid() en una de ellas produce el error attempt to call a boolean value.

El monitor comprueba la entidad cada tick mientras el script está activo y se detiene con sus tareas. El temporizador positivo de duration es independiente y puede eliminarla después de cerrar el script. Los nombres desconocidos de effect se ignoran.

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_spawn", 100) then return end
-- Spawn a fireball aimed at the player
local boss_loc = context.boss:get_location()
local dir = context.vectors.get_vector_between_locations(boss_loc, context.player:get_location())
dir = context.vectors.normalize_vector(dir)

context.world:spawn_entity_at_location("FIREBALL", boss_loc, {
velocity = { x = dir.x * 2, y = dir.y * 2, z = dir.z * 2 },
duration = 100,
})
end
}
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Spawn a primed TNT with a landing callback
context.world:spawn_entity_at_location("TNT", context.boss:get_location(), {
velocity = { x = 0, y = 1.5, z = 0 },
on_land = function(land_location, entity_ref)
context.world:spawn_particle_at_location(land_location, {
particle = "EXPLOSION_EMITTER",
amount = 1,
})
end,
})
end
}

world:spawn_display_at_location(location, options)​

Genera un display de objeto o de bloque: un elemento visual flotante sin hitbox, gravedad ni IA. Úsalo para piedras en órbita, atrezo lanzado y otros efectos que solo necesitan verse, en lugar de decorar un soporte de armadura. El display se centra en location y se orienta según su yaw.

OpciónTipoValor predeterminadoNotas
itemcadenaMaterial que se muestra como objeto. Un objeto de bloque como "AMETHYST_BLOCK" se muestra como un bloque centrado
blockcadenaBloque que se muestra como display de bloque, como material o como datos de bloque, por ejemplo "lantern[hanging=true]"
scalenúmero o tabla vectorial1Un número escala todos los ejes; {x, y, z} escala cada uno. Con 1, un bloque mide un bloque de ancho
durationentero0Los valores positivos eliminan el display tras esta cantidad de ticks
teleport_durationentero0Ticks que tarda el cliente en deslizarse hasta cada nueva ubicación, de 0 a 59. Usa 1 cuando teletransportes el display cada tick
billboardcadenaFIXEDFIXED, VERTICAL, HORIZONTAL o CENTER
glowingbooleanofalseResplandor con contorno
brightnessenteroluz del mundoDe 0 a 15, sustituye la luz en el display
bedrock_fallbackbooleanotrueConsulta más abajo

Indica exactamente uno de item o block. Si falta item o block, si alguno es desconocido, si se dan ambos a la vez o si scale no es positivo, se devuelve nil y se registra una advertencia que nombra el poder. Un valor desconocido de billboard mantiene FIXED.

Los displays nunca se guardan con el chunk. Se eliminan cuando se agota duration, cuando llamas a remove() o cuando el poder se apaga, lo que ocurra primero.

Los clientes Bedrock no pueden renderizar entidades display. Los jugadores de Bedrock que están en el mundo cuando aparece el display ven en su lugar un soporte de armadura invisible con el mismo objeto, o con el objeto del bloque en el caso de un display de bloque, y el display se les oculta. El soporte sigue al display y se elimina con él. Los jugadores de Bedrock que entran en el mundo después no reciben soporte, y un bloque sin forma de objeto, como fire, no recibe soporte en absoluto. Desactívalo con bedrock_fallback = false en efectos que los jugadores de Bedrock no necesiten ver.

El envoltorio devuelto tiene uuid y entity_type y estos métodos:

MétodoNotas
is_valid(), is_alive()Si el display sigue existiendo
get_location()Ubicación actual
teleport_to_location(location)Mueve el display y su soporte de Bedrock
remove()Elimina el display y su soporte de Bedrock
set_scale(scale)Los mismos valores que la opción scale
set_item(material)Solo displays de objeto; devuelve false en los demás
set_block(block)Solo displays de bloque; devuelve false en los demás
set_glowing(enabled)Resplandor con contorno
set_brightness(level)De 0 a 15, o nil para volver a usar la luz del mundo
set_teleport_duration(ticks)Igual que la opción teleport_duration
Ejemplo
-- Three amethyst stones circle the target for three seconds.
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil or not context.cooldowns:check_local("orbit", 200) then return end
local target = context.player
local stones = {}
for i = 1, 3 do
stones[i] = context.world:spawn_display_at_location(target:get_location(), {
item = "AMETHYST_BLOCK", scale = 0.3, duration = 60, teleport_duration = 1
})
end
local elapsed = 0
local task
task = context.scheduler:run_every(1, function(context)
elapsed = elapsed + 1
if elapsed >= 60 then
context.scheduler:cancel_task(task)
return
end
local center = target:get_location()
for i = 1, 3 do
local angle = elapsed * 0.2 + i * (2 * math.pi / 3)
if stones[i] ~= nil and stones[i]:is_valid() then
stones[i]:teleport_to_location(em.create_location(
center.x + math.cos(angle) * 1.5, center.y + 1.2, center.z + math.sin(angle) * 1.5, center.world, 0, 0))
end
end
end)
end
}

world:spawn_falling_block_at_location(location, material, options)​

Genera un bloque en caída usando un material de bloque. Con on_land, EliteMobs intercepta su evento de cambio de bloque, cancela la colocación y llama una vez a function(land_location, entity_ref). Sin esa función, puede colocarse normalmente. No admite duration, max_ticks ni una llamada por invalidez o tiempo agotado.

ParámetroTipoNotas
locationtabla de ubicaciónDónde generar la entidad
materialcadenaNombre del material (p. ej., "STONE", "MAGMA_BLOCK")
optionstabla (opcional)Opciones de generación (véase abajo)

Opciones de bloques en caída​

ClaveTipoValor predeterminadoNotas
velocitytabla vectorialnilVelocidad inicial {x, y, z}
drop_itembooleanofalseSi el bloque se suelta como objeto
hurt_entitiesbooleanofalseSi el bloque daña a las entidades sobre las que cae
on_landfunciónnilFunción function(land_location, entity_ref) que se ejecuta cuando el bloque aterriza

Devuelve una referencia de entidad no viva o nil si no se resuelve la ubicación o el material. Un material reconocido que no sea un bloque puede fallar al crear sus datos de bloque.

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Rain magma blocks from above
local loc = context.boss:get_location()
for i = 1, 5 do
local offset_loc = {
x = loc.x + math.random(-3, 3),
y = loc.y + 10,
z = loc.z + math.random(-3, 3),
world = loc.world
}
context.world:spawn_falling_block_at_location(offset_loc, "MAGMA_BLOCK", {
velocity = { x = 0, y = -0.5, z = 0 },
hurt_entities = true,
on_land = function(land_location, entity_ref)
context.world:spawn_particle_at_location(land_location, { particle = "LAVA", amount = 8 })
end,
})
end
end
}

world:spawn_custom_boss_at_location(filename, location, options)​

Genera un jefe personalizado de EliteMobs a partir de un archivo de configuración.

ParámetroTipoNotas
filenamecadenaNombre del archivo de configuración del jefe (p. ej., "my_boss.yml")
locationtabla de ubicaciónDónde generar la entidad
optionstabla (opcional)Opciones de generación (véase abajo)

Opciones de generación de jefes personalizados​

ClaveTipoValor predeterminadoNotas
levelenteronivel de la configuración del jefe generadoSustituye su nivel. Si se omite, se aplican su configuración y reglas de nivel dinámico; no hereda el nivel del jefe que lo genera.
silentbooleanofalseSuprimir los mensajes de aparición
velocitytabla vectorialnilVelocidad inicial
add_as_reinforcementbooleanofalseRegistrar como refuerzo del jefe actual

Devuelve una tabla que representa al jefe, o nil si no se pudo crear.

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local minion = context.world:spawn_custom_boss_at_location(
"skeleton_minion.yml",
context.boss:get_location(),
{ level = 10, add_as_reinforcement = true }
)
if minion ~= nil then
context.boss:send_message("&cMinions, arise!")
end
end
}

world:spawn_boss_at_location(filename, location, level)​

Método simplificado para generar un jefe. Al omitir la ubicación o el nivel, usa los del jefe que lo genera. No registra el resultado como refuerzo. Omite el tercer argumento para usar su valor predeterminado; pasar explícitamente nil en él no es válido.

ParámetroTipoValor predeterminadoNotas
filenamecadenaNombre del archivo de configuración del jefe
locationtabla de ubicaciónubicación del jefeDónde generar la entidad (opcional; por defecto, la ubicación del jefe)
levelenteronivel del jefeSobrescribir el nivel de aparición (opcional)

Devuelve una tabla que representa a la entidad, o nil.

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.world:spawn_boss_at_location("zombie_guard.yml", context.boss:get_location(), 5)
context.boss:send_message("&cGuards, defend me!")
end
}

world:spawn_reinforcement_at_location(filename, location, duration, velocity)​

Genera silenciosamente un refuerzo, registra a su invocador y hereda el combate normalizado si el jefe personalizado invocador lo usa. Su configuración y reglas de nivel dinámico determinan el nivel; duration es un temporizador de escape, no un nivel.

ParámetroTipoValor predeterminadoNotas
filenamecadenaNombre del archivo de configuración del jefe
locationtabla de ubicaciónDónde generar la entidad
durationentero0Temporizador de escape en ticks; 0 no añade temporizador. No cambia el nivel del refuerzo.
velocitytabla vectorialnilVelocidad inicial (opcional)

Devuelve una tabla que representa a la entidad, o nil.

Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.world:spawn_reinforcement_at_location(
"necro_skeleton.yml",
context.boss:get_location(),
0,
{ x = 0, y = 0.5, z = 0 }
)
context.boss:send_message("&5Rise, my servant!")
end
}

world:spawn_fireworks_at_location(location, spec)​

Genera un fuego artificial real sin suprimir automáticamente su daño. Incluye al menos un color válido por efecto; construir un efecto sin colores puede fallar.

ParámetroTipoNotas
locationtabla de ubicaciónDónde generar la entidad
spectablaEspecificación del fuego artificial (véase abajo)

Tabla de especificación de fuegos artificiales​

ClaveTipoValor predeterminadoNotas
powerentero1Potencia de vuelo (altura)
velocitytabla vectorialnilVelocidad inicial
shot_at_anglebooleanotrueSi el fuego artificial se dispara en ángulo (se usa cuando se define la velocidad)
effectstabla de tablasnilLista de especificaciones de efectos del fuego artificial. Si se omite, la especificación principal se trata como un único efecto.

Especificación de efectos de fuegos artificiales​

ClaveTipoValor predeterminadoNotas
typecadena"BALL_LARGE""BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER"
flickerbooleanotrueEfecto de destello
trailbooleanotrueEfecto de estela
colorstablaobligatorio por efectoLista no vacía de nombres de colores o tablas {red = 255, green = 0, blue = 0}
fade_colorstablanilLista de nombres de colores de desvanecimiento o tablas {red, green, blue}

Nombres de colores: "WHITE", "SILVER", "GRAY", "BLACK", "RED", "MAROON", "YELLOW", "OLIVE", "LIME", "GREEN", "AQUA", "TEAL", "BLUE", "NAVY", "FUCHSIA", "PURPLE", "ORANGE"

Devuelve una referencia de entidad no viva, o nil si no se resuelve la ubicación. :detonate() solicita la detonación. Los tipos y nombres de colores no distinguen mayúsculas; un tipo desconocido usa BALL_LARGE y un color desconocido usa blanco. Los componentes RGB deben estar entre 0..255.

Ejemplo
return {
api_version = 1,
on_spawn = function(context)
local fw = context.world:spawn_fireworks_at_location(context.boss:get_location(), {
power = 0,
effects = {
{
type = "STAR",
flicker = true,
trail = true,
colors = { "RED", "ORANGE", { red = 255, green = 200, blue = 0 } },
fade_colors = { "YELLOW" },
},
},
})

if fw == nil then return end
-- Detonate on the next tick for a visual burst
context.scheduler:run_after(1, function()
fw:detonate()
end)
end
}

world:spawn_splash_potion_at_location(location, spec)​

Genera una poción arrojadiza real. Los efectos Bukkit desconocidos producen una advertencia y se omiten. No asigna un tirador ni aplica el filtro de efectos de instancia de los métodos directos de poción del jefe; se aplica el comportamiento normal de las pociones arrojadizas.

ParámetroTipoNotas
locationtabla de ubicaciónDónde generar la entidad
spectablaEspecificación de la poción (véase abajo)

Tabla de especificación de pociones arrojadizas​

ClaveTipoNotas
velocitytabla vectorialVelocidad inicial de la poción lanzada
effectstabla de tablasLista de especificaciones de efectos de poción

Especificación de efectos de poción​

ClaveTipoValor predeterminadoNotas
typecadenaobligatorioNombre del tipo de efecto de poción (p. ej., "SLOWNESS", "POISON")
durationentero0Duración en ticks
amplifierentero0Amplificador del efecto (0 = nivel I)
overwritebooleanotrueSustituye un efecto anterior del mismo tipo en los metadatos de esta poción; no regula los efectos que ya tiene el jugador

Devuelve una tabla de referencia de entidad, o nil.

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("potion_throw", 200) then return end

local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
dir = context.vectors.normalize_vector(dir)

context.world:spawn_splash_potion_at_location(context.boss:get_location(), {
velocity = { x = dir.x * 1.5, y = 0.5, z = dir.z * 1.5 },
effects = {
{ type = "SLOWNESS", duration = 100, amplifier = 1 },
{ type = "WEAKNESS", duration = 60, amplifier = 0 },
},
})
end
}

world:place_temporary_block_at_location(location, material, duration, requireAir)​

Coloca un bloque registrado que restaura sus datos anteriores tras una duración positiva. Guarda datos de bloque, no el contenido de contenedores. El bloque original vuelve 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, así que no se sobrescribe una edición posterior. Colocar de nuevo sobre un bloque que sigue conteniendo un bloque temporal reinicia su temporizador y conserva el primer original guardado. Se omiten los bloques con entidades de bloque, como cofres y carteles, los chunks descargados y los bloques que mantiene otro propietario de bloques temporales. Romper un bloque registrado no suelta nada y termina el registro sin restaurarlo. Usa un material de bloque. Esta sustitución devuelve nil, incluso si requireAir o una omisión impiden colocar el bloque; no informa del éxito ni comprueba automáticamente las protecciones regionales.

ParámetroTipoValor predeterminadoNotas
locationtabla de ubicaciónDónde colocar el bloque
materialcadenaNombre del material
durationentero0Ticks hasta restaurarlo; un valor cero o negativo coloca el bloque de forma permanente y sin registrarlo
requireAirbooleanofalseSi es true, solo coloca el bloque si actualmente hay aire
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Create a temporary ice floor under the boss
local loc = context.boss:get_location()
for dx = -2, 2 do
for dz = -2, 2 do
context.world:place_temporary_block_at_location(
{ x = loc.x + dx, y = loc.y - 1, z = loc.z + dz, world = loc.world },
"PACKED_ICE",
100,
false
)
end
end
end
}

world:set_block_at_location(location, material, requireAir)​

Coloca un bloque de forma permanente mediante el gestor de bloques temporales, sin temporizador de restauración y sin registrarlo, así que el cambio se mantiene después de apagar el plugin. Si el bloque contiene en ese momento un bloque temporal con temporizador, ese bloque deja de estar registrado y no se restaura. Los bloques que mantiene otro propietario de bloques temporales no se modifican. Usa place_temporary_block_at_location con una duración positiva para restaurar el original mediante un temporizador.

ParámetroTipoValor predeterminadoNotas
locationtabla de ubicaciónDónde colocar el bloque
materialcadenaNombre del material
requireAirbooleanofalseSi es true, solo coloca el bloque si actualmente hay aire
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Place fire at the boss's location
context.world:set_block_at_location(context.boss:get_location(), "FIRE", true)
end
}

world:get_block_type_at_location(location)​

Devuelve el nombre del material en mayúsculas o nil si no se resuelve la ubicación. A diferencia de la consulta compartida por coordenadas, accede al bloque directamente sin comprobar que el chunk esté cargado.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local block_type = context.world:get_block_type_at_location(context.boss:get_location())
if block_type == "WATER" then
context.boss:send_message("&bThe boss is empowered by water!")
context.boss:apply_potion_effect("SPEED", 200, 1)
end
end
}

world:get_highest_block_y_at_location(location)​

Devuelve la Y del bloque más alto según Bukkit en la posición X/Z, o nil si no se resuelve la ubicación. No comprueba si el chunk ya está cargado ni si es seguro teletransportarse al destino.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar (se usan X y Z)
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("skyport", 200) then return end
local loc = context.player:get_location()
local ground_y = context.world:get_highest_block_y_at_location(loc)
-- Teleport the player to the surface
context.player:teleport_to_location({
x = loc.x, y = ground_y + 1, z = loc.z, world = loc.world
})
context.player:send_message("&eYou are teleported to the surface!")
end
}

world:get_blast_resistance_at_location(location)​

Devuelve la resistencia a explosiones del material o 0 si no se resuelve la ubicación.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local resistance = context.world:get_blast_resistance_at_location(context.boss:get_location())
context.log:info("Blast resistance at boss: " .. resistance)
end
}

world:is_air_at_location(location)​

Devuelve true si el bloque en la ubicación es aire.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local above = { x = loc.x, y = loc.y + 2, z = loc.z, world = loc.world }
if context.world:is_air_at_location(above) then
-- There is space above the boss, launch upward
context.boss:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
end
end
}

world:is_passable_at_location(location)​

Devuelve el resultado de Block.isPassable() de Bukkit, o false si no se resuelve la ubicación. Consulta un solo bloque; no comprueba si una entidad completa cabe o puede navegar por él.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
if context.world:is_passable_at_location(context.boss:get_location()) then
context.log:info("Boss is in a passable block")
end
end
}

world:is_passthrough_at_location(location)​

Devuelve true si el bloque en la ubicación no es sólido. Es similar a la comprobación de transitabilidad, pero se basa en si el bloque es sólido.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local above = { x = loc.x, y = loc.y + 1, z = loc.z, world = loc.world }
if context.world:is_passthrough_at_location(above) then
context.log:info("Boss can move upward")
end
end
}

world:is_on_floor_at_location(location)​

Devuelve true si el bloque de la ubicación no es sólido y el bloque una unidad Y por debajo sí lo es. No comprueba el estado de contacto con el suelo, la caja de colisión ni el espacio sobre la cabeza de una entidad.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
if context.world:is_on_floor_at_location(context.boss:get_location()) then
context.boss:send_message("&aThe boss slams the ground!")
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "CLOUD",
amount = 30,
})
end
end
}

world:is_standing_on_material(location, material)​

Devuelve true si el bloque justo debajo de la ubicación coincide con el material indicado.

ParámetroTipoNotas
locationtabla de ubicaciónUbicación que consultar
materialcadenaNombre del material que comprobar
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.world:is_standing_on_material(context.player:get_location(), "SOUL_SAND") then
context.player:send_message("&8The soul sand saps your strength!")
context.player:apply_potion_effect("SLOWNESS", 60, 2)
end
end
}

world:set_world_time(time) / world:set_world_time(location, time)​

Cambia la hora de todo el mundo. Puedes indicar una ubicación para seleccionar el mundo. La hora anterior no se restaura al cerrar el script.

ParámetroTipoNotas
locationtabla de ubicación (opcional)Mundo que modificar. Por defecto, el mundo del jefe.
timeenteroHora del mundo en ticks (0 = amanecer, 6000 = mediodía, 13000 = noche, 18000 = medianoche)
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Set to midnight when combat starts
context.world:set_world_time(18000)
context.boss:send_message("&8Darkness falls...")
end
}

world:set_world_weather(weather, duration) / world:set_world_weather(location, weather, duration)​

Cambia el clima en el mundo del jefe o de la ubicación opcional. Los nombres no distinguen mayúsculas; los desconocidos solo generan una advertencia. RAIN/CLEAR cambian el temporizador del clima; THUNDER cambia el de los truenos. Afecta a todo el mundo y no restaura el estado anterior al cerrar el script.

ParámetroTipoValor predeterminadoNotas
locationtabla de ubicación (opcional)mundo del jefeMundo que modificar
weathercadena"CLEAR", "RAIN" (o "PRECIPITATION"), "THUNDER"
durationentero6000Duración del clima en ticks
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Start a thunderstorm for 200 ticks
context.world:set_world_weather("THUNDER", 200)
context.boss:send_message("&eA storm gathers!")
end
}

world:generate_fake_explosion(blockLocations, sourceLocation)​

Elimina bloques reales y crea escombros de bloques en caída mediante la regeneración de explosiones de EliteMobs. Los escombros tienen daño a entidades activado; no es un efecto inocuo de partículas. Requiere doExplosionRegen; comprueba la bandera de regeneración de WorldGuard cuando se proporciona una ubicación de origen. Omite aire, fuego, líquidos y bloques temporales registrados, y puede incluir bloques vecinos dependientes. La restauración comienza tras 1200 ticks y procesa un bloque registrado por tick. Mantén todas las ubicaciones en el mundo del jefe. Devuelve nil y cerrar el script no deshace la operación.

ParámetroTipoNotas
blockLocationstabla de tablas de ubicaciónLista de ubicaciones de bloques que «explotarán»
sourceLocationtabla de ubicación (opcional)Origen de la explosión para calcular la dirección
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local blocks = {}
for dx = -1, 1 do
for dz = -1, 1 do
table.insert(blocks, { x = loc.x + dx, y = loc.y, z = loc.z + dz, world = loc.world })
end
end
context.world:generate_fake_explosion(blocks, loc)
end
}

world:run_console_command(command)​

Ejecuta inmediatamente un comando de consola como el servidor y devuelve nil, sin exponer si tuvo éxito. No sustituye automáticamente marcadores de jugador o jefe.

Los comandos vanilla informan de su resultado y, con el valor predeterminado broadcast-console-to-ops=true, el servidor muestra cada resultado a todos los operadores conectados. Los comandos que se ejecutan a menudo, como data merge entity, kill o damage, inundan su chat. Usa en su lugar los métodos nativos: spawn_display_at_location para los elementos visuales, los métodos de soporte de armadura para los soportes, entity:remove() para eliminar lo que haya generado un script y entity:deal_custom_damage(amount) para infligir un daño exacto desde el jefe.

ParámetroTipoNotas
commandcadenaComando que ejecutar (sin la / inicial)
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.world:run_console_command("say The boss has entered phase 2!")
end
}

world:run_empowered_lightning_task_at_location(location)​

Inicia una tarea Bukkit independiente en la ubicación capturada. Emite SOUL_FIRE_FLAME durante 60 iteraciones; después genera un rayo real con la omisión de cancelación de aparición y una bola de fuego hacia abajo con potencia explosiva 5, identificada como ender_dragon_empowered_lightning.yml. Es un ataque que causa daño. Cerrar o pausar el script no cancela esta tarea, que tampoco consulta la opción de efectos de advertencia.

ParámetroTipoNotas
locationtabla de ubicaciónDónde hacer caer el rayo
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.world:run_empowered_lightning_task_at_location(context.boss:get_location())
context.boss:send_message("&eFeel the power of the storm!")
end
}

world:spawn_fake_gold_nugget_at_location(location, velocity, hasGravity)​

Crea una pepita de oro visual mediante paquetes para jugadores cercanos; los jugadores y las tolvas no pueden recogerla. Crearla no inicia su movimiento ni su daño. Pásala una vez a run_fake_gold_nugget_damage como parte de un grupo, o elimínala explícitamente.

ParámetroTipoValor predeterminadoNotas
locationtabla de ubicaciónUbicación de aparición
velocitytabla vectorialVelocidad inicial
hasGravitybooleanofalseSi el proyectil tiene gravedad

Devuelve una tabla de proyectil falso, o nil si no se resuelve la ubicación o el vector, con get_location(), set_gravity(bool), remove() e is_removed().

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("nugget", 60) then return end

local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
dir = context.vectors.normalize_vector(dir)

local nugget = context.world:spawn_fake_gold_nugget_at_location(
context.boss:get_location(),
{ x = dir.x, y = dir.y, z = dir.z }
)
if nugget ~= nil then
context.world:run_fake_gold_nugget_damage({ nugget })
end
end
}

world:run_fake_gold_nugget_damage(projectiles)​

Inicia una tarea Bukkit independiente que mueve y comprueba el grupo cada tick. Llámala una sola vez por grupo: cada llamada crea otra tarea. Busca entidades vivas en una caja de semitamaño 0.5 en la nueva posición, omite al jefe de origen y a jugadores bloqueando, y solicita daño personalizado de 1 mediante la política de daño del jefe. Una colisión puede eliminar el proyectil aunque se rechace el daño. Tocar suelo o alcanzar 100 ticks también lo elimina. Comprueba posiciones muestreadas, no todo el trayecto mediante un rayo; cerrar o pausar Lua no cancela la tarea.

ParámetroTipoNotas
projectilestablaLista de tablas de proyectiles falsos obtenidas con spawn_fake_gold_nugget_at_location
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
-- Keep this batch separate from later combat entries.
local projectiles = {}
local loc = context.boss:get_location()
for i = 1, 5 do
local angle = (i / 5) * math.pi * 2
local nugget = context.world:spawn_fake_gold_nugget_at_location(
loc,
{ x = math.cos(angle) * 0.5, y = 0.3, z = math.sin(angle) * 0.5 }
)
if nugget ~= nil then table.insert(projectiles, nugget) end
end

-- Start the batch once; the helper runs its own per-tick task.
context.world:run_fake_gold_nugget_damage(projectiles)
-- Remove any surviving projectiles after 3 seconds.
context.scheduler:run_after(60, function()
for _, projectile in ipairs(projectiles) do
projectile:remove()
end
end)
end
}

world:generate_player_loot(times)​

Ejecuta el generador normal de botín times veces; los valores no positivos no hacen nada. Requiere eliteLoot, que no se haya activado la protección contra abusos, datos del jugador cargados y daño registrado de al menos el 10% de la salud máxima. Omite jugadores con bloqueo de recompensas de la instancia. Cada pasada puede incluir monedas y, con botín aleatorio activado, botín aleatorio/especial y pergaminos según la configuración y las reglas de grupo. No repite todos los drops personalizados definidos ni garantiza un objeto por tirada. Las llamadas repetidas generan más intentos de recompensa; no hay límite de una llamada por jefe.

ParámetroTipoValor predeterminadoNotas
timesentero1Número de tiradas de botín
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("bonus_loot") then
context.boss:add_tag("bonus_loot")
context.world:generate_player_loot(2)
context.boss:send_message("&6Bonus loot drops!")
end
end
}

world:drop_bonus_coins(multiplier)​

Suelta monedas adicionales para jugadores cuyo daño registrado supera el 10% de la salud máxima del jefe. Omite NPC y jugadores sin datos de EliteMobs cargados. La cantidad usa el nivel de recompensa ajustado del jugador multiplicado por multiplier.

ParámetroTipoValor predeterminadoNotas
multipliernúmero2.0Multiplicador de la cantidad de monedas
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.25 and not context.boss:has_tag("bonus_coins") then
context.boss:add_tag("bonus_coins")
context.world:drop_bonus_coins(3.0)
context.boss:send_message("&6Gold spills everywhere!")
end
end
}

context.vectors​

Las funciones vectoriales admiten punto o dos puntos. Aceptan campos x, y, z, índices numéricos 1..3 o una tabla anidada direction. Los componentes ausentes valen 0. Devuelven tablas nuevas sin modificar la entrada.

MétodoDevuelveNotas
vectors.get_vector_between_locations(loc1, loc2[, options])tabla vectorialDesplazamiento loc2 - loc1, sin normalizar por defecto
vectors.normalize_vector(vec)tabla vectorialVector unitario para entradas no nulas; el vector cero sigue siendo cero
vectors.rotate_vector(vec, pitch, yaw)tabla vectorialRota primero alrededor del eje X del mundo y luego del Y, en grados

Todas las tablas vectoriales tienen los campos x, y y z.

vectors.get_vector_between_locations(loc1, loc2, options)​

ParámetroTipoNotas
loc1tabla de ubicaciónPunto inicial
loc2tabla de ubicaciónPunto final
optionstabla (opcional)Opciones de posprocesamiento (véase abajo)

Opciones de vectores​

ClaveTipoValor predeterminadoNotas
normalizebooleanofalseNormalizar el vector resultante
multipliernúmero1.0Escalar el vector
offsettabla vectorialnilAñadir un vector de desplazamiento

Las opciones se aplican en orden: normalizar el desplazamiento no nulo, multiplicar y sumar el desplazamiento en los ejes del mundo. Las ubicaciones no resueltas o de mundos distintos devuelven cero antes de aplicar opciones. Dos ubicaciones válidas coincidentes aún pueden recibir offset.

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("dash", 100) then return end
-- Compute a normalized direction from boss to player, scaled to speed 2
local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location(),
{ normalize = true, multiplier = 2.0 }
)
-- Launch the boss toward the player
context.boss:set_velocity_vector(dir)
end
}

vectors.normalize_vector(vec)​

ParámetroTipoNotas
vectabla vectorialVector de entrada
Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local raw = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
local unit = context.vectors.normalize_vector(raw)
context.log:info("Direction: " .. unit.x .. ", " .. unit.y .. ", " .. unit.z)
end
}

vectors.rotate_vector(vec, pitch, yaw)​

ParámetroTipoNotas
vectabla vectorialVector de entrada
pitchnúmeroRotación alrededor del eje X en grados
yawnúmeroRotación alrededor del eje Y en grados
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("spread_shot", 100) then return end
local forward = context.vectors.normalize_vector(
context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
)
-- Fire three fireballs in a spread pattern
for _, yaw_offset in ipairs({ -30, 0, 30 }) do
local dir = context.vectors.rotate_vector(forward, 0, yaw_offset)
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
{
x = context.boss:get_location().x + dir.x * 10,
y = context.boss:get_location().y + dir.y * 10,
z = context.boss:get_location().z + dir.z * 10,
world = context.boss:get_location().world
},
1.0
)
end
end
}
consejo

Puedes crear un abanico de direcciones rotando un vector base dentro de un bucle:

local base = context.vectors.normalize_vector(
context.vectors.get_vector_between_locations(boss_loc, target_loc)
)
for angle = 0, 330, 30 do
local dir = context.vectors.rotate_vector(base, 0, angle)
-- Use dir for spawning projectiles in a ring
end

context.settings​

Acceso de solo lectura a la configuración de poderes. La función lee el valor actual al llamarla; no suprime partículas ni otros efectos automáticamente. El script debe decidir si muestra una advertencia según el resultado.

MétodoDevuelveNotas
settings:warning_visual_effects_enabled()booleanoSi los efectos visuales de advertencia están activados en la configuración de combate de los mobs
Ejemplo
return {
api_version = 1,
on_enter_combat = function(context)
if context.settings:warning_visual_effects_enabled() then
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "DUST",
amount = 20,
red = 255, green = 0, blue = 0,
})
end
end
}

context.event​

Datos del evento del hook actual. Los campos dependen del evento subyacente; comprueba los opcionales antes de usarlos. Los modificadores numéricos de daño requieren punto (event.set_damage_amount(value)); transfer_damage admite punto o dos puntos. Esta tabla de eventos de jefe no expone los miembros compartidos cancel, uncancel o is_cancelled.

Campo o métodoCuándo está disponibleNotas
event.damage_amountHooks de dañoDaño capturado al resolver por primera vez la tabla diferida del evento
event.get_damage_amount()Hooks de dañoLee la cantidad actual después de los cambios
event.damage_causeHooks de dañoNombre del enum DamageCause de Bukkit (p. ej., "ENTITY_ATTACK")
event.cancel_event()Eventos cancelablesCancela el evento
event.set_damage_amount(value)Hooks basados en EliteDamageEventEstablece el daño directamente
event.multiply_damage_amount(multiplier)Hooks basados en EliteDamageEventMultiplica el daño actual
event.damagerEventos de daño con una entidad atacanteAtacante original de Bukkit: el propio proyectil en impactos de proyectil, no su tirador
event.projectileEventos de daño en los que el atacante es un proyectilTabla de referencia de la entidad del proyectil
event.spawn_reasonon_spawnNombre del enum del motivo de aparición
event.entityDaño de jugador a jefe, on_death, eventos de zonaJefe dañado, entidad muerta o entidad que cruza la zona; si se daña un refuerzo, es el refuerzo
event.is_damage_transferDaño de jugador a jefe, incluido el reenviado por refuerzosIndica si el golpe procede de una transferencia
event:transfer_damage(target, amount)Daño de jugador a jefe, incluido el reenviado por refuerzosEnvía un golpe independiente a otro élite válido; consulta el contrato de transferencia de daño

Ejemplo: Reducir a la mitad el daño recibido​

Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.event ~= nil then
local dmg = context.event.damage_amount
context.log:info("Boss took " .. dmg .. " damage, halving it")
context.event.multiply_damage_amount(0.5)
end
end
}

Ejemplo: Cancelar el daño de proyectiles​

Ejemplo
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.event ~= nil and context.event.damage_cause == "PROJECTILE" then
context.event.cancel_event()
if context.player ~= nil then
context.player:send_message("&cThe boss deflects your projectile!")
end
end
end
}

Ejemplo: Leer la causa del daño​

Ejemplo
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.event ~= nil then
context.log:info("Damage cause: " .. (context.event.damage_cause or "unknown"))
end
end
}
nota
  • damage_amount es un valor capturado. No se actualiza automáticamente después de llamar a set_damage_amount() o multiply_damage_amount().
  • El contexto nuevo que recibe una función programada tiene event = nil. Capturar el contexto anterior no permite modificar válidamente un evento ya terminado; modifica los eventos dentro de su hook.
  • Los modificadores cambian el evento pendiente, no la salud ya perdida. Otros listeners pueden modificar o cancelar el golpe. Una transferencia aceptada envía un golpe adicional; no reduce ni cancela automáticamente el original.

Siguientes pasos​