From d17aac161f389e389b00c4bc0f682ba92eac6434 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 20 Mar 2026 20:44:38 -0500 Subject: [PATCH] fix(Core/Movement): Only update home position for patrolling NPCs (#24080) Co-authored-by: blinkysc Co-authored-by: sudlud --- src/server/game/Handlers/ItemHandler.cpp | 6 +++++- src/server/game/Handlers/NPCHandler.cpp | 6 +++++- src/server/game/Handlers/QuestHandler.cpp | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index e6e51086a..c2cc245b6 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -874,7 +874,11 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) // Stop the npc if moving if (uint32 pause = vendor->GetMovementTemplate().GetInteractionPauseTimer()) vendor->PauseMovement(pause); - vendor->SetHomePosition(vendor->GetPosition()); + + // Update home position for patrolling NPCs only (prevents drift for stationary NPCs) + if (vendor->GetDefaultMovementType() == WAYPOINT_MOTION_TYPE || + vendor->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + vendor->SetHomePosition(vendor->GetPosition()); SetCurrentVendor(vendorEntry); diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 8323cde9e..b355b1bcf 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -162,7 +162,11 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData) // Stop the npc if moving if (uint32 pause = unit->GetMovementTemplate().GetInteractionPauseTimer()) unit->PauseMovement(pause); - unit->SetHomePosition(unit->GetPosition()); + + // Update home position for patrolling NPCs only (prevents drift for stationary NPCs) + if (unit->GetDefaultMovementType() == WAYPOINT_MOTION_TYPE || + unit->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + unit->SetHomePosition(unit->GetPosition()); // If spiritguide, no need for gossip menu, just put player into resurrect queue if (unit->IsSpiritGuide()) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 25ebc3d32..33c4aeeda 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -96,7 +96,11 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) // Stop the npc if moving if (uint32 pause = creature->GetMovementTemplate().GetInteractionPauseTimer()) creature->PauseMovement(pause); - creature->SetHomePosition(creature->GetPosition()); + + // Update home position for patrolling NPCs only (prevents drift for stationary NPCs) + if (creature->GetDefaultMovementType() == WAYPOINT_MOTION_TYPE || + creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + creature->SetHomePosition(creature->GetPosition()); if (sScriptMgr->OnGossipHello(_player, creature)) return;