aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp43
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h1
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h11
-rw-r--r--src/server/game/Entities/Player/Player.cpp1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp8
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;
}