From c3df705a7ae9010c5e8d23de2289c7c735699c5b Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Sat, 23 May 2026 23:53:34 -0300 Subject: [PATCH] =?UTF-8?q?feat(jobs):=20Jobs.1=20client=20=E2=80=94=20DA?= =?UTF-8?q?=20expandido=20+=207=20DA=5FJob=20assets=20organizados=20por=20?= =?UTF-8?q?tier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * UZMMOJobDataAsset (Source/ZMMOJobs/Public/) ganha 3 campos novos espelhando o JobDef do server: - Tier (EZMMOJobTier) - ParentClassId (int32) - AllowedWeapons (TArray) * 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) --- .../Data/Jobs/Beginner/DA_Job_Novice.uasset | Bin 0 -> 1704 bytes Content/ZMMO/Data/Jobs/DA_Job_Novice.uasset | Bin 1420 -> 0 bytes .../Data/Jobs/Vocation/DA_Job_Arcanist.uasset | Bin 0 -> 2040 bytes .../Data/Jobs/Vocation/DA_Job_Artisan.uasset | Bin 0 -> 2031 bytes .../Data/Jobs/Vocation/DA_Job_Devout.uasset | Bin 0 -> 2025 bytes .../Data/Jobs/Vocation/DA_Job_Ranger.uasset | Bin 0 -> 2024 bytes .../Data/Jobs/Vocation/DA_Job_Rogue.uasset | Bin 0 -> 2013 bytes .../Data/Jobs/Vocation/DA_Job_Warrior.uasset | Bin 0 -> 2155 bytes .../Public/ZMMOAttributeTypes.h | 2 +- Source/ZMMOJobs/Public/ZMMOJobDataAsset.h | 20 +++++- Source/ZMMOJobs/Public/ZMMOJobTypes.h | 57 ++++++++++++++++++ 11 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 Content/ZMMO/Data/Jobs/Beginner/DA_Job_Novice.uasset delete mode 100644 Content/ZMMO/Data/Jobs/DA_Job_Novice.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Arcanist.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Artisan.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Devout.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Ranger.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Rogue.uasset create mode 100644 Content/ZMMO/Data/Jobs/Vocation/DA_Job_Warrior.uasset create mode 100644 Source/ZMMOJobs/Public/ZMMOJobTypes.h diff --git a/Content/ZMMO/Data/Jobs/Beginner/DA_Job_Novice.uasset b/Content/ZMMO/Data/Jobs/Beginner/DA_Job_Novice.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ef103f242611593a0fcf28fc243916243acb3447 GIT binary patch literal 1704 zcmb7FYiJWe5FXq5tglupg8IV;_^3@9YpkvKNSdTnG*;UpKA>LX5>L~+cz2CGe~2iE zzl4h74^dH26hwT0MJ#CX1)`#e2>uX6DJY5vq9SOVZ+jQdwt^09cK4gv+1Z)zCf$4I z9RHflW;f*%jmRVV&NJk|^fMz%ZnW)Ldh$~9n!=(557vFUa&0itAl7}@a`DaE@S)Fz zF9N4R*JHj}jLqfYuT@%wfBnjptNangQvA#H7SkUVNmbK?;g5ux8EB5{88so;nrJ+a z4mf17`QE8KM{6RHV5D+ERVW&&2~-3F(Qx_vg_XgIs@VLhz`StI80UWSA&!|YI6-R# zQcalQ(A^un$JpcOVfAC*m0dGh?!~UY>biUWVC_Ws!$44jX($y?>}FAZG4D!Co1($e zH6kSxQgJ(2~b}MIkyV~mfUrzpb`0g3X@20;- zH$>B_maQUT(YLy?C8$zON-<5ccC>dOkUu%Sf-X-U#;EfyGHdsjpq$7gml5AY$TWpT z=L30j7?*q-fd$Jykslm@pg@qHOrmkUOB(LXm|Q#1v#)sVKtit`(LxG&T$d{%ko0fj zel*bc_2oU&>D}~M!^ePG>Yv~Ye@Ew>aB!@@#WY6U@;PZYef{!}Hh>h$YJ}Ug%_)K6 zFhT^*#hHs4(Oc@pymvi%2;r03nXcxqcg>V<1yIbMCxn&p+_MefOT%UlD9>=qa-2g!Me!+( zhnxK&f6!a+^M(R-4NZ-{`sQ#$v-eP7C7AM#;u$dyzS9Tgk#%O8si3VtMV-d1<)_$K zxI~#ZDmx~xy?MP*ICP)t(V#=+KrUoMc)G|{j9N`iU&vQ;lE*kRc&*RfDE+wW!27I? z{g@=BaJF=u7C&&`Q#l!%{l!+NsgK*yFyQd*LS0dfM2wjc>>`Zanh%gWqQyBZx?UFS zMWvfXFS7HzLyNMQI>v;m#VOcGFl=qHFjG{eN9f(Umf*TDp=Cy|EJRx`j}FIG%#yV) znUnK$-(Ef{Rzl~Fh^Y!RZUMyE&OLVKdRnh>6#rt`k8p$j}J;Lowzwjzg**g!mh z@YnhzT{;+Jh5_Qr=mZ^XH9I=sN!bpxTK5E_JylA@tRh4zzhQ6z54~B{XqU)YB-k2_ zaw!XCXJ&$BgoBz!LNu_&j?1?VIMc~UoN)wa#+v!&SqkNyvDO6lW@6Ki{A+7DbNZdi znl;tfuuJP3JcW#0u#Q7%>m&A~)yCDv&b_YxRALVfiALaZ{9KF^IA{T&c1Dn!NuGha z6?MC!gDGz5t+G9v?o}o4)~%}}OgH6zlEcJbdROY~mxVgujOsNLTta45mM;cg|G(I< zIE@l-0^jjoQHJAB1){#JmZlb3!AxkYh%tlj>g2BnSKTdh?}(vgl;n`)$EFk6uU;Ii IvuqUq57?M14gdfE diff --git a/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Arcanist.uasset b/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Arcanist.uasset new file mode 100644 index 0000000000000000000000000000000000000000..da5f825626a45f92476d4cc425e0a2d8e8820a5c GIT binary patch literal 2040 zcmb7FU2GIp6h5@YB8UpMB7zSR6OhtfyJKs+1mbRIr))#F#kP`&TBh6EGP2!SW`>2S zk!UbNd@v#!9*mlhG?2gpPi!J2(xfKJgNVeK_`r*%YN8=A1PBkT=es+1JHc(DUvlTp z{m#$5bAIm39Nzf(?Q*%iyPjxi9noE$C9aIW`NK$RS1Ffh==(IOW9 zwddTge%9?>3iQbb?r>+6r|re{Wb?NK-SvYjJ>3CULQ zIy#tjtb!+li7=A!r&fG~1&LhFJ|M<+3bSD6UE1~i_2R>z9mn(s9J?SK&!_acU##WK zCVfv-$+=AHr6o*u=SwC%lg_1>`l zL@lXqPE7EoOD0O!YFZm8sEeate7Cxm^`K{tkGE~3p8gMu3oFF7(UFq74!wIU%-lZRe~hS>K4CTQIYNR(k$Xcp3DZs+Y|(&NIl< zkjU=ITWlr6z0W@}hsX|zgYz5C#=R0Ylwm&G_}j?;Z>`s-KYFc+U8pMRwjD9tKl+Bq zdUPkH5ICujQ z{HHEP@c_s-aF4rTP34tvA_b-Qq#{CdSP$J45)l#&EaMSJTQksY3qf^1^*;u$CD~?$3|q1QNsy5ehNG1zHrc z?`aFKmB&z7M5J`Rk}SB_dii|=jx}jIzT8h1GHxbZ?y>pn9dQWj$@WJ{1-|9At$sF4 z6W_NLz?p*NaKS$oFt~0N&^q)WkLo`KeFLEQ6=VUyMHx|E%0sD})Ep?Ox`3LxiJ=`v z_^kL2k`JDhB8&m7!wzvmK1@IU;-t?9QT an`f`$5cq+GQM}%{qv7&b&psEB(EkV8NvYES literal 0 HcmV?d00001 diff --git a/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Artisan.uasset b/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Artisan.uasset new file mode 100644 index 0000000000000000000000000000000000000000..392392b2bb8836b8a3af499bd1193fd48e869ff0 GIT binary patch literal 2031 zcmb7FU2GIp6h5?tVhai=NQEYX284EZw(Pb`mq^^7F1E2tu?3=-lfS{3R%n2ObKP^Z^JoK_4_h4KW%Yc+r%I7+;8>F)ru3J9j(6lITfh?%ePE z+&kxd=iaHkYmeS37K=NpiR!9|{^Akx!?t5@)}LNbb@rLMTQ~3CDXv;N@%KA(h-R_w zw_W2u{}TJ~cKwen$D`+y{^uC;@uO|hhlTcPclTy3p*y{lkpqfV*$J6ENVfE|NA1`luzd!!zM8jBZcF%Cxam)8d zUXUOP%bV#lgheZNHf(S1sIf^tFr;a*r)`Xum1iL!f20iMxohhFli2xW%U^Ako>v!K@= zCaU+Lzdx4OC+NoVV(J^Jidm|V;f-8j$K4P7DwwQfSXIzXyzPIW0yy`O2w9KVp6p;o zpgfEafrKe0XI{vjr{{UDB6>LCm)g}z^U$?c%fIWfjA7j>$n_+NL2I1rq4LR&BzVna z=YvmfXnA70*9@a9?&&SlP(oY`ipO09C#@3v8X=^*P1Ly#-YZ#*58Mt#q}a6zVk_ zBU{U3e}CFCa*lK*oJjF&ZG|-~&@vhGkQmx4^qiTs>G`j&6tIA1S$eV0GIPRmij+9} zi?NE?aM2MJaxU3?@lGZq8Qr!ML)3lr_46xv95w7*MlU8gax`{)E{ut>Y<{FNao6{! zc1RL&<;|oFVbP}j8}{A{O%E9gsZf*u)u!ZKN?hJ-s+beBas2(0IIo;G&xb;B!*=MC z!O1T+RFgiP&8H7$1YO^k`ux6X3O#ySw06r~Ev`kRh!q)pPy@(yZeS3SssK0SRtRGHCDOxLgJ(&HzfwFg2j8Z|==_2+A?G|6l#ZUN|83xQORMgO_OW}|fXbqX zX^B0(gD;D;L;ob2pX8(~rvW*KM#r(M|CVOqjW>Trs-1n|S6}YLg}2_Gx|ir4 z*4-YR{o$whJ9pN66+RvNBpuq$vYp(t{l=Kk1~ZuhTGH?gt;ZgAwHNKY;hA<(OU8y+ zFw|=l3&LS*qQ|*S!y!X&B6^bhbU5*JXEGIuMH0_Mqw#oncQl!bro-u2B;J{f?yebQ z-aJp@J(JBnpfxY|aHz%+mZK$nJ*=(`&fCAt-b{V?!FRpiv~601KQwHrnOdlc(wEjX zuIEvE`=QjH_FiEL!xbHSLY-1i^y@1(8|v$MlElTHr*7fL;dRfqRAuVRF|Qz?kFelE zK(~&^T3_BVOP&lRf=KC~BNGp@B4%0kq!<|xM#(O^^z!G66AwV_I7T_=*d^h3W$K>& z-dxMlc-a#*;ZnBa(kd1vEW>rXN2ur6n{)T`IBB{i%P40#b2N2gDUOM$;`mr?;=wQ9 zeNGCISKds&$=Pc?ym{bJSO$c;u2N0f8#}WPDRp(T{pFINEz=*J+_+M%>v4OM-e3Is z+NOHSq)`B4Ru$%MAXswEWv9BHHeHWC9e(fn=6c%9xNGJOi&{3^Zmm0gVAL$pzH`sd zAROIAuXge?H}>{`Fj>1O=uYEjYoFjj&d9%N6vPY6YRjCG%tq|ol93m*-YXx6mp;#_ zdFfhkwjxLUB0pNhPGqQGE6*$;s{P{V@`9IjZw?E}5T9-Nap?aRRr}Rj%@4B!#h--j zh(ia4kBGcSe{^^3W4cudK;GohY3%BsMfuXn!YPo%KP0*Pk8cDY{Vb!XW3DSaIvZ|i zW4SCC7y$pNdO;chi3a}SD%eu}B``)o**&HNfj(%5Dhj9w6adz6(^1Y0RN392svi1( z`wGt4>-!4I)IU^pqqH)>ot)ky{&p~Jr9~@CRr>s}yP*~F$9;z|$ZW*NizAjma#%tH z0%n<*6GGNHJq!EGytvLI>Ow~Zf>yHNK_=g` zyr})hg{2Jt(k5JN3Q`8E4ZZ{ytOAnCH#3p{hM-meP+mb20B=GC@kK0hhUbi1qr!A- z!sP=fM!-9U|QowHaqLg zWRuA+OQ0_hY*C67O;HLJDg+A#+KLU-KZ4Ryq@_v(m587S5^C{>>-p}^-Hav${b1(K z{m!}P-g{m%J-+q5KT4(2;cB8~RYZUC2n<%A_~hPr;_}JUcP5%nPkg-l(xH~&hlw6y z*{=hWKmHthYi{}7hWDdalD^H%)$!wR*M@}urM-Li`4gJ0`8$n%%m1R0)@oc0 z{6SyAY|ODmg`7>*Ut7v#Jf~S!M}|7bk4`#|q3Izb5fy3jAK8{#sl?^O_BaJW>rP!byJjIDiNuT%Iydv} zm(MIFOla9G@3}NPbqmgtd(In;M3TB?)7AcouPP_C;Kmd(y|lo;A&#wZPlHtp6gD!cV&^*D@-6T_njM@VV-Xw9XL16e zVTK6Fm*S)>3R&p%0?(C2Pd50Zbd!=iaIa1BW?iN}q?wM~PbM#RK`Rfr%^cVFD#>C; zCb@=XlXm|r%re}DO=xNgl0*7G;WB8h3d`^T-<5wKPy>+d3i2DjgA$yJmbypF=y`+C zasZVG&`}*1s$O_ci5rl7@u(EB7{J_X@Da(*>$y|%8r%jFM~4FeNEGwzwX<9{U#29AC(uynU?)EUwpPD;F8e)8)(|36aWAK literal 0 HcmV?d00001 diff --git a/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Warrior.uasset b/Content/ZMMO/Data/Jobs/Vocation/DA_Job_Warrior.uasset new file mode 100644 index 0000000000000000000000000000000000000000..e0b3f1702ade513b5ac1e3814babe8ebf162fe46 GIT binary patch literal 2155 zcmb7GYiJx*6h0=Ysg2b(nrd6CScKNZ&F-e=;RcKQ$fgNqn>2~R2PBi->t=Mbv%NFf zNB>v}X#ZA}sPTnuv0#1_Q3F0`169-?q6CeK_KzA-D*h=d{o#7PyEB_1-39$%_RKx! z+;i@n*WIPr=2!kI7K;n#>(o|L|3uw z_o*{K{Th1qQp0!t*MsjzTlX^0!;iODn-<=O1_lm#Bbudo`;AG{`+yPGEZsV{->qTBd+1{N77>WFS<8g1(ehkU+$J-(i3u%ol1?d~q0-ygcCJroLu+uFlr zW$fF#frt-H-|%MOd0smd2A%aw%*V4}%b_!!tl9R-{Cw!_(cIya%O56S4-XEtf$FJ_ zqUW~OHu9>aWwfWg<&a1T%@m&Y)=niS`s0zWYAVZllS1ydwESOfWUm8TO06&`jf{|1 zf%?w;sBdO&s9=dQb2a8U2QT52W}1Bo>YsgT@mgL-bTgCE3NcO{9eHjwgpEDvnd$Pz zp_P~KQ%oe54>O_*NxLVukKF`K7c&rWa!uYR?}}}4#HGWI6f%N#9zQ)_-nPaM1cG_t zKR_w(({EK1w;iB`mBc$YUuiWEh-k?qA8KQAad}%Mc~mzo`e5?a&k<{NWVi3(jL;-| zzx=|4r@8|B4`{Q^l@)S^Ot6LQt_Sng71+YNKfm_`g5H<5%JDt5+|iG+j2US`muf%S zyo(ouTKsV>DemXyN$E#a10h3ZMvDt-vMC*n#1z}YY`4rA{Xj^8TatwfA#L0bHV(L*kqS!*pOoM;N)W>ZqeU;p8Z_ar8*-k zmp_iWUDy0(!y$=cv_F%~-eXOud%K!2J%XkwEL!l_G&5f{COiWFX-e!U>C#S{{=?mN ztNnh1O+g$z1bsc+dgxZS{1$uBz;p;>gMn_Y24}iJzTTF5&wy>q&2!!%su-mT5q^y` z{Iz`^?5m)%o7qkV?ZBI@S7ZQ_6|JoD5t>OSQUd8=4iSnl#>JTxYO2t^yml?m!USYHGHio@~?VPOvXB<}&R2fiSKeC>~;i znE^DFi2B8+5llMw6*>mMd~%@PasL!yW)nZXGeSzCOM@_|0H-FPRw+HLR}#a+|0m*h4W0TWg+2mtkIOp#Rp(F71@0Hp%pdjOO;;BJQ{{@XD3 g=c%Ku-RHl=;hc6*iu{wk&^1)|+1WdNHUs+q0_y6{+W-In literal 0 HcmV?d00001 diff --git a/Source/ZMMOAttributes/Public/ZMMOAttributeTypes.h b/Source/ZMMOAttributes/Public/ZMMOAttributeTypes.h index 3d893e8..21229f9 100644 --- a/Source/ZMMOAttributes/Public/ZMMOAttributeTypes.h +++ b/Source/ZMMOAttributes/Public/ZMMOAttributeTypes.h @@ -5,7 +5,7 @@ /** * Snapshot completo dos atributos do char vindo do server via - * S_ATTRIBUTE_SNAPSHOT_FULL (opcode 1200). + * S_ATTRIBUTE_SNAPSHOT_FULL (opcode 1500). * * Cliente NUNCA recalcula derivados — apenas exibe o que recebe. Os campos * HP/MaxHp/SP/MaxSp ja sao os "efetivos" (base + equip + buff somados no diff --git a/Source/ZMMOJobs/Public/ZMMOJobDataAsset.h b/Source/ZMMOJobs/Public/ZMMOJobDataAsset.h index dcb6c3a..1c83c3f 100644 --- a/Source/ZMMOJobs/Public/ZMMOJobDataAsset.h +++ b/Source/ZMMOJobs/Public/ZMMOJobDataAsset.h @@ -2,6 +2,7 @@ #include "CoreMinimal.h" #include "Engine/DataAsset.h" +#include "ZMMOJobTypes.h" #include "ZMMOJobDataAsset.generated.h" class UTexture2D; @@ -39,11 +40,28 @@ public: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job") FString TechnicalName; - /// Nome localizado exibido na UI (pt-BR no projeto base). Ex: "Aprendiz". + /// 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") diff --git a/Source/ZMMOJobs/Public/ZMMOJobTypes.h b/Source/ZMMOJobs/Public/ZMMOJobTypes.h new file mode 100644 index 0000000..771852c --- /dev/null +++ b/Source/ZMMOJobs/Public/ZMMOJobTypes.h @@ -0,0 +1,57 @@ +#pragma once + +#include "CoreMinimal.h" +#include "ZMMOJobTypes.generated.h" + +/** + * Tier hierarquico de um job. Espelha `EJobTier` do server em + * `Server/.../JobsSystem/Public/JobTypes.hpp`. Valores TEM que bater + * byte-a-byte com a enum do server porque o snapshot pode carregar + * tier como uint8 no futuro. + * + * Renascer (RO pre-renewal): char no Tier 2 (Specialization) que cumpre + * condicao volta pra Tier 3 (RebornBeginner) com bonus permanente, + * abrindo path paralelo RebornVocation → Mastery (coroa final). + */ +UENUM(BlueprintType) +enum class EZMMOJobTier : uint8 +{ + Beginner = 0 UMETA(DisplayName = "Iniciante"), + Vocation = 1 UMETA(DisplayName = "Vocacao"), + Specialization = 2 UMETA(DisplayName = "Especializacao"), + RebornBeginner = 3 UMETA(DisplayName = "Iniciante Renascido"), + RebornVocation = 4 UMETA(DisplayName = "Vocacao Renascida"), + Mastery = 5 UMETA(DisplayName = "Mestria"), +}; + +/** + * Tipos de arma. Espelha `EWeaponType` do server. Usado em `AllowedWeapons` + * do DA pra UI (filtrar items equipaveis) + validacao server-side futura + * quando InventorySystem entrar. + * + * Ordem TEM que bater com server porque o bitmask `allowedWeaponsMask` no + * JobDef usa bit N = EWeaponType(N). + */ +UENUM(BlueprintType) +enum class EZMMOWeaponType : uint8 +{ + Fist = 0 UMETA(DisplayName = "Punho"), + Dagger = 1 UMETA(DisplayName = "Adaga"), + Sword1H = 2 UMETA(DisplayName = "Espada 1M"), + Sword2H = 3 UMETA(DisplayName = "Espada 2M"), + Spear1H = 4 UMETA(DisplayName = "Lanca 1M"), + Spear2H = 5 UMETA(DisplayName = "Lanca 2M"), + Axe1H = 6 UMETA(DisplayName = "Machado 1M"), + Axe2H = 7 UMETA(DisplayName = "Machado 2M"), + Mace1H = 8 UMETA(DisplayName = "Maca 1M"), + Mace2H = 9 UMETA(DisplayName = "Maca 2M"), + Staff1H = 10 UMETA(DisplayName = "Cajado 1M"), + Staff2H = 11 UMETA(DisplayName = "Cajado 2M"), + Bow = 12 UMETA(DisplayName = "Arco"), + Knuckle = 13 UMETA(DisplayName = "Soqueira"), + Musical = 14 UMETA(DisplayName = "Instrumento Musical"), + Whip = 15 UMETA(DisplayName = "Chicote"), + Book = 16 UMETA(DisplayName = "Livro"), + Katar = 17 UMETA(DisplayName = "Katar"), + Gun = 18 UMETA(DisplayName = "Arma de Fogo"), +};