Pular para o conteúdo principal

Scripting Lua: API de Props e Itens

Esta página cobre todas as APIs disponíveis para scripts de props e itens do FreeMinecraftModels: context.prop, context.item, context.event, context.player, context.world, context.zones, context.scheduler, context.state e context.log. Se você é novo em scripting, comece com Primeiros Passos primeiro.


context.prop

A tabela prop fornece informações sobre a entidade prop e métodos para controlar suas animações. Ela é reconstruída nova para cada chamada de hook.

Campos

CampoTipoNotas
prop.model_idstringO nome do modelo blueprint (ex: "torch_01")
prop.current_locationtabela de localizaçãoA posição do prop no momento em que o context foi construído

A tabela de localização tem os campos padrão: x, y, z, world, yaw, pitch.

Exemplo: lendo informações do prop
return {
api_version = 1,

on_spawn = function(context)
context.log:info("Prop spawned: " .. (context.prop.model_id or "unknown"))
local loc = context.prop.current_location
if loc then
context.log:info("Location: " .. loc.x .. ", " .. loc.y .. ", " .. loc.z)
end
end
}

prop:play_animation(name, blend, loop)

Reproduz uma animação nomeada no modelo do prop.

ParâmetroTipoPadrãoNotas
namestringobrigatórioO nome da animação como definido no arquivo de modelo
blendbooleantrueSe deve fazer blending com a animação atual
loopbooleantrueSe a animação deve loopear

Retorna true se a animação foi encontrada e iniciada, false caso contrário.

Exemplo
return {
api_version = 1,

on_right_click = function(context)
local success = context.prop:play_animation("open", true, false)
if not success then
context.log:warn("Animation 'open' not found on this model!")
end
end
}

prop:stop_animation()

Para todas as animações em reprodução no prop.

Não recebe parâmetros.

Exemplo
return {
api_version = 1,

on_right_click = function(context)
context.prop:stop_animation()
end
}

prop:hurt_visual()

Reproduz a animação visual de dano (flash de tonalidade vermelha) no prop sem causar dano real a ele.

Não recebe parâmetros.

Exemplo
return {
api_version = 1,

on_left_click = function(context)
-- Flash red when punched, but don't actually take damage
if context.event then
context.event.cancel()
end
context.prop:hurt_visual()
end
}

prop:pickup()

Remove o prop do mundo e dropa um item de papel de colocação em sua localização. O item dropado pode ser clicado com botão direito em um bloco para colocar o prop novamente.

Não recebe parâmetros.

Exemplo
return {
api_version = 1,

on_right_click = function(context)
-- Let players pick up the prop by right-clicking it
context.prop:pickup()
end
}

prop:mount(player)

Monta um jogador no primeiro assento de ponto de montagem disponível no prop. O modelo deve ter bones de ponto de montagem definidos.

ParâmetroTipoNotas
playertabela de entidadeUma tabela de entidade de jogador (ex: de context.event.player)
Exemplo
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player then
context.prop:mount(player)
end
end
}

prop:dismount(player)

Desmonta um jogador de sua posição de assento de ponto de montagem no prop.

ParâmetroTipoNotas
playertabela de entidadeUma tabela de entidade de jogador
Exemplo
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player then
-- Toggle mount/dismount
local passengers = context.prop:get_passengers()
for i = 1, #passengers do
if passengers[i].uuid == player.uuid then
context.prop:dismount(player)
return
end
end
context.prop:mount(player)
end
end
}

prop:get_passengers()

Retorna um array Lua de tabelas de entidade para todos os passageiros atuais no prop.

Não recebe parâmetros.

Exemplo
return {
api_version = 1,

on_game_tick = function(context)
local passengers = context.prop:get_passengers()
if #passengers > 0 then
context.log:info("Prop has " .. #passengers .. " passenger(s)")
end
end
}

prop:has_mount_points()

Retorna se este prop tem bones de ponto de montagem definidos em seu modelo.

Não recebe parâmetros. Retorna true ou false.

Exemplo
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player and context.prop:has_mount_points() then
context.prop:mount(player)
end
end
}

prop:spawn_elitemobs_boss(filename, x, y, z)

Spawna um boss customizado do EliteMobs na localização dada. Requer que o EliteMobs esteja instalado no servidor.

ParâmetroTipoNotas
filenamestringO nome do arquivo do boss customizado (ex: "my_boss.yml")
xnumberCoordenada X
ynumberCoordenada Y
znumberCoordenada Z

Retorna uma tabela de entidade viva para o boss spawnado, ou nil se o EliteMobs não estiver instalado ou o arquivo do boss não existir.

