Pular para o conteúdo principal

Motor de Scripting Lua do MagmaCore

O MagmaCore fornece um motor de scripting Lua compartilhado utilizado por vários plugins da Nightbreak. O motor lida com sandboxing, agendamento, gerenciamento de zonas, interação com o mundo, tabelas de entidades e interface do jogador -- tudo com uma API consistente entre plugins.

Atualmente, os seguintes plugins utilizam este motor:

  • EliteMobs -- Poderes Lua para bosses personalizados (hooks como on_boss_damaged_by_player, on_enter_combat, etc.)
  • FreeMinecraftModels -- Scripts Lua para props e itens personalizados (hooks como on_right_click, on_left_click, on_equip, etc.)

Esta pagina documenta as funcionalidades compartilhadas do motor. Para hooks, APIs e fluxos de trabalho especificos de cada plugin, consulte as paginas dos plugins linkadas acima.


Introducao Rapida ao Lua

Se voce e completamente novo em Lua, aqui esta a sintaxe minima necessaria para escrever scripts para qualquer plugin da Nightbreak.

Variaveis

Use local para armazenar um valor:

local cooldown_key = "fire_burst"
local damage_multiplier = 1.5

local significa que a variavel pertence apenas a este arquivo ou bloco.

Funcoes

Funcoes sao blocos reutilizaveis de logica:

local function warn_player(player)
player:send_message("&cMove!")
end

Depois, voce pode chama-la:

warn_player(some_player)

Verificacoes com if

Use if quando algo deve acontecer apenas em certas situacoes:

if context.player == nil then
return
end

Isso significa "se nao houver jogador para este hook, pare aqui".

nil

nil significa "sem valor". E a versao do Lua para "nao ha nada aqui".

Voce frequentemente verificara nil com:

if context.event ~= nil then
-- fazer algo com o evento
end

~= significa "nao e igual a".

Tabelas

Lua usa tabelas para varias finalidades:

  • Listas
  • Objetos com chaves nomeadas
  • A definicao final do script retornado

Exemplo de uma tabela com chaves nomeadas:

local particle = {
particle = "FLAME",
amount = 1,
speed = 0.05
}

Retornando a definicao do script

No final de cada arquivo de script, voce retorna uma tabela:

return {
api_version = 1,

on_spawn = function(context)
end
}

Essa tabela retornada e o arquivo de script.

Comentarios

Use -- para escrever uma nota para humanos:

-- Este cooldown impede o ataque de disparar a cada golpe
context.cooldowns:set_local(60, "fire_burst")

Sandbox Lua

Todos os scripts Lua rodam dentro de um ambiente LuaJ com sandbox. Varios globais que poderiam acessar o sistema de arquivos ou o runtime Java sao removidos. As regras do sandbox sao identicas em todos os plugins que usam o MagmaCore.

Globais Removidos

Os seguintes globais padrao do Lua sao definidos como nil e nao podem ser usados:

RemovidoMotivo
debugExpoe o estado interno da VM
dofileAcesso ao sistema de arquivos
ioAcesso ao sistema de arquivos
loadCarregamento arbitrario de codigo
loadfileAcesso ao sistema de arquivos
luajavaAcesso direto a classes Java
moduleSistema de modulos (nao necessario)
osAcesso ao sistema operacional
packageSistema de modulos (nao necessario)
requireSistema de modulos / acesso ao sistema de arquivos

Biblioteca Padrao Disponivel

Todo o resto da biblioteca padrao do Lua funciona normalmente:

CategoriaFuncoes
Matematicamath.abs, math.ceil, math.floor, math.max, math.min, math.random, math.sin, math.cos, math.sqrt, math.pi, e todas as outras funcoes math.*
Stringstring.byte, string.char, string.find, string.format, string.gsub, string.len, string.lower, string.match, string.rep, string.sub, string.upper, e todas as outras funcoes string.*
Tabelatable.insert, table.remove, table.sort, table.concat, e todas as outras funcoes table.*
Iteradorespairs, ipairs, next
Tipotype, tostring, tonumber, select, unpack
Tratamento de errospcall, xpcall, error, assert
Outrosprint, rawget, rawset, rawequal, rawlen, setmetatable, getmetatable
A biblioteca os nao esta disponivel

A biblioteca os e completamente removida do sandbox. Se voce precisar de informacoes de tempo, use context.world:get_time() para o tempo do mundo ou armazene timestamps em context.state usando contadores de ticks com on_tick / on_game_tick.

dica

