aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-07-02 09:52:58 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-13 23:44:13 +0100
commitbba4696de715b79b31e154d1a8e1597507812ece (patch)
tree834f6ce10e8beb23560940ec09031629d38c196d /src/server/game/Entities/Player
parente01f3c81f9537f3ffb5f7d45e5063413885b15f2 (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.cpp30
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)