diff options
author | Meji <alvaro.megias@outlook.com> | 2024-06-23 15:00:35 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-06-23 23:52:17 +0200 |
commit | 1c74da00521fd81d9a965be90b8edb273287a28c (patch) | |
tree | f026218bfa8e7a0fe610c77c1a1fb12cbff06a5a /src/server | |
parent | 7e1fc9c4eadcb451cab8ee91b7f851bc7c1cb9d9 (diff) |
Core/GameObjects: Fixed the interaction/highlight logic for GAMEOBJECT_TYPE_CHEST and quest objectives (#30051)
(cherry picked from commit 31bd3804e35f63915a5d6d669b31add6c82d7010)
Diffstat (limited to 'src/server')
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)); } |