aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-09-10 01:10:40 +0200
committerTreeston <treeston.mmoc@gmail.com>2017-09-10 01:10:40 +0200
commit47af704f63fedae89add61c90ee6e3ab8e905681 (patch)
tree958d51a7865c6fd890b2383c27a81b05a6832712
parentc8fdda7f86f5dbe90525636a7291186fe603f61d (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.cpp23
-rw-r--r--src/server/game/Maps/Map.cpp1
-rw-r--r--src/server/game/Maps/Map.h1
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;