Scripting Lua: Boss e Entidades
Esta página cobre tudo sobre os wrappers de boss e de entidades nos poderes Lua do EliteMobs: context.boss, context.player, context.players, context.entities e as tabelas de wrapper de entidade que eles devolvem. Se é novo nos poderes Lua, comece primeiro por Como começar.
Wrappers de entidade
Quando acede a entidades através da API Lua -- seja a partir de context.boss, context.player, resultados de consultas como context.players:nearby_players(), ou campos de eventos -- recebe sempre tabelas de wrapper. Estas não são objetos Bukkit em bruto. Cada wrapper fornece um conjunto de campos (valores de instantâneo capturados no momento da criação) e métodos (chamadas em tempo real que acedem ao servidor).
Duas regras a lembrar:
- Campos como
health,current_locationemaximum_healthsão instantâneos (snapshots). Refletem o estado no momento em que o wrapper foi criado e não se atualizam automaticamente. - Métodos como
get_location(),get_health()eis_alive()realizam uma verificação em tempo real cada vez que os chama.
Campos comuns de entidade
Cada wrapper de entidade viva inclui estes campos.
| Campo | Tipo | Notas |
|---|---|---|
entity.name | string | Nome de exibição |
entity.uuid | string | UUID como texto |
entity.entity_type | string | Nome do EntityType do Bukkit (por exemplo, "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true para jogadores |
entity.is_elite | boolean | true se o EliteMobs o regista como um elite |
entity.is_mount | boolean | true se este wrapper representa uma montaria de boss |
entity.is_monster | boolean | true para entidades do tipo monstro |
entity.is_valid | boolean | Flag de validade do instantâneo |
entity.health | number | Vida atual (instantâneo) |
entity.maximum_health | number | Vida máxima (instantâneo) |
entity.current_location | tabela de localização | Posição no momento em que o wrapper foi criado |
Para ler dados específicos de elites, como o nível do boss, use os campos e métodos de context.boss descritos na secção context.boss abaixo. Para fazer desaparecer (despawn) um elite a partir de um script, chame o método entity:remove_elite().
Exemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
end
}
Exemplo
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 comuns de entidade
Cada wrapper de entidade viva suporta estes métodos. Cada método realiza uma chamada em tempo real ao servidor.
entity:is_alive()
Devolve true se a entidade ainda for válida e não estiver morta.
Exemplo
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()
Devolve a localização atual em tempo real como uma tabela de localização.
Exemplo
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()
Devolve a localização ao nível dos olhos como uma tabela de localização.
Exemplo
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()
Devolve a vida atual ou máxima em tempo real.
Exemplo
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()
Devolve a velocidade atual da entidade como uma tabela de vetor.
Exemplo
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)
Envia uma mensagem de chat à entidade. Suporta a formatação de cores do EliteMobs.
| Parâmetro | Tipo | Notas |
|---|---|---|
text | string | Mensagem com códigos de cor |
Exemplo
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)
Envia uma mensagem na barra de ação (action bar) à entidade.
| Parâmetro | Tipo | Notas |
|---|---|---|
message | string | Texto da barra de ação com códigos de cor |
Exemplo
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])
Envia um título e um subtítulo opcional à entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
title | string | Texto do título | |
subtitle | string | "" | Texto do subtítulo |
fadeIn | number | 10 | Ticks de aparecimento gradual |
stay | number | 40 | Ticks de permanência |
fadeOut | number | 10 | Ticks de desaparecimento gradual |
Exemplo
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])
Mostra uma barra de boss temporária à entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
title | string | Texto do título da barra | |
color | string | "WHITE" | Valor de BarColor |
style | string | "SOLID" | Valor de BarStyle |
duration | number | 40 | Duração em ticks |
Exemplo
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 a entidade para uma localização.
| Parâmetro | Tipo | Notas |
|---|---|---|
location | tabela de localização | Destino |
Exemplo
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)
Define a velocidade da entidade de imediato.
| Parâmetro | Tipo | Notas |
|---|---|---|
vector | tabela de vetor | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemplo
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 um impulso de velocidade após um curto atraso (predefinição de 1 tick). Útil para sobrepor o knockback.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
vector | tabela de vetor | Direção e força | |
additive | boolean | false | Adicionar à velocidade existente em vez de substituir |
delay | number | 1 | Atraso em ticks antes de aplicar |
Exemplo
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)
Faz a entidade virar-se para um vetor de direção ou para uma localização.
| Parâmetro | Tipo | Notas |
|---|---|---|
directionOrLocation | tabela de vetor ou de localização | Alvo para o qual se virar |
Exemplo
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)
Põe a entidade a arder durante a duração indicada.
| Parâmetro | Tipo | Notas |
|---|---|---|
ticks | number | Duração do fogo em ticks (20 ticks = 1 segundo) |
Exemplo
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])
Adiciona ticks de congelamento visual à entidade (o efeito de sobreposição azul).
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
ticks | number | 1 | Quantidade de ticks de congelamento |
Exemplo
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 um efeito de poção à entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
effect | string | Nome de PotionEffectType | |
duration | number | Duração em ticks | |
amplifier | number | 0 | Nível do efeito (0 = nível I) |
Exemplo
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) não está disponível nos poderes Lua do EliteMobs. Existe apenas no Magmacore/FMM. Use apply_potion_effect com uma duração de 0 como solução alternativa, ou conceba o seu poder sem necessitar de remover efeitos.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Causa dano à entidade. Estão disponíveis três variantes.
| Método | Notas |
|---|---|
deal_damage(amount) | Fonte de dano genérica |
deal_custom_damage(amount) | Usa BossCustomAttackDamage do boss |
deal_damage_from_boss(amount) | A entidade do boss é definida como o causador do dano |
Exemplo
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 entidade até à sua vida máxima.
| Parâmetro | Tipo | Notas |
|---|---|---|
amount | number | Quantidade a curar |
Exemplo
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 a invulnerabilidade na entidade. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
enabled | boolean | true para ativar a invulnerabilidade | |
duration | number | nil | Reverte automaticamente após este número de ticks |
Exemplo
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 a IA na entidade. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
enabled | boolean | true para ativar a IA | |
duration | number | nil | Reverte automaticamente após este número de ticks |
Exemplo
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)
Gere etiquetas (tags) na entidade. As etiquetas são acompanhadas pelo EliteMobs e persistem durante o tempo de vida da entidade.
| Método | Parâmetro | Notas |
|---|---|---|
add_tag(tag[, duration]) | string, number opcional | Adiciona a etiqueta, opcionalmente removendo-a automaticamente após ticks |
remove_tag(tag) | string | Remove a etiqueta |
has_tag(tag) | string | Devolve true se a etiqueta estiver presente |
Exemplo
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)
Faz a entidade executar um comando. Para os jogadores, isto é executado como o jogador; use o texto do comando sem uma / inicial.
| Parâmetro | Tipo | Notas |
|---|---|---|
command | string | Texto do comando sem a / inicial |
Exemplo
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])
Define o atributo generic_scale da entidade. Opcionalmente reverte para 1.0 após uma duração.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
scale | number | Multiplicador de escala | |
duration | number | nil | Reverte automaticamente após este número de ticks |
Exemplo
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 a gravidade na entidade.
| Parâmetro | Tipo | Notas |
|---|---|---|
enabled | boolean | true para gravidade normal |
Exemplo
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])
Reproduz um som na localização da entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
sound | string | Chave de som do Minecraft (por exemplo, "entity.ender_dragon.growl") | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Tom (pitch) |
Exemplo
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 para play_sound_at_entity. Reproduz um som na localização da entidade.
entity:spawn_particle_at_self(particleOrSpec[, count])
Faz surgir partículas na localização da entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
particleOrSpec | string ou tabela | Nome da partícula ou tabela de especificação | |
count | number | 1 | Número de partículas |
Exemplo
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])
Faz surgir partículas numa localização específica.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
location | tabela de localização | Localização alvo | |
particle | string | Nome do tipo de partícula | |
count | number | 1 | Número de partículas |
Exemplo
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)
Reproduz uma animação de modelo personalizado se a entidade tiver um modelo personalizado que a suporte.
| Parâmetro | Tipo | Notas |
|---|---|---|
name | string | Nome da animação |
Exemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
Métodos de veículo e passageiro
Os wrappers de entidade viva também expõem auxiliares de veículo/passageiro do Bukkit. Estes são úteis para montarias controladas por script, efeitos temporários de montar e para verificar se uma entidade já está acoplada a outra entidade.
| Método | Devolve | Notas |
|---|---|---|
entity:is_inside_vehicle() | boolean | True se a entidade estiver a montar outra entidade. |
entity:has_vehicle() | boolean | True se a entidade tiver atualmente um veículo. |
entity:get_vehicle() | wrapper de entidade ou nil | Devolve o wrapper do veículo atual. |
entity:set_vehicle(vehicle) | boolean | Faz esta entidade montar vehicle. |
entity:leave_vehicle() | boolean | Faz esta entidade abandonar o seu veículo atual. |
entity:has_passengers() | boolean | True se esta entidade tiver passageiros. |
entity:get_passenger_count() | number | Número de passageiros. |
entity:get_passengers() | table | Array de wrappers de passageiro. |
entity:add_passenger(passenger) | boolean | Adiciona um passageiro a esta entidade. |
entity:remove_passenger(passenger) | boolean | Remove um passageiro desta entidade. |
entity:eject_passengers() | boolean | Ejeta todos os passageiros. |
Exemplo
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])
Empurra a entidade para longe de uma localização de origem ou de um wrapper de entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
source | localização ou wrapper | Origem do impulso | |
strength | number | 1.0 | Multiplicador da força do impulso |
xOffset | number | 0 | Deslocamento X adicional |
yOffset | number | 0 | Deslocamento Y adicional |
zOffset | number | 0 | Deslocamento Z adicional |
Exemplo
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()
Define ou repõe o nome de exibição personalizado da entidade. Suporta códigos de cor.
Exemplo
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 um bloco temporário na localização atual da entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
material | string | Nome do material do bloco | |
duration | number | 0 | Ticks antes da remoção |
requireAir | boolean | false | Só coloca se o bloco for atualmente ar |
Exemplo
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()
Devolve a altura da entidade em blocos.
entity:is_on_ground()
Devolve true se a entidade estiver atualmente sobre solo sólido.
entity:is_frozen()
Devolve true se a entidade (quando acompanhada como um boss personalizado) tiver a flag de congelado definida.
entity:set_awareness_enabled(aware[, duration])
Alterna a perceção (awareness) do mob. Só afeta entidades do tipo mob. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
aware | boolean | true para ativar a perceção | |
duration | number | nil | Reverte automaticamente após este número de ticks |
entity:is_healing() / entity:set_healing(enabled)
Verifica ou alterna o estado de cura numa entidade elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Devolve true se a caixa delimitadora da entidade se sobrepuser a uma caixa alinhada aos eixos na localização indicada.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
center | tabela de localização | Centro da caixa de teste | |
halfX | number | 0.5 | Meia-largura no eixo X |
halfY | number | igual a halfX | Meia-altura no eixo Y |
halfZ | number | igual a halfX | Meia-largura no eixo Z |
entity:remove_elite()
Remove a entidade elite do acompanhamento do EliteMobs. Se a entidade for um elite, isto fá-lo desaparecer (despawn) corretamente através do EliteMobs.
entity:set_custom_name_visible(visible)
Define se o nome personalizado da entidade está sempre visível ou apenas quando se olha para ela.
| Parâmetro | Tipo | Notas |
|---|---|---|
visible | boolean | true para sempre visível |
entity:set_equipment(slot, material[, options])
Define o equipamento na entidade.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
slot | string | Slot de equipamento: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Nome do material (por exemplo, "DIAMOND_SWORD", "IRON_HELMET") | |
options | table | {} | Definições opcionais (ver abaixo) |
Tabela de opções:
| Chave | Tipo | Predefinição | Notas |
|---|---|---|---|
enchantments | array de tabelas | nil | Cada entrada: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Se o item é inquebrável |
Exemplo
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()
Um método que devolve true se a entidade tiver atualmente a IA ativada.
Exemplo
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
}
Wrappers de referência de entidades não-vivas
Quando uma entidade gerada não é uma LivingEntity -- por exemplo, um bloco em queda, projétil ou bola de fogo -- recebe um wrapper de referência mais leve. Estes são devolvidos por métodos como context.world:spawn_falling_block_at_location() ou context.boss:summon_projectile().
Campos: name, uuid, entity_type, is_player, is_elite, current_location
Métodos:
| Método | Notas |
|---|---|
is_valid() | Verificação de validade em tempo real |
get_location() | Localização atual em tempo real |
get_velocity() | Vetor de velocidade atual |
is_on_ground() | Se está no chão |
teleport_to_location(location) | Teletransporta a entidade |
set_velocity_vector(vector) | Define a velocidade |
set_direction_vector(vector) | Define a direção (apenas Fireball) |
set_yield(value) | Define o rendimento (yield) da explosão (apenas Fireball) |
set_gravity(enabled) | Alterna a gravidade |
detonate() | Detona entidades de fogo de artifício |
remove() | Remove a entidade do mundo |
unregister([reason]) | Cancela o registo no rastreador de entidades |
Exemplo
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
Disponível em hooks onde um jogador está diretamente envolvido (on_boss_damaged_by_player, on_player_damaged_by_boss, etc.). Os wrappers de jogador incluem todos os campos e métodos comuns de entidade listados acima, mais os extras abaixo.
context.player é nil em hooks que não têm um jogador associado, como on_spawn, callbacks agendados e hooks de temporizador. Verifique sempre se é nil antes de usar.
Exemplo
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 do jogador
| Campo | Tipo | Notas |
|---|---|---|
game_mode | string | Nome do modo de jogo atual (por exemplo, "SURVIVAL") |
Métodos exclusivos do jogador
| Método | Notas |
|---|---|
send_message(message) | Mensagem de chat com formatação de cores do EliteMobs |
show_action_bar(message) | Texto da barra de ação |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Sobreposição no ecrã de título |
show_boss_bar(title[, color][, style][, duration]) | Barra de boss temporária |
run_command(command) | Executar um comando como o jogador (sem a / inicial) |
Exemplo
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
O wrapper de boss para o elite mob que possui este poder Lua. Está sempre disponível em todos os hooks.
O wrapper de boss herda todos os métodos comuns de entidade listados acima (por exemplo, push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location, etc.). Os métodos documentados nesta secção são específicos do boss ou têm um comportamento diferente através da camada EliteEntity.
Campos do boss
| Campo | Tipo | Notas |
|---|---|---|
boss.name | string | Nome de exibição |
boss.uuid | string | UUID do elite (boss) |
boss.entity_type | string | Nome do EntityType do Bukkit |
boss.is_monster | boolean | true se a entidade subjacente for um Monster |
boss.level | number | Nível do elite |
boss.health | number | Vida atual (instantâneo) |
boss.maximum_health | number | Vida máxima (instantâneo) |
boss.damager_count | number | Número de causadores de dano (instantâneo) |
boss.is_in_combat | boolean | Estado de combate |
boss.exists | boolean | Se o elite ainda existe |
boss.current_location | tabela de localização | Posição na criação do wrapper (instantâneo) |
Exemplo
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Métodos do boss
boss:is_alive()
Devolve true se a entidade do boss for válida, não estiver morta e o elite ainda existir. Use isto em vez do campo exists para verificações em tempo real.
Exemplo
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()
Devolve a localização atual do boss em tempo real como uma tabela de localização.
Exemplo
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()
Devolve a localização do boss ao nível dos olhos.
Exemplo
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 a IA no boss. Opcionalmente reverte após uma duração.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
enabled | boolean | true para ativar a IA | |
duration | number | nil | Reverte automaticamente após este número de ticks |
Exemplo
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 o boss para uma localização.
| Parâmetro | Tipo | Notas |
|---|---|---|
location | tabela de localização | Destino |
Exemplo
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)
Define a velocidade do boss de imediato.
| Parâmetro | Tipo | Notas |
|---|---|---|
vector | tabela de vetor | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemplo
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 o boss até à sua vida máxima.
| Parâmetro | Tipo | Notas |
|---|---|---|
amount | number | Quantidade a curar |
Exemplo
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])
Reproduz um som na localização do boss.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
sound | string | Chave de som do Minecraft (por exemplo, "entity.wither.spawn") | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Tom (pitch) |
Exemplo
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])
Faz surgir partículas na localização do boss.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
particleOrSpec | string ou tabela | Nome da partícula ou tabela de especificação | |
count | number | 1 | Número de partículas |
Exemplo
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)
Reproduz uma animação de modelo personalizado no boss, se disponível.
| Parâmetro | Tipo | Notas |
|---|---|---|
name | string | Nome da animação |
Exemplo
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:has_mount() / boss:get_mount()
Verifica ou devolve a entidade que este boss está atualmente a montar. boss:get_mount() devolve nil se o boss não tiver montaria. Quando uma montaria é devolvida, o seu wrapper tem is_mount = true.
Exemplo
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 ou desmonta o boss. boss:set_mount(entity) faz o boss montar o wrapper de entidade fornecido e devolve true se o Bukkit aceitar a alteração de passageiro. boss:clear_mount() e boss:dismount() fazem ambos o boss abandonar o seu veículo atual.
Exemplo
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)
Faz o boss virar-se para uma direção ou localização.
| Parâmetro | Tipo | Notas |
|---|---|---|
vectorOrLocation | tabela de vetor ou de localização | Direção para a qual se virar |
Exemplo
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 pathfinding para fazer o boss caminhar até uma localização.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
location | tabela de localização | Destino | |
speed | number | 1.0 | Multiplicador da velocidade de movimento |
follow | boolean | false | Seguir continuamente o alvo |
timeout | number | nil | Cancelar a navegação após este número de ticks |
Exemplo
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)
Gere etiquetas (tags) no boss.
Exemplo
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])
Envia uma mensagem de chat a todos os jogadores próximos.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
message | string | Texto da mensagem com códigos de cor | |
range | number | 20 | Raio em blocos |
Exemplo
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])
Lança uma entidade do tipo projétil a partir do boss.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
entityType | string | Tipo de entidade (por exemplo, "FIREBALL", "ARROW") | |
origin | tabela de localização | Posição de lançamento | |
destination | tabela de localização | Posição alvo | |
speed | number | 1.0 | Velocidade do projétil |
options | table | {} | Ver opções abaixo |
Tabela de opções:
| Chave | Tipo | Notas |
|---|---|---|
duration | number | Remover automaticamente após ticks |
max_ticks | number | Máximo de ticks para monitorizar a aterragem |
custom_damage | number | Dano no impacto |
detonation_power | string | Potência da explosão no impacto |
yield | number | Rendimento (yield) da explosão (Fireball) |
persistent | boolean | Se o projétil persiste (predefinição true) |
effect | string | Nome de EntityEffect a reproduzir ao surgir |
incendiary | boolean | Se a explosão é incendiária |
gravity | boolean | Se o projétil tem gravidade |
glowing | boolean | Efeito de brilho |
invulnerable | boolean | Se o projétil é invulnerável |
track | boolean | Se deve seguir o alvo |
spawn_at_origin | boolean | Surgir na origem em vez de com deslocamento |
direction_only | boolean | Usar apenas a direção, ignorar o alvo |
on_land | function | Callback (landing_location, spawned_entity) |
Exemplo
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 um boss de reforço a partir de um ficheiro de configuração.
| Parâmetro | Tipo | Notas |
|---|---|---|
filename | string | Nome do ficheiro de configuração do boss |
zoneOrLocation | tabela de localização ou zona | Localização de spawn ou definição de zona opcional. Por predefinição, a localização do boss. |
level | number | Nível de reforço opcional. Por predefinição 0, o que permite ao auxiliar de invocação herdar/resolver o nível normalmente. |
Exemplo
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()
Remove o boss do mundo.
Exemplo
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)
Devolve um array de wrappers de jogador dentro do alcance do boss.
| Parâmetro | Tipo | Notas |
|---|---|---|
range | number | Raio em blocos |
Exemplo
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()
Devolve o número, em tempo real, de jogadores que causaram dano a este boss. Ao contrário do campo damager_count, este realiza uma verificação em tempo real.
boss:get_target_player()
Devolve o alvo atual do mob (boss) como um wrapper de jogador, ou nil se o alvo não for um jogador ou não estiver definido.
Métodos de zona e partículas
Estes métodos combinam zonas com efeitos de partículas. Requerem uma tabela de zona como entrada.
boss:get_nearby_players_in_zone(zone)
Devolve um array de wrappers de jogador para todos os jogadores que se encontram atualmente dentro da zona indicada.
| Parâmetro | Tipo | Notas |
|---|---|---|
zone | tabela de zona | Uma definição de forma de zona |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Preenche o interior de uma zona com partículas.
| Parâmetro | Tipo | Notas |
|---|---|---|
zone | tabela de zona | Forma de zona a preencher |
particle | string | Nome do tipo de partícula |
... | Parâmetros de partícula adicionais | |
coverage | number (opcional) | Fator de cobertura da densidade de partículas |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Contorna a borda de uma zona com partículas.
| Parâmetro | Tipo | Notas |
|---|---|---|
zone | tabela de zona | Forma de zona a contornar |
particle | string | Nome do tipo de partícula |
... | Parâmetros de partícula adicionais | |
coverage | number (opcional) | Fator de cobertura da densidade de partículas |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Faz surgir partículas direcionais que viajam do boss em direção a uma zona.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
zone | tabela de zona | Zona alvo | |
particle | string | Nome do tipo de partícula | |
speed | number | nil | Velocidade de viagem da partícula |
boss:get_particles_toward_self(zone, particle, speed?)
Faz surgir partículas direcionais que viajam de uma zona em direção ao boss.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
zone | tabela de zona | Zona de origem | |
particle | string | Nome do tipo de partícula | |
speed | number | nil | Velocidade de viagem da partícula |
boss:spawn_particles_with_vector(particles)
Faz surgir um array de partículas direcionais, cada uma com a sua própria posição e vetor de velocidade.
| Parâmetro | Tipo | Notas |
|---|---|---|
particles | array de tabelas | Cada entrada define uma partícula com posição e direção |
Métodos do Ender Dragon
Estes métodos só se aplicam quando a entidade do boss é um Ender Dragon.
boss:get_ender_dragon_phase()
Devolve o nome da EnderDragon.Phase atual como uma string, ou nil se o boss não for um Ender Dragon.
boss:set_ender_dragon_phase(phase)
Define a fase do Ender Dragon.
| Parâmetro | Tipo | Notas |
|---|---|---|
phase | string | Nome de EnderDragon.Phase (por exemplo, "CIRCLING", "CHARGE_PLAYER") |
Métodos de suporte a poderes especiais
Estes métodos suportam mecânicas de poderes incorporadas no EliteMobs a partir de scripts Lua.
boss:start_tracking_fireball_system(speed?)
Inicia o sistema de IA de bolas de fogo de perseguição no boss. O boss lançará periodicamente bolas de fogo que perseguem o seu alvo.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
speed | number | 0.5 | Velocidade da bola de fogo |
boss:handle_spirit_walk_damage(cause)
Trata o comportamento de caminhada espiritual (spirit walk) para a causa de dano indicada. A caminhada espiritual torna o boss imune a certos tipos de dano e teletransporta-o para trás do atacante.
| Parâmetro | Tipo | Notas |
|---|---|---|
cause | string | Nome de DamageCause do Bukkit (por exemplo, "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Devolve true se o boss tiver atualmente uma parede de escudo ativa.
boss:initialize_shield_wall(charges?)
Ativa uma parede de escudo no boss que pode absorver o dano recebido.
| Parâmetro | Tipo | Predefinição | Notas |
|---|---|---|---|
charges | number | 1 | Número de golpes que o escudo pode absorver |
boss:shield_wall_absorb_damage(player, damage)
Tenta absorver dano com a parede de escudo. Devolve true se o dano foi absorvido, false se o escudo estiver inativo ou esgotado.
| Parâmetro | Tipo | Notas |
|---|---|---|
player | wrapper de jogador | O jogador atacante |
damage | number | Quantidade de dano a absorver |
boss:deactivate_shield_wall()
Desativa a parede de escudo do boss, removendo quaisquer cargas restantes.
boss:start_zombie_necronomicon(target, file)
Inicia o poder necronomicon de zombies num alvo, fazendo surgir reforços mortos-vivos a partir de um ficheiro de configuração.
| Parâmetro | Tipo | Notas |
|---|---|---|
target | wrapper de entidade | Entidade alvo para o necronomicon |
file | string | Nome do ficheiro de configuração do boss para os mortos-vivos invocados |
context.players
Auxiliares de consulta de jogadores centrados no boss. Use estes para encontrar jogadores sem precisar de um jogador específico do evento.
| Método | Devolve | Notas |
|---|---|---|
players:current_target() | wrapper de jogador ou nil | O jogador do evento ou o alvo do mob (boss) se for um jogador |
players:nearby_players(radius) | array de wrappers de jogador | Todos os jogadores dentro do raio do boss |
players:all_players_in_world() | array de wrappers de jogador | Todos os jogadores no mundo do boss |
Exemplo
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
}
Exemplo
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
Auxiliares gerais de consulta de entidades centrados no boss.
| Método | Devolve | Notas |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | array de wrappers de entidade | Entidades próximas em torno do boss |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | array de wrappers de entidade | Entidades dentro de uma caixa alinhada aos eixos |
entities:get_all_entities([filter]) | array de wrappers de entidade | Todas as entidades correspondentes no mundo do boss |
entities:get_direct_target_entity() | wrapper de entidade ou nil | Alvo direto para o evento atual |
entities:get_boss_spawn_location() | tabela de localização | A localização de spawn original do boss |
Filtros válidos: living (predefinição), player / players, elite / elites, mob / mobs, all / entities
Exemplo
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
}
Exemplo
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
}
