diff options
author | Treeston <treeston.mmoc@gmail.com> | 2017-09-10 01:10:40 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2017-09-10 01:10:40 +0200 |
commit | 47af704f63fedae89add61c90ee6e3ab8e905681 (patch) | |
tree | 958d51a7865c6fd890b2383c27a81b05a6832712 | |
parent | c8fdda7f86f5dbe90525636a7291186fe603f61d (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.
-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 11f06e42fb7..c4e37394ca5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6995,7 +6995,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()) @@ -7017,8 +7028,6 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) WeatherMgr::SendFineWeatherUpdateToPlayer(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->team) @@ -7066,13 +7075,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 75aa69fc639..bcd6447c2c9 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -54,7 +54,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 7e5b294e460..3d3fcfb528d 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -270,6 +270,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<uint32/*leaderDBGUID*/, CreatureGroup*> CreatureGroupHolderType; |