refactor(charserver): World -> Realm + parse gatewayEndpoint + fix PendingLoadingSteps race

- ZMMOWorldEntry -> ZMMORealmEntry (RealmId + GatewayEndpoint single string)
- CharServerOpcodes: S_WORLD_* -> S_REALM_*
- UIServerSelectScreen: parse S_REALM_LIST com gatewayEndpoint
- UIUserLobbyScreen: parse S_CHAR_SELECT_OK, split gatewayEndpoint via FString::Split(":", FromEnd) — IPv6 tolerante
- UICharacterCreatePage: SubmitCreate envia realmId
- ZMMOCharSummary: WorldId -> RealmId
- UIFrontEndFlowSubsystem: GetSelectedRealmId; fix de race em PendingLoadingSteps_ (TSet snapshot via MoveTemp antes de iterar; evita access violation em TConstSetBitIterator durante async lambda)

Conferido E2E: 2 standalone instances entram simultaneamente em Provinces diferentes via Gateway.
This commit is contained in:
2026-05-31 20:02:47 -03:00
parent ede49c1777
commit 4e14f1feb6
14 changed files with 222 additions and 186 deletions

View File

@@ -18,13 +18,13 @@ class UZeusCharServerSubsystem;
* Tela Lobby (host) — Fase 1.5 do ARQUITETURA_SERVER_SELECT.
*
* Fluxo:
* 1. NativeOnActivated: pega `SelectedWorldId` do FlowSubsystem, envia
* C_CHAR_LIST_REQUEST filtrado por esse mundo
* 1. NativeOnActivated: pega `SelectedRealmId` do FlowSubsystem, envia
* C_CHAR_LIST_REQUEST filtrado por esse realm
* 2. Parse S_CHAR_LIST -> Chars[]; instancia 1 WBP_CharCard por entry
* 3. Card "Selecionar" -> C_CHAR_SELECT(charId) -> S_CHAR_SELECT_OK ->
* handoff UDP pro WorldServer
* handoff UDP pro Gateway do Realm
* 4. Botao "Criar Personagem" -> mostra page interna `CharacterCreate`
* 5. Botao "Voltar" -> ClearSelectedWorld + Flow.SetState(ServerSelect)
* 5. Botao "Voltar" -> ClearSelectedRealm + Flow.SetState(ServerSelect)
*
* Pages internas via UWidgetSwitcher:
* - PageIndex 0: Lista de chars (CardContainer)
@@ -96,6 +96,9 @@ protected:
UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr<UUICharacterCreatePage_Base> CharCreatePage;
UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr<UCommonTextBlock> Text_Title;
// TODO(R4): renomear o widget Text_WorldName -> Text_RealmName no WBP_UserLobby.uasset
// tambem; aqui mantivemos o nome antigo pra nao quebrar o BindWidgetOptional ate
// alguem reabrir o WBP no editor.
UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr<UCommonTextBlock> Text_WorldName;
UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr<UUIButton_Base> Btn_Back;
UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr<UUIButton_Base> Btn_Create;