From e1fca1ae8d2f10d99adf8fc3a11b9d1f007b6d93 Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Thu, 28 May 2026 00:34:03 -0300 Subject: [PATCH] feat(ui/hud): painel de vitais (Nome/Job/Level + HP/SP/EXP) substituindo HpSpBar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UZMMOHudPlayerVitalsWidget (novo): sub-widget do HUD com 4 UUIProgressBar_Base (HP/SP/BASE EXP/JOB EXP) + nome/classe/level. ApplySnapshot anima HP/SP via SetTargetPrimaryLevel e formata os readouts; ApplyHpSp pro tick rapido. UZMMOHudWidget propaga o snapshot pro PlayerVitals e resolve identidade: nome do AZMMOPlayerState.CharName + job via UZMMOJobsLibrary.GetJobDisplayName(ClassId). HpSpBar legado removido do WBP_HUD. WBP_PlayerVitalsPanel: layout compacto (520w) com colunas alinhadas (label 28 / bar FILL / readout 116 right-align) independente do tamanho do numero. Sem portrait. MIs por barra: UI_M_ProgressBar_SP/BaseEXP/JobEXP/Loading (cores do hud_layout_modal_New.html). EXP/JOB readout mostra exp absoluto por ora — barras de EXP aguardam o servidor enviar exp-to-next no snapshot pra calcular a porcentagem. Co-Authored-By: Claude Opus 4.7 (1M context) --- Content/ZMMO/UI/HUD/WBP_HUD.uasset | Bin 30345 -> 32554 bytes .../ZMMO/UI/HUD/WBP_PlayerVitalsPanel.uasset | Bin 0 -> 100895 bytes .../UI_M_ProgressBar_BaseEXP.uasset | Bin 0 -> 8920 bytes .../UI_M_ProgressBar_JobEXP.uasset | Bin 0 -> 9101 bytes .../UI_M_ProgressBar_Loading.uasset | Bin 0 -> 5627 bytes .../Progressbar/UI_M_ProgressBar_SP.uasset | Bin 0 -> 9876 bytes .../UI/InGame/ZMMOHudPlayerVitalsWidget.cpp | 96 ++++++++++++++++++ .../UI/InGame/ZMMOHudPlayerVitalsWidget.h | 92 +++++++++++++++++ Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp | 27 ++++- Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h | 7 ++ 10 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 Content/ZMMO/UI/HUD/WBP_PlayerVitalsPanel.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_BaseEXP.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_JobEXP.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Loading.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_SP.uasset create mode 100644 Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.cpp create mode 100644 Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.h diff --git a/Content/ZMMO/UI/HUD/WBP_HUD.uasset b/Content/ZMMO/UI/HUD/WBP_HUD.uasset index 2c72fabc385e61837be16f613d0c79e10bb0a7a2..3d7b3be313c302ee92c939bce20184c7f57c8b14 100644 GIT binary patch literal 32554 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�*F9BUoVdB^`l_aymXS(3Vqc>!tMDB$oZ4Za2Te63q1mHxX%({wTh1nFYfa%A=%rQ3 zrGZ?WRxW1wG<&8HXXxF(?O{fD^WeJ(*U7G+QBb)zaI+B%UZ9+%@^NrcKThHo{Tb-! zK%=8!MEJ##VYSX9<@DiyP=@HIWR>`;CD|$z*`C2(5&CA?L$eczR^mb2Fgl}Y-J z46?)N+^2hehaM*VT=V>&FZlQJ4oN1{?5d`D7Nc7iCeauTVReKrdpui7XWy66y($4scNrVD-P`}|S| zN1v!etSb98Q`tfn`m~8$_Jt9{8j(yF+Ta47K7fOI^o4uiRnY|)_{6=`4fw@B=^f-K{?@fq&I$NlL|BM5y?$7Fdwp$$ zu3oO!&D(_Z*G)$YGRinxX(S&q7Ro2xPo`)Edl_#8;PsQI!@E#uTlVYUe@QLG@)%#n z$g!-Lc261P1B%IVd}AjAeUn5R$+MNYwdiLIml8JG7}8zf$XyYgiVKL8ET62=O_q(n z5j@_9udn1*fjJ=eD`(5Cv<2)aDya7wvUE2aMcP*L0dHv`|Si)JdzLcg1R|UJ-mq?fSQy5P^mLK|^gvoFh4;9!8S|CKK=2Yl8o# z;F0HuuGAmsj^!f_`^PTUOn<%lYpVWY!AJA@lXhNCu@Ck!2G&coYi#GCq6QQ-`*v~9 zV5hqxDrtNB-c7cbu^nu-iqB^QyF_3I#$_2<526hNixTam)&95c9c9Ge&;N}ee~jIG z!(F3yx7N6>Pe9t1792o2&`u_u{MjJ7v|Uadm50#3;e1CkoZ_=#1WBiV!|D8M zFtteGyMn#}(QA(5e*aI#S=zt+D1Gmb_nf$vNQ)2OA; zmB8~9infhZKa`I(cCQJ1MC14<$5V?mqBS5OdX4!UDB3mlE7H^Dl3$IW)xMmp8omT) zA@H=(0a27EMh$0!jP<0q{;e^dje-iv=OMP#&WW%J#Q4!u zT$38^C~9y%Eh7^*^{DsT@lCdFC2HdMUd+H}HvF!%S^q1uv;c4me{bMtA82>3#-flS zpEB}Dnr0eD7ERR;67n?9zjw95?iMr*^o!d_7E9M~dOi3mnhB9Km$W<7#Pf0_=_iuc zC5rn&;(jo{pTK*OxI;wUP=Py4+{Xzzpa2>gE!is0LnDr~3J!oL>BNx-mN3~r&a5O% z(unuai1*Nl_ec@%p@EsNwT<`Ch!->(N`o^Ljn{Y&J)Dwhumlgi1P{FgL9d*d$iF#h zj|NE-IPKwtKa=kDy7l&UItt)f>r2yGpcLQ>ePzITp6pEj(VF zagkc`jy%>~jcS}{RQ`yOPvqkS-u~N1zVWyudMvZ)aY^K(0sZ{Z<03uFfBU#JobxzC z_nnbmKj8H$iJqC8=<$GwXD~~Bslo!ZSs-m8(K92xR0nxx%OGw$@Wq2X7800m(AE;~ z$}*Eymzng48ZVFfJn7FPknZ`t@00t6*irt!ibNk|iuSxM5XE2L)O`}v^DPzaO=CQk zr&{_>rE2y(m3Q)YN&EEW&(-Nmcl78y&t|RTZ?C4&2g~S-Xw*#meyRTBX7pl$hkM=U zS)=)*`6wwDzRwfg;3GXz^jM4fb63evmeH3>wePlBR40FrB9^~N;rqQcYQ*1~JvThy zU03;0tz--T?tmnYHxBS4=`?(@g+9Vq$3JtEKmXZ!jDUaio+_6PH5@UjVP$IpiV z3Hl$f54=5nZtS2t^>pN5K?q)P#>JETT?|GI2^AA~N&AC0RyYuEVas2n=n?o2_`oCv z1POztPoeY09e!Vdgm-)5c}eS;_aN@|zs=yJ6GX+8BIjAaOrz^2nTDJC1DT%0S#PLa zE;>|B?``wcNVAx{4P>9BAvPE!-VM~+WH<0@4Z4xPXKO?dzZj6elxfN+_}lfqKLg;y zMPz)(pI&X&l1t=}ca*N|u|+oj{NoAxhiHkNR3LQxNM1NI&zn4m8UN%v!g|?w4y0`Os zV1B{N*vvQ>aLec+fQh!i8dfxU^CYTq(7o*4P9=r5nHFj-%O;M2*7V6i!lkdh@VXIEAGjlV{_+jQ?Q`=l_6L(cF+&@APn!SygXe}`xTB=+U4zhHSdTOk z4={iN?^@zPFuiaRE_3iZu+KB!wBK^+=+$4E#vi-Ku-+f6RyLr#p$x-Bjb9m1*JOog z=r22C8I+ohT_#@see!)t6Q?g`GZo0-3ro{c^2mVrDbp#wN2cJT#3A^2x@xk~<5H~C zNKJ~+WQEp_{{<`MJofXJWc3-zN#V1W^j7>kc&46$j1;a(&m@1pZIt3r&R2?mP~lIv z^&fCsC;RkkpEhY*&ULqyS=JWZQ!j@Q10>f8tht?L4}I{)y(cr~f0;YY8ou==f3UM~ zThf9+HqdlNQvv)I^!d@c`B!7g`h_)Y-!=FB)gSDCv)lTkrt>s00@4=Fd^)eB739z9 z{2!RkgD!5n{OPRZtW_B^cV8aY`WHEb7*XzMDMy&6eCmj_F5PBaedArbuFAPB$RF%1 zrn9slkPS4Q(R2pCrSBM@uTehDSvu;~El;di*u@|0fAe$(zxRf26tEmK?y|{a1r`oWeQkL8hmsgzo=6rv!R9y!iJw8tCX3`Eop~qh;N$=v)7Ltt6 zXb3&1wF<472us_+^dXHos1~~ir`V$$r&3a5LVa{$`VIsQ6$pI>n*q=s@K!*HD}4T^FY8UTH6;0R))W4S{>F4Gxlon+Ax zR#7AaUHT1eD1g}cV8bYXaNp$NMgzVB?i$_U%mlOo>pF!nk-BLa=eobHEVpU^!HDSD zy_T*MxxOI|VUZwuqlR-(LunHK+fX;$731vkqNXabk!YZks|BV$l+O_`U;4cPpCKwo zh#VQG%h<|f+4UK#BT4i&N#yzwKfP37RFdW$oQYI?Br*kEKT^#}YDVNaNs{g)(ZiW> z-j!O(9(V_5thwLMkZ@Gfq#=d-GJYm1|4$lHvr=Je(qK5wM5^E0kecQEd|%Gp1VF0M zGX57xeEU_88H4_^jm5@nr6@mwRunBYvR`wZws-C;luGM+V`jVCuDH1=mBWu%OY>-x1xa&Hz`O5 zY8x0PR>B6DH-apsY%SwfRVd2HT%rs^8>K7bUZy!z;EHHP1&e^z#(o}t!K|uLt5@mXMBF0v>dw z{l~}`GqUcxbi%@%QwO6<1^jTAORDq^c2VeFi$}AL(M73VVWxt^u3M}F!YK`CKy$)@3>woYV{pN z379WiP)M-&9lggq^&eT|?Hbsv=*c&`Q~>k?$Q?sCRW$nlIMM$c27`vApV^4Kc;XSS zS=`JPIWn%Q?yT(`XtPpOG}5JHxI!REvxE2p1k6{LyyqUGa*W9JHlf!iUk3=sSDyuF z2cUuirADktu_Ls4+DCX3+!&Woe#$_~ak0SBBXj!&Tp~4TS<*4g6}{*M86{xg8JA4l zvV1+sSzDI=^PrrPD4LTh4aB2$# zVxq`1M6PeBx4J%}9u|l8GA%;^z`g>aZ!}fFd`%S-fluBkej4@GH9{OF6B_VF09XZd zgvgPJ={0AgG||gMWuw)n8&z}^m0TmD%rkDNRMHDFN+9?O!spzgu)^#AoiSnby!9U? z9I+_|NuIZ9as|XlN$2UyL#Qg~Ws4jdFBD~Df$)ZPn(GUVr9<)c4{{0fU6J%M$geS? zAE`>&&cGBt`WUEwbRo5(3;(kb`W=myAYOCp3AmL06B@?7Trj-Ol3|gP^rbuj(Z`hX z=XC<4+sFlmKEzHEFFdHFu4OPyMUQ7knVJtFTJ>I5>5 zF`ykpMu=JTLqtEt(2~A2Clf;OfXM(EgN2dqL>JafJ(ky6p30#2 delta 8829 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 JK&<&u|9|fNk){9u literal 0 HcmV?d00001 diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_BaseEXP.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_BaseEXP.uasset new file mode 100644 index 0000000000000000000000000000000000000000..a1303a1b3327c48eb10f696f7ec5ac64d6478cd6 GIT binary patch literal 8920 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 EzZ*TCnE(I) literal 0 HcmV?d00001 diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_JobEXP.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_JobEXP.uasset new file mode 100644 index 0000000000000000000000000000000000000000..307ce41425ad365c1b00a4866baeb142d76ba208 GIT binary patch literal 9101 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 literal 0 HcmV?d00001 diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Loading.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Loading.uasset new file mode 100644 index 0000000000000000000000000000000000000000..73e0bd28ae191cd9b17be78440780a2eae41f97e GIT binary patch literal 5627 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 literal 0 HcmV?d00001 diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.cpp b/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.cpp new file mode 100644 index 0000000..8cdfa0c --- /dev/null +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.cpp @@ -0,0 +1,96 @@ +#include "ZMMOHudPlayerVitalsWidget.h" + +#include "Components/TextBlock.h" +#include "UI/Widgets/UIProgressBar_Base.h" +#include "Internationalization/Text.h" + +namespace +{ + /** Formata int com separador de milhar do locale (ex.: 9840 -> "9,840"). */ + FText FormatNumber(int64 Value) + { + return FText::AsNumber(Value); + } + + float SafeRatio(int32 Current, int32 Max) + { + return Max > 0 ? FMath::Clamp(static_cast(Current) / static_cast(Max), 0.f, 1.f) : 0.f; + } +} + +void UZMMOHudPlayerVitalsWidget::ApplySnapshot(const FZMMOAttributesSnapshot& Snapshot) +{ + LastSnapshot = Snapshot; + + // HP / SP (pool efetivo — % real) + ApplyHpSp(Snapshot.Hp, Snapshot.MaxHp, Snapshot.Sp, Snapshot.MaxSp); + + // Level + if (LvlText) + { + LvlText->SetText(FText::FromString(FString::Printf(TEXT("LVL %d"), Snapshot.BaseLevel))); + } + + // BASE / JOB EXP — sem "exp-to-next" no snapshot. Readout mostra valor + // absoluto acumulado; as barras ficam pra quando a curva de exp existir. + if (ExpReadout) + { + ExpReadout->SetText(FormatNumber(Snapshot.BaseExp)); + } + if (JobReadout) + { + JobReadout->SetText(FormatNumber(Snapshot.JobExp)); + } + + OnSnapshotApplied(Snapshot); +} + +void UZMMOHudPlayerVitalsWidget::ApplyHpSp(int32 Hp, int32 MaxHp, int32 Sp, int32 MaxSp) +{ + LastSnapshot.Hp = Hp; + LastSnapshot.MaxHp = MaxHp; + LastSnapshot.Sp = Sp; + LastSnapshot.MaxSp = MaxSp; + + if (HpBar) + { + HpBar->SetTargetPrimaryLevel(SafeRatio(Hp, MaxHp)); + } + if (SpBar) + { + SpBar->SetTargetPrimaryLevel(SafeRatio(Sp, MaxSp)); + } + if (HpReadout) + { + HpReadout->SetText(FText::Format( + NSLOCTEXT("ZMMOHud", "HpSpReadout", "{0}/{1}"), + FormatNumber(Hp), FormatNumber(MaxHp))); + } + if (SpReadout) + { + SpReadout->SetText(FText::Format( + NSLOCTEXT("ZMMOHud", "HpSpReadout", "{0}/{1}"), + FormatNumber(Sp), FormatNumber(MaxSp))); + } +} + +void UZMMOHudPlayerVitalsWidget::SetCharName(const FString& InName) +{ + if (NameText) + { + NameText->SetText(FText::FromString(InName)); + } +} + +void UZMMOHudPlayerVitalsWidget::SetClassName(const FString& InClassName) +{ + if (ClassText) + { + ClassText->SetText(FText::FromString(InClassName)); + } +} + +void UZMMOHudPlayerVitalsWidget::OnSnapshotApplied_Implementation(const FZMMOAttributesSnapshot& /*Snapshot*/) +{ + // Default vazio — skin do WBP estende se quiser (low-HP flash, etc.). +} diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.h b/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.h new file mode 100644 index 0000000..78f1887 --- /dev/null +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudPlayerVitalsWidget.h @@ -0,0 +1,92 @@ +#pragma once + +#include "CommonUserWidget.h" +#include "CoreMinimal.h" +#include "ZMMOAttributeTypes.h" +#include "ZMMOHudPlayerVitalsWidget.generated.h" + +class UUIProgressBar_Base; +class UTextBlock; + +/** + * Sub-widget do HUD: painel de vitais do player (portrait + nome/job/level + + * barras HP/SP/BASE EXP/JOB EXP). Sem auto-bind no AttributeComponent — o + * parent (UZMMOHudWidget) propaga snapshots via ApplySnapshot/ApplyHpSp. + * + * Barras são UUIProgressBar_Base (material custom Primary/Secondary). HP/SP + * têm pool efetivo no snapshot → % real. BASE/JOB EXP só têm exp acumulado + * (sem "exp-to-next") — barras de EXP ficam pra quando a curva existir; + * por ora o readout mostra o valor absoluto. + * + * WBP filho (WBP_PlayerVitalsPanel) deve ter widgets com EXATAMENTE estes + * nomes: HpBar, SpBar (obrigatórios); ExpBar, JobBar, NameText, ClassText, + * LvlText, HpReadout, SpReadout, ExpReadout, JobReadout (opcionais). + */ +UCLASS(Abstract, Blueprintable, BlueprintType) +class ZMMO_API UZMMOHudPlayerVitalsWidget : public UCommonUserWidget +{ + GENERATED_BODY() + +public: + /** Atualiza todos os campos a partir do snapshot. Chamado pelo UZMMOHudWidget. */ + UFUNCTION(BlueprintCallable, Category = "Zeus|HUD") + void ApplySnapshot(const FZMMOAttributesSnapshot& Snapshot); + + /** Atualiza apenas HP/SP (otimização do tick — sem mexer em level/exp). */ + UFUNCTION(BlueprintCallable, Category = "Zeus|HUD") + void ApplyHpSp(int32 Hp, int32 MaxHp, int32 Sp, int32 MaxSp); + + /** Nome do char — vem do PlayerState (não está no snapshot). */ + UFUNCTION(BlueprintCallable, Category = "Zeus|HUD") + void SetCharName(const FString& InName); + + /** Nome do job/classe — vem do JobsDatabase via ClassId (não é string no snapshot). */ + UFUNCTION(BlueprintCallable, Category = "Zeus|HUD") + void SetClassName(const FString& InClassName); + +protected: + /** Hook BP pra skin reagir (cores low-HP, animações, etc.). */ + UFUNCTION(BlueprintNativeEvent, Category = "Zeus|HUD") + void OnSnapshotApplied(const FZMMOAttributesSnapshot& Snapshot); + virtual void OnSnapshotApplied_Implementation(const FZMMOAttributesSnapshot& Snapshot); + + // === BindWidget — barras (HP/SP obrigatórias) === + UPROPERTY(BlueprintReadOnly, meta = (BindWidget), Category = "Zeus|HUD") + TObjectPtr HpBar; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidget), Category = "Zeus|HUD") + TObjectPtr SpBar; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr ExpBar; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr JobBar; + + // === BindWidget — textos (todos opcionais) === + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr NameText; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr ClassText; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr LvlText; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr HpReadout; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr SpReadout; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr ExpReadout; + + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + TObjectPtr JobReadout; + +private: + /** Último snapshot recebido (cache pra ApplyHpSp manter MaxHp/MaxSp). */ + UPROPERTY(Transient) + FZMMOAttributesSnapshot LastSnapshot; +}; diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp index 1e7c69e..21a8d2b 100644 --- a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp @@ -10,6 +10,9 @@ #include "ZMMO.h" #include "ZMMOAttributeComponent.h" #include "ZMMOHudHpSpWidget.h" +#include "ZMMOHudPlayerVitalsWidget.h" +#include "ZMMOJobsLibrary.h" +#include "ZMMOPlayerState.h" UZMMOHudWidget::UZMMOHudWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) @@ -98,12 +101,28 @@ void UZMMOHudWidget::UnbindFromComponent() void UZMMOHudWidget::HandleAttributesChanged(const FZMMOAttributesSnapshot& Snapshot) { - // Propaga snapshot aos sub-widgets que ja existem. Em V1 so' HpSpBar. + // Propaga snapshot aos sub-widgets que ja existem. if (HpSpBar) { HpSpBar->ApplySnapshot(Snapshot); } - // Futuros: PlayerInfo->ApplySnapshot, Buffs->RefreshIcons, etc. + if (PlayerVitals) + { + PlayerVitals->ApplySnapshot(Snapshot); + + // Identidade: nome vem do PlayerState (não está no snapshot); job vem + // do JobsSubsystem resolvendo ClassId -> display name. + if (UZMMOAttributeComponent* Comp = BoundComponent.Get()) + { + if (const AZMMOPlayerState* PS = Cast(Comp->GetOwner())) + { + PlayerVitals->SetCharName(PS->CharName); + } + } + PlayerVitals->SetClassName( + UZMMOJobsLibrary::GetJobDisplayName(this, Snapshot.ClassId).ToString()); + } + // Futuros: Buffs->RefreshIcons, etc. } void UZMMOHudWidget::HandleHpSpChanged(int32 Hp, int32 Sp) @@ -115,6 +134,10 @@ void UZMMOHudWidget::HandleHpSpChanged(int32 Hp, int32 Sp) { HpSpBar->ApplyHpSp(Hp, Snap.MaxHp, Sp, Snap.MaxSp); } + if (PlayerVitals) + { + PlayerVitals->ApplyHpSp(Hp, Snap.MaxHp, Sp, Snap.MaxSp); + } } } diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h index 39f3553..d53b532 100644 --- a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h @@ -10,6 +10,7 @@ class UTextBlock; class UWidget; class UZMMOAttributeComponent; class UZMMOHudHpSpWidget; +class UZMMOHudPlayerVitalsWidget; /** * Root da HUD de gameplay. UCommonActivatableWidget pushed pelo @@ -74,6 +75,12 @@ protected: UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") UZMMOHudHpSpWidget* HpSpBar = nullptr; + /// Painel de vitais novo (portrait + nome/job/level + HP/SP/EXP/JOB bars). + /// Substitui o HpSpBar legado. BindWidgetOptional — coexiste durante a + /// migração; o WBP_HUD pode ter um ou outro. + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") + UZMMOHudPlayerVitalsWidget* PlayerVitals = nullptr; + /// Container do toast "LEVEL UP!" (Fase 3). Hidden por default; em /// `HandleLevelUp` vira visivel por `LevelUpToastDurationSec` segundos /// (ver `Show/HideLevelUpToast`). WBP_HUD coloca um Border + Image + TextBlock