#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 por ClassId * 3. Log: quantos jobs encontrou * * Uso: * - C++: GameInstance->GetSubsystem()->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 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 /// virar async no futuro. void LoadJobsFromAssetRegistry(); UPROPERTY() TMap> CachedJobs; };