Mais cedo ou mais tarde, todo script vai dar erro. A diferença entre quem resolve rápido e quem fica horas travado geralmente não é conhecimento de Lua — é método. Aqui vai um processo prático pra debugar sem se perder.
O console do servidor normalmente aponta o arquivo e a linha exata onde o erro aconteceu, além de uma descrição como attempt to index a nil value. Resistir à tentação de sair mudando código aleatoriamente e, em vez disso, ler essa linha com atenção já resolve boa parte dos casos.
A grande maioria dos erros de Lua em OTServer vem de tentar usar algo que não existe (nil) como se existisse. Exemplo clássico:
local item = player:getSlotItem(CONST_SLOT_HEAD)
print(item:getName()) -- erro se o jogador não tiver nada equipado na cabeça
A correção é sempre checar antes de usar:
local item = player:getSlotItem(CONST_SLOT_HEAD)
if item then
print(item:getName())
end
Antes de assumir ferramentas complexas de debug, espalhar print() em pontos estratégicos do script pra ver que valores estão chegando em cada etapa resolve a maioria dos problemas:
print("DEBUG: quantidade recebida = " .. tostring(quantidade))
Usar tostring() evita que o próprio print quebre quando a variável for nil.
Quando o erro não é óbvio, comente partes do script até sobrar só o trecho mínimo que ainda reproduz o problema. Script pequeno e isolado é muito mais fácil de debugar do que um sistema inteiro de uma vez.
Às vezes o script não gera erro nenhum no console, mas também não faz o que deveria. Nesses casos, geralmente a lógica condicional (if) está filtrando um caso que você não previu. Volte e confira, um por um, se cada condição está realmente recebendo o valor que você espera.
Outro erro clássico: inverter a ordem dos argumentos numa função, como passar (item, player) quando a função espera (player, item). O Lua não acusa erro de tipo automaticamente em muitos casos — ele só vai se comportar de um jeito estranho. Conferir a assinatura da função na documentação da API evita esse tipo de bug silencioso.
Regra de ouro: nunca debugue direto no servidor em produção. Reproduza o erro num ambiente de testes, onde você pode quebrar e mexer à vontade sem afetar jogadores reais.