Lua é a linguagem por trás de praticamente tudo que acontece dentro de um OTServer: magias, NPCs, quests, eventos, sistemas custom. A boa notícia é que ela foi desenhada pra ser simples de ler e aprender — você não precisa ser programador profissional pra começar a mexer nela.
Engines como o TFS e o Canary são escritas em C++, mas expõem uma API em Lua pra quem quer customizar o jogo sem recompilar a engine inteira. Isso significa que scripts em Lua são carregados em tempo de execução — você edita um arquivo, reinicia (ou recarrega) o servidor, e a mudança já está valendo.
local nome = "Knight"
local level = 50
local ativo = true
local declara uma variável visível só dentro daquele escopo — é o padrão que você vai usar na grande maioria dos scripts.
if level >= 50 then
print("Jogador tem level suficiente")
else
print("Level insuficiente")
end
for i = 1, 5 do
print("Repetição número " .. i)
end
local function saudacao(nome)
return "Olá, " .. nome .. "!"
end
print(saudacao("Knight"))
Talkactions são comandos de chat, tipo !level. Um exemplo simples que mostra o level do jogador que digitou o comando:
local talk = TalkAction("!level")
function talk.onSay(player, words, param)
player:sendTextMessage(MESSAGE_INFO_DESCR, "Seu level atual é: " .. player:getLevel())
return false
end
talk:register()
Esse script já usa dois conceitos centrais da API: o objeto player, que representa quem está jogando, e os métodos dele (como getLevel()) que retornam informações do personagem.
A API de cada engine (TFS, Canary) tem sua própria lista de funções disponíveis pro objeto player, creature, item e outros. Ela geralmente fica documentada no wiki do repositório oficial da engine no GitHub, e vale muito a pena deixar essa página sempre aberta enquanto você programa — é mais rápido consultar do que tentar adivinhar o nome de um método.
Dica: comece sempre testando scripts pequenos e isolados num servidor de testes. Entender o que cada linha faz é mais importante do que decorar sintaxe.
Com esse básico, o próximo passo natural é tentar montar um NPC funcional, que já mistura praticamente todos esses conceitos — variáveis, condicionais e funções — num script só.