From 6391372f004eeedb1a1157ff40c7d474baeaf513 Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Sun, 24 May 2026 01:37:04 -0300 Subject: [PATCH] feat(jobs): Jobs.1 client UI infra (handler + library + tecla J) + UI tweaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Infraestrutura cliente da promocao de classe (Jobs.1). WBP_JobChangePanel NAO esta neste commit — foi exploracao descartada (criar UI dinamica de botoes via MCP BP graph esbarrou em limites do CreateWidget node). A fundacao C++ fica pronta pra ser usada quando voltarmos pra UI. INFRA C++ NOVA (Source/ZMMOJobs/) * UZMMOJobChangeNetworkHandler (WorldSubsystem novo) — bind no OnJobChangeResult do plugin e re-broadcast via FZMMOOnJobChangeResultBP (dynamic multicast assignavel em BP). WBP futura escuta direto. * UZMMOJobsSubsystem helpers: GetJobsByTier(EZMMOJobTier) + GetEligibleNextJobs(currentClassId) — filtra por ParentClassId. Pure. * UZMMOJobsLibrary BPFL wrappers + SendJobChangeRequest convenience (delega pro UZeusNetworkSubsystem). Dep ZeusNetwork adicionada no Build.cs. ENUM + INPUT * EZMMOInGameUIState ganha JobChangePanel (entre StatusWindow e Inventory). DA_InGameScreenSet pendente de receber entry quando WBP for criada (tecla J vai falhar silenciosamente ate la). * ZMMOPlayerController: tecla J -> ToggleJobChangePanel -> Flow->ToggleScreen(JobChangePanel). Espelha pattern do Alt+A do StatusWindow (InputComponent legacy BindKey + FInputChord). UI TWEAKS * WBP_StatusWindow + DT_UI_Styles: ajustes visuais no Editor durante a sessao (sem mudanca funcional documentavel — provavelmente fontes/ spacing/cores). Co-Authored-By: Claude Opus 4.7 (1M context) --- Content/ZMMO/Data/UI/DT_UI_Styles.uasset | Bin 52184 -> 52519 bytes Content/ZMMO/UI/HUD/WBP_StatusWindow.uasset | Bin 81121 -> 84723 bytes Source/ZMMO/Data/UI/InGameTypes.h | 1 + .../Game/Controller/ZMMOPlayerController.cpp | 19 +++++ .../Game/Controller/ZMMOPlayerController.h | 3 + .../Private/ZMMOJobChangeNetworkHandler.cpp | 67 ++++++++++++++++++ Source/ZMMOJobs/Private/ZMMOJobsLibrary.cpp | 35 +++++++++ Source/ZMMOJobs/Private/ZMMOJobsSubsystem.cpp | 29 ++++++++ .../Public/ZMMOJobChangeNetworkHandler.h | 54 ++++++++++++++ Source/ZMMOJobs/Public/ZMMOJobsLibrary.h | 23 ++++++ Source/ZMMOJobs/Public/ZMMOJobsSubsystem.h | 17 +++++ Source/ZMMOJobs/ZMMOJobs.Build.cs | 3 +- 12 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 Source/ZMMOJobs/Private/ZMMOJobChangeNetworkHandler.cpp create mode 100644 Source/ZMMOJobs/Public/ZMMOJobChangeNetworkHandler.h diff --git a/Content/ZMMO/Data/UI/DT_UI_Styles.uasset b/Content/ZMMO/Data/UI/DT_UI_Styles.uasset index 2406533038a36315aeb7b7fb4055fd559f2adca0..2a65db144f63973efedc6d862e764ef6216aabf4 100644 GIT binary patch literal 52519 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 literal 52184 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 diff --git a/Content/ZMMO/UI/HUD/WBP_StatusWindow.uasset b/Content/ZMMO/UI/HUD/WBP_StatusWindow.uasset index 0311ba8817b3c5c56606314a33cf96ec6648513e..53f54bcdc8d16080303dbc0649121bcba08b6aa4 100644 GIT binary patch literal 84723 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 I@J5XPe_ish_y7O^ literal 81121 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 diff --git a/Source/ZMMO/Data/UI/InGameTypes.h b/Source/ZMMO/Data/UI/InGameTypes.h index d5bc63c..a48125b 100644 --- a/Source/ZMMO/Data/UI/InGameTypes.h +++ b/Source/ZMMO/Data/UI/InGameTypes.h @@ -27,6 +27,7 @@ enum class EZMMOInGameUIState : uint8 None, ///< Antes do player local spawnar; UI in-game inativa. Playing, ///< HUD principal visivel (HP/SP/level/etc). StatusWindow, ///< Janela de atributos + botões de alocacao (Fase 4). + JobChangePanel, ///< Painel de promocao de classe (Jobs.1). Toggle tecla J. Inventory, ///< (futuro) Bag/equipamentos. SkillTree, ///< (futuro) Arvore de skills. EscapeMenu, ///< (futuro) Pausa, settings, logout. diff --git a/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp b/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp index 801f186..0433b8a 100644 --- a/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp +++ b/Source/ZMMO/Game/Controller/ZMMOPlayerController.cpp @@ -104,6 +104,14 @@ void AZMMOPlayerController::SetupInputComponent() this, &AZMMOPlayerController::ToggleStatusWindow); Binding.bConsumeInput = true; Binding.bExecuteWhenPaused = true; // dispara mesmo com StatusWindow aberto (CommonUI menu mode) + + // Hotkey J -> toggle JobChangePanel (Jobs.1). + FInputKeyBinding& JobBinding = InputComponent->BindKey( + FInputChord(EKeys::J, /*bShift*/ false, /*bCtrl*/ false, /*bAlt*/ false, /*bCmd*/ false), + IE_Pressed, + this, &AZMMOPlayerController::ToggleJobChangePanel); + JobBinding.bConsumeInput = true; + JobBinding.bExecuteWhenPaused = true; } } @@ -118,6 +126,17 @@ void AZMMOPlayerController::ToggleStatusWindow() } } +void AZMMOPlayerController::ToggleJobChangePanel() +{ + if (UGameInstance* GI = GetGameInstance()) + { + if (UUIInGameFlowSubsystem* Flow = GI->GetSubsystem()) + { + Flow->ToggleScreen(EZMMOInGameUIState::JobChangePanel); + } + } +} + bool AZMMOPlayerController::ShouldUseTouchControls() const { return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; diff --git a/Source/ZMMO/Game/Controller/ZMMOPlayerController.h b/Source/ZMMO/Game/Controller/ZMMOPlayerController.h index 1f2c057..689db8d 100644 --- a/Source/ZMMO/Game/Controller/ZMMOPlayerController.h +++ b/Source/ZMMO/Game/Controller/ZMMOPlayerController.h @@ -50,4 +50,7 @@ protected: /** Hotkey Alt+A → toggle StatusWindow via UUIInGameFlowSubsystem. */ void ToggleStatusWindow(); + + /** Hotkey J → toggle JobChangePanel (Jobs.1 — promocao de classe). */ + void ToggleJobChangePanel(); }; diff --git a/Source/ZMMOJobs/Private/ZMMOJobChangeNetworkHandler.cpp b/Source/ZMMOJobs/Private/ZMMOJobChangeNetworkHandler.cpp new file mode 100644 index 0000000..ab3a458 --- /dev/null +++ b/Source/ZMMOJobs/Private/ZMMOJobChangeNetworkHandler.cpp @@ -0,0 +1,67 @@ +#include "ZMMOJobChangeNetworkHandler.h" + +#include "Engine/GameInstance.h" +#include "Engine/World.h" +#include "ZeusNetworkSubsystem.h" + +DEFINE_LOG_CATEGORY_STATIC(LogZMMOJobChange, Log, All); + +bool UZMMOJobChangeNetworkHandler::ShouldCreateSubsystem(UObject* Outer) const +{ + // Mesmo criterio do AttributeNetworkHandler — so' em mundos de gameplay + // (PIE / standalone in-game). Editor preview / front-end menu nao precisa. + const UWorld* World = Cast(Outer); + if (World == nullptr) { return false; } + return World->WorldType == EWorldType::Game + || World->WorldType == EWorldType::PIE; +} + +void UZMMOJobChangeNetworkHandler::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + if (UZeusNetworkSubsystem* Net = GetZeusNetSubsystem()) + { + JobChangeResultHandle = Net->OnJobChangeResult.AddUObject( + this, &UZMMOJobChangeNetworkHandler::HandleJobChangeResult); + UE_LOG(LogZMMOJobChange, Log, + TEXT("[ZMMOJobChangeNetworkHandler] Bind OnJobChangeResult OK")); + } + else + { + UE_LOG(LogZMMOJobChange, Warning, + TEXT("[ZMMOJobChangeNetworkHandler] ZeusNetworkSubsystem indisponivel — bind pulado")); + } +} + +void UZMMOJobChangeNetworkHandler::Deinitialize() +{ + if (UZeusNetworkSubsystem* Net = GetZeusNetSubsystem()) + { + if (JobChangeResultHandle.IsValid()) + { + Net->OnJobChangeResult.Remove(JobChangeResultHandle); + JobChangeResultHandle.Reset(); + } + } + OnJobChangeResult.Clear(); + Super::Deinitialize(); +} + +void UZMMOJobChangeNetworkHandler::HandleJobChangeResult( + bool bAccepted, int32 Reason, int32 NewClassId) +{ + UE_LOG(LogZMMOJobChange, Log, + TEXT("[ZMMOJobChangeNetworkHandler] S_JOB_CHANGE_RESULT accepted=%d reason=%d newClassId=%d"), + bAccepted ? 1 : 0, Reason, NewClassId); + OnJobChangeResult.Broadcast(bAccepted, Reason, NewClassId); +} + +UZeusNetworkSubsystem* UZMMOJobChangeNetworkHandler::GetZeusNetSubsystem() const +{ + const UWorld* World = GetWorld(); + if (World == nullptr) { return nullptr; } + UGameInstance* GI = World->GetGameInstance(); + if (GI == nullptr) { return nullptr; } + return GI->GetSubsystem(); +} diff --git a/Source/ZMMOJobs/Private/ZMMOJobsLibrary.cpp b/Source/ZMMOJobs/Private/ZMMOJobsLibrary.cpp index 0f4b861..82c67d5 100644 --- a/Source/ZMMOJobs/Private/ZMMOJobsLibrary.cpp +++ b/Source/ZMMOJobs/Private/ZMMOJobsLibrary.cpp @@ -4,6 +4,7 @@ #include "Engine/World.h" #include "ZMMOJobDataAsset.h" #include "ZMMOJobsSubsystem.h" +#include "ZeusNetworkSubsystem.h" namespace { @@ -52,3 +53,37 @@ bool UZMMOJobsLibrary::IsJobRegistered(const UObject* WorldContextObject, int32 } return false; } + +TArray UZMMOJobsLibrary::GetJobsByTier( + const UObject* WorldContextObject, EZMMOJobTier Tier) +{ + if (UZMMOJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject)) + { + return Sub->GetJobsByTier(Tier); + } + return {}; +} + +TArray UZMMOJobsLibrary::GetEligibleNextJobs( + const UObject* WorldContextObject, int32 CurrentClassId) +{ + if (UZMMOJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject)) + { + return Sub->GetEligibleNextJobs(CurrentClassId); + } + return {}; +} + +void UZMMOJobsLibrary::SendJobChangeRequest( + const UObject* WorldContextObject, int32 TargetClassId) +{ + if (WorldContextObject == nullptr) { return; } + const UWorld* World = WorldContextObject->GetWorld(); + if (World == nullptr) { return; } + UGameInstance* GI = World->GetGameInstance(); + if (GI == nullptr) { return; } + if (UZeusNetworkSubsystem* Net = GI->GetSubsystem()) + { + Net->SendJobChangeRequest(TargetClassId); + } +} diff --git a/Source/ZMMOJobs/Private/ZMMOJobsSubsystem.cpp b/Source/ZMMOJobs/Private/ZMMOJobsSubsystem.cpp index bcdac0a..e2e782b 100644 --- a/Source/ZMMOJobs/Private/ZMMOJobsSubsystem.cpp +++ b/Source/ZMMOJobs/Private/ZMMOJobsSubsystem.cpp @@ -65,3 +65,32 @@ UZMMOJobDataAsset* UZMMOJobsSubsystem::GetJobData(int32 ClassId) const } return nullptr; } + +TArray UZMMOJobsSubsystem::GetJobsByTier(EZMMOJobTier Tier) const +{ + TArray Out; + Out.Reserve(CachedJobs.Num()); + for (const TPair>& Pair : CachedJobs) + { + if (Pair.Value && Pair.Value->Tier == Tier) + { + Out.Add(Pair.Value.Get()); + } + } + return Out; +} + +TArray UZMMOJobsSubsystem::GetEligibleNextJobs(int32 CurrentClassId) const +{ + TArray Out; + Out.Reserve(4); // tipico: 2-6 destinos + for (const TPair>& Pair : CachedJobs) + { + if (Pair.Value && Pair.Value->ParentClassId == CurrentClassId + && Pair.Value->ClassId != CurrentClassId) + { + Out.Add(Pair.Value.Get()); + } + } + return Out; +} diff --git a/Source/ZMMOJobs/Public/ZMMOJobChangeNetworkHandler.h b/Source/ZMMOJobs/Public/ZMMOJobChangeNetworkHandler.h new file mode 100644 index 0000000..b2b9ea0 --- /dev/null +++ b/Source/ZMMOJobs/Public/ZMMOJobChangeNetworkHandler.h @@ -0,0 +1,54 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/WorldSubsystem.h" +#include "ZMMOJobChangeNetworkHandler.generated.h" + +class UZeusNetworkSubsystem; + +/** + * Multicast dinamico assignable em Blueprint. WBP de promocao binda no + * OnJobChangeResult pra reagir ao S_JOB_CHANGE_RESULT (1520) do server. + * + * Parametros: + * - bAccepted : true = promocao aplicada (S_ATTRIBUTE_SNAPSHOT_FULL + * chega logo apos com state novo). + * - Reason : EJobChangeRejectReason (None/NoSession/UnknownJob/ + * NotParent/WrongTier/JobLevelTooLow/AlreadyAtTarget/ + * JobsDbUnavailable). Significativo apenas se !bAccepted. + * - NewClassId : significativo apenas se bAccepted=true (redundante com + * snapshot que vem junto, mas util pra triggers/toasts). + */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FZMMOOnJobChangeResultBP, + bool, bAccepted, int32, Reason, int32, NewClassId); + +/** + * Bridge entre o `UZeusNetworkSubsystem` (do plugin ZeusNetwork) e a UI + * Blueprint (WBP de promocao). Mesmo pattern do `UZMMOAttributeNetworkHandler` + * — converte o delegate C++-only `FZeusOnJobChangeResult` num dynamic + * multicast (`FZMMOOnJobChangeResultBP`) assignavel em BP. + * + * Por que UWorldSubsystem? Player so' faz promocao quando ja' esta no + * WorldServer (com mundo carregado). No front-end / lobby, esse subsystem + * nao existe — economiza memoria. + */ +UCLASS() +class ZMMOJOBS_API UZMMOJobChangeNetworkHandler : public UWorldSubsystem +{ + GENERATED_BODY() + +public: + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + virtual bool ShouldCreateSubsystem(UObject* Outer) const override; + + /// Assignavel em BP: WBP_JobChangePanel.OnEvent_OnJobChangeResult. + UPROPERTY(BlueprintAssignable, Category = "Zeus|Jobs") + FZMMOOnJobChangeResultBP OnJobChangeResult; + +private: + void HandleJobChangeResult(bool bAccepted, int32 Reason, int32 NewClassId); + UZeusNetworkSubsystem* GetZeusNetSubsystem() const; + + FDelegateHandle JobChangeResultHandle; +}; diff --git a/Source/ZMMOJobs/Public/ZMMOJobsLibrary.h b/Source/ZMMOJobs/Public/ZMMOJobsLibrary.h index 825b348..03cf59d 100644 --- a/Source/ZMMOJobs/Public/ZMMOJobsLibrary.h +++ b/Source/ZMMOJobs/Public/ZMMOJobsLibrary.h @@ -2,6 +2,7 @@ #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" +#include "ZMMOJobTypes.h" #include "ZMMOJobsLibrary.generated.h" class UZMMOJobDataAsset; @@ -36,4 +37,26 @@ public: UFUNCTION(BlueprintPure, Category = "Zeus|Jobs", meta = (WorldContext = "WorldContextObject")) static bool IsJobRegistered(const UObject* WorldContextObject, int32 ClassId); + + /// Lista jobs num tier (UI dropdown). Vazio se subsystem indisponivel. + UFUNCTION(BlueprintPure, Category = "Zeus|Jobs", + meta = (WorldContext = "WorldContextObject")) + static TArray GetJobsByTier( + const UObject* WorldContextObject, EZMMOJobTier Tier); + + /// Destinos de promocao a partir do char atual. WBP de promocao consome + /// direto. Vazio se nao houver filhos (ex: char ja' esta em Tier 3 + /// Mastery — Jobs.4 introduzira terminal de progressao). + UFUNCTION(BlueprintPure, Category = "Zeus|Jobs", + meta = (WorldContext = "WorldContextObject")) + static TArray GetEligibleNextJobs( + const UObject* WorldContextObject, int32 CurrentClassId); + + /// Helper de send via ZeusNetworkSubsystem. Conveniencia pra WBP nao + /// precisar pegar o subsystem manualmente. Idempotente: rejeitado + /// silenciosamente se nao conectado. + UFUNCTION(BlueprintCallable, Category = "Zeus|Jobs", + meta = (WorldContext = "WorldContextObject")) + static void SendJobChangeRequest( + const UObject* WorldContextObject, int32 TargetClassId); }; diff --git a/Source/ZMMOJobs/Public/ZMMOJobsSubsystem.h b/Source/ZMMOJobs/Public/ZMMOJobsSubsystem.h index 7f8a103..c1c0ee6 100644 --- a/Source/ZMMOJobs/Public/ZMMOJobsSubsystem.h +++ b/Source/ZMMOJobs/Public/ZMMOJobsSubsystem.h @@ -2,6 +2,7 @@ #include "CoreMinimal.h" #include "Subsystems/GameInstanceSubsystem.h" +#include "ZMMOJobTypes.h" #include "ZMMOJobsSubsystem.generated.h" class UZMMOJobDataAsset; @@ -41,6 +42,22 @@ public: UFUNCTION(BlueprintPure, Category = "Zeus|Jobs") int32 GetJobCount() const { return CachedJobs.Num(); } + /// Lista jobs num tier especifico (UI agrupa por tier — ex: dropdown + /// "Vocacoes possiveis"). Ordem do retorno e' a do AssetRegistry scan + /// — UI pode reordenar por ClassId/DisplayName se precisar. + UFUNCTION(BlueprintPure, Category = "Zeus|Jobs") + TArray GetJobsByTier(EZMMOJobTier Tier) const; + + /// Destinos de promocao validos a partir do `CurrentClassId`. Filtra + /// pelos jobs que tem `ParentClassId == CurrentClassId`. WBP de + /// promocao consome direto pra montar botoes "Tornar-se X". + /// + /// NOTA: condicao de elegibilidade real (jobLevel >= cap, quest, item) + /// e' do server — UI apenas LISTA opcoes possiveis pelo schema. Server + /// reponde rejeicao via S_JOB_CHANGE_RESULT (Jobs::EJobChangeRejectReason). + UFUNCTION(BlueprintPure, Category = "Zeus|Jobs") + TArray GetEligibleNextJobs(int32 CurrentClassId) const; + private: /// Scan AssetRegistry + popula CachedJobs. Sincronizo (V1) — chamado UMA /// vez no Initialize. Pra 50 jobs eh aceitavel; se crescer pra 200+ pode diff --git a/Source/ZMMOJobs/ZMMOJobs.Build.cs b/Source/ZMMOJobs/ZMMOJobs.Build.cs index f5f200f..00a0924 100644 --- a/Source/ZMMOJobs/ZMMOJobs.Build.cs +++ b/Source/ZMMOJobs/ZMMOJobs.Build.cs @@ -13,7 +13,8 @@ public class ZMMOJobs : ModuleRules }); PrivateDependencyModuleNames.AddRange(new string[] { - "AssetRegistry" // FAssetRegistryModule pra scan de DA_Job_* + "AssetRegistry", // FAssetRegistryModule pra scan de DA_Job_* + "ZeusNetwork" // UZeusNetworkSubsystem (SendJobChangeRequest) }); // Espelho do `Server/.../JobsSystem/module.json` (modulo nucleo MMO).