Servidores de Jogos

Eventos no MTA: addEventHandler e triggerServerEvent

Eventos no MTA: addEventHandler e triggerServerEvent

O MTA:SA é orientado a eventos: em vez de verificar o tempo todo se algo aconteceu, seus scripts reagem quando algo acontece — um jogador entra, morre, entra em um veículo, clica em um botão.

Escutando eventos nativos

addEventHandler("onPlayerWasted", root, function(municao, assassino)
    local nome = getPlayerName(source)
    outputChatBox(nome .. " morreu.", root, 255, 0, 0)
end)
  • "onPlayerWasted" — nome do evento;
  • root — o elemento ao qual o evento está ligado (root = qualquer elemento);
  • source — variável especial com o elemento que gerou o evento (aqui, o jogador que morreu).

Eventos de servidor começam com on (onPlayerJoin, onVehicleEnter); eventos de cliente com onClient (onClientRender, onClientGUIClick).

Eventos personalizados

Você pode criar seus próprios eventos:

addEvent("onEmpregoConcluido")

addEventHandler("onEmpregoConcluido", root, function(valor)
    outputChatBox("Você recebeu $" .. valor, source)
end)

-- em outro ponto do código:
triggerEvent("onEmpregoConcluido", jogador, 500)

Cliente → servidor

O cliente pede algo ao servidor com triggerServerEvent:

-- client.lua
triggerServerEvent("comprarItem", localPlayer, "kit_medico")
-- server.lua
addEvent("comprarItem", true) -- true = pode ser disparado remotamente
addEventHandler("comprarItem", root, function(item)
    local jogador = client -- quem de fato disparou
    -- validar tudo aqui!
end)

O segundo argumento de addEvent precisa ser true para aceitar eventos vindos da rede.

Servidor → cliente

-- server.lua
triggerClientEvent(jogador, "mostrarAviso", jogador, "Bem-vindo ao emprego de taxista!")
-- client.lua
addEvent("mostrarAviso", true)
addEventHandler("mostrarAviso", root, function(texto)
    -- desenhar notificação na tela
end)

source x client

Em eventos vindos do cliente, source pode ser qualquer elemento que o cliente escolher. Já a variável client contém o jogador que realmente enviou o evento. Para segurança, use client e compare com source quando necessário:

if client ~= source then return end

Veja o post "Validando eventos do cliente para evitar exploits".

Boas práticas

  • Nomeie eventos personalizados com um prefixo do seu resource (ex.: rp:comprarItem) para evitar conflitos;
  • Ligue handlers a elementos específicos quando possível (ex.: resourceRoot) em vez de root;
  • Evite eventos disparados a cada frame para o servidor — use com moderação;
  • Remova handlers que não são mais necessários com removeEventHandler.

Hospede seu servidor com a VittHost

No MTASA-BR da VittHost, você acompanha seus eventos e erros pelo console em tempo real do 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