Sub-módulo cliente do JobsSystem do server. Pavimenta dados visuais/UI por job (DisplayName localizado, ícone, anim override, som de level up) sem acoplar ao ZMMOAttributes. ARQUITETURA — espelha o peer-module pattern do server (PR #9): Server: Game/MMO/Modules/JobsSystem (módulo núcleo, LoadOrder=50) Client: Source/ZMMOJobs/ (LoadingPhase=PreDefault, peer de ZMMOAttributes) ZMMOAttributes NÃO depende de ZMMOJobs — server envia classId no snapshot, cliente faz lookup local via Library/Subsystem. NOVOS ARQUIVOS C++ module (Source/ZMMOJobs/): - module.json + ZMMOJobs.Build.cs (deps: Core/Engine/AssetRegistry) - ZMMOJobsModule.h/.cpp — IMPLEMENT_MODULE - ZMMOJobDataAsset.h/.cpp — UPrimaryDataAsset (BlueprintType) campos: ClassId, TechnicalName, DisplayName, JobIcon (soft), DefaultAnimInstanceClass, JobChangeMontage (soft), LevelUpSoundCue (soft) - ZMMOJobsSubsystem.h/.cpp — UGameInstanceSubsystem scan AssetRegistry no Initialize + cache TMap<int32, DA*> por ClassId O(1) GetJobData(ClassId) - ZMMOJobsLibrary.h/.cpp — UBlueprintFunctionLibrary GetJobDisplayName/GetJobData/IsJobRegistered fallback "Classe N" se ClassId desconhecido Content: - Content/ZMMO/Data/Jobs/DA_Job_Novice.uasset (ClassId=0, TechnicalName="Novice", DisplayName="Aprendiz") MODIFICADOS - ZMMO.uproject: + Module "ZMMOJobs" (LoadingPhase PreDefault) - Source/ZMMO/ZMMO.Build.cs: + "ZMMOJobs" em PublicDependencyModuleNames - Source/ZMMO/Game/UI/FrontEnd/UICharCard_Base.cpp:51 — primeiro consumer do Library: "Classe %d" hardcoded → UZMMOJobsLibrary::GetJobDisplayName(this, ClassId) Card da seleção de personagem agora mostra "Aprendiz" via DA lookup. BLUEPRINT ACCESS Toda a API exposta pra BP via UFUNCTION(BlueprintPure): - UZMMOJobsLibrary::GetJobDisplayName(Self, ClassId) → FText - UZMMOJobsLibrary::GetJobData(Self, ClassId) → UZMMOJobDataAsset* - UZMMOJobsSubsystem::GetJobData(ClassId) - UZMMOJobDataAsset propriedades BlueprintReadOnly (UMG binding direto) LOOKUP AssetRegistry varre /Game/ por UZMMOJobDataAsset no boot do GameInstance. Chave = campo ClassId do asset (não nome do arquivo — renomear .uasset OK). Lookup O(1) via TMap. Custo de scan amortizado em 1 vez por sessão (~50ms pra 50 jobs futuro). VALIDAÇÃO Editor: [Log] DA class found: <class 'ZMMOJobDataAsset'> [Log] Subsystem class found: <class 'ZMMOJobsSubsystem'> [Log] Library class found: <class 'ZMMOJobsLibrary'> [Log] AssetRegistry encontrou 1 ZMMOJobDataAsset(s): - DA_Job_Novice @ /Game/ZMMO/Data/Jobs/DA_Job_Novice Próximo módulo cliente: 1 linha no .uproject + .Build.cs + ZMMOJobs.Build.cs não muda. Pattern estabelecido. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
#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<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(); }
|
|
|
|
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;
|
|
};
|