Files
ZMMO/Source/ZMMOJobs/Public/ZMMOJobChangeNetworkHandler.h
Mateus Rodrigues 6391372f00 feat(jobs): Jobs.1 client UI infra (handler + library + tecla J) + UI tweaks
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>
2026-05-24 01:37:04 -03:00

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;
};