print escreve no console do servidor, mas prefira context.log:info(msg) para saida. Mensagens de log sao prefixadas com o nome do arquivo do script, facilitando rastrear qual script produziu a mensagem.


Contrato do Arquivo

Cada script Lua deve retornar (return) uma tabela. Essa tabela e intencionalmente rigorosa.

Campos de Nivel Superior Obrigatorios e Opcionais

CampoObrigatorioTipoNotas
api_versionSimNumberAtualmente deve ser 1
priorityNaoNumberPrioridade de execucao. Valores menores rodam primeiro. Padrao e 0
chaves de hook suportadasNaoFunctionDeve usar um dos nomes exatos de hook suportados pelo plugin

Regras de Validacao

  • O arquivo deve retornar uma tabela.
  • api_version e obrigatorio e atualmente deve ser 1.
  • priority deve ser numerico se presente.
  • Cada chave extra de nivel superior deve ser um nome de hook suportado.
  • Cada chave de hook deve apontar para uma funcao.
  • Chaves de nivel superior desconhecidas sao rejeitadas.

Funcoes auxiliares e constantes locais devem ficar acima do return final, nao dentro da tabela retornada, a menos que sejam hooks reais.

local ANIMATION_NAME = "idle"

local function do_something(context)
context.log:info("Doing something!")
end

return {
api_version = 1,
priority = 0,

on_spawn = function(context)
do_something(context)
end
}

Sintaxe de Metodo: : vs .

Em Lua, object:method(arg) e uma abreviacao para object.method(object, arg). A API do MagmaCore aceita ambas as formas, entao qualquer uma funciona:

context.log:info("hello")
context.log.info("hello") -- mesma coisa

Toda a documentacao usa : de forma consistente.


Orcamento de Execucao

Cada invocacao de hook e cada invocacao de callback sao cronometradas. Se uma unica chamada demorar mais de 50 milissegundos, o script e desabilitado com um aviso no console:

[Lua] my_script.lua took 73ms in 'on_game_tick' (limit: 50ms) -- script disabled to prevent lag.

Para se manter dentro do orcamento:

  • Evite loops sem limite dentro de hooks.
  • Mantenha os handlers on_game_tick / on_tick leves -- eles rodam a cada tick.
  • Use context.scheduler:run_repeating(...) para distribuir trabalho entre ticks.
  • Mova trabalho pesado para tras de um cooldown baseado em estado ou um intervalo razoavel.

context.state

Uma tabela Lua simples que persiste durante toda a vida da instancia do script. Use-a para armazenar flags, contadores, IDs de tarefas, estados de alternancia e quaisquer dados que voce precise compartilhar entre hooks.

on_spawn = function(context)
context.state.is_open = false
context.state.click_count = 0
context.state.task_id = nil
end,

on_right_click = function(context)
context.state.click_count = (context.state.click_count or 0) + 1
end
info

Apenas context.state persiste entre chamadas de hook. Todas as outras tabelas de contexto (context.prop, context.world, context.event, etc.) sao reconstruidas a cada vez. context.state nao e reconstruida -- ela sobrevive desde o momento em que a instancia do script e criada ate ser destruida.


context.log

Metodos de log no console. As mensagens sao prefixadas com o nome do arquivo do script no console do servidor.

MetodoNotas
log:info(message)Mensagem informativa
log:warn(message)Mensagem de aviso
log:error(message)Mensagem de nivel de aviso (registrada no nivel WARN, igual a log:warn)
log:debug(message)Mensagem de depuracao (aparece como nivel info com um prefixo de depuracao)
context.log:info("Script loaded!")
context.log:warn("Something unexpected happened")
context.log:error("Critical failure in zone setup")
context.log:debug("State value: " .. tostring(context.state.counter))

context.cooldowns

A tabela cooldowns gerencia cooldowns baseados em tempo para seus scripts. Existem dois escopos:

  • Cooldowns locais sao por instancia de script e identificados por uma chave string. Se nenhuma chave for fornecida, o nome do arquivo do script e usado como chave padrao.
  • Cooldowns globais sao compartilhados entre todos os scripts no mesmo proprietario de entidade (por exemplo, todos os scripts no mesmo prop, ou todos os poderes Lua no mesmo boss).

cooldowns:check_local(key?, duration)

O metodo mais comum. Verifica se o cooldown esta pronto e, se estiver, inicia-o e retorna true. Se nao estiver pronto, retorna false. E um check-and-set atomico — sem condicoes de corrida.

