From 98cc0484ce5fffc30b85b882e902bc69fa8ab2a0 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 3 Sep 2020 11:53:58 -0400 Subject: [PATCH] Core/Scripts: Implemented OnlyOnceAreaTriggerScript Port From (https://github.com/TrinityCore/TrinityCore/commit/fe938b99f843df3f6c120695db38f327bd55ea94) --- Source/Game/Maps/Instances/InstanceScript.cs | 8 ++++- Source/Game/Scripting/CoreScripts.cs | 33 +++++++++++++++++++ .../AzjolNerub/BossKrikthirTheGatewatcher.cs | 5 ++- .../AzjolNerub/InstanceAzjolNerub.cs | 28 +++++++++++++++- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index 36bc99407..e26641a53 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -872,11 +872,16 @@ namespace Game.Maps public uint GetCompletedEncounterMask() { return completedEncounters; } // Sets a temporary entrance that does not get saved to db - void SetTemporaryEntranceLocation(uint worldSafeLocationId) { _temporaryEntranceId = worldSafeLocationId; } + public void SetTemporaryEntranceLocation(uint worldSafeLocationId) { _temporaryEntranceId = worldSafeLocationId; } // Get's the current entrance id public uint GetEntranceLocation() { return _temporaryEntranceId != 0 ? _temporaryEntranceId : _entranceId; } + // Only used by areatriggers that inherit from OnlyOnceAreaTriggerScript + public void MarkAreaTriggerDone(uint id) { _activatedAreaTriggers.Add(id); } + public void ResetAreaTriggerDone(uint id) { _activatedAreaTriggers.Remove(id); } + public bool IsAreaTriggerDone(uint id) { return _activatedAreaTriggers.Contains(id); } + public virtual void FillInitialWorldStates(InitWorldStates data) { } public int GetEncounterCount() { return bosses.Count; } @@ -909,6 +914,7 @@ namespace Game.Maps Dictionary _objectGuids = new Dictionary(); uint completedEncounters; List _instanceSpawnGroups = new List(); + List _activatedAreaTriggers = new List(); uint _entranceId; uint _temporaryEntranceId; uint _combatResurrectionTimer; diff --git a/Source/Game/Scripting/CoreScripts.cs b/Source/Game/Scripting/CoreScripts.cs index 662822b0b..7e8dd705d 100644 --- a/Source/Game/Scripting/CoreScripts.cs +++ b/Source/Game/Scripting/CoreScripts.cs @@ -366,6 +366,39 @@ namespace Game.Scripting public virtual bool OnTrigger(Player player, AreaTriggerRecord trigger, bool entered) { return false; } } + public class OnlyOnceAreaTriggerScript : AreaTriggerScript + { + public OnlyOnceAreaTriggerScript(string name) : base(name) { } + + public override bool OnTrigger(Player player, AreaTriggerRecord trigger, bool entered) + { + uint triggerId = trigger.Id; + InstanceScript instance = player.GetInstanceScript(); + if (instance != null) + { + if (instance.IsAreaTriggerDone(triggerId)) + return true; + else + instance.MarkAreaTriggerDone(triggerId); + } + return _OnTrigger(player, trigger, entered); + } + + void ResetAreaTriggerDone(InstanceScript script, uint triggerId) + { + script.ResetAreaTriggerDone(triggerId); + } + + void ResetAreaTriggerDone(Player player, AreaTriggerRecord trigger) + { + InstanceScript instance = player.GetInstanceScript(); + if (instance != null) + ResetAreaTriggerDone(instance, trigger.Id); + } + + public virtual bool _OnTrigger(Player player, AreaTriggerRecord trigger, bool entered) { return false; } + } + public class BattlegroundScript : ScriptObject { public BattlegroundScript(string name) : base(name) diff --git a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs index 36c42ca6c..5e544b145 100644 --- a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs +++ b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs @@ -186,9 +186,9 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.KrikthirTheGatewatcher switch (action) { case -ANInstanceMisc.ActionGatewatcherGreet: - if (!_hadGreet && me.IsAlive() && !me.IsInCombat() && !_petsInCombat) + if (instance.GetData(ANDataTypes.GatewatcherGreet) == 0 && me.IsAlive() && !me.IsInCombat() && !_petsInCombat) { - _hadGreet = true; + instance.SetData(ANDataTypes.GatewatcherGreet, 1); Talk(TextIds.SayPrefight); } break; @@ -277,7 +277,6 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.KrikthirTheGatewatcher Talk(TextIds.SaySendGroup); } - bool _hadGreet; bool _hadFrenzy; bool _petsInCombat; byte _watchersActive; diff --git a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/InstanceAzjolNerub.cs b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/InstanceAzjolNerub.cs index d84e62ab2..2a3324b03 100644 --- a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/InstanceAzjolNerub.cs +++ b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/InstanceAzjolNerub.cs @@ -35,6 +35,7 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub public const uint WatcherSilthik = 5; public const uint AnubarakWall = 6; public const uint AnubarakWall2 = 7; + public const uint GatewatcherGreet = 8; } struct ANCreatureIds @@ -103,6 +104,8 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub class instance_azjol_nerub_InstanceScript : InstanceScript { + uint _gateWatcherGreet; + public instance_azjol_nerub_InstanceScript(InstanceMap map) : base(map) { SetHeaders(ANInstanceMisc.DataHeader); @@ -134,7 +137,30 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub return true; } - } + + public override uint GetData(uint dataId) + { + switch (dataId) + { + case ANDataTypes.GatewatcherGreet: + return _gateWatcherGreet; + default: + return 0; + } + } + + public override void SetData(uint dataId, uint value) + { + switch (dataId) + { + case ANDataTypes.GatewatcherGreet: + _gateWatcherGreet = value; + break; + default: + break; + } + } + } public override InstanceScript GetInstanceScript(InstanceMap map) {