Exemplo
return {
api_version = 1,

on_right_click = function(context)
local loc = context.prop.current_location
if loc then
local boss = context.prop:spawn_elitemobs_boss("dungeon_guardian.yml", loc.x, loc.y + 1, loc.z)
if boss then
context.log:info("Spawned boss: " .. (boss.name or "unknown"))
else
context.log:warn("Could not spawn boss -- is EliteMobs installed?")
end
end
end
}

prop:open_inventory(player, title, rows)

Abre um inventário de baú GUI persistente para o jogador. O conteúdo é salvo no PersistentDataContainer do prop quando o inventário é fechado, e restaurado quando aberto novamente.

ParâmetroTipoPadrãoNotas
playertabela de entidadeobrigatórioO jogador para mostrar o inventário
titlestringobrigatórioO título do inventário (suporta códigos de cor com &)
rowsint3Número de linhas (1-6, onde 6 = 54 slots = baú duplo)

Retorna true se o inventário foi aberto, false caso contrário.


prop:is_viewing_inventory(player)

Retorna se o jogador dado atualmente tem o inventário deste prop aberto.

ParâmetroTipoNotas
playertabela de entidadeO jogador a verificar

Retorna true ou false.

Exemplo: Animação de fechar quando inventário é fechado
context.state["task_" .. player.uuid] = context.scheduler:run_repeating(5, 5, function(tick_context)
if not tick_context.prop:is_viewing_inventory(player) then
tick_context.prop:play_animation("close", true, false)
tick_context.scheduler:cancel(tick_context.state["task_" .. player.uuid])
end
end)

prop:place_book(player)

Pega o livro escrito ou escribível da mão principal do jogador e armazena no prop.

ParâmetroTipoNotas
playertabela de entidadeO jogador segurando o livro

Retorna true se bem-sucedido.


prop:read_book(player)

Abre o livro armazenado para leitura pelo jogador.

ParâmetroTipoNotas
playertabela de entidadeO jogador para mostrar o livro

Retorna true se um livro foi aberto.


prop:take_book(player)

Retorna o livro armazenado ao inventário do jogador e o remove do prop.

ParâmetroTipoNotas
playertabela de entidadeO jogador para dar o livro

Retorna true se bem-sucedido.


prop:has_book()

Retorna se um livro está armazenado neste prop. Não recebe parâmetros.


prop:drop_inventory()

Dropa todo o conteúdo do inventário armazenado na localização do prop como entidades de item, e então limpa os dados armazenados. Fecha automaticamente o inventário para qualquer jogador que esteja visualizando.

Não recebe parâmetros. Retorna true se bem-sucedido.


prop:drop_book()

Dropa o livro armazenado na localização do prop como uma entidade de item e limpa os dados do livro armazenado.

Não recebe parâmetros. Retorna true se bem-sucedido.


prop:set_persistent_data(key, value)

Armazena um valor string no PersistentDataContainer do armor stand do prop. Esses dados sobrevivem reinícios do servidor e descargas de chunks.

ParâmetroTipoNotas
keystringUm nome de chave único (armazenado como fmm_lua_<key> internamente)
valuestringO valor a armazenar. Use tostring() para números e booleanos.

Retorna true se bem-sucedido, false se o prop não tiver um armor stand de suporte.


prop:get_persistent_data(key)

Recupera um valor string previamente armazenado com set_persistent_data. Retorna nil se a chave não foi definida.

ParâmetroTipoNotas
keystringO nome da chave usado em set_persistent_data
Exemplo: Estado de alternância persistente
return {
api_version = 1,

on_spawn = function(context)
local saved = context.prop:get_persistent_data("active")
context.state.active = saved == "true"
end,

on_right_click = function(context)
context.state.active = not context.state.active
context.prop:set_persistent_data("active", tostring(context.state.active))
end
}

context.item

A tabela item está disponível apenas em scripts de itens (não em scripts de props). Fornece informações sobre o item personalizado e métodos para manipulá-lo. Esta tabela é reconstruída nova para cada chamada de hook.

Campos

CampoTipoNotas
item.idstringO ID do tipo de item (o fmm_item_id da configuração YML)

item:material()

Retorna o nome do material do item como string (ex: "DIAMOND_SWORD", "STICK").


item:get_amount() / item:set_amount(n)

Obtém ou define o tamanho do stack do item.

ParâmetroTipoNotas
nintA nova quantidade do stack

item:consume(n)

Decrementa a quantidade do stack do item em n (padrão 1). Se a quantidade resultante for 0 ou menos, o item é removido do inventário do jogador.

ParâmetroTipoPadrãoNotas
nint1Quantidade a consumir

item:get_uses() / item:set_uses(n)

Obtém ou define um contador de uso personalizado armazenado no PersistentDataContainer do item. Isso é independente da durabilidade vanilla e pode ser usado para implementar sistemas de durabilidade ou carga personalizados.

ParâmetroTipoNotas
nintO novo contador de usos

