diff options
author | Treeston <treeston.mmoc@gmail.com> | 2017-09-10 01:10:40 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-08-23 23:25:35 +0200 |
commit | 35e74687c3e1e0e24a0ae0049ff96ede2abdc516 (patch) | |
tree | 7f52f7af3abb423acdf2ec7bf5d8853de3519e73 /src | |
parent | bca96eeb267a658c5dbce94b225ed54836165819 (diff) |
Core/Player: More cleanups to Player::UpdateZone, including correcting an oversight that was causing the last known zone id to not update when leaving map. Closes #20289 for real this time.
(cherry picked from commit 47af704f63fedae89add61c90ee6e3ab8e905681)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 1 |
3 files changed, 16 insertions, 9 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8ac0426952b..4d967243f15 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7153,7 +7153,18 @@ void Player::UpdateArea(uint32 newArea) void Player::UpdateZone(uint32 newZone, uint32 newArea) { - GetMap()->UpdatePlayerZoneStats(m_zoneUpdateId, newZone); + uint32 const oldZone = m_zoneUpdateId; + m_zoneUpdateId = newZone; + m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL; + + GetMap()->UpdatePlayerZoneStats(oldZone, newZone); + + // call leave script hooks immedately (before updating flags) + if (oldZone != newZone) + { + sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId); + sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId); + } // group update if (GetGroup()) @@ -7175,8 +7186,6 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) GetMap()->SendZoneDynamicInfo(newZone, this); - sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea); - // in PvP, any not controlled zone (except zone->team == 6, default case) // in PvE, only opposition team capital switch (zone->FactionGroupMask) @@ -7223,13 +7232,11 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) UpdateZoneDependentAuras(newZone); - m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL; - if (m_zoneUpdateId != newZone) + // call enter script hooks after everyting else has processed + sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea); + if (oldZone != newZone) { - m_zoneUpdateId = newZone; - sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId); sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone); - sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId); sBattlefieldMgr->HandlePlayerEnterZone(this, newZone); SendInitWorldStates(newZone, newArea); // only if really enters to new zone, not just area change, works strange... if (Guild* guild = GetGuild()) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 79136e3f663..ea1040a4e9b 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -61,7 +61,6 @@ u_map_magic MapLiquidMagic = { {'M','L','I','Q'} }; #define DEFAULT_GRID_EXPIRY 300 #define MAX_GRID_LOAD_TIME 50 #define MAX_CREATURE_ATTACK_RADIUS (45.0f * sWorld->getRate(RATE_CREATURE_AGGRO)) -#define MAP_INVALID_ZONE 0xFFFFFFFF GridState* si_GridStates[MAX_GRID_STATE]; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index d071aa0d404..d646a3bf023 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -280,6 +280,7 @@ struct ZoneDynamicInfo #define MAX_FALL_DISTANCE 250000.0f // "unlimited fall" to find VMap ground if it is available, just larger than MAX_HEIGHT - INVALID_HEIGHT #define DEFAULT_HEIGHT_SEARCH 50.0f // default search distance to find height at nearby locations #define MIN_UNLOAD_DELAY 1 // immediate unload +#define MAP_INVALID_ZONE 0xFFFFFFFF typedef std::map<ObjectGuid::LowType/*leaderDBGUID*/, CreatureGroup*> CreatureGroupHolderType; |