Comandos personalizados com addCommandHandler
Comandos como /pagar, /reparar ou /anuncio são a forma mais direta de interação dos jogadores com os sistemas do servidor. No MTA, eles são criados com addCommandHandler.
O básico
addCommandHandler("ola", function(jogador, comando)
outputChatBox("Olá, " .. getPlayerName(jogador) .. "!", jogador)
end)
No jogo: /ola.
No servidor, a função recebe:
- O jogador que digitou (ou o console);
- O nome do comando;
- Os argumentos digitados.
Argumentos
addCommandHandler("pagar", function(jogador, cmd, alvoNome, valorTexto)
if not alvoNome or not valorTexto then
return outputChatBox("Uso: /pagar [jogador] [valor]", jogador, 255, 200, 0)
end
local alvo = getPlayerFromName(alvoNome)
local valor = tonumber(valorTexto)
if not alvo then
return outputChatBox("Jogador não encontrado.", jogador, 255, 0, 0)
end
if not valor or valor <= 0 or valor ~= math.floor(valor) then
return outputChatBox("Valor inválido.", jogador, 255, 0, 0)
end
if alvo == jogador then
return outputChatBox("Você não pode pagar a si mesmo.", jogador, 255, 0, 0)
end
if getPlayerMoney(jogador) < valor then
return outputChatBox("Dinheiro insuficiente.", jogador, 255, 0, 0)
end
takePlayerMoney(jogador, valor)
givePlayerMoney(alvo, valor)
outputChatBox("Você pagou $" .. valor .. " a " .. getPlayerName(alvo), jogador, 0, 255, 0)
outputChatBox(getPlayerName(jogador) .. " te pagou $" .. valor, alvo, 0, 255, 0)
end)
Repare na validação de cada argumento: números negativos, decimais e alvos inválidos são exploits clássicos.
Juntando o resto da mensagem
Para comandos com texto livre (/anuncio Vendo carro barato):
addCommandHandler("anuncio", function(jogador, cmd, ...)
local texto = table.concat({...}, " ")
if texto == "" then return end
outputChatBox("[ANÚNCIO] " .. getPlayerName(jogador) .. ": " .. texto, root, 0, 200, 255)
end)
Comandos restritos pela ACL
O terceiro parâmetro de addCommandHandler ativa a restrição por ACL:
addCommandHandler("darvip", function(jogador, cmd, alvo)
-- ...
end, true)
Com true, só contas com o direito command.darvip na ACL podem usar. Você também pode verificar manualmente:
local conta = getPlayerAccount(jogador)
if isGuestAccount(conta) or not isObjectInACLGroup("user." .. getAccountName(conta), aclGetGroup("Admin")) then
return
end
Comandos no cliente
Scripts de cliente também podem criar comandos (útil para ações visuais, como /hud), mas eles não devem mudar nada importante — lembre-se de que o cliente não é confiável.
Anti-spam
Limite o uso de comandos pesados com um intervalo por jogador:
local ultimoUso = {}
-- dentro do handler:
if ultimoUso[jogador] and getTickCount() - ultimoUso[jogador] < 3000 then return end
ultimoUso[jogador] = getTickCount()
(E limpe a tabela no onPlayerQuit.)
Hospede seu servidor com a VittHost
No MTASA-BR da VittHost, você testa seus comandos com console em tempo real no painel Pterodactyl. Servidores no Brasil, proteção DDoS, MySQL incluso, downloads acelerados por nginx dedicado e teste grátis de 3 dias.