M MY Multiplayer: Wiki

Eventos entre cliente e servidor

Como registrar eventos customizados com addEvent e enviá-los entre cliente e servidor com triggerServerEvent, triggerClientEvent e eventos latentes no MY Multiplayer (MYMP).

No MY Multiplayer (MYMP), scripts de cliente e de servidor se comunicam pela rede registrando eventos customizados e disparando-os no lado oposto.

Criar e ouvir um evento

  • addEvent(nome, remoto) registra um novo nome de evento. Apenas eventos registrados com remoto igual a true podem ser recebidos pela rede vindos do outro lado; qualquer evento remoto não autorizado é descartado e registrado no log.
  • addEventHandler(nome, elemento, funcao) conecta uma função Lua ao evento na árvore de elementos.

Do cliente para o servidor

triggerServerEvent(nome, source, ...) envia um evento do cliente ao servidor.

  • Restrição de elementos: o elemento source e quaisquer elementos passados nos argumentos precisam existir no servidor. Passar um elemento criado apenas no cliente gera erro.
  • Identificação segura do remetente: no servidor, a variável global client contém o jogador real cuja conexão enviou o pacote. Sempre valide client — e não source nem argumentos da função — para identificar o autor da ação, pois source e os argumentos são escolhidos pelo cliente.

Do servidor para o cliente

triggerClientEvent([para,] nome, source, ...) envia um evento do servidor para um ou mais clientes:

  • para: pode ser um player, uma tabela de jogadores ou um elemento da árvore (envia a todos os jogadores abaixo dele). Quando omitido, o evento é enviado a todos os jogadores conectados.
  • Para cargas maiores de dados, use triggerLatentServerEvent e triggerLatentClientEvent, que transmitem os dados gradualmente respeitando um limite de banda sem bloquear o tráfego normal.

Exemplo completo

Servidor:

addEvent("onShopBuy", true)

addEventHandler("onShopBuy", resourceRoot, function(itemId)
    if type(itemId) ~= "string" then return end
    triggerClientEvent(client, "onShopBought", resourceRoot, itemId)
end)

Cliente:

addEvent("onShopBought", true)

addEventHandler("onShopBought", resourceRoot, function(itemId)
    outputDebugString("Você comprou " .. itemId)
end)

triggerServerEvent("onShopBuy", resourceRoot, "burger")

Limite de eventos por jogador

Quando um jogador dispara mais de max_player_triggered_events_per_interval eventos (padrão: 100) dentro da janela player_triggered_event_interval em milissegundos (padrão: 1000, ambos configuráveis no server.cfg), o servidor dispara o evento onPlayerTriggerEventThreshold. Cabe ao script decidir a ação tomada, como desconectar o jogador com kickPlayer.