#pragma once #include "CoreMinimal.h" #include "Subsystems/GameInstanceSubsystem.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(); } 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; };