diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 66f51efde..d13a136d2 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -211,7 +211,6 @@ namespace Game.Entities public bool IsDebugAreaTriggers { get; set; } uint m_zoneUpdateId; uint m_areaUpdateId; - uint m_zoneUpdateTimer; uint m_ChampioningFaction; byte m_fishingSteps; diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index 09f61dadd..4aa50b639 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -154,7 +154,6 @@ namespace Game.Entities uint oldZone = m_zoneUpdateId; m_zoneUpdateId = newZone; - m_zoneUpdateTimer = 1 * Time.InMilliseconds; GetMap().UpdatePlayerZoneStats(oldZone, newZone); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 3685cd884..bf19a0302 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -433,37 +433,6 @@ namespace Game.Entities m_weaponChangeTimer -= diff; } - if (m_zoneUpdateTimer > 0) - { - if (diff >= m_zoneUpdateTimer) - { - // On zone update tick check if we are still in an inn if we are supposed to be in one - if (_restMgr.HasRestFlag(RestFlag.Tavern)) - { - AreaTriggerRecord atEntry = CliDB.AreaTriggerStorage.LookupByKey(_restMgr.GetInnTriggerId()); - if (atEntry == null || !IsInAreaTrigger(atEntry)) - _restMgr.RemoveRestFlag(RestFlag.Tavern); - } - - uint newzone, newarea; - GetZoneAndAreaId(out newzone, out newarea); - - if (m_zoneUpdateId != newzone) - UpdateZone(newzone, newarea); // also update area - else - { - // use area updates as well - // needed for free far all arenas for example - if (m_areaUpdateId != newarea) - UpdateArea(newarea); - - m_zoneUpdateTimer = 1 * Time.InMilliseconds; - } - } - else - m_zoneUpdateTimer -= diff; - } - if (IsAlive()) { RegenTimer += diff; @@ -570,8 +539,14 @@ namespace Game.Entities // Group update SendUpdateToOutOfRangeGroupMembers(); - // Indoor/Outdoor aura requirements - CheckOutdoorsAuraRequirements(); + // Updating Zone and AreaId. This will also trigger spell_area and phasing related updates + UpdateZoneAndAreaId(); + + // Updating auras which can only be used inside or outside (such as Mounts) + UpdateIndoorsOutdoorsAuras(); + + // Updating the resting state when entering resting places + UpdateTavernRestingState(); } public override void SetDeathState(DeathState s) @@ -6596,12 +6571,37 @@ namespace Game.Entities SendPacket(new ExplorationExperience(Experience, Area)); } - public void CheckOutdoorsAuraRequirements() + public void UpdateZoneAndAreaId() + { + GetZoneAndAreaId(out uint newzone, out uint newarea); + + if (m_zoneUpdateId != newzone) + UpdateZone(newzone, newarea); // also update area + else + { + // use area updates as well + // needed for free far all arenas for example + if (m_areaUpdateId != newarea) + UpdateArea(newarea); + } + } + + public void UpdateIndoorsOutdoorsAuras() { if (WorldConfig.GetBoolValue(WorldCfg.VmapIndoorCheck)) RemoveAurasWithAttribute(IsOutdoors() ? SpellAttr0.OnlyIndoors : SpellAttr0.OnlyOutdoors); } + public void UpdateTavernRestingState() + { + var atEntry = CliDB.AreaTriggerStorage.LookupByKey(_restMgr.GetInnTriggerId()); + + if (_restMgr.HasRestFlag(RestFlag.Tavern) && (atEntry == null || !IsInAreaTrigger(atEntry))) + _restMgr.RemoveRestFlag(RestFlag.Tavern); + else if (!_restMgr.HasRestFlag(RestFlag.Tavern) && IsInAreaTrigger(atEntry)) + _restMgr.SetRestFlag(RestFlag.Tavern); + } + public void SendSysMessage(CypherStrings str, params object[] args) { string input = ObjectMgr.GetCypherString(str); diff --git a/Source/Game/Entities/Player/RestMgr.cs b/Source/Game/Entities/Player/RestMgr.cs index 9d1b500ab..794f7dbcb 100644 --- a/Source/Game/Entities/Player/RestMgr.cs +++ b/Source/Game/Entities/Player/RestMgr.cs @@ -78,7 +78,7 @@ namespace Game.Entities SetRestBonus(restType, totalRestBonus); } - public void SetRestFlag(RestFlag restFlag, uint triggerId = 0) + public void SetRestFlag(RestFlag restFlag) { RestFlag oldRestMask = _restFlagMask; _restFlagMask |= restFlag; @@ -88,9 +88,6 @@ namespace Game.Entities _restTime = GameTime.GetGameTime(); _player.SetPlayerFlag(PlayerFlags.Resting); } - - if (triggerId != 0) - _innAreaTriggerId = triggerId; } public void RemoveRestFlag(RestFlag restFlag) @@ -161,5 +158,6 @@ namespace Game.Entities public float GetRestBonus(RestTypes restType) { return _restBonus[(int)restType]; } public bool HasRestFlag(RestFlag restFlag) { return (_restFlagMask & restFlag) != 0; } public uint GetInnTriggerId() { return _innAreaTriggerId; } + public void SetInnTriggerID(uint id) { _innAreaTriggerId = id; } } } diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index 89eb61918..d0df48068 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -245,7 +245,7 @@ namespace Game { // set resting flag we are in the inn if (packet.Entered) - player.GetRestMgr().SetRestFlag(RestFlag.Tavern, atEntry.Id); + player.GetRestMgr().SetInnTriggerID(atEntry.Id); else player.GetRestMgr().RemoveRestFlag(RestFlag.Tavern); diff --git a/Source/Game/Handlers/MovementHandler.cs b/Source/Game/Handlers/MovementHandler.cs index f0f74982c..8e627f462 100644 --- a/Source/Game/Handlers/MovementHandler.cs +++ b/Source/Game/Handlers/MovementHandler.cs @@ -209,7 +209,7 @@ namespace Game Unit.ProcSkillsAndAuras(plrMover, null, new ProcFlagsInit(ProcFlags.Jump), new ProcFlagsInit(ProcFlags.None), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null); } - // Whenever a player stops a movement action, an indoor/outdoor check is being performed + // Whenever a player stops a movement action, several position based checks and updates are being performed switch (opcode) { case ClientOpcodes.MoveSetFly: @@ -220,7 +220,9 @@ namespace Game case ClientOpcodes.MoveStopSwim: case ClientOpcodes.MoveStopPitch: case ClientOpcodes.MoveStopAscend: - plrMover.CheckOutdoorsAuraRequirements(); + plrMover.UpdateZoneAndAreaId(); + plrMover.UpdateIndoorsOutdoorsAuras(); + plrMover.UpdateTavernRestingState(); break; default: break;