From ff75ad92eb9b51d70786afdbc8978b307a60668c Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Wed, 3 Jun 2026 03:02:51 -0300 Subject: [PATCH] feat(gas): Batch 2 - Vertical slice Dash client (input bind + assets) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ZeusCharacter: - DashAction UPROPERTY + load /Game/Input/Actions/IA_Dash.IA_Dash no ctor. - SetupPlayerInputComponent: BindAction(DashAction, Triggered) -> OnDashTriggered. - OnDashTriggered: resolve UZeusGASComponent via PlayerState -> chama RequestActivateAbilityByTag(Zeus.Ability.Movement.Dash). Bridge envia C_ABILITY_TRY_ACTIVATE pro server (handle, tagHash) e o ASC local executa ActivateAbility (LaunchCharacter) quando server confirma S_ABILITY_ACTIVATED. Assets (criados via MCP): - DT_Abilities (/Game/ZMMO/Data/Abilities/) — row "Zeus.Ability.Movement.Dash" apontando pro BP_GA_Dash_C. Row name = tag canonica (hash bate com server). - BP_GA_Dash (/Game/ZMMO/GAS/Abilities/) — parent UZeusGameplayAbility_Dash. - IA_Dash (/Game/Input/Actions/) — Boolean InputAction. - IMC_Default — bind LeftShift -> IA_Dash com trigger Pressed (13a mapping). Fluxo completo (apos rebuild + server na branch GameplayAbilitySystem): LShift -> OnDashTriggered -> RequestActivateAbilityByTag -> C_ABILITY_TRY_ACTIVATE -> server valida cost SP/cooldown -> S_ABILITY_ACTIVATED + S_ATTRIBUTE_HP_SP_UPDATE (-10 SP) -> ASC.TryActivateAbility(local) -> BP_GA_Dash::ActivateAbility -> LaunchCharacter(forward * 2400 cm/s) + HUD SP cai 10 + cooldown 3s. Branch GameplayAbilitySystem (criada a partir do main pro escopo GAS). Co-Authored-By: Claude Opus 4.7 --- Content/Input/Actions/IA_Dash.uasset | Bin 0 -> 1463 bytes Content/Input/IMC_Default.uasset | Bin 7787 -> 8513 bytes .../ZMMO/Data/Abilities/DT_Abilities.uasset | Bin 0 -> 4724 bytes Content/ZMMO/GAS/Abilities/BP_GA_Dash.uasset | Bin 0 -> 16175 bytes Source/ZMMO/Game/Entity/ZeusCharacter.cpp | 44 ++++++++++++++++++ Source/ZMMO/Game/Entity/ZeusCharacter.h | 10 ++++ 6 files changed, 54 insertions(+) create mode 100644 Content/Input/Actions/IA_Dash.uasset create mode 100644 Content/ZMMO/Data/Abilities/DT_Abilities.uasset create mode 100644 Content/ZMMO/GAS/Abilities/BP_GA_Dash.uasset diff --git a/Content/Input/Actions/IA_Dash.uasset b/Content/Input/Actions/IA_Dash.uasset new file mode 100644 index 0000000000000000000000000000000000000000..804bbf61fac87891f2848729e6a3d66ba83776a5 GIT binary patch literal 1463 zcma)6TSydP6h7*j%sKzRQzJWX zFXVE$o+5zKLV(}6l6;HoHLZVi{nf5_^KZvol}S1WhPITC%iKKwUqBI*l<6C+_=}fW(xm~qmwFM zZa(H|^8n8sDbCyU8Ec%Q0^$!Y88C{NFIIrbQaYBRy1~UOZ$1#IHJM;AU-YbE8!GLh zbW-eNElEj?$4-kxY{iPpDN$lzRD|i2YMq&Td3m7<9jzVe z=~jO-%{tp6{Y+BeS98PuO$IEOh>8h`^{PFFnfouku0hlv7iAfgq2a4*QPVp=p1Y9q9s{@<<83s^$lD2rI#b@{CtOxt4T@=~fBaHW(< zsQbE5cl152lq3n=j?Eg8y7w<3iXLxeETd1QPBI#`JwYoAW-RDgyj5LV4#YKL+fmmW zxU5N>vHVnGI-wQs&LGRTZJ)u@(0WcqYgUa}1610>Vm!mb*%VWg5|T-LI|=ov8eSms zG%*@~=*E2gs!j zdl{m*6CnaI#A2WzYJnoY+a$_)v zHU&@Mm&Fv25k{mBYT+oN8H~WK;BasN&lyB?07n9&a7#JX;U^X>eKo)o{srIqdG{Q* ZXZkgDh#ss_2Iss7P0uIm^#4NQ{{bq|C@cT~ literal 0 HcmV?d00001 diff --git a/Content/Input/IMC_Default.uasset b/Content/Input/IMC_Default.uasset index 4dddf94c3e47016fcd802444fa67c72b2adc6f04..9aecfd64a92b697dc645fa159477a288abaf95da 100644 GIT binary patch literal 8513 zcmdT~eQXp(6n{YZkb*)%iqV0j_t8+ukmu>Ua~tg zZ{EH)^P4ws-dub1-N}u2+S}X9`w$K6O>~cyp!G8^7FQnsQ0n)oWUVYOZ5#b%&AxF% zh?oc+>{qa~HQzqob9m`H=T6=}@eJerTfO&>zjL-W$DU2ymEDw={4(Q>WRG#KP%9d( zE{{((S_{o(xniZ@bIPoTXc~LA^irzS)Q>2hRZV%R8JQX8S4`%#)O2%ZMy4qzEj=yU zGSzIcm@OG*MH<3`S#91^L@<7xwLz^BrSeMx<=rQ+S~1JKFqk z_$rJ8Ix(oe)SqG~@5st2f_xJv&*=2{@Mb~025-`d3dWHHDuiGPf<$AL2z39MHbLwR=z`RtHbObtb zX-~hpA;VDfFV(AJeWBp-I9yc{&Fl45abI+~m%FI`%H`3cSc8w!Z}X8jZEKuvf*p&? zR~xW1|IE%g@(d$4%SXr={@=n*Q)@&vn> z#ug~RE_GB@gJ0f$rg1FeEBLF>nB6W}Tp_EiTtOCSi}S*P7$(MMMh9jt-a5cvFJi-> zH8xKSaD*i?ZfLkVP;J<%9gMSTpvlBsn*z9>JL;>1NTIvJQRxsFHu1k!*8p3n3t+qM z=74;tEpod=YVLDvFlJS}>`l=w2V}B;*?;8)#x4=;HA0nG;I<1+$4UY20$q}a!9#I! zeFHG-Y>gy3^!BZtJOO^}gT#^7E{wjV}J>mWG>yVHeCzOU9pNe$m_>O!W#?XIB*+e=frkSTQ6iFECa>up^{yW-!hNy9N-bz@`K zF7z)9wOW&A0ZFq{kR+0quh;@l;j=jV@U=L#t&BLKX{1YSE2F!+XWePFt&HTV%P?vX zzSqRs_itqFS9plR>aK_zSw09O(s5#HnKt_(!jQjDb-7$os8|BO`ef;h4<3D~_7;g% zf-KU8^~)@e_1Tz*u>~*MWn7GK(Lt+ixnt!@rtL5nubuNz8r4QDD~k{i8R59^jNr(4K*75FT>m>?)$vec58uHzQ6hHY zTmZdgPzv1_w}sBG>_Hz$&mLm2*4`QeB=xDM_8tVy4|^(jewz&Xw!jUCJsdmQ`E55q zvp$8x9wMSy~HuoRZ-4pU<{z6Fare0TGSL?L9#YGFCy*qwS>OIST^oVwmo44dNL*b&$r@Y@JMho3({Q4C$c zcu?-cR>=A-aSuSQSiajpU zn-o9pf}$9*z$Qhi9wAS|pNK$F3|nB6;%Ebg5rR(rGi5YG7w|Yh)+ucG%QC-68JHjl zc{1mrj)zm%mn+;3K~J8?1<=4{=Ko)??uHdM{6qnYJZ#(|FFOq532Yo?{|xbQ%kFoQ dr+;$_A%UL^%23&>?)s>Nm@642NV(Jb~v z@G^t!VMNo|SXxtDUQzCRxYSuvT;{AOuPAktl$F?Bvz#uM(^c+_6OUrEoDoDA=dqUo zzR}$y81nUYhR5>;d%jq=Vq8)C?%I6^KB28Q#y$=C-~nZZ5*W1)-7+YfjrsXYU1j-; z#egV;#e%ZJ@>}k+mvkuWcxe+R$CR6|uinL@_>`Ue!veUs}^|!+@^J{t7VFwKRa;(TX0nj#*d59S|JpYWFKwo zm{SU7E;$m6Gh1|gXVrs1)(3>BsDf5l84%fP9#PZSYYx#bv`C5?CSPRw&bcX(R#v)Y zzo<%@$s=5&Dnaw0>bnakO=MgUWg(%dp+@kEj))=H{r zM&r6|V=U;!lFtu(W9)dx5Qb+e)4oTSx3dVtypHjw^`6iW7zixLwz2KP?QCJ%BTQc( ziZqV|LTQqkC6OI*+DZQ^m^l<3vsH1@Cdo}bLn z^@4Ym;1d@pULhc@72sO%3WwM!DO-!S;pn}YI!ybY`RxM)w0<_q>dFnk(H=Urwf?qoA06r_E4uDzYZ7(WqR zj6E}|szsq`1w!YQCmwmB`%QDVPV@;H(|yBA*G+pK7DUXab-QfKaj|=F^{kfGt__Ix zHBy*1d4DLwQOw|@@VvHr*iz5(_hP~zrA$5Dprssh>|~j*z?|zG&3Q7q!W8LjDbf|C zNLQSM&P35e<^-j2W(ss&j4n3?y5AXHUJ^QPmlAUi0}KyHW5!}ex8i3| z^`v8J$2cBizPZR^<0(`h2B>ts0V*#ZKq4;#Yy3T7^0;APPs_t`vm4;?uU9Iblhf(!b100M!7 zekioe0AATA8B6{4V2VnH&lP}`E7mYO2b~#8IsiR3;3nOH=3k#@gsw2U@eJhx$j%AO|Ep>+miaKxqilHzwcKn9yEeo5i}G)3B7y3sP) zZ1GEq(gqu*$#nd8v;RZH!DPLf?MlD4yylnmzi?5xqx6vfZ!He7e;aS_di}Y=IUgQH Z81pYsT~+p{<<#s&Lyo+c%YTap{a?ux`;q_v diff --git a/Content/ZMMO/Data/Abilities/DT_Abilities.uasset b/Content/ZMMO/Data/Abilities/DT_Abilities.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ebe2a465d81c0dafb46c2098b5b21fc4f83618ad GIT binary patch literal 4724 zcmcIo3v3ic7#=8v@~9T%t%XGtEN!nZT1a_FuRUskLQ4xKR8qEgL%Vo)d)eLVgBW83 zv5CY4#b|?&2x1H&NP-Chkw*ebG-8Al5)dMZ60HhRkT=x-+ugZtdshl5e|j^s|Nrm* zo|%7pXw{@m*V^0Lm&GwQpf_VTX$GXtEZp|T$Cqk9YEh2uopb7wm2VD|;u9GI`E2-? zl!>#q{8WEDX=B@uY2ybIZq3N#WvdtXwx2sOeA~&d+Y-+c?$5fNKmX=le`Vn5tjz`c zX1ksv+(i0i6w3jgv81$gK}L~m$QcDSieE7lu4fcgR!1I)u@B3p@$+7c(I1=Am$7j) z7v*{K+_~<|$=SKt*|R;Fc?IstnV!6&so6Q6Y(Z z6sj6uw4i1M_ZsYaN&3uT4jRH7^2<$?a;?s;E&4W)>S!F4Ibz7(JsZ~?Pq-2DmTvK_1w=|e-EvPTktU=>-E1A=0N>? zHOSeOxFcqUtkg$%3eN0mOD3K&+50l(WuEGl{mM$&p!h+S9+JJB4KbRUVU*2e2GaLe z&OT@?(|EnY8%hGm>f2iLVh3`u;^QitcCmLk%wMQBR2W*A>Tbivgd~(j1XCs(b*9v* zDXGag9V+Tj5RP0<*q*rS2@urfMi&>V=I*$O+Ovd5Jj-Ms-p0m89o|^G>S%(sHq}gT z?7I_oR`SM<&>zk>cEhSlHDm_WEKOL()@?pB{Yj#rJY05txJ2e%MY3MU5?1Wl5BnSy zgnA|qS?i_)dmi8v8=rG}=rbhAap=*ubDVkZvg+c3YEvsO9XtlEi_Pr`)+&_iHM8C* z8A)ijKg>fKl~6Gca*YbwXYJOM4WV?n-yx~GkZnwOtcA`%X0aFzjq8v!I8iCr_&FQ> z*~KKh)al6eo@uE0I6QZC;PZd zDh%s{$;y-}%IHB={XVrJDCOuK-uIMK$EJT2IdzEd`Pu;;pnyQz#1EDah-C^&_)4p^9n!%!tl8yG9E>Q)G;>uIC}=}S;yL5 zn$sMNqixJ^d&Y!o*!{yTHcb|#2&rN}g2(g;3j%Zfn6);)DzS_TC#n@y4nP+rARrbDXNj`|kg9q*CYL@) z9}?+d&=3HeR;;y9G(L#L;bm_ O<$b<6kb>+1!2d5)A>@Mq literal 0 HcmV?d00001 diff --git a/Content/ZMMO/GAS/Abilities/BP_GA_Dash.uasset b/Content/ZMMO/GAS/Abilities/BP_GA_Dash.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ae6e91df6e1ff1aacdf8019e5330dcfda08f50fd GIT binary patch literal 16175 zcmeHO3zSsFnXcv`Zv_NIM7$vH#|+am49^JD)7`^kUN8ebkPLUaYi1g{`!;=V4>SQX z;$z*I9D|Z$f~b)_L^k3HD(Ys*s_bf3;~tf`B%W~8WAu;%3%hPGzChXkt6SCg_Ds(M zhU|JgTX4JX{p+v)U4K>Gx^wvUsSkg8{`~p1JsIoYgRw8DM)|w_D}KDE_pZlYdg{~N zyGLKC-+AiXuMQV7)|c8A9RBv~vx`5x?4vu_Gut*yo!EsXBgY`O=?He)hTN(*zrLw08INRTK9G`;6WB=Jtd7bb@{8efz+m zs=vMNxovOk-?Q|~;{F6%Xq|hb#ebmmy81l8p78Dbc)%YD_LLk7=1nHpc)Ie-^cc^-rJ|xLzpSJtzob4AjaU(G=KHGa z%1Y||y4gfnjMdOJob>KP_3ix_8%uR?w%1ou?3-Kc^#*+fMI|#!g9Wn#Ma6|aueZ3g z&`&6gMM=ubsP+tF>~gA)3;~p}M@Kj{aPaIQ(5qA*q3g742iC!3!9U%5;)(M8Bg@Pe z-kv-Xc%TWPdXq@KSn$OmJ%`fMv}r2?v!<=!QLdYO#;m;AqMfn-y7g#}-0jp!l!yQA z$S&NJUd7ni8*G^RCBL7CQ%ebO-qqGs1M-R?V@Q3LUlU435>|exk>o3@>eum*#Xegy zvO@1Uzt|*D z(-zM#J6<{CMT&A(N>*<)l4Z+s;4VyII_(@I_|rY zV1aPN;$goLO2Kza;td8nR5$o6_}Wc&3{~q^6MMbnkrt>Ci0kCNaE%4thbL6NgApr( z>N$`9I7}FTq*;h}Ejo5)bgq_p^GGm3kv;kNSO0EvNX0USTK@Zo79s8e%_JcO1y6D^ zEPHIv`;Wt&d=n3`Eho>7g585rL$@+L&p!6<2*^ihD)QmX|lWe-c*akCM+uA zY0vi8nn6oElvaPy1amEkJCydmRlF4DTIQ`Qp@?WEVs;)&vuA#NqGhn%R22`z!wSB2 zX!JFV$a3AZvaM{gfn$2SiEygmv3i~q4*C9dPd^LQZBVsNN?L5&iLDDj+XgziZ+rHa z3n5O05l%%pLl4DPw6yTJVNLfe`B0dMk?yI<# zu&edZdcBdC8zDU!*-SDUafoRqbn@p=D}6U)v{kn~HS(RktD%35-ps?RB79?2LxagJ zw&j&m{tWyU!-$o{j1<|cZp05>MKIQcns`iS=MUYp5oWe?qA>H&mMNnVpEb(@<#o@`M%m?h*e`HGv=IsI5}RRTFF$%36hy?_c>U|YT}fGp8RbK zMsqDCnA%8!J#(_p^XRjZ9NvhbTuqiR*{JLH6k_PAB<$ol;II?Nw)jW6nlY7P3}+@$ zcHcXzn_vn>;1-@TX_{sCg?{%2f;>Zz4VzmyXrvp`YFJEpFfjw}woPws+_VFkTV|iS zY-0_pj2s&0ZWU~^giG5q`#(=QxEyu}gvD@Uy^Mov?Cc_*ZBNxL^Rj<9{Nq7zmKf$X z?wY-xHP9_v>omJ!;vZf^j4$&dH0wkUX5M+rHSoQh^!T#V9`Kbh$IP<3hhI(4?F#z( z`fn9byC`rJ3JmCyN5E*&C2MyDF=y6RK>&UbgHn^E5I%+dYnW+WQbHtKOpvkc9UQ#uigm=e8~ZXGUSRBC3Ekpc~!`XW_EEGcUj`#3Xz-NF7X zrwJo&ntM9d~`3Pni+ZU=-dhg2k=3=6Z7=sZhs$9ee-NfQNQ zy!GrqL$oknF#ug$oy*zX+QiO~N2 zwXa9G_t(BQk#2|H*DlIMUhXV6FQ>Sq+^l6*5*o)!e7dbuJ(pu$i!`{?GL2JHiyO(9 z7>krB^!m)xRA)?K8h1}j>>>wL8#-z9RU#|zlxvgj$8(h>S1EK%Hi&k@{)+P`W^h{f3pQX#w}QUxHTryGWQ zB9%o;wWB^HJDnw*&s=zzlu)n7iYRwB|p1 zRf=g>SU_y%gHgTF6k$tF zyenhtn87$(O24Hn#+q3J+rUf#O|eQ=Pw;xyL{O7@43xc=(^G=*08J5Y1G749?IHVi zSBA?ZomDI(rD_Z5d5L*dkqzR+%|ipjwx$D7Hh1*8T;i0IWh~Jz#cElYMTkP2D0$em z5@Rvhub%7}VF7`=fjm&pHdD&6`K@I^wvl=nWMv1}@k8#`-jcc_(ZzXtkfakJ2`rKy zQL#bzJ3$h8DB0V#Xs=z_%8_G$?9n#TJhUxSmQA>HT}g44AgdtCHV{T%i8Y061SuLs zjQ5dHhttJrtmuF?7g~Gh(8!TX!ITtsi-%H(!&$YJ)1pAp$>p)N883U-2+70o=UBFd zmCWYosw|3O zWkC-mRhwe2HamAZ@;cUb-zm$x{p=pE4v+5Yq2y7~w3y;z9mS_dW_eF0&YTvNsg=#$ zlB?M9uyN7~#mvhJ$cF`N9-G7bY!;hMv%xHa`q^9oDW+&FqGvC86<9vnLlqLnEUIS{ z6_pFRtE-aRoi81)b=;~v(y`7%rOrXJpp#SG{ML$i_OL4?W_NW`8DufV;bxKTovh-9 zsSMb${8ve-9ND1>Mq+|8biQlGSWDiT&C-OgD0Wv9Wf4c}T9E-_G}>$FN)fNF;3yv` zxpGIRiYd2#4nGeqyzDXDU9D79Ia>M2mN8*ZCv)d+9VTVySd)B-HHAJzxPiQqPh-gW zH-q9Z7qm1d)RzN_b)L%Y-L;154;#eA>IJJ0XYJS;uI8?eE%5i)SJ1y8{a|JRMXaaB z(q+)~vAhRNwf|AVkm(e>p6=0i9bFsg!ZX?vbb*$e=7%mgXrc|PSVcEX_Yt~4BQ9%2 z3m(H9;iC(EZ~;%rrucv_VBo!hF31IaTEo#-(Eu)Z;~Ds>4e&;~n&|=!;Gi9}@C>{d zU4TJOJS*EkUi?$pL3#0F=T0>ykbANIz$(wZ!hO zW=bZtVyY%TtfL(c_Cd~Sz{#1N;f<1VDZ06H*))kYQ|tuPN_r-Ze0!yzYh`8ctMWU< z*-Uh=xkQ$^Oww5{Y=Nk53mGkO)DDYzdPs=UznbDVMPmWKV`**KKr!1u_O;i9&fcfH zepItPI5ZOVX5y1#H`1NGi}ld%+a43`V~mj)HXgnB@Tj}%WJ`CYR3pW@^ zYXN87)Ly$LX{}UD`;TJUXZUF?8=zf@PwZ2Q#V#d4I}tBo&ZX59+Ob>l5v-Va zP3#gs6&Lm#)V}nSB(=7A?+V#+6O9OqG9Jdb9i1^T7BNFlZnwAE8z6(ls6S$Qio{m3 ziHl8=b z!%O>81yei_HMSkxnqxPl=qP@O9vfDe;fH;&g4z5Un9ib~Yn}ed} z&1jUH17wEP3Z+Kvb6C@c3-;Z1Z>5Fe>iDHlSm1x(FNH1}f3y9P?fF9CZ`j-MJaU-w zvOO-xQLN&w>z=pAu`{Z-(#YOQrwTY!Z1v&a%>-)iXe1kTQWw7E&vT#3OrkfGbkG+| zM8$_nJWLd1LY3TYgK2MyEOj0fK)5*N{J`tQG4x}nmu@&?UW(40^ zhvg@s^w$jXG^q6#te1*&o8zuYE|prJXJtE0{6R%G&x>&SWPfZdzM^e)7=?qZ9G@Z+ zRGg}P6a4{u?xwR`oO$9BWwxw~WQ|Ik!{U@3r=2Jh?MnQLMjTf9Bv1h89wgmVaHK1M zK$wCDDsJS3Hb~&$s1pT5KwOmva04K|C`NI2!e8*9pdFVgU?RBBkq~z$e7TH*4)TCo zJfnl?gr~UzM1OB2YgAJ7mKWrKt@wTp4Q{0c5)@FR)JFn96h)o%yJean+gdAvuN(UA zdil?%Mjt8<-2c(P^c*pL?-a#e^l?A9zl)FrWz~y)N#4X?GN8CkG~Ho9HvMnqZ>zEo%Ks8QOOWV{W}@@o}sL%t2C7pP7-h}(UnRe;ua7On6!dKY+xez|ylpYFoq zUZ>Uwy=Bnp*%0l({6O4eWte2Z4bhtpomS&ERvw+ulu%2Oo)vY2?lfAlN2s^D*98W8 zCkc)xjdlVl!U)l`K{eK&5#kKGoWb%lr4C&lG+X-hSpGMo4+eia$IFjltY)B$bnHn>Q(zP%tF$p3a( zC~GMER~WIAC3&S#yCW7KccHYI_TD7m{}1Q?gW;SSzHPGhkFoN*cU0W^qwhrrDi^{_ zY7$3^+_LngYaagm^@{K7|GDF|cZ>K_u-33{3}+QVVB6JlK|=vL#F9VT@!PX&OLqS7 z`MU3pGk=i_w#dc(>o%Mr?^Ay%diBJcp9c@dw?`lN!9z=O!LTDzC8GmYXY_ZdTB-U& z)c*KuSFXqDOh_y!sNL;+ML^W;Hn^}LNrN6Wx%lkQzEjN?0GdJTEC2ui literal 0 HcmV?d00001 diff --git a/Source/ZMMO/Game/Entity/ZeusCharacter.cpp b/Source/ZMMO/Game/Entity/ZeusCharacter.cpp index 8752dd6..11943f2 100644 --- a/Source/ZMMO/Game/Entity/ZeusCharacter.cpp +++ b/Source/ZMMO/Game/Entity/ZeusCharacter.cpp @@ -17,6 +17,8 @@ #include "Subsystems/WorldSubsystem.h" #include "UObject/ConstructorHelpers.h" #include "ZMMO.h" +#include "GameplayTagContainer.h" +#include "GameplayTagsManager.h" #include "ZeusGASComponent.h" #include "ZeusPlayerState.h" #include "ZeusWorldSubsystem.h" @@ -101,11 +103,14 @@ AZeusCharacter::AZeusCharacter() TEXT("/Game/Input/Actions/IA_MouseLook.IA_MouseLook")); static ConstructorHelpers::FObjectFinder JumpActionAsset( TEXT("/Game/Input/Actions/IA_Jump.IA_Jump")); + static ConstructorHelpers::FObjectFinder DashActionAsset( + TEXT("/Game/Input/Actions/IA_Dash.IA_Dash")); if (MoveActionAsset.Succeeded()) { MoveAction = MoveActionAsset.Object; } if (LookActionAsset.Succeeded()) { LookAction = LookActionAsset.Object; } if (MouseLookActionAsset.Succeeded()) { MouseLookAction = MouseLookActionAsset.Object; } if (JumpActionAsset.Succeeded()) { JumpAction = JumpActionAsset.Object; } + if (DashActionAsset.Succeeded()) { DashAction = DashActionAsset.Object; } } void AZeusCharacter::BeginPlay() @@ -166,6 +171,11 @@ void AZeusCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputCompo EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AZeusCharacter::Look); EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &AZeusCharacter::Look); + + if (DashAction) + { + EnhancedInputComponent->BindAction(DashAction, ETriggerEvent::Triggered, this, &AZeusCharacter::OnDashTriggered); + } } else { @@ -203,6 +213,40 @@ void AZeusCharacter::OnJumpReleased() DoJumpEnd(); } +void AZeusCharacter::OnDashTriggered() +{ + // Resolve UZeusGASComponent do PlayerState. Component vive la' via + // AZeusPlayerState Component Registry (config-driven). Sem el, ASC ausente + // e RequestActivateAbilityByTag falha — log warning. + const APlayerState* PS = GetPlayerState(); + if (!PS) + { + UE_LOG(LogZeusPlayer, Warning, TEXT("OnDashTriggered: PlayerState nullptr — ignorado")); + return; + } + UZeusGASComponent* Comp = PS->FindComponentByClass(); + if (!Comp) + { + UE_LOG(LogZeusPlayer, Warning, TEXT("OnDashTriggered: UZeusGASComponent nao achado")); + return; + } + + // Tag canonica casa com row do DT + JSON do server. Hash FNV calculado + // dentro do componente (RequestActivateAbilityByTag). + const FGameplayTag DashTag = UGameplayTagsManager::Get().RequestGameplayTag( + FName(TEXT("Zeus.Ability.Movement.Dash"))); + if (!DashTag.IsValid()) + { + UE_LOG(LogZeusPlayer, Warning, + TEXT("OnDashTriggered: tag Zeus.Ability.Movement.Dash nao registrada no cliente")); + return; + } + + const bool bSent = Comp->RequestActivateAbilityByTag(DashTag); + UE_LOG(LogZeusPlayer, Log, TEXT("OnDashTriggered -> RequestActivateAbilityByTag = %s"), + bSent ? TEXT("OK (C_ABILITY_TRY_ACTIVATE enviado)") : TEXT("FALHOU")); +} + void AZeusCharacter::DoMove(const float Right, const float Forward) { PendingMoveRight = FMath::Clamp(Right, -1.0f, 1.0f); diff --git a/Source/ZMMO/Game/Entity/ZeusCharacter.h b/Source/ZMMO/Game/Entity/ZeusCharacter.h index 3589812..c9b5c57 100644 --- a/Source/ZMMO/Game/Entity/ZeusCharacter.h +++ b/Source/ZMMO/Game/Entity/ZeusCharacter.h @@ -62,6 +62,11 @@ protected: UPROPERTY(EditAnywhere, Category = "Input") UInputAction* MouseLookAction; + /// IA_Dash — dispara C_ABILITY_TRY_ACTIVATE pra Zeus.Ability.Movement.Dash + /// via UZeusGASComponent. Bind padrao no IMC_Default: LeftShift -> Pressed. + UPROPERTY(EditAnywhere, Category = "Input") + UInputAction* DashAction; + /** Cadencia de envio dos pacotes `C_INPUT_AXIS` (Hz). */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zeus|Networking", meta = (ClampMin = "1", ClampMax = "120")) int32 InputSendRateHz = 30; @@ -104,6 +109,11 @@ protected: void OnJumpPressed(); void OnJumpReleased(); + /// IA_Dash Triggered -> resolve UZeusGASComponent do PlayerState e chama + /// RequestActivateAbilityByTag("Zeus.Ability.Movement.Dash"). Server valida + /// + responde S_ABILITY_ACTIVATED (HP/SP atualizado, montage roda local). + void OnDashTriggered(); + public: /** Wrappers expostos a Blueprint (UI / mobile / automation). */ UFUNCTION(BlueprintCallable, Category = "Input")