From 768ecf5ee308de026d95690058f656b2f8da7807 Mon Sep 17 00:00:00 2001 From: Daniel Poveda Date: Sun, 12 Oct 2025 15:51:44 +0200 Subject: [PATCH] fix: input mapping --- Content/UI/WBP_SkillNode.uasset | 4 ++-- Content/UI/WBP_SkillTree.uasset | 4 ++-- .../UTAD_UI/SkillTree/SkillTreeComponent.cpp | 19 ++++++++++++------- Source/UTAD_UI/UTAD_UIPlayerController.cpp | 16 ++++++++++------ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/Content/UI/WBP_SkillNode.uasset b/Content/UI/WBP_SkillNode.uasset index 3526046..57bdcf8 100644 --- a/Content/UI/WBP_SkillNode.uasset +++ b/Content/UI/WBP_SkillNode.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:50d80d3fda9d5eee62200c98af7a43a3e679459e1e92334fb71598b377977c8b -size 283216 +oid sha256:86232ff6d4df467ea2f4ab3550e2b037aac5882ba25378a8d6f394a930dc7750 +size 280472 diff --git a/Content/UI/WBP_SkillTree.uasset b/Content/UI/WBP_SkillTree.uasset index cd272b9..db9d253 100644 --- a/Content/UI/WBP_SkillTree.uasset +++ b/Content/UI/WBP_SkillTree.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8f60c1cae98e35b9971c51f6278386a26a46de56daa1bb4c5962c85b97a9eac -size 292870 +oid sha256:0e737788902d1ef5934994b048fa76e8ced52786fd3fcd276c514b2f030c321d +size 289016 diff --git a/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp index 26d6814..b3d2819 100644 --- a/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp +++ b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp @@ -490,6 +490,7 @@ void USkillTreeComponent::UpdateSkillStates() { for (auto& Pair : AllSkills) { + const FName& SkillID = Pair.Key; FSkillNodeRuntime& SkillNode = Pair.Value; // Only update Locked and Available states based on prerequisites @@ -503,14 +504,18 @@ void USkillTreeComponent::UpdateSkillStates() case ESkillNodeState::Locked: case ESkillNodeState::Available: - // Update state based on prerequisites - if (ArePrerequisitesMet(SkillNode.NodeData)) { - SkillNode.CurrentState = ESkillNodeState::Available; - } - else - { - SkillNode.CurrentState = ESkillNodeState::Locked; + // Calculate new state based on prerequisites + ESkillNodeState NewState = ArePrerequisitesMet(SkillNode.NodeData) + ? ESkillNodeState::Available + : ESkillNodeState::Locked; + + // Only broadcast if state actually changed + if (SkillNode.CurrentState != NewState) + { + SkillNode.CurrentState = NewState; + OnSkillStateChanged.Broadcast(SkillID); + } } break; } diff --git a/Source/UTAD_UI/UTAD_UIPlayerController.cpp b/Source/UTAD_UI/UTAD_UIPlayerController.cpp index f318bd4..8d7e42e 100644 --- a/Source/UTAD_UI/UTAD_UIPlayerController.cpp +++ b/Source/UTAD_UI/UTAD_UIPlayerController.cpp @@ -196,19 +196,21 @@ void AUTAD_UIPlayerController::ShowSkillTree() { SkillTreeWidget->AddToViewport(1); - // Switch to UI-only input mode to block gameplay actions (like click-to-move) - FInputModeUIOnly InputMode; - InputMode.SetWidgetToFocus(SkillTreeWidget->TakeWidget()); + // Use GameAndUI mode - allows Enhanced Input to work while UI is open + // Mouse clicks will be consumed by UI widgets automatically + FInputModeGameAndUI InputMode; InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock); + InputMode.SetHideCursorDuringCapture(false); SetInputMode(InputMode); bShowMouseCursor = true; // Switch input mapping context from gameplay to UI + // This allows UI-specific controls (like Tab to close) to work if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem( GetLocalPlayer())) { - // Remove gameplay context + // Remove gameplay context to prevent movement actions if (DefaultMappingContext) { Subsystem->RemoveMappingContext(DefaultMappingContext); @@ -227,9 +229,11 @@ void AUTAD_UIPlayerController::HideSkillTree() if (SkillTreeWidget && SkillTreeWidget->IsInViewport()) { // Clear any unconfirmed skill selections - if (AUTAD_UICharacter* Character = Cast(GetPawn())) + if (const AUTAD_UICharacter* PlayerCharacter = + Cast(GetPawn())) { - if (USkillTreeComponent* SkillTreeComp = Character->GetSkillTreeComponent()) + if (USkillTreeComponent* SkillTreeComp = + PlayerCharacter->GetSkillTreeComponent()) { SkillTreeComp->ClearSelection(); }