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