Pular para o conteúdo

Eventos de cliente

Cliente

Os eventos desta página disparam só no cliente, dentro do jogo de um jogador. O próprio evento e seus handlers nunca atravessam essa fronteira. O protocolo pode relatar separadamente ao servidor a ação correspondente — como dano ou uma explosão — e também encaminha automaticamente as linhas digitadas no F8 depois dos manipuladores locais. Para enviar dados próprios, use triggerServerEvent.

Você registra um manipulador exatamente como faz no servidor:

addEventHandler("onClientVehicleExplode", root, function()
outputDebugString(getVehicleName(source) .. " explodiu")
end)

addEventHandler, removeEventHandler, getEventHandlers, eventos personalizados e as regras de propagação estão descritos na página de Eventos e nas funções de eventos — funcionam do mesmo jeito aqui, e a página de cada função aponta onde o cliente difere. Esta página cobre só a lista de eventos que o cliente dispara sozinho.

São 106 nomes no total: 105 eventos que você pega com addEventHandler e o onClientSVGUpdate, que é o único que não passa pelo sistema de eventos — ele só chega à função que você registra.

Todos os manipuladores registrados por um resource somem quando ele para. Um manipulador preso diretamente a um elemento também é removido automaticamente logo depois do onClientElementDestroy daquele elemento.

Enquanto um manipulador está executando, quatro globais ficam disponíveis:

GlobalConteúdo
sourceO elemento que originou o evento — o mesmo descrito na linha Source de cada evento abaixo.
eventNameO nome do evento em execução, como texto.
sourceResourceO resource cujo script chamou triggerEvent. É nil quando quem disparou foi a engine ou o servidor.
sourceResourceRootO elemento raiz desse resource, nil nos mesmos casos.

Cada manipulador recebe o próprio conjunto de valores e tem eles restaurados ao retornar, então um manipulador que dispara um evento aninhado continua vendo o seu próprio source na linha seguinte à chamada aninhada.

Não existe client no cliente: aqui não há “de qual jogador veio”, porque tudo acontece na máquina de um jogador só.

Três elementos ficam sempre à mão nos scripts de cliente e aparecem o tempo todo nos manipuladores:

GlobalConteúdo
localPlayerO jogador desta máquina. É a resposta para “sou eu?” dentro de um manipulador.
rootA raiz da árvore de elementos. Prender um manipulador aqui pega o evento venha ele de onde vier.
resourceRootA raiz do seu resource. Serve para filtrar onClientResourceStart e onClientResourceStop para o seu próprio resource.

O uso mais comum de localPlayer é separar o que aconteceu com você do que aconteceu com os outros:

addEventHandler("onClientVehicleEnter", root, function(ped, assento)
if ped == localPlayer and assento == 0 then
outputDebugString("assumi a direção de " .. getVehicleName(source))
end
end)

cancelEvent, wasEventCancelled e getCancelReason existem no cliente e funcionam nos eventos que você dispara com triggerEvent.

Vinte e seis eventos desta página também respondem ao cancelamento — o cliente olha para o resultado e desfaz, bloqueia ou reverte o que ia acontecer:

EventoO que o cancelamento faz
onClientPlayerDamage · onClientPedDamageBarra o golpe no ponto de aplicação e preserva vida e colete.
onClientPlayerChokeInterrompe o engasgo e ignora novos engasgos por um segundo e meio.
onClientPlayerHeliKilled · onClientPedHeliKilledA hélice não mata.
onClientPlayerHitByWaterCannon · onClientPedHitByWaterCannonO jato para de empurrar por meio segundo.
onClientExplosionA explosão não acontece.
onClientWeaponFireO tiro não deixa impacto.
onClientPlayerWeaponSwitchA arma volta para a que estava na mão.
onClientPlayerStealthKillO golpe pelas costas não sai.
onClientPlayerRadioSwitchA estação continua a mesma.
onClientElementModelChangeO modelo antigo é mantido — só quando a troca veio de setElementModel.
onClientVehicleStartEnterA tarefa de entrar do jogador local não começa; para um ped criado por este cliente, setPedEnterVehicle devolve false.
onClientVehicleStartExitSó para um ped criado por este cliente: setPedExitVehicle devolve false.
onClientVehicleEnterSó para um ped criado por este cliente: ele é tirado de volta do veículo.
onClientVehicleDamageA vida anterior do veículo é restaurada.
onClientWorldSoundO jogo nunca toca aquele som.
onClientPauseMenuOpenO menu principal não abre.
onClientPlayerWeaponReload · onClientPedWeaponReloadA arma não é recarregada nesta máquina.
onClientElementAttach · onClientElementDetachO anexo ou a separação não é aplicado — um attachElements/detachElements local devolve false, e um anunciado pelo servidor é ignorado só nesta máquina.
onClientKeyA tecla não chega a nenhum bind de bindKey. O jogo em si ainda a recebe.
onClientDebugMessageA mensagem não aparece no console de debug.
onClientPlayerVoiceStartO microfone do jogador local continua desligado; a fala de outro jogador é silenciada nesta máquina.

Quadro

Quatro eventos disparam em todo quadro, sempre nesta ordem:

OrdemEventoPara que serve
1onClientPedsProcessedOs personagens do mundo já foram atualizados. É o ponto mais cedo do quadro em que dá para ler posições e vida de todo mundo.
2onClientPreRenderRecebe o tempo decorrido desde o quadro anterior. É onde entra o que precisa de um passo de tempo: interpolação, movimento de câmera, contadores.
3onClientRenderO gancho de desenho. Tudo que você desenha aqui aparece sobre o mundo.
4onClientHUDRenderO último do quadro. O que você desenha aqui fica por cima do que foi desenhado no onClientRender.

Os quatro têm a raiz como source, nenhum é cancelável e as funções de desenho funcionam nos quatro. A diferença prática é só ordem: quem desenha depois cobre quem desenhou antes.

Áreas de colisão e marcadores são testados uma vez por quadro contra jogadores, peds, veículos e objetos. Os eventos disparam na transição — entrou ou saiu —, nunca continuamente enquanto o elemento fica dentro.

Cada toque em uma área gera dois eventos: um com a área como source e outro com o elemento como source. Marcadores geram um, mais o onClientPlayerMarkerHit na entrada e o onClientPlayerMarkerLeave na saída quando o elemento é um jogador.

Cada entrada em um pickup dispara dois eventos, nesta ordem: primeiro onClientPickupHit, depois onClientPlayerPickupHit. A saída faz o mesmo com o par de saída.

Estes avisam sobre o download de assets que acontece antes de um resource iniciar. São a base para você montar a sua própria tela de download, no lugar da caixa de transferência embutida.

Os quatro eventos de voz só existem quando o chat de voz está ligado na configuração do servidor.