Servidores de Jogos

Comandos personalizados com addCommandHandler

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:

  1. O jogador que digitou (ou o console);
  2. O nome do comando;
  3. 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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS