mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/GameObjects: Fixed the interaction/highlight logic for GAMEOBJECT_TYPE_CHEST and quest objectives (#30051)
This commit is contained in:
@@ -2230,6 +2230,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))
|
||||
@@ -2293,6 +2307,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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -8904,6 +8904,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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user