#pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "ZMMOJobTypes.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_.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/.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: "Novato". /// Pode usar FText Localization tables pra multi-idioma futuro. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job") FText DisplayName; /// Tier hierarquico — espelha `JobDef::tier` do server. UI usa pra agrupar /// jobs (ex: lista de Vocacoes possiveis quando promovendo Novato). UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job") EZMMOJobTier Tier = EZMMOJobTier::Beginner; /// ClassId do parent na arvore de promocao. 0 = sem parent (Novato eh root). /// Espelha `JobDef::parentJobId` do server. UI usa pra filtrar destinos /// possiveis ao mostrar painel de promocao. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job") int32 ParentClassId = 0; /// Lista de armas que o job pode equipar. Espelha `JobDef::allowedWeaponsMask` /// do server (mas como TArray pra editor visual em vez de bitmask cru). /// Inventory UI usa pra hint "nao pode equipar" + filtro de catalogo. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job") TArray AllowedWeapons; /// 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 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 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 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 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)); } };