diff options
author | Chaouki Dhib <chaodhib@gmail.com> | 2021-05-22 14:54:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-22 14:54:58 +0200 |
commit | 19fa411431aa8a87a27206af116d4b0d1fb953ec (patch) | |
tree | 4377a2b9c373d49d6b5b4f1992d663608c1e8f2b | |
parent | 3e2dd51eed0b4f4724cb795e1a14d0c94fff4453 (diff) |
Core/Movement: Hotfix the crashes that can occur in the movement handlers (#26538)
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/GameClient.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 3 |
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; } |