From fa2ce2b12fe2fdcb66b685c527d53b3ad5b4ada5 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 8 May 2026 10:37:06 -0500 Subject: [PATCH] fix(Core/Vehicles): Remove incorrect passenger->vehicle threat redirection (#25719) Co-authored-by: blinkysc Co-authored-by: Shauren --- src/server/game/Combat/ThreatManager.cpp | 13 ++++--------- src/server/game/Entities/Vehicle/Vehicle.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 5559b86742..07e02ae0f5 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -206,6 +206,10 @@ void ThreatReference::HeapNotifyDecreased() if (tWho->GetSummonerGUID().IsPlayer()) return false; + // accessories are fully treated as components of the parent and cannot have threat + if (cWho->HasUnitTypeMask(UNIT_MASK_ACCESSORY)) + return false; + return true; } @@ -396,15 +400,6 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell return; } - // while riding a vehicle, all threat goes to the vehicle, not the pilot - if (Unit* vehicle = target->GetVehicleBase()) - { - AddThreat(vehicle, amount, spell, ignoreModifiers, ignoreRedirects); - if (target->HasUnitTypeMask(UNIT_MASK_ACCESSORY)) // accessories are fully treated as components of the parent and cannot have threat - return; - amount = 0.0f; - } - // if we cannot actually have a threat list, we instead just set combat state and avoid creating threat refs altogether if (!CanHaveThreatList()) { diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 09293b5a45..794016405a 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -313,7 +313,10 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ if (TempSummon* accessory = _me->SummonCreature(entry, *_me, TempSummonType(type), summonTime)) { if (minion) + { accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); + accessory->GetThreatMgr().Initialize(); // reinitialize CanHaveThreatList cached value + } if (!_me->HandleSpellClick(accessory, seatId)) { @@ -455,9 +458,9 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) init.SetTransportEnter(); init.Launch(); - // Transfer threat from passenger to vehicle + // Put the vehicle in combat with anything that was threatening the passenger; the threat itself stays on the passenger for (auto const& [guid, threatRef] : unit->GetThreatMgr().GetThreatenedByMeList()) - threatRef->GetOwner()->GetThreatMgr().AddThreat(_me, threatRef->GetThreat(), nullptr, true, true); + threatRef->GetOwner()->GetThreatMgr().AddThreat(_me, 0.0f, nullptr, true, true); if (_me->IsCreature()) {