ParametroTipoNotas
keystring (opcional)Identificador do cooldown. Padrao e o nome do arquivo do script.
durationintDuracao do cooldown em ticks (20 = 1 segundo)
on_right_click = function(context)
-- Only allow this action once every 3 seconds
if not context.cooldowns:check_local("interact", 60) then
return
end
-- ... do the action
end

cooldowns:local_ready(key?)

Retorna true se o cooldown local expirou (ou nunca foi definido), false se ainda esta ativo.

cooldowns:local_remaining(key?)

Retorna o numero de ticks restantes no cooldown local, ou 0 se esta pronto.

cooldowns:set_local(duration, key?)

Define um cooldown local sem verificar se ja existe um ativo. Use para reinicializacoes incondicionais de cooldown.

ParametroTipoNotas
durationintDuracao em ticks. Passe 0 ou negativo para limpar.
keystring (opcional)Identificador do cooldown. Padrao e o nome do arquivo do script.

cooldowns:global_ready()

Retorna true se o cooldown global (compartilhado entre todos os scripts na mesma entidade) expirou.

cooldowns:set_global(duration)

Define o cooldown global.

ParametroTipoNotas
durationintDuracao em ticks
Cooldowns globais do EliteMobs

Nos scripts de poderes do EliteMobs, global_ready() e set_global() usam o sistema de cooldown de poderes integrado do boss, que e compartilhado entre todos os poderes Lua do mesmo boss. Cooldowns locais no EliteMobs tambem sao compartilhados entre todos os poderes na mesma entidade boss (identificados pela sua string escolhida).


context.scheduler

O agendador permite executar tarefas com atraso e tarefas repetidas. Todas as tarefas pertencem a instancia do script e sao canceladas automaticamente quando a instancia do script e destruida (por exemplo, quando um prop e removido ou um boss morre).

scheduler:run_later(ticks, callback)

Executa um callback uma vez apos um atraso. Retorna um ID numerico de tarefa.

ParametroTipoNotas
ticksintAtraso em ticks do servidor (20 ticks = 1 segundo)
callbackfunctionChamado com um context novo quando o atraso expira
context.scheduler:run_later(40, function(delayed_context)
delayed_context.log:info("2 seconds have passed!")
end)

scheduler:run_repeating(delay, interval, callback)

Executa um callback repetidamente em um intervalo fixo. Retorna um ID numerico de tarefa.

ParametroTipoNotas
delayintAtraso inicial em ticks antes da primeira execucao
intervalintTicks entre cada execucao subsequente
callbackfunctionChamado com um context novo a cada intervalo
context.state.particle_task = context.scheduler:run_repeating(0, 20, function(tick_context)
tick_context.log:info("Another second passed!")
end)

scheduler:cancel(taskId)

Cancela uma tarefa agendada pelo seu ID.

ParametroTipoNotas
taskIdintO ID da tarefa retornado por run_later ou run_repeating
Sempre cancele tarefas repetidas

Se voce iniciar uma tarefa repetida, sempre cancele-a no seu hook de limpeza (on_destroy para props, on_exit_combat / on_death para bosses, on_unequip para itens). Esquecer de cancelar deixa uma tarefa em segundo plano rodando ate que a instancia do script seja destruida, o que desperdiça desempenho e pode causar erros.

Callbacks recebem contexto novo

Callbacks agendados recebem um contexto novo como parametro. Sempre use o argumento de contexto do proprio callback, nao o context externo do hook que criou o callback. O contexto externo pode conter referencias desatualizadas.


context.world

A tabela world fornece metodos para consultar e interagir com o mundo do Minecraft. Ela e construida a partir do mundo atual da entidade.

Extensoes especificas de plugins

O EliteMobs estende context.world com metodos adicionais para spawnar bosses, reforcos, blocos caindo, fogos de artificio, pocoes de splash e blocos temporarios. Consulte EliteMobs Mundo e Ambiente para a API estendida completa. Os metodos documentados aqui estao disponiveis em todos os plugins.

world.name

Um campo string contendo o nome do mundo.


world:get_block_at(x, y, z)

Retorna o nome do material do bloco nas coordenadas fornecidas como uma string em minusculas (por exemplo, "stone", "air").

ParametroTipoNotas
xintCoordenada X do bloco
yintCoordenada Y do bloco
zintCoordenada Z do bloco

world:set_block_at(x, y, z, material)

Define o bloco nas coordenadas fornecidas. Executa na thread principal.

