diff options
author | Meji <alvaro.megias@outlook.com> | 2025-05-17 13:31:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-17 13:31:03 +0200 |
commit | 553ce72707c39d1ab7127c42f233ef27f1a7fa4d (patch) | |
tree | 9b9faa538f88c1e71e47af0f5f552d3fd0f437ab | |
parent | ab456bfd31c96abfd3b00efee2f6f274ebd525c6 (diff) |
Core/SpawnTracking: Check if the objective is completable to get correct spawn tracking state (#30923)
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7f9609bfbb8..a53225db319 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17178,6 +17178,23 @@ bool Player::IsQuestObjectiveCompletable(uint16 slot, Quest const* quest, QuestO return true; } +bool Player::IsQuestObjectiveCompletable(uint32 questId, uint32 objectiveId) const +{ + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest) + return false; + + uint16 slot = FindQuestSlot(questId); + if (slot >= MAX_QUEST_LOG_SIZE) + return false; + + QuestObjective const* obj = sObjectMgr->GetQuestObjective(objectiveId); + if (!obj) + return false; + + return IsQuestObjectiveCompletable(slot, quest, *obj); +} + bool Player::IsQuestObjectiveComplete(uint16 slot, Quest const* quest, QuestObjective const& objective) const { switch (objective.Type) @@ -17527,7 +17544,7 @@ SpawnTrackingState Player::GetSpawnTrackingStateByObjective(uint32 spawnTracking { if (IsQuestRewarded(questObjective->QuestID) || IsQuestObjectiveComplete(questObjective->QuestID, questObjective->ID)) return SpawnTrackingState::Complete; - else if (GetQuestStatus(questObjective->QuestID) != QUEST_STATUS_NONE) + else if (GetQuestStatus(questObjective->QuestID) != QUEST_STATUS_NONE && IsQuestObjectiveCompletable(questObjective->QuestID, questObjective->ID)) { auto itr = m_QuestStatus.find(questObjective->QuestID); if (itr != m_QuestStatus.end() && itr->second.Slot < MAX_QUEST_LOG_SIZE) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ea7542b68cd..c1f1e071f9a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1740,6 +1740,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> int32 GetQuestObjectiveData(QuestObjective const& objective) const; void SetQuestObjectiveData(QuestObjective const& objective, int32 data); bool IsQuestObjectiveCompletable(uint16 slot, Quest const* quest, QuestObjective const& objective) const; + bool IsQuestObjectiveCompletable(uint32 questId, uint32 objectiveId) const; bool IsQuestObjectiveComplete(uint16 slot, Quest const* quest, QuestObjective const& objective) const; bool IsQuestObjectiveComplete(uint32 questId, uint32 objectiveId) const; bool IsQuestObjectiveProgressBarComplete(uint16 slot, Quest const* quest) const; |