diff --git a/Content/ZMMO/UI/HUD/WBP_HUD.uasset b/Content/ZMMO/UI/HUD/WBP_HUD.uasset index b3bc8f5..2c72fab 100644 Binary files a/Content/ZMMO/UI/HUD/WBP_HUD.uasset and b/Content/ZMMO/UI/HUD/WBP_HUD.uasset differ diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp index 378ca3b..1e7c69e 100644 --- a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.cpp @@ -1,9 +1,12 @@ #include "ZMMOHudWidget.h" +#include "Components/TextBlock.h" +#include "Components/Widget.h" #include "CommonInputTypeEnum.h" // ECommonInputMode #include "Engine/World.h" #include "GameFramework/PlayerController.h" #include "GameFramework/PlayerState.h" +#include "TimerManager.h" #include "ZMMO.h" #include "ZMMOAttributeComponent.h" #include "ZMMOHudHpSpWidget.h" @@ -32,6 +35,8 @@ void UZMMOHudWidget::NativeOnActivated() // HUD nao intercepta cliques — mouse passa direto pro Pawn (camera, etc.). // Sub-widgets que precisam de click (futuro: hotkeys) podem override. SetVisibility(ESlateVisibility::HitTestInvisible); + // Toast comeca escondido — so' aparece em HandleLevelUp. + HideLevelUpToast(); BindToLocalPlayer(); UE_LOG(LogZMMO, Log, TEXT("ZMMOHudWidget activated (HpSpBar=%s)"), HpSpBar ? *HpSpBar->GetName() : TEXT("none")); @@ -115,8 +120,39 @@ void UZMMOHudWidget::HandleHpSpChanged(int32 Hp, int32 Sp) void UZMMOHudWidget::HandleLevelUp(int32 NewBaseLevel, int32 StatusPointDelta) { - // Snapshot subsequente do AttributeSystem vai disparar HandleAttributesChanged - // e atualizar HpSpBar->LevelText. Aqui e' o ponto pra efeitos visuais - // instantaneos (toast "LEVEL UP", confetti, sound). V1 noop — UI pode - // hook via Blueprint depois. + // Snapshot subsequente atualiza HpSpBar (level/maxhp/maxsp). Aqui mostra + // toast visual instantaneo. StatusPointDelta nao usado no texto (UI mostra + // no StatusWindow). Polish futuro: SFX + particle aura. + UE_LOG(LogZMMO, Log, TEXT("[HUD] LEVEL UP! newLevel=%d +sp=%d"), NewBaseLevel, StatusPointDelta); + ShowLevelUpToast(NewBaseLevel); +} + +void UZMMOHudWidget::ShowLevelUpToast(int32 NewBaseLevel) +{ + if (LevelUpToastText) + { + LevelUpToastText->SetText(FText::FromString( + FString::Printf(TEXT("LEVEL UP! Lv %d"), NewBaseLevel))); + } + if (LevelUpToastContainer) + { + LevelUpToastContainer->SetVisibility(ESlateVisibility::HitTestInvisible); + } + + // Cancela timer anterior (caso level up duplo em sequencia) + agenda hide. + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(LevelUpToastHideTimer); + World->GetTimerManager().SetTimer(LevelUpToastHideTimer, + FTimerDelegate::CreateUObject(this, &UZMMOHudWidget::HideLevelUpToast), + LevelUpToastDurationSec, /*loop*/ false); + } +} + +void UZMMOHudWidget::HideLevelUpToast() +{ + if (LevelUpToastContainer) + { + LevelUpToastContainer->SetVisibility(ESlateVisibility::Collapsed); + } } diff --git a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h index 28d6de6..39f3553 100644 --- a/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h +++ b/Source/ZMMO/Game/UI/InGame/ZMMOHudWidget.h @@ -2,9 +2,12 @@ #include "CommonActivatableWidget.h" #include "CoreMinimal.h" +#include "Engine/TimerHandle.h" #include "ZMMOAttributeTypes.h" #include "ZMMOHudWidget.generated.h" +class UTextBlock; +class UWidget; class UZMMOAttributeComponent; class UZMMOHudHpSpWidget; @@ -71,6 +74,22 @@ protected: UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD") UZMMOHudHpSpWidget* HpSpBar = 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 + /// dentro deste container; este C++ controla apenas o lifecycle visivel/hidden. + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD|LevelUp") + UWidget* LevelUpToastContainer = nullptr; + + /// Texto exibido no toast — formato "LEVEL UP! Lv X" (X = novo level). + /// Tambem BindWidgetOptional; WBP_HUD pode usar texto estatico no design. + UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional), Category = "Zeus|HUD|LevelUp") + UTextBlock* LevelUpToastText = nullptr; + + /// Duracao do toast em segundos. Configuravel no BP filho. + UPROPERTY(EditDefaultsOnly, Category = "Zeus|HUD|LevelUp") + float LevelUpToastDurationSec = 2.5f; + // === Futuros sub-widgets === // UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional)) UZMMOHudPlayerInfoWidget* PlayerInfo = nullptr; // UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional)) UZMMOHudMinimapWidget* Minimap = nullptr; @@ -99,4 +118,9 @@ private: UPROPERTY(Transient) TWeakObjectPtr BoundComponent; + + void ShowLevelUpToast(int32 NewBaseLevel); + void HideLevelUpToast(); + + FTimerHandle LevelUpToastHideTimer; };