Files
ZMMO/Source/ZMMOJobs/Public/ZMMOJobDataAsset.h
Mateus Rodrigues c3df705a7a feat(jobs): Jobs.1 client — DA expandido + 7 DA_Job assets organizados por tier
* UZMMOJobDataAsset (Source/ZMMOJobs/Public/) ganha 3 campos novos
  espelhando o JobDef do server:
    - Tier             (EZMMOJobTier)
    - ParentClassId    (int32)
    - AllowedWeapons   (TArray<EZMMOWeaponType>)

* Novo header ZMMOJobTypes.h com 2 UENUM(BlueprintType):
    - EZMMOJobTier      (6 valores: Beginner..Mastery)
    - EZMMOWeaponType   (19 valores: Fist..Gun)
  Todos com UMETA(DisplayName="pt-BR") pro Editor mostrar nomes
  amigaveis em dropdowns. Ordem casa byte-a-byte com EJobTier/
  EWeaponType do server (necessario pq snapshot carrega tier u8 + mask).

* 7 DA_Job_*.uasset criados via MCP Python, organizados por tier:
    Content/ZMMO/Data/Jobs/Beginner/
      DA_Job_Novice    (ClassId=0, AllowedWeapons=[Fist,Dagger])
    Content/ZMMO/Data/Jobs/Vocation/
      DA_Job_Warrior   (ClassId=1, 8 armas: Sword+Spear+Axe variations)
      DA_Job_Arcanist  (ClassId=2, 5 armas: Staff+Book)
      DA_Job_Ranger    (ClassId=3, 5 armas: Bow+Musical+Whip)
      DA_Job_Artisan   (ClassId=4, 5 armas: Sword1H+Mace1H+Axe1H)
      DA_Job_Rogue     (ClassId=5, 5 armas: Sword1H+Bow+Katar)
      DA_Job_Devout    (ClassId=6, 5 armas: Mace+Staff1H+Knuckle)
  ParentClassId=0 (Novice) em todas Vocacoes. Tier=Vocation.
  JobIcon/Sound/Anim ficam None — preencher conforme arte for produzida.

  ZMMOJobsSubsystem busca por classe (GetAssetsByClass), entao a
  reorganizacao em subpastas NAO requer mudanca em .cpp/.h.

* ZMMOAttributeTypes.h: comentario de opcode 1200 -> 1500 (espelha
  refactor Open-Closed do server ranges; valores wire format mudaram).

Boot esperado: [ZMMOJobsSubsystem] Initialize: 7 job(s) carregados.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 23:53:34 -03:00

94 lines
3.9 KiB
C++

#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_<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: "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<EZMMOWeaponType> 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<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));
}
};