From b456a0403f12a00792e22c6ba11d4ccf0fe94a39 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 26 Dec 2021 19:25:32 -0500 Subject: [PATCH] Core/Instance: add new hook & method Port From (https://github.com/TrinityCore/TrinityCore/commit/6a63200e40d286dd49cc90135a519b0680a6f435) --- Source/Game/Maps/Instances/InstanceScript.cs | 40 ++++++++++++++++++++ Source/Game/Maps/Map.cs | 11 ++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index 18d32808c..c58c2ad62 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -669,6 +669,40 @@ namespace Game.Maps } } + + void DoRemoveAurasDueToSpellOnPlayer(Player player, uint spell, bool includePets = false, bool includeControlled = false) + { + if (!player) + return; + + player.RemoveAurasDueToSpell(spell); + + if (!includePets) + return; + + for (var i = 0; i < SharedConst.MaxSummonSlot; ++i) + { + ObjectGuid summonGUID = player.m_SummonSlot[i]; + if (!summonGUID.IsEmpty()) + { + Creature summon = instance.GetCreature(summonGUID); + if (summon != null) + summon.RemoveAurasDueToSpell(spell); + } + } + + if (!includeControlled) + return; + + for (var i = 0; i < player.m_Controlled.Count; ++i) + { + Unit controlled = player.m_Controlled[i]; + if (controlled != null) + if (controlled.IsInWorld && controlled.IsCreature()) + controlled.RemoveAurasDueToSpell(spell); + } + } + // Cast spell on all players in instance public void DoCastSpellOnPlayers(uint spell, bool includePets = false, bool includeControlled = false) { @@ -900,9 +934,15 @@ namespace Game.Maps } public virtual void Initialize() { } + public virtual void Update(uint diff) { } + + // Called when a player successfully enters the instance. public virtual void OnPlayerEnter(Player player) { } + // Called when a player successfully leaves the instance. + public virtual void OnPlayerLeave(Player player) { } + // Return wether server allow two side groups or not public bool ServerAllowsTwoSideGroups() { return WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup); } diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index d9bd6e7e6..2648aa022 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -5256,10 +5256,12 @@ namespace Game.Maps public override void RemovePlayerFromMap(Player player, bool remove) { - Log.outInfo(LogFilter.Maps, - "MAP: Removing player '{0}' from instance '{1}' of map '{2}' before relocating to another map", - player.GetName(), GetInstanceId(), GetMapName()); - //if last player set unload timer + Log.outInfo(LogFilter.Maps, "MAP: Removing player '{0}' from instance '{1}' of map '{2}' before relocating to another map", player.GetName(), GetInstanceId(), GetMapName()); + + if (i_data != null) + i_data.OnPlayerLeave(player); + + // if last player set unload timer if (m_unloadTimer == 0 && GetPlayers().Count == 1) m_unloadTimer = m_unloadWhenEmpty ? 1 : (uint)Math.Max(WorldConfig.GetIntValue(WorldCfg.InstanceUnloadDelay), 1); @@ -5267,6 +5269,7 @@ namespace Game.Maps i_scenario.OnPlayerExit(player); base.RemovePlayerFromMap(player, remove); + // for normal instances schedule the reset after all players have left SetResetSchedule(true); Global.InstanceSaveMgr.UnloadInstanceSave(GetInstanceId());