From 5932dccdc8543295bd1ecb8616ba458e3d38d67c Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 25 Aug 2020 13:12:01 -0400 Subject: [PATCH] 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. Port From (https://github.com/TrinityCore/TrinityCore/commit/35e74687c3e1e0e24a0ae0049ff96ede2abdc516) --- Source/Game/Entities/Player/Player.Map.cs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index 7f6895bd6..175cd4e92 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -148,7 +148,18 @@ namespace Game.Entities public void UpdateZone(uint newZone, uint newArea) { - GetMap().UpdatePlayerZoneStats(m_zoneUpdateId, newZone); + uint oldZone = m_zoneUpdateId; + m_zoneUpdateId = newZone; + m_zoneUpdateTimer = 1 * Time.InMilliseconds; + + GetMap().UpdatePlayerZoneStats(oldZone, newZone); + + // call leave script hooks immedately (before updating flags) + if (oldZone != newZone) + { + Global.OutdoorPvPMgr.HandlePlayerLeaveZone(this, m_zoneUpdateId); + Global.BattleFieldMgr.HandlePlayerLeaveZone(this, m_zoneUpdateId); + } // group update if (GetGroup()) @@ -172,8 +183,6 @@ namespace Game.Entities GetMap().SendZoneDynamicInfo(newZone, this); - Global.ScriptMgr.OnPlayerUpdateZone(this, newZone, newArea); - // in PvP, any not controlled zone (except zone.team == 6, default case) // in PvE, only opposition team capital switch ((ArenaTeams)zone.FactionGroupMask) @@ -220,13 +229,11 @@ namespace Game.Entities UpdateZoneDependentAuras(newZone); - m_zoneUpdateTimer = 1 * Time.InMilliseconds; - if (m_zoneUpdateId != newZone) + // call enter script hooks after everyting else has processed + Global.ScriptMgr.OnPlayerUpdateZone(this, newZone, newArea); + if (oldZone != newZone) { - m_zoneUpdateId = newZone; - Global.OutdoorPvPMgr.HandlePlayerLeaveZone(this, m_zoneUpdateId); Global.OutdoorPvPMgr.HandlePlayerEnterZone(this, newZone); - Global.BattleFieldMgr.HandlePlayerLeaveZone(this, m_zoneUpdateId); Global.BattleFieldMgr.HandlePlayerEnterZone(this, newZone); SendInitWorldStates(newZone, newArea); // only if really enters to new zone, not just area change, works strange... Guild guild = GetGuild();