#pragma once #include "Blueprint/UserWidget.h" #include "CoreMinimal.h" #include "ZMMOAttributeTypes.h" #include "ZMMOHudHpSpWidget.generated.h" class UProgressBar; class UTextBlock; class UZMMOAttributeComponent; /** * Widget base do HUD de atributos (HP/SP/level). Spawnada por * `AZMMOPlayerCharacter::BeginPlay` quando o pawn local virou autoritativo. * * Layout (cor, textos, ancoras) vem do WBP filho via UMG. * Comportamento (binding com AttributeComponent + refresh on delegate) * vive aqui em C++ — permite que outros modulos consumam esta API * sem precisar abrir o WBP. Sub-classe via Blueprint apenas para skin * visual e disposicao dos sub-widgets. * * Convencao `meta=(BindWidget)`: o WBP filho DEVE ter widgets com os * mesmos nomes (HpBar, SpBar). `BindWidgetOptional` permite ao WBP * omitir o widget (ex.: HUD compacto sem texto numerico). */ UCLASS(Abstract, Blueprintable, BlueprintType) class ZMMOATTRIBUTES_API UZMMOHudHpSpWidget : public UUserWidget { GENERATED_BODY() public: /** * Liga o widget a um `UZMMOAttributeComponent`. Subscreve aos delegates * e faz um refresh imediato com o snapshot corrente. Idempotente — * chamar com outro componente desliga do anterior. * Se `InComponent` for nullptr, desliga sem religar. */ UFUNCTION(BlueprintCallable, Category = "Zeus|HUD") void BindToAttributeComponent(UZMMOAttributeComponent* InComponent); UFUNCTION(BlueprintPure, Category = "Zeus|HUD") UZMMOAttributeComponent* GetBoundComponent() const { return BoundComponent.Get(); } protected: virtual void NativeDestruct() override; /** * Hook BlueprintNativeEvent para skin visual reagir a um snapshot novo * (cores, animacao de level up, etc.). Implementacao default em C++ * apenas atualiza progress bars + textos via `BindWidget`/`BindWidgetOptional`. */ UFUNCTION(BlueprintNativeEvent, Category = "Zeus|HUD") void OnSnapshotApplied(const FZMMOAttributesSnapshot& Snapshot); virtual void OnSnapshotApplied_Implementation(const FZMMOAttributesSnapshot& Snapshot); UFUNCTION(BlueprintNativeEvent, Category = "Zeus|HUD") void OnHpSpDelta(int32 Hp, int32 Sp); virtual void OnHpSpDelta_Implementation(int32 Hp, int32 Sp); // === BindWidget — devem existir no WBP com EXATAMENTE estes nomes === UPROPERTY(BlueprintReadOnly, meta = (BindWidget), Category = "Zeus|HUD") UProgressBar* HpBar = nullptr; UPROPERTY(BlueprintReadOnly, meta = (BindWidget), Category = "Zeus|HUD") UProgressBar* SpBar = nullptr; UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") UTextBlock* HpText = nullptr; UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") UTextBlock* SpText = nullptr; UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") UTextBlock* LevelText = nullptr; private: UFUNCTION() void HandleAttributesChanged(const FZMMOAttributesSnapshot& Snapshot); UFUNCTION() void HandleHpSpChanged(int32 Hp, int32 Sp); UPROPERTY() TWeakObjectPtr BoundComponent; };