diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2019-07-02 09:52:58 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-12-13 23:44:13 +0100 |
| commit | bba4696de715b79b31e154d1a8e1597507812ece (patch) | |
| tree | 834f6ce10e8beb23560940ec09031629d38c196d /src/server/game/Entities/Player | |
| parent | e01f3c81f9537f3ffb5f7d45e5063413885b15f2 (diff) | |
Entities/Player: Clean up client control handling behavior around possession. Mind Control should no longer cause various weirdness. Closes #23539.
(cherry picked from commit f6f1c48aa592ea10c99fd23f46e94934b2f0cef2)
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 04555e758f9..153ee80e18d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25750,24 +25750,38 @@ void Player::ResurrectUsingRequestDataImpl() 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)) + // a player can never client control nothing + ASSERT(target); + + // don't allow possession to be overridden + if (target->HasUnitState(UNIT_STATE_CHARMED) && (GetGUID() != target->GetCharmerGUID())) { - // this should never happen, otherwise m_unitBeingMoved might be left dangling! - ASSERT(GetUnitBeingMoved() == target); + TC_LOG_ERROR("entities.player", "Player '%s' attempt to client control '%s', which is charmed by GUID %s", + GetName().c_str(), target->GetName().c_str(), target->GetCharmerGUID().ToString().c_str()); return; } + // still affected by some aura that shouldn't allow control, only allow on last such aura to be removed + if (target->HasUnitState(UNIT_STATE_CONTROLLED)) + allowMove = false; + WorldPackets::Movement::ControlUpdate data; data.Guid = target->GetGUID(); data.On = allowMove; SendDirectMessage(data.Write()); - if (this != target) - SetViewpoint(target, allowMove); + WorldObject* viewpoint = GetViewpoint(); + if (!viewpoint) + viewpoint = this; + if (target != viewpoint) + { + if (viewpoint != this) + SetViewpoint(viewpoint, false); + if (target != this) + SetViewpoint(target, true); + } - if (allowMove) - SetMovedUnit(target); + SetMovedUnit(target); } void Player::UpdateZoneDependentAuras(uint32 newZone) |
