diff --git a/Content/__ExternalActors__/ThirdPerson/TestWorld/0/K1/J30Y0PBMDO6QU5G0LYMZVZ.uasset b/Content/__ExternalActors__/ThirdPerson/TestWorld/0/K1/J30Y0PBMDO6QU5G0LYMZVZ.uasset new file mode 100644 index 0000000..2e4d464 Binary files /dev/null and b/Content/__ExternalActors__/ThirdPerson/TestWorld/0/K1/J30Y0PBMDO6QU5G0LYMZVZ.uasset differ diff --git a/Content/__ExternalActors__/ThirdPerson/TestWorld/1/IG/UMDLFRNRL0X2EHVXYK5GHU.uasset b/Content/__ExternalActors__/ThirdPerson/TestWorld/1/IG/UMDLFRNRL0X2EHVXYK5GHU.uasset index 6af849b..f86bac8 100644 Binary files a/Content/__ExternalActors__/ThirdPerson/TestWorld/1/IG/UMDLFRNRL0X2EHVXYK5GHU.uasset and b/Content/__ExternalActors__/ThirdPerson/TestWorld/1/IG/UMDLFRNRL0X2EHVXYK5GHU.uasset differ diff --git a/Content/__ExternalActors__/ThirdPerson/TestWorld/9/9Q/XR10A0B577UDQQ9XFFRPIH.uasset b/Content/__ExternalActors__/ThirdPerson/TestWorld/9/9Q/XR10A0B577UDQQ9XFFRPIH.uasset new file mode 100644 index 0000000..0562752 Binary files /dev/null and b/Content/__ExternalActors__/ThirdPerson/TestWorld/9/9Q/XR10A0B577UDQQ9XFFRPIH.uasset differ diff --git a/Content/__ExternalActors__/ThirdPerson/TestWorld/9/KE/RK629GGHY991OCX4UXBSSA.uasset b/Content/__ExternalActors__/ThirdPerson/TestWorld/9/KE/RK629GGHY991OCX4UXBSSA.uasset index fe93e17..d3db023 100644 Binary files a/Content/__ExternalActors__/ThirdPerson/TestWorld/9/KE/RK629GGHY991OCX4UXBSSA.uasset and b/Content/__ExternalActors__/ThirdPerson/TestWorld/9/KE/RK629GGHY991OCX4UXBSSA.uasset differ diff --git a/Content/__ExternalActors__/ThirdPerson/TestWorld/E/SD/S3UTR49GRCI3BL0GB4MTC1.uasset b/Content/__ExternalActors__/ThirdPerson/TestWorld/E/SD/S3UTR49GRCI3BL0GB4MTC1.uasset index 2f11935..36d154b 100644 Binary files a/Content/__ExternalActors__/ThirdPerson/TestWorld/E/SD/S3UTR49GRCI3BL0GB4MTC1.uasset and b/Content/__ExternalActors__/ThirdPerson/TestWorld/E/SD/S3UTR49GRCI3BL0GB4MTC1.uasset differ diff --git a/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp b/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp index 5a7be63..b6fb1cb 100644 --- a/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp +++ b/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp @@ -34,6 +34,20 @@ void AZMMOPlayerController::BeginPlay() { Super::BeginPlay(); + if (IsLocalPlayerController()) + { + // Limpa estado de input herdado da UI do FrontEnd (UIManagerSubsystem + // e LocalPlayerSubsystem — sobrevive ao travel, e o controller anterior + // (AZMMOFrontEndPlayerController) tinha setado FInputModeUIOnly + + // bShowMouseCursor=true). Sem este reset, WASD/Look podem nao chegar + // ao pawn porque o Slate ainda esta com foco no widget antigo. + FInputModeGameOnly InputMode; + InputMode.SetConsumeCaptureMouseDown(true); + SetInputMode(InputMode); + bShowMouseCursor = false; + FlushPressedKeys(); + } + if (ShouldUseTouchControls() && IsLocalPlayerController()) { MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp index 22bde20..d4712b8 100644 --- a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp +++ b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp @@ -365,7 +365,15 @@ void UUIFrontEndFlowSubsystem::HandleServerTravelRequested(const FString& MapNam if (!MapPath.IsEmpty()) { - UGameplayStatics::OpenLevel(GetGameInstance(), FName(*MapPath)); + // Forca ZMMOGameMode em qualquer mapa que venha do WorldServer. + // World Settings do .umap podem ter override herdado de L_FrontEnd + // (GameModeOverride=ZMMOFrontEndGameMode) — sobrescrevemos via URL + // option pra nao depender de cada artista configurar. + // Evolucao natural: quando o WorldServer enviar GameMode no + // S_TRAVEL_TO_MAP (wire estendido), trocar este literal por + // `?game=` + valor recebido do server. + const FString Options = TEXT("game=/Script/ZMMO.ZMMOGameMode"); + UGameplayStatics::OpenLevel(GetGameInstance(), FName(*MapPath), /*bAbsolute=*/true, Options); } } diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIUserLobbyScreen_Base.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIUserLobbyScreen_Base.cpp index 35e3e64..56655d4 100644 --- a/Source/ZMMO/Game/UI/FrontEnd/UIUserLobbyScreen_Base.cpp +++ b/Source/ZMMO/Game/UI/FrontEnd/UIUserLobbyScreen_Base.cpp @@ -6,6 +6,7 @@ #include "UICharCard_Base.h" #include "UICharacterCreatePage_Base.h" #include "ZeusCharServerSubsystem.h" +#include "ZeusNetworkSubsystem.h" #include "CommonTextBlock.h" #include "Components/PanelWidget.h" #include "Components/WidgetSwitcher.h" @@ -431,8 +432,18 @@ void UUIUserLobbyScreen_Base::HandleCharSelectOk(const TArray& Payload) { Flow->SetState(EZMMOFrontEndState::EnteringWorld); } - // TODO Fase 1.5C: invocar UZeusNetworkSubsystem->ConnectToWorld(host,port,token) - // quando o WorldServer aceitar tickets do CharServer (handshake estendido). + + // Fase 3: handoff UDP — apresenta o ticket no `C_CONNECT_REQUEST`. O + // WorldServer valida via GETDEL no Valkey regional. WorldServer envia + // `S_CONNECT_OK` (sucesso) ou `S_CONNECT_REJECT` (ticket invalido/expirado). + if (UZeusNetworkSubsystem* ZeusNet = GI->GetSubsystem()) + { + ZeusNet->ConnectToZeusServerWithTicket(WorldHost, static_cast(WorldPort), HandoffToken); + } + else + { + UE_LOG(LogZMMO, Error, TEXT("Lobby: ZeusNetworkSubsystem ausente — handoff abortado")); + } } void UUIUserLobbyScreen_Base::HandleCharSelectReject(const TArray& Payload)