ParametroTipoNotas
xintCoordenada X do bloco
yintCoordenada Y do bloco
zintCoordenada Z do bloco
materialstringNome do Material Bukkit, em minusculas (por exemplo, "stone", "air", "oak_planks")

Retorna true se o bloco foi definido com sucesso, false caso contrario.


world:spawn_particle(particle, x, y, z, count, dx, dy, dz, speed)

Gera particulas em uma localizacao.

ParametroTipoPadraoNotas
particlestringobrigatorioNome do enum Particle do Bukkit, MAIUSCULAS (por exemplo, "FLAME", "DUST")
xnumberobrigatorioCoordenada X
ynumberobrigatorioCoordenada Y
znumberobrigatorioCoordenada Z
countint1Numero de particulas
dxnumber0Dispersao/deslocamento X
dynumber0Dispersao/deslocamento Y
dznumber0Dispersao/deslocamento Z
speednumber0Velocidade da particula
Particulas que requerem dados

Alguns tipos de particulas requerem dados de bloco ou item que nao sao suportados por esta API simples. BLOCK_CRACK, FALLING_DUST, BLOCK_DUST e ITEM_CRACK falharao ou nao produzirao efeito visivel. Use alternativas sem dados: CLOUD, SMOKE, CAMPFIRE_COSY_SMOKE, SNOWFLAKE, FLAME, DUST, etc.


world:play_sound(sound, x, y, z, volume, pitch)

Reproduz um som em uma localizacao.

ParametroTipoPadraoNotas
soundstringobrigatorioNome do enum Sound do Bukkit, MAIUSCULAS (por exemplo, "ENTITY_EXPERIENCE_ORB_PICKUP")
xnumberobrigatorioCoordenada X
ynumberobrigatorioCoordenada Y
znumberobrigatorioCoordenada Z
volumenumber1.0Volume
pitchnumber1.0Tom

world:strike_lightning(x, y, z)

Gera um raio em uma localizacao (visual e causa dano).

ParametroTipoNotas
xnumberCoordenada X
ynumberCoordenada Y
znumberCoordenada Z

world:get_time()

Retorna o tempo atual do mundo em ticks.


world:set_time(ticks)

Define o tempo do mundo.

ParametroTipoNotas
ticksintTempo do mundo (0 = amanhecer, 6000 = meio-dia, 13000 = noite, 18000 = meia-noite)

world:get_nearby_entities(x, y, z, radius)

Retorna um array de tabelas wrapper de entidades para todas as entidades dentro de uma caixa delimitadora centrada nas coordenadas fornecidas.

ParametroTipoNotas
xnumberCentro X
ynumberCentro Y
znumberCentro Z
radiusnumberRaio de busca (usado como meia-extensao nos tres eixos)
cuidado

Isso retorna TODAS as entidades no alcance, incluindo entidades nao-vivas (armor stands, itens dropados, etc.). Sempre verifique com if entity.damage then antes de chamar metodos de entidades vivas.


world:get_nearby_players(x, y, z, radius)

Retorna um array de tabelas wrapper de jogadores para todos os jogadores dentro de uma caixa delimitadora centrada nas coordenadas fornecidas.

ParametroTipoNotas
xnumberCentro X
ynumberCentro Y
znumberCentro Z
radiusnumberRaio de busca

world:spawn_entity(entity_type, x, y, z)

Gera uma entidade vanilla do Minecraft na localizacao fornecida.

ParametroTipoNotas
entity_typestringNome do tipo de entidade Bukkit, em minusculas (por exemplo, "zombie", "skeleton", "pig")
xnumberCoordenada X
ynumberCoordenada Y
znumberCoordenada Z

Retorna uma tabela de entidade para a entidade gerada (com metodos de entidade viva se aplicavel), ou nil se o tipo de entidade for invalido.


world:get_highest_block_y(x, z)

Retorna a coordenada Y do bloco nao-ar mais alto na posicao X/Z fornecida.

ParametroTipoNotas
xintCoordenada X do bloco
zintCoordenada Z do bloco

world:raycast(from_x, from_y, from_z, dir_x, dir_y, dir_z, [max_distance])

Lanca um raio a partir de um ponto em uma direcao e retorna informacoes sobre o que ele atinge.

ParametroTipoPadraoNotas
from_xnumberobrigatorioOrigem X
from_ynumberobrigatorioOrigem Y
from_znumberobrigatorioOrigem Z
dir_xnumberobrigatorioComponente X da direcao
dir_ynumberobrigatorioComponente Y da direcao
dir_znumberobrigatorioComponente Z da direcao
max_distancenumber50Distancia maxima do raio

