diff options
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)); } |