aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2024-03-24 17:27:13 +0100
committerGitHub <noreply@github.com>2024-03-24 17:27:13 +0100
commit6a80bebcb533eb5780e5d98be84d813b5732992a (patch)
tree93c5a5246b431e521f4fc88c3b38504b6e0190ba /src
parent94b78ebc8b0eb09409d0db36bebfde85a1644fe8 (diff)
Core/GameObjects: Added dynamic highlight for GAMEOBJECT_TYPE_SPELL_FOCUS (#29825)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp17
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h1
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h12
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h12
-rw-r--r--src/server/game/Entities/Player/Player.cpp30
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp6
6 files changed, 59 insertions, 19 deletions
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<GameObject>
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