item:get_name() / item:set_name(s)

Obtém ou define o nome de exibição do item. Suporta códigos de cor com &.

ParâmetroTipoNotas
sstringO novo nome de exibição (ex: "&b&lFrost Sword")

item:get_lore() / item:set_lore(table)

Obtém ou define o lore do item. get_lore() retorna uma tabela de strings (uma por linha). set_lore() recebe uma tabela de strings.

ParâmetroTipoNotas
tabletableArray de strings, uma por linha de lore
Exemplo: Script de item que rastreia usos
return {
api_version = 1,

on_right_click = function(context)
local uses = context.item:get_uses()
if uses <= 0 then
context.player:send_message("&cThis item is out of charges!")
return
end
context.item:set_uses(uses - 1)
context.player:send_message("&aUsed! Charges remaining: " .. (uses - 1))
end
}

item:get_durability()

Retorna uma tabela com campos current e max representando a durabilidade vanilla do item, ou nil se o item não tiver barra de durabilidade.

Exemplo
local dur = context.item:get_durability()
if dur then
context.player:send_message("Durability: " .. dur.current .. "/" .. dur.max)
end

item:get_durability_percentage()

Retorna a durabilidade restante como uma fração de 0.0 a 1.0, ou nil se o item não tiver barra de durabilidade.


item:use_durability(amount, can_break)

Reduz a durabilidade vanilla do item por uma quantidade fixa.

ParâmetroTipoPadrãoNotas
amountintobrigatórioQuantos pontos de durabilidade consumir
can_breakbooleanfalseSe true, o item é destruído quando a durabilidade acaba. Se false, a durabilidade para em 1.

item:use_durability_percentage(fraction, can_break)

Reduz a durabilidade vanilla do item por uma porcentagem do seu máximo.

ParâmetroTipoPadrãoNotas
fractionnumberobrigatórioFração da durabilidade máxima a consumir (ex: 0.1 = 10%)
can_breakbooleanfalseSe true, o item é destruído quando a durabilidade acaba. Se false, a durabilidade para em 1.

context.event

Dados do evento para o hook atual. Disponível em hooks de clique, combate e interação para scripts de props e itens. Retorna nil em hooks que não têm evento associado (on_spawn, on_game_tick, on_destroy, on_zone_enter, on_zone_leave, on_equip).

Campos e Métodos

Campo ou MétodoTipoNotas
event.playertabela de entidade de jogadorO jogador que acionou o evento. Disponível em on_left_click, on_right_click e on_projectile_hit (o atirador, se foi um jogador). Veja Métodos de Entidade de Jogador para todos os campos e métodos.
event.is_cancelledbooleanSe o evento está atualmente cancelado
event.cancel()functionCancela o evento (ex: previne dano ou interação)
event.uncancel()functionDescancela um evento previamente cancelado
info

Nem todos os eventos são canceláveis. Se o evento Bukkit subjacente não implementa Cancellable, event.cancel() e event.uncancel() não estarão presentes e event.is_cancelled será sempre false.

Exemplo: Tornando um prop invulnerável

Exemplo
return {
api_version = 1,

on_left_click = function(context)
if context.event then
context.event.cancel()
end
end
}

Exemplo: Verificando estado de cancelamento

Exemplo
return {
api_version = 1,

on_left_click = function(context)
if context.event and not context.event.is_cancelled then
context.event.cancel()
context.log:info("Damage cancelled!")
end
end
}
cuidado

Dentro de callbacks agendados (scheduler:run_later, scheduler:run_repeating), context.event é sempre nil. Modificação de evento só pode acontecer durante o próprio hook de evento.


context.world

A API world é compartilhada entre todos os plugins Nightbreak. Veja context.world para a referência completa.

info

Props do FMM usam a mesma tabela world do MagmaCore que bosses do EliteMobs. Todos os métodos documentados na página global (get_block_at, set_block_at, spawn_particle, play_sound, strike_lightning, get_time, set_time, get_nearby_entities, get_nearby_players, spawn_entity, get_highest_block_y, raycast, spawn_firework) estão disponíveis no FMM. Veja a API world do MagmaCore para detalhes completos sobre world:raycast() (lançar um raio e detectar entidades/blocos atingidos) e world:spawn_firework() (spawnar foguetes de fogos de artifício com cores e formas personalizadas). EliteMobs estende a tabela world com métodos adicionais para spawnar bosses, reforços e mais -- veja Mundo e Ambiente do EliteMobs.


Métodos de Entidade de Jogador

Tabelas de entidade de jogador são retornadas de context.event.player, context.world:get_nearby_players() e callbacks de zona.

API Compartilhada

