diff options
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/ViewerDependentValues.h | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 8 |
5 files changed, 49 insertions, 15 deletions
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<GameObject> 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); diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index 79aae2b4363..371c0e2ab39 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -95,12 +95,21 @@ public: dynFlags |= GO_DYNFLAG_LO_ACTIVATE; break; case GAMEOBJECT_TYPE_CHEST: - case GAMEOBJECT_TYPE_GOOBER: if (gameObject->ActivateToQuest(receiver)) dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT; else if (receiver->IsGameMaster()) dynFlags |= GO_DYNFLAG_LO_ACTIVATE; break; + case GAMEOBJECT_TYPE_GOOBER: + if (gameObject->ActivateToQuest(receiver)) + { + dynFlags |= GO_DYNFLAG_LO_HIGHLIGHT; + if (gameObject->GetGoStateFor(receiver->GetGUID()) != GO_STATE_ACTIVE) + dynFlags |= GO_DYNFLAG_LO_ACTIVATE; + } + else if (receiver->IsGameMaster()) + dynFlags |= GO_DYNFLAG_LO_ACTIVATE; + break; case GAMEOBJECT_TYPE_GENERIC: if (gameObject->ActivateToQuest(receiver)) dynFlags |= GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 53ce1f7c170..bbe918e106d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24257,6 +24257,7 @@ void Player::UpdateVisibleGameobjectsOrSpellClicks() case GAMEOBJECT_TYPE_CHEST: case GAMEOBJECT_TYPE_GOOBER: case GAMEOBJECT_TYPE_GENERIC: + case GAMEOBJECT_TYPE_GATHERING_NODE: if (sObjectMgr->IsGameObjectForQuests(obj->GetEntry())) objMask.MarkChanged(&UF::ObjectData::DynamicFlags); break; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ecb36b25938..169a29eed1e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8892,6 +8892,14 @@ void ObjectMgr::LoadGameObjectForQuests() break; continue; } + case GAMEOBJECT_TYPE_GATHERING_NODE: + { + // scan GO chest with loot including quest items + // find quest loot for GO + if (LootTemplates_Gameobject.HaveQuestLootFor(gameObjectTemplatePair.second.gatheringNode.chestLoot)) + break; + continue; + } default: continue; } |