From 13993a0b5b45430ea7bc4868283494f0362f2a1e Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sat, 16 Apr 2022 14:45:16 +0200 Subject: [PATCH] fix(Core/Units): Stop melee attacking victim if being charmed by non-friendly target. (#11353) Fixes #11316 --- src/server/game/Entities/Unit/Unit.cpp | 35 ++++++++++++++++++++++++++ src/server/game/Entities/Unit/Unit.h | 1 + 2 files changed, 36 insertions(+) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5743d427e..741d4beec 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17896,6 +17896,8 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au // Set charmed charmer->SetCharm(this, true); + StopAttackingInvalidTarget(); + if (GetTypeId() == TYPEID_UNIT) { if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(MOTION_SLOT_IDLE)) @@ -18060,6 +18062,8 @@ void Unit::RemoveCharmedBy(Unit* charmer) charmer->SetCharm(this, false); + StopAttackingInvalidTarget(); + Player* playerCharmer = charmer->ToPlayer(); if (playerCharmer) { @@ -19591,6 +19595,37 @@ void Unit::StopAttackFaction(uint32 faction_id) (*itr)->StopAttackFaction(faction_id); } +void Unit::StopAttackingInvalidTarget() +{ + AttackerSet const& attackers = getAttackers(); + for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();) + { + Unit* attacker = (*itr); + if (!attacker->IsValidAttackTarget(this)) + { + attacker->AttackStop(); + if (attacker->GetTypeId() == TYPEID_PLAYER) + { + attacker->ToPlayer()->SendAttackSwingCancelAttack(); + } + + for (Unit* controled : attacker->m_Controlled) + { + if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this)) + { + controled->AttackStop(); + } + } + + itr = attackers.begin(); + } + else + { + ++itr; + } + } +} + void Unit::OutDebugInfo() const { LOG_ERROR("entities.unit", "Unit::OutDebugInfo"); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 26c13d1a9..08ad430eb 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1360,6 +1360,7 @@ public: void CombatStop(bool includingCast = false); void CombatStopWithPets(bool includingCast = false); void StopAttackFaction(uint32 faction_id); + void StopAttackingInvalidTarget(); Unit* SelectNearbyTarget(Unit* exclude = nullptr, float dist = NOMINAL_MELEE_RANGE) const; Unit* SelectNearbyNoTotemTarget(Unit* exclude = nullptr, float dist = NOMINAL_MELEE_RANGE) const; void SendMeleeAttackStop(Unit* victim = nullptr);