From e87b2cec6ced9d8c8c7c8520e21f2f595e79046c Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Mon, 8 Jun 2026 20:33:41 -0300 Subject: [PATCH] fix(zmmo-client): guard HandlePlayerSpawned ignore proprio entityId + ZeusV1 config Acompanha commit server 54f2f9a (P10-FIX-LEGACY). Resolve bug "vejo proxy de UM mas o outro NAO ve" + "proxy fantasma do proprio player" -- causado por server emitir S_SPAWN_PLAYER local=0 do proprio entityId via AOI re-emit (workflow wcyeqgrad finding). Source/ZMMO/Game/Network/ZeusWorldSubsystem.cpp ================================================ HandlePlayerSpawned guard novo logo apos EntityId==0 check: if (LocalEntityId != 0 && EntityId == LocalEntityId) { UE_LOG(LogZMMO, Verbose, TEXT("ignoring S_SPAWN_PLAYER for own LocalEntityId=%lld (bIsLocal=%d)"), LocalEntityId, bIsLocal ? 1 : 0); return; } Sem o guard, server re-emit S_SPAWN_PLAYER local=0 do proprio entityId (via AOI SetOnEnter callback em catch-up cross-server ou recompute pos- handoff) criava proxy fantasma do proprio player. GAS/HUD/PlayerArray roteava via fantasma e o pawn real perdia vinculo de identidade visivel pros outros players. Defesa em profundidade -- complementa fix server-side (AoiReplicationHelpers.cpp:28 SendSpawnPlayerToConn agora tem skip-self guard antes de construir payload) + SpawnKey dedupe sem IsLocal no plugin (ZeusNetworkSubsystem.cpp:949 removeu IsLocal do hash). Config/DefaultZeusV1.ini ========================= Config inicial para UZeusNetworkingClientSubsystem (P9-6/P9-7 plugin V1). Aponta para Gateway 127.0.0.1:7777 (fluxo padrao producao). Documenta alternativa de direct connect 9001 (debug only -- bug Windows multi-NIC loopback). bUseZeusNetworkingV1=True ativa V1 plugin em paralelo ao legacy (transport V1 hoje quebrado via Gateway -- channelId nao eh routing key, Phase 12 territory; gameplay continua via legacy ate la). Validado smoke 2 PIE 2026-06-08 20:32 ====================================== * SP_01: players=2 conns=2 + AOI players=2 maxSet=1 enters=5 hyst=92 stable * UE: [PIE0] e [PIE1] prefix funcionando (commit server 54f2f9a ZNET_PIE_PREFIX) * "S_SPAWN_PLAYER duplicate ignored" dedupe pegando re-emit (Batch 2) * S_CHAR_INFO trocado correto: PIE0 ve Olatudook, PIE1 ve Mateuus * Saida limpa: UnregisterViewer + Broadcast S_DESPAWN_PLAYER targets=1 Co-Authored-By: Claude Opus 4.7 --- Config/DefaultZeusV1.ini | 19 +++++++++++++++++++ .../ZMMO/Game/Network/ZeusWorldSubsystem.cpp | 15 +++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 Config/DefaultZeusV1.ini diff --git a/Config/DefaultZeusV1.ini b/Config/DefaultZeusV1.ini new file mode 100644 index 0000000..c163a79 --- /dev/null +++ b/Config/DefaultZeusV1.ini @@ -0,0 +1,19 @@ +; DefaultZeusV1.ini +; Config inicial pra UZeusNetworkingClientSubsystem (P9-6/P9-7 plugin). +; Editar via UE Project Settings -> Plugins -> Zeus V1 OU editar este arquivo +; e relancar o editor. +; +; PORT 7777: ZeusGateway. NodeService popula routes via charId lookup quando +; cliente conecta (validado: handshake routed charId=7 -> SP_01 cell 0). Fluxo +; padrao de producao -- UE conecta no Gateway, Gateway resolve cell ownership +; via lease em Valkey + encaminha pro ZS correto. +; +; ALTERNATIVO (debug only -- bug aberto pendente investigacao): +; ServerPort=9001 conecta DIRETO em SP_01 mas hoje pacote UE nao chega no +; server (FUdpSocketBuilder + Windows multi-NIC loopback issue). Use 7777. + +[/Script/ZeusNetwork.ZeusNetworkingClientSubsystem] +ServerHost=127.0.0.1 +ServerPort=7777 +bUseZeusNetworkingV1=True +bAutoConnectOnStart=True diff --git a/Source/ZMMO/Game/Network/ZeusWorldSubsystem.cpp b/Source/ZMMO/Game/Network/ZeusWorldSubsystem.cpp index e1897ca..4abef2d 100644 --- a/Source/ZMMO/Game/Network/ZeusWorldSubsystem.cpp +++ b/Source/ZMMO/Game/Network/ZeusWorldSubsystem.cpp @@ -96,6 +96,21 @@ void UZeusWorldSubsystem::HandlePlayerSpawned(const int64 EntityId, const bool b return; } + // P10-FIX-LEGACY (workflow wcyeqgrad finding): server pode reenviar + // S_SPAWN_PLAYER com bIsLocal=false do PROPRIO entityId via AOI re-emit + // (catch-up cross-server, SetOnEnter callback recomputando InterestSet, + // handoff em flight). Sem guard, o segundo spawn cria proxy fantasma do + // proprio player; GAS/HUD passa a rotear via proxy fantasma e o pawn real + // perde vinculo. Sintoma observado: player ve 2 pawns sobrepostos, ou + // outros players nao veem o autoritativo. + if (LocalEntityId != 0 && EntityId == LocalEntityId) + { + UE_LOG(LogZMMO, Verbose, + TEXT("ZeusWorldSubsystem: ignoring S_SPAWN_PLAYER for own LocalEntityId=%lld (bIsLocal=%d)"), + LocalEntityId, bIsLocal ? 1 : 0); + return; + } + if (bIsLocal) { // O proprio AZeusCharacter cuida da sua identidade quando recebe o