aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp20
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h1
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h20
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp9
4 files changed, 38 insertions, 12 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index a22f60da51f..5cb00383257 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2228,6 +2228,20 @@ void GameObject::Respawn()
}
}
+bool GameObject::HasConditionalInteraction() const
+{
+ if (GetGOInfo()->GetQuestID())
+ return true;
+
+ if (GetGoType() != GAMEOBJECT_TYPE_AURA_GENERATOR && GetGOInfo()->GetConditionID1())
+ return true;
+
+ if (sObjectMgr->IsGameObjectForQuests(GetEntry()))
+ return true;
+
+ return false;
+}
+
bool GameObject::CanActivateForPlayer(Player const* target) const
{
if (!MeetsInteractCondition(target))
@@ -2291,6 +2305,12 @@ bool GameObject::ActivateToQuest(Player const* target) const
return true;
break;
}
+ case GAMEOBJECT_TYPE_GATHERING_NODE:
+ {
+ if (LootTemplates_Gameobject.HaveQuestLootForPlayer(GetGOInfo()->gatheringNode.chestLoot, target))
+ return true;
+ break;
+ }
default:
break;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 86ebd9bb14d..160b768544b 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -338,6 +338,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
bool hasQuest(uint32 quest_id) const override;
bool hasInvolvedQuest(uint32 quest_id) const override;
+ bool HasConditionalInteraction() const;
bool CanActivateForPlayer(Player const* target) const;
bool ActivateToQuest(Player const* target) const;
void UseDoorOrButton(uint32 time_to_restore = 0, bool alternative = false, Unit* user = nullptr);
diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
index 4911f67518c..68d393e9804 100644
--- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
+++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
@@ -92,14 +92,11 @@ public:
{
case GAMEOBJECT_TYPE_BUTTON:
case GAMEOBJECT_TYPE_GOOBER:
- if (gameObject->GetGOInfo()->GetQuestID() || gameObject->GetGOInfo()->GetConditionID1())
+ if (gameObject->HasConditionalInteraction() && gameObject->CanActivateForPlayer(receiver))
{
- if (gameObject->CanActivateForPlayer(receiver))
- {
- dynFlags |= GO_DYNFLAG_LO_HIGHLIGHT;
- if (gameObject->GetGoStateFor(receiver->GetGUID()) != GO_STATE_ACTIVE)
- dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
- }
+ dynFlags |= GO_DYNFLAG_LO_HIGHLIGHT;
+ if (gameObject->GetGoStateFor(receiver->GetGUID()) != GO_STATE_ACTIVE)
+ dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
}
break;
case GAMEOBJECT_TYPE_QUESTGIVER:
@@ -107,16 +104,15 @@ public:
dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
break;
case GAMEOBJECT_TYPE_CHEST:
- if (gameObject->CanActivateForPlayer(receiver))
+ if (gameObject->HasConditionalInteraction() && gameObject->CanActivateForPlayer(receiver))
dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT;
else if (receiver->IsGameMaster())
dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE;
break;
case GAMEOBJECT_TYPE_GENERIC:
case GAMEOBJECT_TYPE_SPELL_FOCUS:
- if (gameObject->GetGOInfo()->GetQuestID() || gameObject->GetGOInfo()->GetConditionID1())
- if (gameObject->CanActivateForPlayer(receiver))
- dynFlags |= GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT;
+ if (gameObject->HasConditionalInteraction() && gameObject->CanActivateForPlayer(receiver))
+ dynFlags |= GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT;
break;
case GAMEOBJECT_TYPE_TRANSPORT:
case GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT:
@@ -132,7 +128,7 @@ public:
dynFlags &= ~GO_DYNFLAG_LO_NO_INTERACT;
break;
case GAMEOBJECT_TYPE_GATHERING_NODE:
- if (gameObject->GetGOInfo()->GetConditionID1() && gameObject->CanActivateForPlayer(receiver))
+ if (gameObject->HasConditionalInteraction() && gameObject->CanActivateForPlayer(receiver))
dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE | GO_DYNFLAG_LO_HIGHLIGHT;
if (gameObject->GetGoStateFor(receiver->GetGUID()) == GO_STATE_ACTIVE)
dynFlags |= GO_DYNFLAG_LO_DEPLETED;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 5385f24cbb8..243d308cf78 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -8908,6 +8908,15 @@ void ObjectMgr::LoadGameObjectForQuests()
++count;
}
+ for (auto [questObjectiveId, objective] : _questObjectives)
+ {
+ if (objective->Type != QUEST_OBJECTIVE_GAMEOBJECT)
+ continue;
+
+ _gameObjectForQuestStore.insert(objective->ObjectID);
+ ++count;
+ }
+
TC_LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
}