From d457828f3b2f187ec6b3a7c7760e620c686b9fda Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 22 Oct 2022 22:32:25 -0400 Subject: [PATCH] Core/GameObjects: Implemented AllowMultiInteract for GAMEOBJECT_TYPE_GOOBER Port From (https://github.com/TrinityCore/TrinityCore/commit/f52f2cc67ad91fa9017f6739e0efdf9677c5d629) --- Source/Game/Entities/GameObject/GameObject.cs | 47 ++++++++++++------- .../Entities/Object/Update/UpdateFields.cs | 11 ++++- Source/Game/Entities/Player/Player.Quest.cs | 1 + Source/Game/Globals/ObjectManager.cs | 8 ++++ 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 2d83d698b..5ef8947db 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -957,6 +957,14 @@ namespace Game.Entities } } + void DespawnForPlayer(Player seer, TimeSpan respawnTime) + { + PerPlayerState perPlayerState = GetOrCreatePerPlayerStates()[seer.GetGUID()]; + perPlayerState.ValidUntil = GameTime.GetSystemTime() + respawnTime; + perPlayerState.Despawned = true; + seer.UpdateVisibilityOf(this); + } + public void Delete() { SetLootState(LootState.NotReady); @@ -1891,11 +1899,10 @@ namespace Game.Entities case GameObjectTypes.Goober: //10 { GameObjectTemplate info = GetGoInfo(); + Player player = user.ToPlayer(); - if (user.IsTypeId(TypeId.Player)) + if (player != null) { - Player player = user.ToPlayer(); - if (info.Goober.pageID != 0) // show page... { PageTextPkt data = new(); @@ -1941,16 +1948,26 @@ namespace Game.Entities if (trapEntry != 0) TriggeringLinkedGameObject(trapEntry, user); - SetFlag(GameObjectFlags.InUse); - SetLootState(LootState.Activated, user); - - // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389) - if (info.Goober.customAnim != 0) - SendCustomAnim(GetGoAnimProgress()); + if (info.Goober.AllowMultiInteract != 0 && player != null) + { + if (info.IsDespawnAtAction()) + DespawnForPlayer(player, TimeSpan.FromSeconds(m_respawnDelayTime)); + else + SetGoStateFor(GameObjectState.Active, player); + } else - SetGoState(GameObjectState.Active); + { + SetFlag(GameObjectFlags.InUse); + SetLootState(LootState.Activated, user); - m_cooldownTime = GameTime.GetGameTimeMS() + info.GetAutoCloseTime(); + // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389) + if (info.Goober.customAnim != 0) + SendCustomAnim(GetGoAnimProgress()); + else + SetGoState(GameObjectState.Active); + + m_cooldownTime = GameTime.GetGameTimeMS() + info.GetAutoCloseTime(); + } // cast this spell later if provided spellId = info.Goober.spell; @@ -2906,14 +2923,10 @@ namespace Game.Entities GameObjectTemplate goInfo = GetGoInfo(); if (goInfo.Chest.consumable == 0 && goInfo.Chest.chestPersonalLoot != 0) { - PerPlayerState perPlayerState = GetOrCreatePerPlayerStates()[looter.GetGUID()]; - perPlayerState.ValidUntil = GameTime.GetSystemTime() + (goInfo.Chest.chestRestockTime != 0 + DespawnForPlayer(looter, goInfo.Chest.chestRestockTime != 0 ? TimeSpan.FromSeconds(goInfo.Chest.chestRestockTime) : TimeSpan.FromSeconds(m_respawnDelayTime)); // not hiding this object permanently to prevent infinite growth of m_perPlayerState - // while also maintaining some sort of cheater protection (not getting rid of entries on logout) - perPlayerState.Despawned = true; - - looter.UpdateVisibilityOf(this); + // while also maintaining some sort of cheater protection (not getting rid of entries on logout) } break; } diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index d280e7921..da49ca7d5 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -131,12 +131,21 @@ namespace Game.Entities dynFlags |= GameObjectDynamicLowFlags.Activate; break; case GameObjectTypes.Chest: - case GameObjectTypes.Goober: if (gameObject.ActivateToQuest(receiver)) dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight; else if (receiver.IsGameMaster()) dynFlags |= GameObjectDynamicLowFlags.Activate; break; + case GameObjectTypes.Goober: + if (gameObject.ActivateToQuest(receiver)) + { + dynFlags |= GameObjectDynamicLowFlags.Highlight; + if (gameObject.GetGoStateFor(receiver.GetGUID()) != GameObjectState.Active) + dynFlags |= GameObjectDynamicLowFlags.Activate; + } + else if (receiver.IsGameMaster()) + dynFlags |= GameObjectDynamicLowFlags.Activate; + break; case GameObjectTypes.Generic: if (gameObject.ActivateToQuest(receiver)) dynFlags |= GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight; diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 66c9dc6cc..8b6c23645 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -2978,6 +2978,7 @@ namespace Game.Entities case GameObjectTypes.Chest: case GameObjectTypes.Goober: case GameObjectTypes.Generic: + case GameObjectTypes.GatheringNode: if (Global.ObjectMgr.IsGameObjectForQuests(obj.GetEntry())) objMask.MarkChanged(obj.m_objectData.DynamicFlags); break; diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 394f6700d..4b75ca3ba 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -4709,6 +4709,14 @@ namespace Game continue; } + case GameObjectTypes.GatheringNode: + { + // scan GO chest with loot including quest items + // find quest loot for GO + if (LootStorage.Gameobject.HaveQuestLootFor(pair.Value.GatheringNode.chestLoot)) + break; + continue; + } default: continue; }