diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 16:45:32 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-12 01:27:04 +0100 |
commit | d10554da14fb8371072567f673c9f919cbe6b929 (patch) | |
tree | 4e448433760f3ed9e3ce18185c1acf2e01c69bd5 /src | |
parent | edc75831194bc2419e3abada47121fadf4b2aa8d (diff) |
Entities/Unit: Fix an issue where Unit pointers could be left dangling if a channeled Charm was interrupted by a control aura application. Closes #23440.
(cherry picked from commit f4b06fd0b7ead843bba8f5215a09abf7976e012c)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 6 |
4 files changed, 7 insertions, 13 deletions
diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index e9459874289..b63a4cb3713 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -458,12 +458,3 @@ void Puppet::Update(uint32 time) } } } - -void Puppet::RemoveFromWorld() -{ - if (!IsInWorld()) - return; - - RemoveCharmedBy(nullptr); - Minion::RemoveFromWorld(); -} diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 2f71f4b5930..c2d245744d2 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -138,7 +138,6 @@ class TC_GAME_API Puppet : public Minion void InitStats(uint32 duration) override; void InitSummon() override; void Update(uint32 time) override; - void RemoveFromWorld() override; }; class TC_GAME_API ForcedUnsummonDelayEvent : public BasicEvent diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a4043aa6747..ac3bbdf0228 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25737,7 +25737,11 @@ void Player::SetClientControl(Unit* target, bool allowMove) { // still affected by some aura that shouldn't allow control, only allow on last such aura to be removed if (allowMove && target->HasUnitState(UNIT_STATE_CANT_CLIENT_CONTROL)) + { + // this should never happen, otherwise m_unitBeingMoved might be left dangling! + ASSERT(GetUnitBeingMoved() == target); return; + } WorldPackets::Movement::ControlUpdate data; data.Guid = target->GetGUID(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ba787843086..66bae485496 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10590,12 +10590,14 @@ void Unit::SetControlled(bool apply, UnitState state) if (HasUnitState(state)) return; + if (state & UNIT_STATE_CONTROLLED) + CastStop(); + AddUnitState(state); switch (state) { case UNIT_STATE_STUNNED: SetStunned(true); - CastStop(); break; case UNIT_STATE_ROOT: if (!HasUnitState(UNIT_STATE_STUNNED)) @@ -10608,7 +10610,6 @@ void Unit::SetControlled(bool apply, UnitState state) SendMeleeAttackStop(); // SendAutoRepeatCancel ? SetConfused(true); - CastStop(); } break; case UNIT_STATE_FLEEING: @@ -10618,7 +10619,6 @@ void Unit::SetControlled(bool apply, UnitState state) SendMeleeAttackStop(); // SendAutoRepeatCancel ? SetFeared(true); - CastStop(); } break; default: |