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 deroot; - 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.