From 6a80bebcb533eb5780e5d98be84d813b5732992a Mon Sep 17 00:00:00 2001 From: Meji Date: Sun, 24 Mar 2024 17:27:13 +0100 Subject: Core/GameObjects: Added dynamic highlight for GAMEOBJECT_TYPE_SPELL_FOCUS (#29825) --- src/server/game/Entities/GameObject/GameObject.cpp | 17 ++++++++++++ src/server/game/Entities/GameObject/GameObject.h | 1 + .../game/Entities/GameObject/GameObjectData.h | 12 +++++++++ .../Object/Updates/ViewerDependentValues.h | 12 +++++---- src/server/game/Entities/Player/Player.cpp | 30 ++++++++++++---------- src/server/game/Globals/ObjectMgr.cpp | 6 +++++ 6 files changed, 59 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index dacdb902d30..32b0bc706ad 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2225,6 +2225,17 @@ void GameObject::Respawn() } } +bool GameObject::CanActivateForPlayer(Player const* target) const +{ + if (!MeetsInteractCondition(target)) + return false; + + if (sObjectMgr->IsGameObjectForQuests(GetEntry()) && !ActivateToQuest(target)) + return false; + + return true; +} + bool GameObject::ActivateToQuest(Player const* target) const { if (target->HasQuestForGO(GetEntry())) @@ -2267,6 +2278,12 @@ bool GameObject::ActivateToQuest(Player const* target) const return true; break; } + case GAMEOBJECT_TYPE_SPELL_FOCUS: + { + if (target->GetQuestStatus(GetGOInfo()->spellFocus.questID) == QUEST_STATUS_INCOMPLETE) + return true; + break; + } case GAMEOBJECT_TYPE_GOOBER: { if (target->GetQuestStatus(GetGOInfo()->goober.questID) == QUEST_STATUS_INCOMPLETE) diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 9b8651f1133..81db669c0b0 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 bool hasQuest(uint32 quest_id) const override; bool hasInvolvedQuest(uint32 quest_id) const override; + 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); // 0 = use `gameobject`.`spawntimesecs` diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 1c05153c550..d9d6a904c6d 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -865,6 +865,18 @@ struct GameObjectTemplate } } + uint32 GetQuestID() const + { + switch (type) + { + case GAMEOBJECT_TYPE_CHEST: return chest.questID; + case GAMEOBJECT_TYPE_GENERIC: return generic.questID; + case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.questID; + case GAMEOBJECT_TYPE_GOOBER: return goober.questID; + default: return 0; + } + } + uint32 GetConditionID1() const { switch (type) diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index f6d7d1876b0..8c7c5c22580 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -100,6 +100,12 @@ public: else if (receiver->IsGameMaster()) dynFlags |= GO_DYNFLAG_LO_ACTIVATE; 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; + break; case GAMEOBJECT_TYPE_GOOBER: if (gameObject->ActivateToQuest(receiver)) { @@ -110,10 +116,6 @@ public: 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; - break; case GAMEOBJECT_TYPE_TRANSPORT: case GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT: { @@ -137,7 +139,7 @@ public: break; } - if (!gameObject->MeetsInteractCondition(receiver)) + if (!receiver->IsGameMaster() && !gameObject->MeetsInteractCondition(receiver)) dynFlags |= GO_DYNFLAG_LO_NO_INTERACT; dynamicFlags = (uint32(pathProgress) << 16) | uint32(dynFlags); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f530ecdbb2b..f2d321fe6b5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25233,23 +25233,25 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks UF::ObjectData::Base objMask; UF::GameObjectData::Base goMask; - if (m_questObjectiveStatus.contains({ QUEST_OBJECTIVE_GAMEOBJECT, int32(gameObject->GetEntry()) })) + if (m_questObjectiveStatus.contains({ QUEST_OBJECTIVE_GAMEOBJECT, int32(gameObject->GetEntry()) }) || gameObject->GetGOInfo()->GetConditionID1()) objMask.MarkChanged(&UF::ObjectData::DynamicFlags); - - switch (gameObject->GetGoType()) + else { - case GAMEOBJECT_TYPE_QUESTGIVER: - case GAMEOBJECT_TYPE_CHEST: - case GAMEOBJECT_TYPE_GOOBER: - case GAMEOBJECT_TYPE_GENERIC: - case GAMEOBJECT_TYPE_GATHERING_NODE: - if (sObjectMgr->IsGameObjectForQuests(gameObject->GetEntry())) - objMask.MarkChanged(&UF::ObjectData::DynamicFlags); - break; - default: - break; + switch (gameObject->GetGoType()) + { + case GAMEOBJECT_TYPE_QUESTGIVER: + case GAMEOBJECT_TYPE_CHEST: + case GAMEOBJECT_TYPE_GENERIC: + case GAMEOBJECT_TYPE_SPELL_FOCUS: + case GAMEOBJECT_TYPE_GOOBER: + case GAMEOBJECT_TYPE_GATHERING_NODE: + if (sObjectMgr->IsGameObjectForQuests(gameObject->GetEntry())) + objMask.MarkChanged(&UF::ObjectData::DynamicFlags); + break; + default: + break; + } } - if (objMask.GetChangesMask().IsAnySet() || goMask.GetChangesMask().IsAnySet()) gameObject->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), this); } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4fc19ea821c..ab693e0143b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8795,6 +8795,12 @@ void ObjectMgr::LoadGameObjectForQuests() break; continue; } + case GAMEOBJECT_TYPE_SPELL_FOCUS: + { + if (gameObjectTemplatePair.second.spellFocus.questID > 0) //quests objects + break; + continue; + } case GAMEOBJECT_TYPE_GOOBER: { if (gameObjectTemplatePair.second.goober.questID > 0) //quests objects -- cgit v1.2.3