aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChaouki Dhib <chaodhib@gmail.com>2021-05-22 14:54:58 +0200
committerGitHub <noreply@github.com>2021-05-22 14:54:58 +0200
commit19fa411431aa8a87a27206af116d4b0d1fb953ec (patch)
tree4377a2b9c373d49d6b5b4f1992d663608c1e8f2b
parent3e2dd51eed0b4f4724cb795e1a14d0c94fff4453 (diff)
Core/Movement: Hotfix the crashes that can occur in the movement handlers (#26538)
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp1
-rw-r--r--src/server/game/Server/GameClient.cpp6
-rw-r--r--src/server/game/Server/WorldSession.cpp3
3 files changed, 9 insertions, 1 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 888457c7cbc..0c21a169644 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -422,6 +422,7 @@ Unit::~Unit()
ASSERT(m_removedAuras.empty());
ASSERT(m_gameObj.empty());
ASSERT(m_dynObj.empty());
+ ASSERT(!_gameClientMovingMe || _gameClientMovingMe->GetBasePlayer() == this);
}
void Unit::Update(uint32 p_time)
diff --git a/src/server/game/Server/GameClient.cpp b/src/server/game/Server/GameClient.cpp
index f2a662d63dd..9dde28b3bfb 100644
--- a/src/server/game/Server/GameClient.cpp
+++ b/src/server/game/Server/GameClient.cpp
@@ -28,6 +28,9 @@ GameClient::GameClient(WorldSession* sessionToServer)
void GameClient::AddAllowedMover(Unit* unit)
{
+ if (GameClient* previousController = unit->GetGameClientMovingMe())
+ previousController->RemoveAllowedMover(unit);
+
_allowedMovers.insert(unit->GetGUID());
unit->SetGameClientMovingMe(this);
}
@@ -36,7 +39,10 @@ void GameClient::RemoveAllowedMover(Unit* unit)
{
_allowedMovers.erase(unit->GetGUID());
if (unit->GetGameClientMovingMe() == this)
+ {
unit->SetGameClientMovingMe(nullptr);
+ SetActivelyMovedUnit(nullptr);
+ }
}
bool GameClient::IsAllowedToMove(Unit* unit) const
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 2405631cd75..9cf46fba730 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -1665,9 +1665,10 @@ bool WorldSession::IsRightUnitBeingMoved(ObjectGuid guid)
GameClient* client = GetGameClient();
// the client is attempting to tamper movement data
+ // edit: this wouldn't happen in retail but it does in TC, even with a legitimate client.
if (!client->GetActivelyMovedUnit() || client->GetActivelyMovedUnit()->GetGUID() != guid)
{
- TC_LOG_INFO("entities.unit", "Attempt at tampering movement data by Player %s", _player->GetName().c_str());
+ TC_LOG_DEBUG("entities.unit", "Attempt at tampering movement data by Player %s", _player->GetName().c_str());
return false;
}