Retorna uma tabela com os seguintes campos:

CampoTipoNotas
hit_entitytabela de entidade ou nilA primeira entidade atingida pelo raio, ou nil se nenhuma
hit_locationtabela de localizacao ou nilO ponto exato onde o raio atingiu algo
hit_blocktabela ou nil{x, y, z, material} do bloco atingido, ou nil se nenhum bloco foi atingido

world:spawn_firework(x, y, z, colors, [type], [power])

Gera um foguete de fogos de artificio na localizacao fornecida.

ParametroTipoPadraoNotas
xnumberobrigatorioCoordenada X
ynumberobrigatorioCoordenada Y
znumberobrigatorioCoordenada Z
colorstableobrigatorioArray de strings de cores, por exemplo {"RED", "BLUE", "WHITE"}
typestring"BALL"Formato do fogo de artificio: "BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER"
powerint1Potencia de voo, 0-127
-- Exemplo: explosao de fogos de artificio vermelho e dourado
context.world:spawn_firework(loc.x, loc.y, loc.z, {"RED", "GOLD"}, "BURST", 2)

world:place_temporary_block(x, y, z, material, [ticks], [require_air])

Coloca um bloco que automaticamente reverte ao seu estado original apos um atraso.

ParametroTipoPadraoNotas
xintobrigatorioCoordenada X do bloco
yintobrigatorioCoordenada Y do bloco
zintobrigatorioCoordenada Z do bloco
materialstringobrigatorioNome do Material Bukkit (por exemplo, "stone", "ice")
ticksint0Duracao em ticks antes do bloco reverter. 0 significa permanente.
require_airbooleanfalseSe true, so coloca o bloco se o alvo for ar

Retorna true se o bloco foi colocado, false se o material era invalido ou o requisito de ar nao foi atendido.


world:drop_item(x, y, z, material, [amount])

Dropa uma entidade de item na localizacao fornecida com dispersao natural.

ParametroTipoPadraoNotas
xnumberobrigatorioCoordenada X
ynumberobrigatorioCoordenada Y
znumberobrigatorioCoordenada Z
materialstringobrigatorioNome do Material Bukkit
amountint1Tamanho do stack

Retorna uma tabela de entidade para o item dropado, ou nil se o material era invalido.


context.zones

A tabela zones permite criar zonas espaciais e monitorar eventos de entrada/saida de jogadores. As zonas sao vinculadas a instancia do script e limpas automaticamente quando a instancia do script e destruida.

zones:create_sphere(x, y, z, radius)

Cria uma zona esferica centrada nas coordenadas fornecidas. Retorna um handle numerico de zona.

ParametroTipoNotas
xnumberCentro X
ynumberCentro Y
znumberCentro Z
radiusnumberRaio da esfera

zones:create_cylinder(x, y, z, radius, height)

Cria uma zona cilindrica. Retorna um handle numerico de zona.

ParametroTipoNotas
xnumberCentro X
ynumberCentro Y (base)
znumberCentro Z
radiusnumberRaio do cilindro
heightnumberAltura do cilindro

zones:create_cuboid(x, y, z, xSize, ySize, zSize)

Cria uma zona cuboide. Retorna um handle numerico de zona.

ParametroTipoNotas
xnumberCentro X
ynumberCentro Y
znumberCentro Z
xSizenumberMeia-extensao em X
ySizenumberMeia-extensao em Y
zSizenumberMeia-extensao em Z

zones:watch(handle, onEnterCallback, onLeaveCallback)

Comeca a monitorar uma zona para eventos de entrada/saida de jogadores. Quando um jogador entra ou sai da zona, o callback correspondente e disparado (e, se definidos, os hooks on_zone_enter / on_zone_leave).

ParametroTipoNotas
handleintHandle de zona de uma chamada create_*
onEnterCallbackfunction ou nilChamado quando um jogador entra na zona
onLeaveCallbackfunction ou nilChamado quando um jogador sai da zona

Retorna true se o monitoramento foi configurado com sucesso, nil se o handle de zona era invalido.

info

Os monitoramentos de zona sao verificados a cada tick do servidor contra todos os jogadores no mesmo mundo. Mantenha a quantidade de zonas razoavel para evitar sobrecarga de desempenho.


zones:unwatch(handle)

Para de monitorar uma zona e limpa seus recursos.

ParametroTipoNotas
handleintHandle de zona para parar de monitorar

Exemplo: Zona de gatilho por proximidade

