aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Quests
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-05-09 20:21:32 +0200
committerShauren <shauren.trinity@gmail.com>2021-05-09 20:21:32 +0200
commit91b91b502f30f781c8dea77dec4ce2f469b89744 (patch)
treeec4b30e134e7390c833d5a9612eea036263beec6 /src/server/game/Quests
parentdd8aed421a48225b0e60c677969d1fc133954279 (diff)
Core/Quests: Quest improvements
* Add quest log slot argument to functions dealing with objective progress * Implemented QUEST_OBJECTIVE_FLAG_SEQUENCED (prevent progressing hidden objectives)
Diffstat (limited to 'src/server/game/Quests')
-rw-r--r--src/server/game/Quests/QuestDef.h3
-rw-r--r--src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp8
2 files changed, 10 insertions, 1 deletions
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index c497f332b05..bb2ab57fcc3 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -253,6 +253,7 @@ enum QuestSpecialFlags
QUEST_SPECIAL_FLAGS_DB_ALLOWED = QUEST_SPECIAL_FLAGS_REPEATABLE | QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT | QUEST_SPECIAL_FLAGS_AUTO_ACCEPT | QUEST_SPECIAL_FLAGS_DF_QUEST | QUEST_SPECIAL_FLAGS_MONTHLY,
+ QUEST_SPECIAL_FLAGS_SEQUENCED_OBJECTIVES = 0x020, // Internal flag computed only
};
enum class QuestTagType
@@ -670,9 +671,9 @@ class TC_GAME_API Quest
struct QuestStatusData
{
+ uint16 Slot = MAX_QUEST_LOG_SIZE;
QuestStatus Status = QUEST_STATUS_NONE;
uint32 Timer = 0;
- std::vector<int32> ObjectiveData;
};
#endif
diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
index 07b1e1f582a..d9072f58659 100644
--- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
+++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
@@ -296,6 +296,14 @@ bool QuestObjectiveCriteriaMgr::CanUpdateCriteriaTree(Criteria const* criteria,
return false;
}
+ uint16 slot = _owner->FindQuestSlot(objective->QuestID);
+ if (slot >= MAX_QUEST_LOG_SIZE || !_owner->IsQuestObjectiveCompletable(slot, quest, *objective))
+ {
+ TC_LOG_TRACE("criteria.quest", "QuestObjectiveCriteriaMgr::CanUpdateCriteriaTree: (Id: %u Type %s Quest Objective %u) Objective not completable",
+ criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), objective->ID);
+ return false;
+ }
+
return CriteriaHandler::CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}