feat(jobs): novo módulo ZMMOJobs (peer de ZMMOAttributes) + DA_Job_Novice
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>
This commit is contained in:
75
Source/ZMMOJobs/Public/ZMMOJobDataAsset.h
Normal file
75
Source/ZMMOJobs/Public/ZMMOJobDataAsset.h
Normal file
@@ -0,0 +1,75 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Engine/DataAsset.h"
|
||||
#include "ZMMOJobDataAsset.generated.h"
|
||||
|
||||
class UTexture2D;
|
||||
class USoundBase;
|
||||
class UAnimInstance;
|
||||
class UAnimMontage;
|
||||
|
||||
/**
|
||||
* Dados visuais/UI de UM job (classe). 1 .uasset por job em
|
||||
* `Content/ZMMO/Data/Jobs/DA_Job_<Nome>.uasset`.
|
||||
*
|
||||
* ClassId eh a CHAVE — bate com `classId` do snapshot do server (rathena
|
||||
* pc.hpp `job_class`, ex: Novice=0, Swordsman=1, Mage=2, ...).
|
||||
*
|
||||
* Soft pointers (TSoftObjectPtr) sao usados pra assets pesados (textures,
|
||||
* sounds) — lazy-loaded quando precisar (level up, hover icon). DataAsset
|
||||
* em si fica em memoria depois do scan do Subsystem.
|
||||
*
|
||||
* Async pointers (TSubclassOf) sao sync — anim BP precisa estar carregada
|
||||
* quando o player spawna.
|
||||
*/
|
||||
UCLASS(BlueprintType)
|
||||
class ZMMOJOBS_API UZMMOJobDataAsset : public UPrimaryDataAsset
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
/// Chave estavel (bate com `Config/Jobs/<Name>.json:Id` no server e com
|
||||
/// `FZMMOAttributesSnapshot::ClassId` recebido do server).
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
|
||||
int32 ClassId = 0;
|
||||
|
||||
/// Nome tecnico estavel (en-US). Ex: "Novice", "Swordsman". Aparece em
|
||||
/// logs e telemetria — NUNCA exibido pro player.
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
|
||||
FString TechnicalName;
|
||||
|
||||
/// Nome localizado exibido na UI (pt-BR no projeto base). Ex: "Aprendiz".
|
||||
/// Pode usar FText Localization tables pra multi-idioma futuro.
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
|
||||
FText DisplayName;
|
||||
|
||||
/// Icone do job — usado em StatusWindow, CharacterCard, JobChangeUI.
|
||||
/// Soft ptr: nao carrega ate alguem chamar LoadSynchronous() ou async load.
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Assets")
|
||||
TSoftObjectPtr<UTexture2D> JobIcon;
|
||||
|
||||
/// AnimInstance class override (opcional). Quando nao-null, AnimBP
|
||||
/// padrao do PlayerCharacter eh substituido por esta classe no spawn
|
||||
/// (jobs com move set diferente — Monge bate, Assassin furtivo, etc.).
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Anim")
|
||||
TSubclassOf<UAnimInstance> DefaultAnimInstanceClass;
|
||||
|
||||
/// Montage de "job change" (animacao de transformacao). Tocada quando
|
||||
/// player promove de Novice → 1a classe. V1 nao implementado.
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Anim")
|
||||
TSoftObjectPtr<UAnimMontage> JobChangeMontage;
|
||||
|
||||
/// Som de level up override. Quando null, HUD usa som generico do projeto.
|
||||
/// Soft ptr: lazy load no primeiro level up.
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Audio")
|
||||
TSoftObjectPtr<USoundBase> LevelUpSoundCue;
|
||||
|
||||
/// PrimaryAssetType pro AssetManager (precisa pra GetPrimaryAssetIdList).
|
||||
/// Hardcoded "ZMMOJob" — registry classifica todos os DAs deste tipo.
|
||||
virtual FPrimaryAssetId GetPrimaryAssetId() const override
|
||||
{
|
||||
return FPrimaryAssetId(FPrimaryAssetType(TEXT("ZMMOJob")),
|
||||
*FString::Printf(TEXT("Job_%d_%s"), ClassId, *TechnicalName));
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user