return {
api_version = 1,

on_spawn = function(context)
local loc = context.prop.current_location -- or context.boss:get_location()
if loc == nil then return end

local handle = context.zones:create_sphere(loc.x, loc.y, loc.z, 5)

context.zones:watch(
handle,
function(player)
context.log:info("Player entered zone!")
end,
function(player)
context.log:info("Player left zone!")
end
)

context.state.zone_handle = handle
end,

on_destroy = function(context)
if context.state.zone_handle then
context.zones:unwatch(context.state.zone_handle)
end
end
}

context.event

A tabela event esta presente quando o hook atual foi acionado por um evento do jogo (por exemplo, on_right_click, on_zone_enter). Ela nao esta presente durante on_tick ou callbacks agendados.

Campo / MetodoTipoNotas
is_cancelledbooleanSe o evento foi cancelado
cancel()methodCancela o evento (impede o comportamento padrao)
uncancel()methodDescancela um evento previamente cancelado
playerentity tableO jogador envolvido no evento, se houver
on_right_click = function(context)
if context.event then
context.event:cancel() -- prevent the default right-click interaction
end
end
Tabela de eventos do EliteMobs

Scripts de poderes do EliteMobs tem uma tabela de eventos mais detalhada com quantidades de dano, causas de dano, referencias ao atacante e metodos de modificacao de dano. Consulte a Referencia da API Lua para os campos completos de eventos do EliteMobs.


Namespace Auxiliar em

A tabela em esta disponivel no momento do carregamento do arquivo (antes de qualquer hook rodar). Ela fornece construtores auxiliares para criar tabelas de localizacao, tabelas de vetores e definicoes de zonas usadas em toda a API.

FuncaoProposito
em.create_location(x, y, z [, world, yaw, pitch])Cria uma tabela de localizacao com nome de mundo, yaw e pitch opcionais. A tabela retornada tambem tem um metodo .add(dx, dy, dz) que desloca a localizacao no local e retorna ela mesma para encadeamento.
em.create_vector(x, y, z)Cria uma tabela de vetor
em.zone.create_sphere_zone(radius)Cria uma definicao de zona esferica
em.zone.create_dome_zone(radius)Cria uma definicao de zona em domo
em.zone.create_cylinder_zone(radius, height)Cria uma definicao de zona cilindrica
em.zone.create_cuboid_zone(x, y, z)Cria uma definicao de zona cuboide
em.zone.create_cone_zone(length, radius)Cria uma definicao de zona conica
em.zone.create_static_ray_zone(length, thickness)Cria uma definicao de zona de raio estatico
em.zone.create_rotating_ray_zone(length, point_radius, animation_duration)Cria uma definicao de zona de raio rotativo
em.zone.create_translating_ray_zone(length, point_radius, animation_duration)Cria uma definicao de zona de raio em translacao

Os construtores de zonas retornam tabelas encadeaveis com :set_center(loc) (ou :set_origin(loc) / :set_destination(loc) dependendo do tipo de zona):

-- No escopo do arquivo: criar uma forma de zona reutilizavel
local blast_zone = em.zone.create_sphere_zone(5)

return {
api_version = 1,

on_spawn = function(context)
-- Ancorar a zona no momento da chamada
blast_zone:set_center(context.boss:get_location())
local entities = context.zones:get_entities_in_zone(blast_zone)
-- ...
end
}
info

O namespace em e particularmente util no EliteMobs, onde definicoes de zonas sao usadas com context.zones:get_entities_in_zone() e context.script. No FreeMinecraftModels, os metodos context.zones:create_sphere(...) / create_cylinder(...) / create_cuboid(...) sao mais comumente usados para zonas simples baseadas em monitoramento.


Tabelas de Entidades

Tabelas de entidades sao retornadas de consultas ao mundo, dados de eventos e callbacks de zonas. Elas fornecem um conjunto em camadas de campos e metodos dependendo do tipo de entidade.

Campos Base de Entidade

CampoTipoNotas
uuidstringO UUID da entidade
entity_typestringO tipo da entidade (por exemplo, "player", "zombie", "skeleton", "villager")
is_validbooleanSe a referencia da entidade ainda e valida
is_deadbooleanSe a entidade esta morta
is_playerbooleanSe a entidade e um jogador
is_hostilebooleanSe a entidade e um mob hostil (zombie, skeleton, etc.)
is_passivebooleanSe a entidade e um mob passivo (cow, pig, chicken, etc.)
current_locationtabela de localizacaoA posicao atual da entidade (x, y, z, world, yaw, pitch)
worldstringO nome do mundo em que a entidade esta

