mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 08:28:32 +01:00
Core/GameObjects: Added dynamic highlight for GAMEOBJECT_TYPE_SPELL_FOCUS (#29825)
(cherry picked from commit 6a80bebcb5)
This commit is contained in:
@@ -2223,6 +2223,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()))
|
||||
@@ -2265,6 +2276,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)
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -24797,23 +24797,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);
|
||||
}
|
||||
|
||||
@@ -8804,6 +8804,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
|
||||
|
||||
Reference in New Issue
Block a user