Pular para o conteúdo principal

Scripting Lua: Solução de problemas

webapp_banner.jpg

Esta página cobre problemas comuns que você pode encontrar ao escrever ou depurar poderes Lua, além de conselhos de migração para autores vindos do EliteScript. Para exemplos funcionais, consulte Exemplos e padrões. Se está começando, consulte Primeiros passos.


Problemas comuns

1. O poder não carrega de todo

Verifique o console do servidor em busca de erros ao iniciar. A causa mais comum é um erro de sintaxe Lua (falta de end, parênteses não correspondentes, etc.). Verifique também se o arquivo termina em .lua e está no diretório powers correto.

2. O hook nunca dispara

Verifique se o nome do hook está escrito exatamente como na lista de hooks. Erros comuns: on_boss_hit (errado) vs. on_boss_damaged_by_player (correto), ou on_tick (errado) vs. on_game_tick (correto).

3. context.player é nil

Nem todos os hooks fornecem um jogador. on_spawn, on_game_tick, on_enter_combat e on_exit_combat não têm jogador. Sempre adicione uma guarda nil antes de usar context.player.

4. Timeout / orçamento de execução excedido

Se um hook ou callback demora muito, o poder é automaticamente desativado para prevenir lag.

[Lua]   -> Your script took 73ms in 'on_tick' (limit: 50ms) — power disabled to prevent lag.

5. O callback do scheduler usa dados obsoletos

Você provavelmente está usando o context externo em vez do parâmetro do callback. Mude para function(tick_context) ... tick_context.boss ... end.

6. A consulta de zona não retorna entidades

Para zonas nativas, kind deve ser minúsculo ("sphere"). Para utilitários de script, shape deve ser maiúsculo ("CONE").

7. As partículas não aparecem

Verifique se o nome da partícula é um enum Particle Bukkit válido em UPPER_CASE. Erro comum: "flame" (errado) vs. "FLAME" (correto).

8. O cooldown não parece funcionar

Use check_local(key, duration) (que verifica E define em uma chamada), não local_ready(key) seguido de set_local(duration, key) separado.

9. O boss continua executando o poder após a morte

Adicione lógica de limpeza em on_exit_combat e/ou on_death para cancelar tarefas do scheduler.


Leitura de mensagens de erro

Quando algo dá errado em um poder Lua, o console imprime um bloco de erro amigável com o prefixo [Lua].

[Lua] Error in 'push_zone.lua' at line 35 during 'on_boss_damaged_by_player':
[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] -> Power has been disabled for this boss to prevent further errors.
Erro Lua brutoO que o console te diz
attempt to call nilVocê tentou chamar um método ou função que não existe.
index expected, got nilVocê tentou acessar um campo de algo que é nil.
attempt to indexVocê tentou acessar uma propriedade de um valor nil ou inválido.
bad argumentMostra os detalhes específicos da incompatibilidade de argumentos.
TimeoutSeu script levou Xms em 'hook_name' (limite: 50ms) -- poder desativado.
dica

Quando vir um erro [Lua] no console, leia a mensagem completa antes de mergulhar no código -- geralmente aponta diretamente para a solução.


Não assuma que aliases não documentados existem

A API Lua expoe um conjunto especifico de nomes de metodos. Se voce esta escrevendo poderes manualmente ou com assistencia de IA, nao assuma que atalhos ou nomes alternativos existem. Os seguintes nomes nao existem e causarao erros:

  • show_temporary_boss_bar() -- use player:show_boss_bar(title, color, style, duration).
  • run_command_as_player() -- use player:run_command(command).
  • em.location(...) -- nao ha global em. Use context.boss:get_location(), context.player.current_location, ou metodos context.world.
  • em.vector(...) -- nao ha global em. Use context.vectors.get_vector_between_locations(loc1, loc2) ou tabelas simples {x=0, y=1, z=0}.
  • em.zone.sphere(...) -- nao ha global em. Use uma tabela de definicao de zona como {kind = "sphere", radius = 5, origin = location}.
  • entity:teleport_to(...) -- use entity:teleport_to_location(location).
  • entity:set_velocity(...) -- use entity:set_velocity_vector(vector).
  • entity:set_facing(...) -- use entity:face_direction_or_location(direction_or_location).

Em caso de duvida, consulte as paginas de Referencia da API (Boss e entidades, Mundo e ambiente, Zonas e alvos). Se nao esta documentado, nao existe.


Conselhos de migracao para autores de EliteScript

Se voce ja escreve bons EliteScripts, a forma mais facil de aprender poderes Lua e:

  1. Continue pensando em termos de eventos, alvos, zonas, vetores relativos e particulas. Os conceitos sao os mesmos -- apenas a sintaxe muda. Eventos EliteScript se tornam nomes de hooks como on_spawn ou on_boss_damaged_by_player. Alvos e zonas sao passados como tabelas para context.script usando os mesmos nomes de campo documentados nas paginas Zonas EliteScript e Alvos EliteScript.

  2. Mova seu fluxo de controle para Lua. Rolagens aleatorias, funcoes auxiliares compartilhadas, loops, estado persistente (context.state) e agendamento de tarefas (context.scheduler) sao as coisas que Lua adiciona e que EliteScript puro nao consegue fazer facilmente. Comece convertendo um poder condicional ou com ramificacoes para Lua enquanto mantém todo o resto igual.

  3. Use context.script para targeting e geometria de zonas. Os utilitarios de script aceitam os mesmos nomes de campo que o EliteScript (targetType, shape, Target, Target2, range, offset, coverage), entao voce pode continuar usando a documentacao existente do EliteScript como referencia para essas especificacoes. Isso permite aproveitar padroes familiares enquanto ganha a flexibilidade do Lua para a camada logica.


Caminho de progressão para iniciantes

  1. Escreva um arquivo com apenas api_version = 1 e on_spawn.
  2. Faça o boss enviar uma mensagem ou reproduzir um som.
  3. Adicione um cooldown com context.cooldowns.
  4. Adicione um hook ativado por jogador como on_boss_damaged_by_player.
  5. Adicione uma ação atrasada com context.scheduler:run_after(...).
  6. Adicione uma consulta de zona nativa Lua simples ou um context.script:target(...) simples.
  7. Só então avance para ataques rotativos, máquinas de estado e mecânicas de múltiplos passos.

Próximos passos