Core/GameObjects: Fixed the interaction/highlight logic for GAMEOBJECT_TYPE_CHEST and quest objectives (#30051)

This commit is contained in:
Meji
2024-06-23 15:00:35 +02:00
committed by GitHub
parent 5cb4536bd0
commit 31bd3804e3
4 changed files with 38 additions and 12 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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));
}