From 8d0b667dd42c25ed026b34c016fc0f04ff79d71d Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 18 Aug 2025 10:43:18 -0400 Subject: [PATCH] Core/AreaTriggers: Add AREATRIGGER_ACTION_TAVERN Port From (https://github.com/TrinityCore/TrinityCore/commit/8e6c7bdc5d9805fdd33bec35cfe2f7b154b4ed58) --- .../Framework/Constants/AreaTriggerConst.cs | 4 ++- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 30 ++++++++++++++-- Source/Game/Entities/Player/Player.cs | 35 ++++++++++++++----- Source/Game/Entities/Player/RestMgr.cs | 20 ++++++++--- Source/Game/Handlers/MiscHandler.cs | 7 +++- 5 files changed, 79 insertions(+), 17 deletions(-) diff --git a/Source/Framework/Constants/AreaTriggerConst.cs b/Source/Framework/Constants/AreaTriggerConst.cs index d3454c2e1..c28e6fb06 100644 --- a/Source/Framework/Constants/AreaTriggerConst.cs +++ b/Source/Framework/Constants/AreaTriggerConst.cs @@ -14,7 +14,9 @@ namespace Framework.Constants Cast = 0, AddAura = 1, Teleport = 2, - Max = 3 + Tavern = 3, + + Max } public enum AreaTriggerActionUserTypes diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index ed13156a3..68efc9ea6 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -856,6 +856,9 @@ namespace Game.Entities SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.NumUnitsInside), _insideUnits.Count); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.NumPlayersInside), _insideUnits.Count(guid => guid.IsPlayer())); + + if (IsStaticSpawn()) + SetActive(!_insideUnits.Empty()); } public AreaTriggerTemplate GetTemplate() @@ -1017,6 +1020,16 @@ namespace Game.Entities } } break; + case AreaTriggerActionTypes.Tavern: + { + Player player = caster.ToPlayer(); + if (player != null) + { + player.GetRestMgr().SetInnTrigger(new InnAreaTrigger(false)); + player.GetRestMgr().SetRestFlag(RestFlag.Tavern); + } + break; + } default: break; } @@ -1031,8 +1044,21 @@ namespace Game.Entities { foreach (AreaTriggerAction action in GetTemplate().Actions) { - if (action.ActionType == AreaTriggerActionTypes.Cast || action.ActionType == AreaTriggerActionTypes.AddAura) - unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid()); + switch (action.ActionType) + { + case AreaTriggerActionTypes.Cast: + goto case AreaTriggerActionTypes.AddAura; + case AreaTriggerActionTypes.AddAura: + unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid()); + break; + case AreaTriggerActionTypes.Tavern: + Player player = unit.ToPlayer(); + if (player != null) + player.GetRestMgr().SetInnTrigger(null); + break; + default: + break; + } } } } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 50d0e9289..50218112d 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -4591,7 +4591,7 @@ namespace Game.Entities else m_deathExpireTime = now + PlayerConst.DeathExpireStep; } - + public int CalculateCorpseReclaimDelay(bool load = false) { Corpse corpse = GetCorpse(); @@ -4629,7 +4629,7 @@ namespace Game.Entities return (int)(delay * Time.InMilliseconds); } - + public void SendCorpseReclaimDelay(int delay) { CorpseReclaimDelay packet = new(); @@ -4875,7 +4875,8 @@ namespace Game.Entities foundPet = true; } } - }; + } + ; FindAndRemovePet(m_petStable.ActivePets); FindAndRemovePet(m_petStable.StabledPets); @@ -5562,7 +5563,8 @@ namespace Game.Entities if (creature.HasNpcFlag2(npcFlags2)) return true; return false; - }; + } + ; if (!hasNpcFlags()) return null; @@ -6609,12 +6611,27 @@ namespace Game.Entities public void UpdateTavernRestingState() { - var atEntry = CliDB.AreaTriggerStorage.LookupByKey(_restMgr.GetInnTriggerId()); + InnAreaTrigger innTrigger = _restMgr.GetInnTrigger(); + if (innTrigger == null) + { + if (_restMgr.HasRestFlag(RestFlag.Tavern)) + _restMgr.RemoveRestFlag(RestFlag.Tavern); - 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); + return; + } + + if (innTrigger.IsDBC) + { + var atEntry = CliDB.AreaTriggerStorage.LookupByKey(innTrigger.AreaTriggerEntryId); + + if (_restMgr.HasRestFlag(RestFlag.Tavern) && (atEntry == null || !IsInAreaTrigger(atEntry))) + { + _restMgr.RemoveRestFlag(RestFlag.Tavern); + _restMgr.SetInnTrigger(null); + } + else if (!_restMgr.HasRestFlag(RestFlag.Tavern) && IsInAreaTrigger(atEntry)) + _restMgr.SetRestFlag(RestFlag.Tavern); + } } public void SendSysMessage(CypherStrings str, params object[] args) diff --git a/Source/Game/Entities/Player/RestMgr.cs b/Source/Game/Entities/Player/RestMgr.cs index 794f7dbcb..b329e0ce3 100644 --- a/Source/Game/Entities/Player/RestMgr.cs +++ b/Source/Game/Entities/Player/RestMgr.cs @@ -6,7 +6,7 @@ namespace Game.Entities { Player _player; long _restTime; - uint _innAreaTriggerId; + InnAreaTrigger _innAreaTrigger; float[] _restBonus = new float[(int)RestTypes.Max]; RestFlag _restFlagMask; @@ -111,7 +111,7 @@ namespace Game.Entities uint rested_loss = rested_bonus; if (restType == RestTypes.XP) - MathFunctions.AddPct(ref rested_loss, _player.GetTotalAuraModifier(AuraType.ModRestedXpConsumption)); + MathFunctions.AddPct(ref rested_loss, _player.GetTotalAuraModifier(AuraType.ModRestedXpConsumption)); SetRestBonus(restType, GetRestBonus(restType) - rested_loss); @@ -157,7 +157,19 @@ 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; } + public InnAreaTrigger GetInnTrigger() { return _innAreaTrigger; } + public void SetInnTrigger(InnAreaTrigger trigger) { _innAreaTrigger = trigger; } + } + + public class InnAreaTrigger + { + public bool IsDBC = true; + public uint AreaTriggerEntryId; + + public InnAreaTrigger(bool isDBC, uint areaTriggerEntryId = 0) + { + IsDBC = isDBC; + AreaTriggerEntryId = areaTriggerEntryId; + } } } diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index f2af348bf..d4b6681fb 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -245,9 +245,14 @@ namespace Game { // set resting flag we are in the inn if (packet.Entered) - player.GetRestMgr().SetInnTriggerID(atEntry.Id); + { + player.GetRestMgr().SetInnTrigger(new InnAreaTrigger(true, atEntry.Id)); + } else + { player.GetRestMgr().RemoveRestFlag(RestFlag.Tavern); + player.GetRestMgr().SetInnTrigger(null); + } if (Global.WorldMgr.IsFFAPvPRealm()) {