From f52f2cc67ad91fa9017f6739e0efdf9677c5d629 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 23 Oct 2022 01:30:31 +0200 Subject: Core/GameObjects: Implemented AllowMultiInteract for GAMEOBJECT_TYPE_GOOBER --- src/server/game/Entities/GameObject/GameObject.cpp | 43 +++++++++++++++------- src/server/game/Entities/GameObject/GameObject.h | 1 + 2 files changed, 30 insertions(+), 14 deletions(-) (limited to 'src/server/game/Entities/GameObject') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 9f84d95d17e..03871de2908 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1421,6 +1421,14 @@ void GameObject::DespawnOrUnsummon(Milliseconds delay, Seconds forceRespawnTime) } } +void GameObject::DespawnForPlayer(Player* seer, Seconds respawnTime) +{ + PerPlayerState& perPlayerState = GetOrCreatePerPlayerStates()[seer->GetGUID()]; + perPlayerState.ValidUntil = GameTime::GetSystemTime() + respawnTime; + perPlayerState.Despawned = true; + seer->UpdateVisibilityOf(this); +} + void GameObject::Delete() { SetLootState(GO_NOT_READY); @@ -2398,8 +2406,9 @@ void GameObject::Use(Unit* user) case GAMEOBJECT_TYPE_GOOBER: //10 { GameObjectTemplate const* info = GetGOInfo(); + Player* player = user->ToPlayer(); - if (Player* player = user->ToPlayer()) + if (player) { if (info->goober.pageID) // show page... { @@ -2441,16 +2450,26 @@ void GameObject::Use(Unit* user) if (uint32 trapEntry = info->goober.linkedTrap) TriggeringLinkedGameObject(trapEntry, user); - SetFlag(GO_FLAG_IN_USE); - SetLootState(GO_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) - SendCustomAnim(GetGoAnimProgress()); + if (info->goober.AllowMultiInteract && player) + { + if (info->IsDespawnAtAction()) + DespawnForPlayer(player, Seconds(m_respawnDelayTime)); + else + SetGoStateFor(GO_STATE_ACTIVE, player); + } else - SetGoState(GO_STATE_ACTIVE); + { + SetFlag(GO_FLAG_IN_USE); + SetLootState(GO_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) + SendCustomAnim(GetGoAnimProgress()); + else + SetGoState(GO_STATE_ACTIVE); + + m_cooldownTime = GameTime::GetGameTimeMS() + info->GetAutoCloseTime(); + } // cast this spell later if provided spellId = info->goober.spell; @@ -3291,14 +3310,10 @@ void GameObject::OnLootRelease(Player* looter) GameObjectTemplate const* goInfo = GetGOInfo(); if (!goInfo->chest.consumable && goInfo->chest.chestPersonalLoot) { - PerPlayerState& perPlayerState = GetOrCreatePerPlayerStates()[looter->GetGUID()]; - perPlayerState.ValidUntil = GameTime::GetSystemTime() + (goInfo->chest.chestRestockTime + DespawnForPlayer(looter, goInfo->chest.chestRestockTime ? Seconds(goInfo->chest.chestRestockTime) : Seconds(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); } break; } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 8dd027eb207..1e9d0fc3b0a 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -222,6 +222,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject uint32 GetRespawnDelay() const { return m_respawnDelayTime; } void Refresh(); void DespawnOrUnsummon(Milliseconds delay = 0ms, Seconds forceRespawnTime = 0s); + void DespawnForPlayer(Player* seer, Seconds respawnTime); void Delete(); void SendGameObjectDespawn(); Loot* GetFishLoot(Player* lootOwner); -- cgit v1.2.3