Pular para o conteúdo principal

Scripting Lua: Boss e Entidades

webapp_banner.jpg

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_location e maximum_health sã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() e is_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.

CampoTipoNotas
entity.namestringNome de exibição
entity.uuidstringUUID como texto
entity.entity_typestringNome do EntityType do Bukkit (por exemplo, "ZOMBIE", "PLAYER")
entity.is_playerbooleantrue para jogadores
entity.is_elitebooleantrue se o EliteMobs o regista como um elite
entity.is_mountbooleantrue se este wrapper representa uma montaria de boss
entity.is_monsterbooleantrue para entidades do tipo monstro
entity.is_validbooleanFlag de validade do instantâneo
entity.healthnumberVida atual (instantâneo)
entity.maximum_healthnumberVida máxima (instantâneo)
entity.current_locationtabela de localizaçãoPosiçã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âmetroTipoNotas
textstringMensagem 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âmetroTipoNotas
messagestringTexto 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âmetroTipoPredefiniçãoNotas
titlestringTexto do título
subtitlestring""Texto do subtítulo
fadeInnumber10Ticks de aparecimento gradual
staynumber40Ticks de permanência
fadeOutnumber10Ticks 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âmetroTipoPredefiniçãoNotas
titlestringTexto do título da barra
colorstring"WHITE"Valor de BarColor
stylestring"SOLID"Valor de BarStyle
durationnumber40Duraçã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âmetroTipoNotas
locationtabela de localizaçãoDestino
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âmetroTipoNotas
vectortabela 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âmetroTipoPredefiniçãoNotas
vectortabela de vetorDireção e força
additivebooleanfalseAdicionar à velocidade existente em vez de substituir
delaynumber1Atraso 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âmetroTipoNotas
directionOrLocationtabela de vetor ou de localizaçãoAlvo 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âmetroTipoNotas
ticksnumberDuraçã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âmetroTipoPredefiniçãoNotas
ticksnumber1Quantidade 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âmetroTipoPredefiniçãoNotas
effectstringNome de PotionEffectType
durationnumberDuração em ticks
amplifiernumber0Ní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
}