Metodos Base de Entidade

MetodoRetornoNotas
teleport(location_table)voidTeleporta a entidade. A tabela de localizacao deve ter os campos x, y, z, world; yaw e pitch sao opcionais.
remove()voidRemove a entidade do mundo. So atua se a entidade ainda for valida.
set_silent(flag)voidSuprime ou reabilita os sons da entidade.
set_invulnerable(flag)voidTorna a entidade invulneravel ou vulneravel a dano.
set_gravity(flag)voidHabilita ou desabilita a gravidade para a entidade.
set_glowing(flag)voidAlterna o efeito de contorno brilhante na entidade.

Campos de Entidade Viva

Entidades vivas (jogadores, mobs, etc.) tem todos os campos base de entidade mais:

CampoTipoNotas
healthnumberVida atual
maximum_healthnumberVida maxima
namestringNome de exibicao
is_alivebooleanSe a entidade esta viva

Metodos de Entidade Viva

MetodoRetornoNotas
damage(amount)voidCausa a quantidade de dano especificada a entidade
push(x, y, z)voidAplica um impulso de velocidade
set_facing(x, y, z)voidDefine a direcao para onde a entidade olha
add_potion_effect(effect, duration, amplifier)voidAdiciona um efeito de pocao. effect e uma string (por exemplo, "speed", "slowness", "regeneration"). duration e em ticks. amplifier e o nivel do efeito menos 1 (0 = nivel I).
remove_potion_effect(effect)voidRemove um efeito de pocao pelo nome
cuidado

Nem todas as entidades retornadas por get_nearby_entities() sao entidades vivas. Voce pode usar entity.is_player, entity.is_hostile ou entity.is_passive para filtrar por categoria, ou verificar if entity.damage then antes de chamar metodos de entidades vivas como damage(), push() ou add_potion_effect().


Campos de Integracao com Plugins

Tabelas de entidades incluem automaticamente campos para detectar e interagir com entidades gerenciadas por outros plugins da Nightbreak. Esses campos so sao preenchidos quando o plugin relevante esta instalado -- caso contrario, eles assumem false / nil sem nenhuma sobrecarga.

Campos do EliteMobs

Disponiveis quando o EliteMobs esta instalado.

CampoTipoNotas
is_elitebooleanSe a entidade e um elite do EliteMobs
is_custom_bossbooleanSe a entidade e um boss personalizado do EliteMobs (tambem disponivel dentro da subtabela elite)
is_significant_bossbooleanSe a entidade e um boss personalizado com multiplicador de vida acima de 1 (ou seja, um encontro projetado, nao um elite generico)
elitetabela ou nilSubtabela de informacoes do elite (veja abaixo). nil se a entidade nao for um elite.

A subtabela elite contem:

CampoTipoNotas
elite.levelintO nivel do elite
elite.namestringO nome de exibicao do elite
elite.healthnumberVida atual
elite.max_healthnumberVida maxima
elite.is_custom_bossbooleanSe e um boss personalizado (em oposicao a um elite natural)
elite.health_multipliernumberMultiplicador de vida definido na configuracao
elite.damage_multipliernumberMultiplicador de dano definido na configuracao
elite:remove()voidRemove o elite atraves do pipeline de remocao adequado do EliteMobs (limpa rastreamento, loot, etc.)
Exemplo: Causar dano diferente a elites
local entities = context.world:get_nearby_entities(x, y, z, 5)
for _, entity in ipairs(entities) do
if entity.is_elite then
-- Causa dano dobrado a elites
entity:damage(20)
context.log:info("Hit elite: " .. entity.elite.name .. " (level " .. entity.elite.level .. ")")
elseif entity.is_hostile then
entity:damage(10)
end
end

Campos do FreeMinecraftModels

Disponiveis quando o FreeMinecraftModels esta instalado.

CampoTipoNotas
is_modeledbooleanSe a entidade tem um modelo FMM anexado (DynamicEntity ou PropEntity)
is_propbooleanSe a entidade e um prop do FMM (entidade decorativa estatica)
modeltabela ou nilSubtabela de informacoes do modelo (veja abaixo). nil se a entidade nao tiver modelo.

A subtabela model contem:

