aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-09-10 01:10:40 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-23 23:25:35 +0200
commit35e74687c3e1e0e24a0ae0049ff96ede2abdc516 (patch)
tree7f52f7af3abb423acdf2ec7bf5d8853de3519e73 /src
parentbca96eeb267a658c5dbce94b225ed54836165819 (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.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 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;