cuidado

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étodoNotas
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âmetroTipoNotas
amountnumberQuantidade 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âmetroTipoPredefiniçãoNotas
enabledbooleantrue para ativar a invulnerabilidade
durationnumbernilReverte 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âmetroTipoPredefiniçãoNotas
enabledbooleantrue para ativar a IA
durationnumbernilReverte 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étodoParâmetroNotas
add_tag(tag[, duration])string, number opcionalAdiciona a etiqueta, opcionalmente removendo-a automaticamente após ticks
remove_tag(tag)stringRemove a etiqueta
has_tag(tag)stringDevolve 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âmetroTipoNotas
commandstringTexto 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âmetroTipoPredefiniçãoNotas
scalenumberMultiplicador de escala
durationnumbernilReverte 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âmetroTipoNotas
enabledbooleantrue 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âmetroTipoPredefiniçãoNotas
soundstringChave de som do Minecraft (por exemplo, "entity.ender_dragon.growl")
volumenumber1.0Volume
pitchnumber1.0Tom (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âmetroTipoPredefiniçãoNotas
particleOrSpecstring ou tabelaNome da partícula ou tabela de especificação
countnumber1Nú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âmetroTipoPredefiniçãoNotas
locationtabela de localizaçãoLocalização alvo
particlestringNome do tipo de partícula
countnumber1Nú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âmetroTipoNotas
namestringNome 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étodoDevolveNotas
entity:is_inside_vehicle()booleanTrue se a entidade estiver a montar outra entidade.
entity:has_vehicle()booleanTrue se a entidade tiver atualmente um veículo.
entity:get_vehicle()wrapper de entidade ou nilDevolve o wrapper do veículo atual.
entity:set_vehicle(vehicle)booleanFaz esta entidade montar vehicle.
entity:leave_vehicle()booleanFaz esta entidade abandonar o seu veículo atual.
entity:has_passengers()booleanTrue se esta entidade tiver passageiros.
entity:get_passenger_count()numberNúmero de passageiros.
entity:get_passengers()tableArray de wrappers de passageiro.
entity:add_passenger(passenger)booleanAdiciona um passageiro a esta entidade.
entity:remove_passenger(passenger)booleanRemove um passageiro desta entidade.
entity:eject_passengers()booleanEjeta 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âmetroTipoPredefiniçãoNotas
sourcelocalização ou wrapperOrigem do impulso
strengthnumber1.0Multiplicador da força do impulso
xOffsetnumber0Deslocamento X adicional
yOffsetnumber0Deslocamento Y adicional
zOffsetnumber0Deslocamento 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âmetroTipoPredefiniçãoNotas
materialstringNome do material do bloco
durationnumber0Ticks antes da remoção
requireAirbooleanfalseSó 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âmetroTipoPredefiniçãoNotas
awarebooleantrue para ativar a perceção
durationnumbernilReverte 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âmetroTipoPredefiniçãoNotas
centertabela de localizaçãoCentro da caixa de teste
halfXnumber0.5Meia-largura no eixo X
halfYnumberigual a halfXMeia-altura no eixo Y
halfZnumberigual a halfXMeia-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âmetroTipoNotas
visiblebooleantrue para sempre visível

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

Define o equipamento na entidade.

ParâmetroTipoPredefiniçãoNotas
slotstringSlot de equipamento: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND"
materialstringNome do material (por exemplo, "DIAMOND_SWORD", "IRON_HELMET")
optionstable{}Definições opcionais (ver abaixo)

Tabela de opções:

ChaveTipoPredefiniçãoNotas
enchantmentsarray de tabelasnilCada entrada: { type = "SHARPNESS", level = 2 }
unbreakablebooleanfalseSe 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étodoNotas
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.

cuidado

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

CampoTipoNotas
game_modestringNome do modo de jogo atual (por exemplo, "SURVIVAL")

Métodos exclusivos do jogador

MétodoNotas
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.

dica

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

CampoTipoNotas
boss.namestringNome de exibição
boss.uuidstringUUID do elite (boss)
boss.entity_typestringNome do EntityType do Bukkit
boss.is_monsterbooleantrue se a entidade subjacente for um Monster
boss.levelnumberNível do elite
boss.healthnumberVida atual (instantâneo)
boss.maximum_healthnumberVida máxima (instantâneo)
boss.damager_countnumberNúmero de causadores de dano (instantâneo)
boss.is_in_combatbooleanEstado de combate
boss.existsbooleanSe o elite ainda existe
boss.current_locationtabela de localizaçãoPosiçã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âmetroTipoPredefiniçãoNotas
enabledbooleantrue para ativar a IA
durationnumbernilReverte 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âmetroTipoNotas
locationtabela de localizaçãoDestino
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âmetroTipoNotas
vectortabela 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âmetroTipoNotas
amountnumberQuantidade 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âmetroTipoPredefiniçãoNotas
soundstringChave de som do Minecraft (por exemplo, "entity.wither.spawn")
volumenumber1.0Volume
pitchnumber1.0Tom (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âmetroTipoPredefiniçãoNotas
particleOrSpecstring ou tabelaNome da partícula ou tabela de especificação
countnumber1Nú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âmetroTipoNotas
namestringNome 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âmetroTipoNotas
vectorOrLocationtabela de vetor ou de localizaçãoDireçã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âmetroTipoPredefiniçãoNotas
locationtabela de localizaçãoDestino
speednumber1.0Multiplicador da velocidade de movimento
followbooleanfalseSeguir continuamente o alvo
timeoutnumbernilCancelar 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âmetroTipoPredefiniçãoNotas
messagestringTexto da mensagem com códigos de cor
rangenumber20Raio 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âmetroTipoPredefiniçãoNotas
entityTypestringTipo de entidade (por exemplo, "FIREBALL", "ARROW")
origintabela de localizaçãoPosição de lançamento
destinationtabela de localizaçãoPosição alvo
speednumber1.0Velocidade do projétil
optionstable{}Ver opções abaixo

Tabela de opções:

ChaveTipoNotas
durationnumberRemover automaticamente após ticks
max_ticksnumberMáximo de ticks para monitorizar a aterragem
custom_damagenumberDano no impacto
detonation_powerstringPotência da explosão no impacto
yieldnumberRendimento (yield) da explosão (Fireball)
persistentbooleanSe o projétil persiste (predefinição true)
effectstringNome de EntityEffect a reproduzir ao surgir
incendiarybooleanSe a explosão é incendiária
gravitybooleanSe o projétil tem gravidade
glowingbooleanEfeito de brilho
invulnerablebooleanSe o projétil é invulnerável
trackbooleanSe deve seguir o alvo
spawn_at_originbooleanSurgir na origem em vez de com deslocamento
direction_onlybooleanUsar apenas a direção, ignorar o alvo
on_landfunctionCallback (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âmetroTipoNotas
filenamestringNome do ficheiro de configuração do boss
zoneOrLocationtabela de localização ou zonaLocalização de spawn ou definição de zona opcional. Por predefinição, a localização do boss.
levelnumberNí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âmetroTipoNotas
rangenumberRaio 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âmetroTipoNotas
zonetabela de zonaUma definição de forma de zona

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

Preenche o interior de uma zona com partículas.

ParâmetroTipoNotas
zonetabela de zonaForma de zona a preencher
particlestringNome do tipo de partícula
...Parâmetros de partícula adicionais
coveragenumber (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âmetroTipoNotas
zonetabela de zonaForma de zona a contornar
particlestringNome do tipo de partícula
...Parâmetros de partícula adicionais
coveragenumber (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âmetroTipoPredefiniçãoNotas
zonetabela de zonaZona alvo
particlestringNome do tipo de partícula
speednumbernilVelocidade 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âmetroTipoPredefiniçãoNotas
zonetabela de zonaZona de origem
particlestringNome do tipo de partícula
speednumbernilVelocidade 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âmetroTipoNotas
particlesarray de tabelasCada 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âmetroTipoNotas
phasestringNome 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âmetroTipoPredefiniçãoNotas
speednumber0.5Velocidade 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âmetroTipoNotas
causestringNome 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âmetroTipoPredefiniçãoNotas
chargesnumber1Nú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âmetroTipoNotas
playerwrapper de jogadorO jogador atacante
damagenumberQuantidade 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âmetroTipoNotas
targetwrapper de entidadeEntidade alvo para o necronomicon
filestringNome 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étodoDevolveNotas
players:current_target()wrapper de jogador ou nilO jogador do evento ou o alvo do mob (boss) se for um jogador
players:nearby_players(radius)array de wrappers de jogadorTodos os jogadores dentro do raio do boss
players:all_players_in_world()array de wrappers de jogadorTodos 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étodoDevolveNotas
entities:get_nearby_entities(radius[, filter])array de wrappers de entidadeEntidades próximas em torno do boss
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter])array de wrappers de entidadeEntidades dentro de uma caixa alinhada aos eixos
entities:get_all_entities([filter])array de wrappers de entidadeTodas as entidades correspondentes no mundo do boss
entities:get_direct_target_entity()wrapper de entidade ou nilAlvo direto para o evento atual
entities:get_boss_spawn_location()tabela de localizaçãoA 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
}

Próximos passos