From 39355fa1ee7038d8f3a8fd94b1dc561848d4b980 Mon Sep 17 00:00:00 2001 From: schell244 Date: Fri, 10 Dec 2021 01:58:43 +0100 Subject: [PATCH] fix(Core/Players): Update the player's zone and area only after update the player's position server-side (#9419) --- src/server/game/Entities/Player/Player.cpp | 2 ++ src/server/game/Entities/Player/Player.h | 3 +++ src/server/game/Entities/Player/PlayerUpdates.cpp | 9 +++++++++ src/server/game/Handlers/MiscHandler.cpp | 7 +++---- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a7f26d453..c1e4a0b2b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -190,6 +190,8 @@ Player::Player(WorldSession* session): Unit(true), m_mover(this) m_areaUpdateId = 0; m_team = TEAM_NEUTRAL; + m_needZoneUpdate = false; + m_nextSave = SavingSystemMgr::IncreaseSavingMaxValue(1); m_additionalSaveTimer = 0; m_additionalSaveMask = 0; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 34000cee0..994a393c7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1806,6 +1806,7 @@ public: void UpdatePvP(bool state, bool _override = false); void UpdateZone(uint32 newZone, uint32 newArea); void UpdateArea(uint32 newArea); + void SetNeedZoneUpdate(bool needUpdate) { m_needZoneUpdate = needUpdate; } void UpdateZoneDependentAuras(uint32 zone_id); // zones void UpdateAreaDependentAuras(uint32 area_id); // subzones @@ -2869,6 +2870,8 @@ public: uint8 m_grantableLevels; + bool m_needZoneUpdate; + [[nodiscard]] AchievementMgr* GetAchievementMgr() const { return m_achievementMgr; } private: diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index f33854f9a..0a70bc5e1 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1115,6 +1115,15 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, if (!Unit::UpdatePosition(x, y, z, orientation, teleport)) return false; + // Update player zone if needed + if (m_needZoneUpdate) + { + uint32 newZone, newArea; + GetZoneAndAreaId(newZone, newArea); + UpdateZone(newZone, newArea); + m_needZoneUpdate = false; + } + if (GetGroup()) SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 124479c3d..1fd8a63c7 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -522,10 +522,9 @@ void WorldSession::HandleZoneUpdateOpcode(WorldPacket& recv_data) LOG_DEBUG("network", "WORLD: Recvd ZONE_UPDATE: %u", newZone); - // use server size data - uint32 newzone, newarea; - GetPlayer()->GetZoneAndAreaId(newzone, newarea); - GetPlayer()->UpdateZone(newzone, newarea); + // use server side data, but only after update the player position. See Player::UpdatePosition(). + GetPlayer()->SetNeedZoneUpdate(true); + //GetPlayer()->SendInitWorldStates(true, newZone); }