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>
70 lines
2.6 KiB
C++
70 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Subsystems/GameInstanceSubsystem.h"
|
|
#include "ZMMOJobTypes.h"
|
|
#include "ZMMOJobsSubsystem.generated.h"
|
|
|
|
class UZMMOJobDataAsset;
|
|
|
|
/**
|
|
* Cache central de UZMMOJobDataAsset por ClassId. Vive como GameInstance
|
|
* Subsystem — startup automatico quando GameInstance inicializa (PIE,
|
|
* standalone, packaged). Sobrevive a map transitions.
|
|
*
|
|
* Initialize:
|
|
* 1. Carrega via AssetRegistry: scan de UZMMOJobDataAsset em todo Content
|
|
* 2. Cacheia em TMap<int32, UZMMOJobDataAsset*> por ClassId
|
|
* 3. Log: quantos jobs encontrou
|
|
*
|
|
* Uso:
|
|
* - C++: GameInstance->GetSubsystem<UZMMOJobsSubsystem>()->GetJobData(0)
|
|
* - BP: UZMMOJobsLibrary::GetJobData(WorldContext, 0)
|
|
*
|
|
* Fase 7+ (Mod support): SCANEAR PrimaryAssetType="ZMMOJob" do AssetManager
|
|
* permite mods adicionarem DAs proprios sem mexer no source.
|
|
*/
|
|
UCLASS()
|
|
class ZMMOJOBS_API UZMMOJobsSubsystem : public UGameInstanceSubsystem
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
|
virtual void Deinitialize() override;
|
|
|
|
/// Lookup por classId. Retorna nullptr se ClassId nao tem DA correspondente
|
|
/// (caller usa Library com fallback FText).
|
|
UFUNCTION(BlueprintPure, Category = "Zeus|Jobs")
|
|
UZMMOJobDataAsset* GetJobData(int32 ClassId) const;
|
|
|
|
/// Total de jobs cacheados (diagnostico).
|
|
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<UZMMOJobDataAsset*> 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<UZMMOJobDataAsset*> 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
|
|
/// virar async no futuro.
|
|
void LoadJobsFromAssetRegistry();
|
|
|
|
UPROPERTY()
|
|
TMap<int32, TObjectPtr<UZMMOJobDataAsset>> CachedJobs;
|
|
};
|