From 2db12344e645eb1d52111cb93bf43c96b7454679 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 13 Nov 2017 13:17:21 -0500 Subject: [PATCH] Handle despawning and respawning of nearby linked traps on gameobject despawn and respawn --- Source/Game/Entities/GameObject/GameObject.cs | 20 ++++++++++++++++++- Source/Game/Spells/SpellEffects.cs | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 88d2beb1d..868c45266 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -468,6 +468,11 @@ namespace Game.Entities m_SkillupList.Clear(); m_usetimes = 0; + // If nearby linked trap exists, respawn it + GameObject linkedTrap = GetLinkedTrap(); + if (linkedTrap) + linkedTrap.SetLootState(LootState.Ready); + switch (GetGoType()) { case GameObjectTypes.FishingNode: // can't fish now @@ -547,7 +552,7 @@ namespace Game.Entities if (owner) { // Hunter trap: Search units which are unfriendly to the trap's owner - var checker = new AnyUnfriendlyNoTotemUnitInObjectRangeCheck(this, owner, radius); + var checker = new NearestUnfriendlyNoTotemUnitInObjectRangeCheck(this, owner, radius); var searcher = new UnitSearcher(this, checker); Cell.VisitGridObjects(this, searcher, radius); target = searcher.GetTarget(); @@ -657,6 +662,11 @@ namespace Game.Entities } case LootState.JustDeactivated: { + // If nearby linked trap exists, despawn it + GameObject linkedTrap = GetLinkedTrap(); + if (linkedTrap) + linkedTrap.SetLootState(LootState.JustDeactivated); + //if Gameobject should cast spell, then this, but some GOs (type = 10) should be destroyed if (GetGoType() == GameObjectTypes.Goober) { @@ -2338,6 +2348,12 @@ namespace Game.Entities return true; } + public void SetLinkedTrap(GameObject linkedTrap) { m_linkedTrap = linkedTrap.GetGUID(); } + GameObject GetLinkedTrap() + { + return ObjectAccessor.GetGameObject(this, m_linkedTrap); + } + public override void BuildValuesUpdate(UpdateType updateType, ByteBuffer data, Player target) { if (!target) @@ -2688,6 +2704,8 @@ namespace Game.Entities public Loot loot = new Loot(); public GameObjectModel m_model; + + ObjectGuid m_linkedTrap; #endregion } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 134d8dba6..628b0eb8b 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -2914,6 +2914,8 @@ namespace Game.Spells GameObject linkedGO = new GameObject(); if (linkedGO.Create(linkedEntry, map, m_caster.GetPhaseMask(), new Position(x, y, z, target.GetOrientation()), rotation, 255, GameObjectState.Ready)) { + pGameObj.SetLinkedTrap(linkedGO); + linkedGO.CopyPhaseFrom(m_caster); linkedGO.SetRespawnTime(duration > 0 ? duration / Time.InMilliseconds : 0); @@ -4656,6 +4658,8 @@ namespace Game.Spells GameObject linkedGO = new GameObject(); if (linkedGO.Create(linkedEntry, cMap, m_caster.GetPhaseMask(), pos, rotation, 255, GameObjectState.Ready)) { + pGameObj.SetLinkedTrap(linkedGO); + linkedGO.CopyPhaseFrom(m_caster); linkedGO.SetRespawnTime(duration > 0 ? duration / Time.InMilliseconds : 0);