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) <noreply@anthropic.com>
55 lines
2.1 KiB
C++
55 lines
2.1 KiB
C++
#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;
|
|
};
|