CampoTipoNotas
model.model_idstringO ID do blueprint do modelo (por exemplo, "torch_01")
model:play_animation(name, [blend], [loop])booleanReproduz uma animacao nomeada. blend padrao e false, loop padrao e false. Retorna true se a animacao foi encontrada.
model:stop_animations()voidPara todas as animacoes em reproducao no modelo.
model:remove()voidRemove a entidade modelada atraves do pipeline de remocao adequado do FMM.
Padrao Bridge vs Prop

O bridge do modelo (disponivel em qualquer entidade) define blend e loop como false por padrao. A play_animation da tabela prop define ambos como true porque props tipicamente querem animacoes com blend e em loop.

Exemplo: Filtrar entidades por tipo
local entities = context.world:get_nearby_entities(x, y, z, 10)
for _, entity in ipairs(entities) do
if entity.is_prop then
-- Pular props
elseif entity.is_player then
entity:damage(5)
elseif entity.entity_type == "villager" then
-- Nao machucar aldeoes
elseif entity.is_elite then
entity:damage(20)
elseif entity.is_hostile then
entity:damage(10)
end
end

Campos Especificos de Jogador

Entidades jogador tem todos os campos de entidade e entidade viva mais:

CampoTipoNotas
game_modestringO modo de jogo do jogador ("creative", "survival", "adventure", "spectator")

Metodos Especificos de Jogador

MetodoRetornoNotas
send_message(msg)voidEnvia uma mensagem de chat ao jogador. Suporta codigos de cor com &.
get_held_item()tabela ou nilRetorna {type, amount, display_name} para o item na mao principal do jogador, ou nil se vazia
consume_held_item(amount?)voidConsome itens da mao principal do jogador. amount padrao e 1
has_item(material, amount?)booleanRetorna true se o jogador tiver pelo menos amount (padrao 1) do material fornecido em qualquer lugar do inventario
get_target_entity([range])tabela de entidade ou nilRetorna a entidade para a qual o jogador esta olhando via raycast, ou nil se nenhuma. Alcance padrao e 50.
get_eye_location()tabela de localizacaoRetorna uma tabela de localizacao na altura dos olhos do jogador
get_look_direction()tabelaRetorna um vetor de direcao {x, y, z} para onde o jogador esta olhando
send_block_change(x, y, z, material, [ticks])voidEnvia um bloco falso visivel apenas para este jogador. Se ticks for fornecido, o bloco falso se restaura automaticamente apos essa duracao.
reset_block(x, y, z)voidRestaura um bloco falso de volta ao bloco real para este jogador
sleep(x, y, z)voidFaz o jogador entrar na animacao de dormir em uma cama nas coordenadas fornecidas. O bloco e restaurado automaticamente quando o jogador para de dormir.
wake_up()voidAcorda um jogador dormindo.

Metodos de Interface do Jogador

Estes metodos estao disponiveis em qualquer tabela de entidade de jogador e fornecem maneiras de exibir informacoes ao jogador atraves dos elementos de interface integrados do Minecraft.

player:show_boss_bar(text, [color], progress, [ticks])

Mostra uma barra de boss ao jogador.

ParametroTipoPadraoNotas
textstringobrigatorioO texto a exibir. Suporta codigos de cor com &.
colorstring"WHITE"Cor da barra. Uma de: "RED", "BLUE", "GREEN", "YELLOW", "PURPLE", "PINK", "WHITE"
progressnumberobrigatorioPreenchimento de 0.0 (vazio) a 1.0 (cheio)
ticksintnilAtraso opcional de auto-ocultacao em ticks. Se omitido, a barra permanece ate ser manualmente ocultada.

player:hide_boss_bar()

Remove a barra de boss da tela do jogador. Nao recebe parametros.

player:show_action_bar(text, [ticks])

Mostra texto na area da barra de acao (acima da hotbar).

ParametroTipoPadraoNotas
textstringobrigatorioO texto a exibir. Suporta codigos de cor com &.
ticksintnilDuracao opcional em ticks. Se fornecido, a mensagem e reenviada a cada 40 ticks para permanecer visivel pela duracao total.

player:show_title(title, [subtitle], fade_in, stay, fade_out)

Mostra uma tela de titulo ao jogador.

ParametroTipoPadraoNotas
titlestringobrigatorioTexto do titulo principal. Suporta codigos de cor com &.
subtitlestring""Texto do subtitulo abaixo do titulo principal. Opcional.
fade_inintobrigatorioDuracao do fade-in em ticks
stayintobrigatorioQuanto tempo o titulo permanece na tela em ticks
fade_outintobrigatorioDuracao do fade-out em ticks

Proximos Passos

Para hooks, APIs e fluxos de trabalho especificos de cada plugin: