Criando Seu Primeiro NPC Funcional em Lua
Blog Criando Seu Primeiro NPC Funcional em Lua
Programação

Criando Seu Primeiro NPC Funcional em Lua

28/08/2026

NPCs são parte essencial de qualquer OTServer — vendem itens, dão quests, avançam histórias. Vamos construir, passo a passo, a estrutura de um NPC simples: um vendedor que cumprimenta o jogador e vende um item básico.

Estrutura básica de um NPC

Um NPC em engines como o TFS geralmente é composto por dois arquivos: um .xml, que define aparência e dados básicos, e um .lua, que define o comportamento (o que ele fala e faz).

O arquivo XML

<npc name="Mercador" script="mercador.lua" walkinterval="2000" floorchange="0">
    <health now="100" max="100"/>
    <look type="128" head="78" body="69" legs="58" feet="76" addons="0"/>
</npc>

O arquivo Lua: cumprimento e despedida

local npcHandler = NpcHandler:new()
NpcSystem.parseParameters(npcHandler)

function onCreatureAppear(cid, creature)
    npcHandler:onCreatureAppear(cid, creature)
end

function onCreatureDisappear(cid, creature)
    npcHandler:onCreatureDisappear(cid, creature)
end

function onCreatureSay(cid, type, msg)
    npcHandler:onCreatureSay(cid, type, msg)
end

npcHandler:setMessage(MESSAGE_GREET, "Olá, |PLAYERNAME|! Quer comprar algo?")
npcHandler:setMessage(MESSAGE_FAREWELL, "Até mais, aventureiro!")

O marcador |PLAYERNAME| é substituído automaticamente pelo nome do jogador que está conversando — um detalhe pequeno que já deixa o NPC mais natural.

Adicionando a venda de itens

Pra transformar esse NPC num vendedor de verdade, você registra uma lista de itens vendáveis, cada um com nome, id e preço:

local shopItems = {
    {id = 2160, name = "crystal coin", price = 100, sell = 0},
    {id = 2171, name = "small health potion", price = 15, sell = 5},
}

npcHandler:addModule(FocusModule:new())
ShopModule.new(shopItems)

Com isso, ao falar palavras-chave como "trade" ou abrir o comércio pelo próprio client, o jogador já consegue comprar e vender os itens definidos.

Testando o NPC

Depois de salvar os dois arquivos na pasta de NPCs da engine e reiniciar (ou recarregar) o servidor, entre com um personagem de teste, encontre o NPC no mapa, fale com ele e confira: a saudação aparece? O comércio abre corretamente? Os preços batem com o que você configurou?

Dica: comece sempre copiando um NPC simples já funcional da própria engine como base, em vez de escrever tudo do zero — é mais fácil identificar o que mudar do que montar a estrutura inteira na mão.

Esse é só o esqueleto básico. A partir daqui dá pra evoluir pra NPCs com diálogos condicionais, quests completas e sistemas de missão — mas o princípio de cumprimento, fala e módulo de comércio é a base de praticamente todos eles.