Scripting Lua: Solução de problemas
Esta página aborda problemas comuns que você pode encontrar ao escrever ou depurar scripts de props do FreeMinecraftModels, além de dicas para trabalhar com o sistema de geração preguiçosa de configuração. Se você procura exemplos funcionais, consulte Exemplos e padrões. Se está apenas começando, consulte Primeiros passos.
Problemas comuns
1. Arquivo de configuração não carrega / Script não atribuído
Sintoma: O prop aparece mas não responde a cliques ou a nenhum hook.
Causas e soluções:
-
Ainda não existe um arquivo de configuração
.yml. O FMM gera a configuração de forma preguiçosa no primeiro spawn do prop. Na primeira vez que um modelo é gerado, o FMM cria a configuração.ymlde forma assíncrona com valores padrão (habilitado, sem scripts). Você precisa editar a configuração gerada para adicionar os nomes dos seus arquivos de script e então gerar o prop novamente. -
A configuração tem
isEnabled: false. Abra o arquivo.ymlao lado do arquivo do modelo e definaisEnabled: true. -
A lista
scripts:está vazia. Adicione os nomes dos seus arquivos de script:isEnabled: true
scripts:
- my_script.lua -
O nome do arquivo
.ymlnão corresponde ao nome do arquivo do modelo. A configuração deve ter o mesmo nome base que o arquivo do modelo. Por exemplo,torch_01.fmmodelprecisa detorch_01.ymlno mesmo diretório.
2. Arquivo de script não encontrado
Sintoma: O console mostra: [FMM Scripts] Script 'my_script.lua' not found in scripts/ folder
Causas e soluções:
-
Diretório errado. Os arquivos de script devem estar em
plugins/FreeMinecraftModels/scripts/, não ao lado do arquivo do modelo. -
Nome de arquivo não corresponde. O nome na configuração
.ymldeve corresponder exatamente ao nome do arquivo na pastascripts/, incluindo maiúsculas/minúsculas e a extensão.lua. -
Arquivo não presente. Verifique se o arquivo
.luarealmente existe na pastascripts/.
3. Script não carrega de forma alguma
Sintoma: Nenhum erro no console, mas nenhum hook é disparado.
Verifique o console do servidor para erros de sintaxe Lua durante a inicialização. As causas mais comuns são:
endfaltando para fechar uma função ou blocoif- Parênteses não correspondentes
- Vírgula faltando entre definições de hooks na tabela retornada
- O arquivo não termina com
.lua
Se houver um erro Lua, o console imprimirá um bloco de erro [Lua] com o nome do arquivo, número da linha e uma descrição.
4. Hook nunca dispara
Sintoma: O script carrega (você vê a mensagem [FMM Scripts] Bound script), mas um hook específico nunca é ativado.
Verifique se o nome do hook está escrito exatamente como listado na referência de hooks. Erros comuns:
| Nome errado | Nome correto |
|---|---|
on_click | on_right_click ou on_left_click |
on_interact | on_right_click |
on_hit | on_left_click |
on_tick | on_game_tick |
on_remove | on_destroy |
on_arrow_hit | on_projectile_hit |
Verifique também se o prop possui realmente uma entidade armor stand associada. Algumas configurações de props podem não produzir uma entidade clicável.
5. Timeout / Orçamento de execução excedido
Sintoma: O console mostra uma mensagem como:
[Lua] my_script.lua took 73ms in 'on_game_tick' (limit: 50ms) -- script disabled to prevent lag.
O script estava realizando trabalho demais em uma única chamada de hook. Causas comuns:
- Iterar sobre entidades demais em
on_game_tick - Criar partículas demais por tick
- Executar loops custosos sem distribuir o trabalho entre ticks
Solução: Mova o trabalho pesado para trás de um cooldown baseado em estado ou use scheduler:run_repeating() com um intervalo razoável em vez de on_game_tick.
6. context.event é nil em um hook de clique
Isso normalmente não deveria acontecer para on_left_click e on_right_click, mas sempre se proteja com:
if context.event then
context.event.cancel()
end
Dentro de callbacks do scheduler, context.event é sempre nil -- este é o comportamento esperado. A modificação de eventos só pode acontecer dentro do hook de evento em si.
7. Animação não toca
Sintoma: play_animation() retorna false, ou nada visível acontece.
Causas e soluções:
-
Nome de animação errado. O nome deve corresponder exatamente ao que está definido no arquivo do modelo. Verifique seu arquivo
.bbmodelou.fmmodelpara o nome correto da animação. -
O modelo não tem animações. Nem todos os modelos têm animações. Verifique se o arquivo do modelo realmente contém dados de animação.
-
Jogadores não estão no alcance do pacote de recursos. A animação é do lado do servidor, mas os jogadores precisam ter o pacote de recursos do FMM carregado para ver o modelo.
8. Partículas não aparecem
- Verifique se o nome da partícula é um valor válido do enum
Particledo Bukkit em MAIÚSCULAS:"FLAME", não"flame". - Verifique se a localização está em um chunk carregado. Se não houver jogadores por perto, o chunk pode estar descarregado.
- Verifique se
counté pelo menos 1. - Algumas partículas (como
DUST) precisam de dados extras específicos que ospawn_particle()básico pode não suportar. Use partículas padrão comoFLAME,HEART,HAPPY_VILLAGER,NOTE,ENCHANT, etc.
9. Som não toca
- Verifique se o nome do som é uma constante válida do enum
Sounddo Bukkit em MAIÚSCULAS. Exemplo:"BLOCK_NOTE_BLOCK_HARP", não"block.note_block.harp". - Verifique se as coordenadas de localização estão corretas (não todas zero ou NaN).
- Verifique se o volume é maior que 0.
10. Estado é redefinido inesperadamente
context.state é por instância de prop e persiste durante a vida do prop. Se o estado parece ser redefinido:
- O prop pode ter sido removido e gerado novamente (cada spawn cria uma nova instância).
- Você pode estar lendo o estado em um callback do scheduler usando a variável de contexto errada. Sempre use o parâmetro de contexto próprio do callback.
Como funciona a geração preguiçosa de configuração
Entender o sistema de configuração preguiçosa ajuda a evitar confusão ao configurar novos props:
-
Primeiro spawn: Quando um prop aparece e nenhum arquivo
.ymlassociado existe, o FMM cria a configuração de forma assíncrona. Isso significa que o arquivo é escrito em uma thread de fundo e não está imediatamente disponível. -
Valores padrão: A configuração gerada tem
isEnabled: truee uma lista vaziascripts: []. -
Sem scripts no primeiro spawn: Como a configuração é criada depois que o prop já apareceu (e não tem scripts listados), o prop não terá scripts atribuídos no seu primeiro spawn.
-
Editar e gerar novamente: Depois que o FMM cria a configuração, você a edita para adicionar os nomes dos seus arquivos de script. Na próxima vez que o prop aparecer, os scripts serão carregados.
-
Localização da configuração: O arquivo
.ymlé criado no mesmo diretório que o arquivo do modelo, com o mesmo nome base. Por exemplo:- Modelo:
plugins/FreeMinecraftModels/models/fountain.fmmodel - Configuração:
plugins/FreeMinecraftModels/models/fountain.yml
- Modelo:
- Coloque o modelo em
models/ - Coloque o script em
scripts/ - Gere o prop uma vez (gera o
.yml) - Edite o
.ymlpara adicionarscripts: [my_script.lua] - Gere o prop novamente -- o script agora está ativo
Leitura de mensagens de erro
Quando algo dá errado em um script Lua de prop, o console imprime um bloco de erro [Lua]. Essas mensagens indicam exatamente qual arquivo, qual linha, qual hook e o que deu errado em linguagem clara.
Um erro típico se parece com isso:
[Lua] Error in 'my_door.lua' at line 12 during 'on_right_click':
[Lua] -> You tried to call a method or function that doesn't exist.
[Lua] -> Check the method name for typos, or make sure you're using ':' (colon) for method calls, not '.' (dot).
[Lua] -> Script has been disabled for this entity to prevent further errors.
O sistema traduz erros comuns do Lua para linguagem clara:
| Erro Lua bruto | O que o console indica |
|---|---|
attempt to call nil | Você tentou chamar um método ou função que não existe. Verifique erros de digitação e o uso de : vs. .. |
index expected, got nil | Você tentou acessar um campo em algo que é nil. Verifique se o código anterior o inicializou. |
attempt to index | Você tentou acessar uma propriedade em um valor nil ou inválido. |
bad argument | Uma função recebeu o tipo errado de argumento. A mensagem mostra o tipo esperado vs. o real. |
| Timeout | Seu script levou Xms em 'hook_name' (limite: 50ms) -- script desabilitado para prevenir lag. |
Sempre leia a mensagem de erro [Lua] completa antes de mergulhar no código. Geralmente ela aponta diretamente para a solução.
Não assuma que métodos não documentados existem
A API Lua do FMM expõe um conjunto específico de métodos. Não assuma que nomes abreviados ou alternativos existem. Erros comuns:
context.prop:get_location()-- não existe. Usecontext.prop.current_location(um campo, não um método).context.prop:set_animation("open")-- não existe. Usecontext.prop:play_animation("open", true, true).context.event:setCancelled(true)-- não existe. Usecontext.event.cancel().context.cooldowns:check_local(...)-- não existe no FMM. Usecontext.statecomscheduler:run_later()para cooldowns.context.player-- não existe nos scripts de props do FMM. Usecontext.world:get_nearby_players()para encontrar jogadores perto do prop.context.boss-- não existe. Isso é do EliteMobs. Usecontext.propno FMM.
Em caso de dúvida, consulte a página da API de Props. Se não está documentado lá, não existe.
Dicas de depuração
1. Use context.log:info() generosamente
Adicione mensagens de log em cada passo ao depurar:
on_right_click = function(context)
context.log:info("Right click received!")
context.log:info("Event present: " .. tostring(context.event ~= nil))
context.log:info("State is_open: " .. tostring(context.state.is_open))
end
2. Verifique o console na inicialização
O FMM registra [FMM Scripts] Bound script 'X' to prop 'Y' para cada vinculação bem-sucedida. Se você não vê essa mensagem, a configuração ou o script não foi carregado.
3. Verifique o caminho do arquivo do modelo
A configuração .yml deve ser um arquivo irmão do arquivo do modelo (mesmo diretório, mesmo nome base). Verifique isso conferindo:
- Caminho do arquivo do modelo:
plugins/FreeMinecraftModels/models/my_model.fmmodel - Caminho do arquivo de configuração:
plugins/FreeMinecraftModels/models/my_model.yml
4. Teste hooks individualmente
Ao construir um script complexo, comece testando cada hook isoladamente. Adicione um hook por vez e verifique se ele dispara antes de passar para o próximo.
5. Verifique erros de digitação nos nomes dos hooks
A razão mais comum para um hook não disparar é um nome de hook escrito incorretamente. O script carregará sem erros, mas a função de hook com erro de digitação será rejeitada durante a validação.
Caminho de progressão para iniciantes
Se você quer aprender este sistema do zero, esta progressão funciona bem:
- Escreva um arquivo com apenas
api_version = 1eon_spawnque registre uma mensagem. - Adicione o script a uma configuração de prop e verifique se a mensagem de log aparece.
- Adicione
on_right_clicke registre quando o prop é clicado. - Adicione
on_left_clickcomcontext.event.cancel()para invulnerabilidade. - Toque uma animação no clique direito.
- Adicione um som no clique direito.
- Adicione estado e comportamento de alternância.
- Adicione vigilância de zona para detecção de proximidade.
- Somente então passe para scripts complexos com múltiplos hooks e schedulers.
Cada passo se baseia no anterior, e você pode testar em cada etapa.
Próximos passos
- Primeiros passos -- estrutura de arquivos, hooks, tutorial do primeiro script, modelos para copiar e colar
- API de Props -- referência completa da API
- Exemplos e padrões -- scripts completos funcionais que você pode estudar e adaptar