As tabelas de entidade, métodos de entidade viva, métodos específicos de jogador e métodos de UI de jogador são compartilhados entre todos os plugins Nightbreak. Veja o Motor de Scripting Lua do MagmaCore para a referência completa cobrindo campos base de entidade, campos e métodos de entidade viva, campos e métodos específicos de jogador e Métodos de UI de Jogador. Novos métodos de jogador incluem player:get_target_entity() (mira por raycast), player:get_eye_location(), player:get_look_direction(), player:send_block_change() (blocos falsos por jogador) e player:reset_block() -- veja Métodos Específicos de Jogador para detalhes.


context.zones

A API de zonas é compartilhada entre todos os plugins Nightbreak. Veja context.zones para a referência completa.


context.scheduler

A API do scheduler é compartilhada entre todos os plugins Nightbreak. Veja context.scheduler para a referência completa.


context.state

A API de estado é compartilhada entre todos os plugins Nightbreak. Veja context.state para a referência completa.


context.log

A API de logging é compartilhada entre todos os plugins Nightbreak. Veja context.log para a referência completa.


Modelo de Runtime

Um Runtime por Instância de Script

Cada entidade prop que tem scripts vinculados recebe sua própria instância de runtime Lua independente. Quando o prop spawna, o FMM carrega o código fonte Lua, o avalia em um ambiente sandboxado novo e armazena a tabela retornada. Quando o prop é removido, o runtime é encerrado.

Para scripts de itens, um runtime é criado por par (jogador, itemId). Quando um jogador equipa um item personalizado, FMM cria uma instância de script para esse jogador e tipo de item. Quando o item é desequipado, o runtime é encerrado.

Isso significa:

  • Variáveis locais declaradas no escopo do arquivo são privadas para aquela instância de script.
  • context.state é completamente isolado entre instâncias, mesmo que compartilhem o mesmo arquivo de script.

Propriedade de Tarefas Agendadas

Todas as tarefas criadas através do context.scheduler pertencem ao runtime que as criou. Quando um prop é removido:

  1. O runtime é encerrado.
  2. Cada tarefa pertencente -- tanto de execução única quanto repetitiva -- é automaticamente cancelada.
  3. Todos os monitoramentos de zona são limpos.

Orçamento de Execução

Cada invocação de hook e cada invocação de callback é cronometrada. Se uma única chamada levar mais que 50 milissegundos, o script é desabilitado com um aviso no console:

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

Para ficar dentro do orçamento:

  • Evite loops sem limite dentro de hooks.
  • Mantenha handlers on_game_tick leves -- eles rodam a cada tick.
  • Use context.scheduler:run_repeating(...) para distribuir trabalho entre ticks.

Referência Completa de Hooks

Esta tabela lista todos os hooks disponíveis em scripts de props e itens.

Hooks de Props (8)

HookDispara quandocontext.event
on_spawnProp spawna no mundonil
on_game_tickCada tick do servidor (50ms)nil
on_destroyProp é removidonil
on_left_clickJogador clica esquerdo no propevento de dano
on_right_clickJogador clica direito no propevento de interação
on_projectile_hitProjétil atinge o propevento de acerto de projétil
on_zone_enterJogador entra em uma zona monitoradanil
on_zone_leaveJogador sai de uma zona monitoradanil

Hooks de Itens (22)

HookCategoriaDispara quandocontext.event
on_attack_entityCombateJogador ataca uma entidadeevento de dano
on_kill_entityCombateJogador mata uma entidadeevento de morte
on_take_damageCombateJogador recebe danoevento de dano
on_shield_blockCombateJogador bloqueia com escudoevento de dano
on_shoot_bowCombateJogador dispara arcoevento de tiro de arco
on_projectile_hitCombateProjétil do jogador acertaevento de acerto de projétil
on_projectile_launchCombateJogador lança projétilevento de lançamento
on_right_clickInteraçãoJogador clica direitoevento de interação
on_left_clickInteraçãoJogador clica esquerdoevento de interação
on_shift_right_clickInteraçãoJogador shift+clique direitoevento de interação
on_shift_left_clickInteraçãoJogador shift+clique esquerdoevento de interação
on_interact_entityInteraçãoJogador clica direito em entidadeevento de interação com entidade
on_equipEquipamentoItem entra em slot ativonil
on_unequipEquipamentoItem sai de slot ativonil
on_swap_handsEquipamentoTroca mão principal/secundáriaevento de troca
on_dropEquipamentoJogador solta itemevento de soltar
on_break_blockUtilidadeJogador quebra blocoevento de quebra de bloco
on_consumeUtilidadeJogador consome itemevento de consumo
on_item_damageUtilidadeItem recebe dano de durabilidadeevento de dano de item
on_fishUtilidadeJogador usa vara de pescarevento de pesca
on_deathUtilidadeJogador morre enquanto equipadoevento de morte
on_game_tickCiclo de vidaCada tick enquanto equipadonil

Próximos Passos