7 Erros Comuns de Programação que Travam Seu OTServer
Blog 7 Erros Comuns de Programação que Travam Seu OTServer
Programação

7 Erros Comuns de Programação que Travam Seu OTServer

16/02/2026

Boa parte dos crashes e travamentos de um OTServer não vêm da engine em si, mas de scripts mal escritos. Aqui vão sete erros de programação que aparecem com muita frequência — com exemplos práticos de como evitar cada um.

1. Não validar as entradas

Talkactions, NPCs e comandos que recebem parâmetros do jogador precisam validar o que está chegando antes de usar. Compare os dois exemplos:

-- Errado: assume que o parâmetro sempre é um número válido
local quantidade = tonumber(param)
player:addItem(2160, quantidade)

-- Certo: valida antes de usar
local quantidade = tonumber(param)
if not quantidade or quantidade <= 0 or quantidade > 100 then
    player:sendTextMessage(MESSAGE_FAILURE, "Quantidade inválida.")
    return true
end
player:addItem(2160, quantidade)

2. Ignorar o uso de pcall

Em Lua, envolver trechos de código arriscado em pcall evita que um erro isolado derrube todo o script — ou, em casos mais graves, trave o próprio servidor:

local sucesso, erro = pcall(function()
    -- código que pode falhar
    processarEventoComplexo(player)
end)

if not sucesso then
    print("[ERRO] Evento falhou: " .. tostring(erro))
end

É uma rede de segurança barata que muita gente deixa de usar.

3. Copiar scripts sem entender a lógica

Pegar um script pronto de um fórum e colar sem entender o que cada parte faz é um dos erros mais comuns entre iniciantes. O problema aparece na hora de debugar: sem entender a lógica, fica impossível saber onde está o bug ou como adaptar o script pro seu contexto.

4. Não comentar código complexo

Scripts com lógica mais elaborada (sistemas de quest, eventos, mecânicas custom) ficam praticamente ilegíveis sem comentários mínimos explicando o "porquê" de decisões não óbvias:

-- Bloqueia o uso em área protegida pra evitar exploit de duplicação
-- reportado na versão anterior do sistema (ver changelog v1.3)
if player:getZone() == ZONE_PROTECTION then
    return false
end

Isso vira um problema sério quando você precisa editar esse código meses depois, ou quando outra pessoa da equipe precisa mexer nele.

5. Misturar lógica de jogo com lógica de banco de dados

Fazer múltiplas queries desnecessárias dentro de um loop de jogo, ou embutir lógica de negócio direto em comandos SQL, deixa o código difícil de manter e também pode gerar lentidão perceptível pros jogadores. Prefira buscar os dados uma vez, guardar em variável, e só voltar ao banco quando realmente precisar persistir uma mudança.

6. Não testar casos extremos

Um script que funciona perfeitamente com um personagem level 100 pode quebrar com um personagem level 1, com inventário cheio, ou com atributos no limite. Antes de publicar um script novo, teste pelo menos estes cenários: personagem recém-criado, inventário cheio, atributo no valor máximo e mínimo, e múltiplos jogadores usando o script ao mesmo tempo.

7. Loops pesados em eventos frequentes

Código dentro de callbacks que rodam com muita frequência — como onThink — precisa ser leve. Um loop custoso executado a cada poucos segundos para centenas de criaturas ou jogadores pode, sozinho, derrubar a performance geral do servidor. Prefira aumentar o intervalo do evento (interval) sempre que a lógica permitir, em vez de rodar verificações pesadas a cada segundo.

Na dúvida, teste sempre em um ambiente separado (servidor de testes) antes de subir qualquer script novo pro servidor em produção.

Nenhum desses erros é motivo pra desânimo — são praticamente um rito de passagem de quem programa pra OTServer. O importante é aprender a reconhecê-los antes que virem um problema real pros seus jogadores.