Pular para o conteúdo

triggerServerEvent

Cliente Manipulação de eventos

Dispara um evento no servidor.

bool triggerServerEvent ( string nomeDoEvento, element origem [, ... ] )
NomeTipoPadrãoDescrição
nomeDoEventostring—Evento a disparar no servidor.
origemelement—Elemento de origem, que vira source no manipulador do servidor.
...any—Argumentos repassados ao manipulador.

true se o envio foi aceito, false se não houver conexão com o servidor.

Só atravessa o que o servidor conhece. Uma origem criada por um script de cliente registra Bad source element @ 'triggerServerEvent' [element is clientside] e devolve false. Um argumento que seja um elemento assim, ou qualquer outro userdata que a rede não carrega, registra um erro com a posição dele e a chamada inteira devolve false; dentro de uma tabela, esses valores chegam como nil.

O retorno diz só que o pacote saiu daqui — não que o servidor recebeu, nem que ele executou alguma coisa. Se o script precisa saber o resultado, o servidor tem que responder com um triggerClientEvent.

O cliente pede para comprar um item; o servidor confere o dinheiro, decide e responde.

No cliente:

-- resposta do servidor
addEvent("onCompraResultado", true)
addEventHandler("onCompraResultado", root, function(aprovada, motivo)
if aprovada then
outputDebugString("compra concluída")
else
outputDebugString("compra recusada: " .. motivo, 2)
end
end)
bindKey("f2", "down", function()
-- só o identificador do item; o preço é problema do servidor
triggerServerEvent("onJogadorComprar", localPlayer, "colete")
end)

No servidor:

local precos = { colete = 500, capacete = 150 }
addEvent("onJogadorComprar", true) -- o `true` é o que permite o cliente disparar
addEventHandler("onJogadorComprar", root, function(item)
local jogador = client -- quem realmente mandou o pacote
local preco = precos[item] -- preço da tabela do servidor, não do cliente
if not preco then
triggerClientEvent(jogador, "onCompraResultado", jogador, false, "item inexistente")
return
end
local saldo = getElementData(jogador, "dinheiro") or 0
if saldo < preco then
triggerClientEvent(jogador, "onCompraResultado", jogador, false, "dinheiro insuficiente")
return
end
setElementData(jogador, "dinheiro", saldo - preco)
triggerClientEvent(jogador, "onCompraResultado", jogador, true)
end)

Repare no formato do par: cada lado registra o nome com addEvent(nome, true) antes de conseguir receber, e cada lado passa um elemento de origem que vira o source do outro lado.