27std::unordered_map<uint32, std::vector<QuestLineXQuestEntry const*>> QuestsByQuestLine;
32 std::vector<CampaignEntry const*>* Campaigns =
nullptr;
34std::map<uint32, std::vector<CampaignEntry const*>> CampaignsByQuestLine;
35std::unordered_map<uint32, std::vector<QuestLineData>> QuestLineDataByQuest;
37struct CampaignQuestLine
42 friend std::strong_ordering
operator<=>(CampaignQuestLine
const& left, CampaignQuestLine
const& right) =
default;
44std::vector<CampaignQuestLine> CampaignQuestLines;
46struct CampaignQuestLinesSentinel
48 std::vector<CampaignQuestLine>::const_iterator
End;
51 friend bool operator==(std::vector<CampaignQuestLine>::const_iterator
const& itr, CampaignQuestLinesSentinel
const& end)
53 return itr == end.End || itr->CampaignId != end.CampaignId;
60 std::ranges::lower_bound(CampaignQuestLines, campaignId, std::ranges::less(), &CampaignQuestLine::CampaignId),
61 CampaignQuestLinesSentinel{ .End = CampaignQuestLines.end(), .CampaignId = campaignId });
71 CampaignsByQuestLine[campaignQuestLine->QuestLineID].push_back(campaign);
72 CampaignQuestLines.push_back({ .CampaignId = campaignQuestLine->CampaignID, .QuestLineId = campaignQuestLine->QuestLineID });
78 QuestsByQuestLine[questLineQuest->QuestLineID].push_back(questLineQuest);
80 QuestLineData& questLineData = QuestLineDataByQuest[questLineQuest->QuestID].emplace_back();
81 questLineData.QuestLineQuest = questLineQuest;
85 std::ranges::sort(CampaignQuestLines);
87 for (
auto& [_, questLineQuests] : QuestsByQuestLine)
93 std::span<QuestLineXQuestEntry const* const> result;
94 if (
auto itr = QuestsByQuestLine.find(questLineId); itr != QuestsByQuestLine.end())
103 if (
Quest const* quest =
sObjectMgr->GetQuestTemplate(questLineQuest->QuestID))
151 std::vector<uint32> questIds(questLineQuests.size());
158 auto questLines = GetQuestLinesForCampaign(campaignId);
159 if (questLines.begin() == questLines.end())
162 for (CampaignQuestLine
const& campaignQuestLine : questLines)
172 auto itr = QuestLineDataByQuest.find(questId);
173 if (itr == QuestLineDataByQuest.end())
176 for (QuestLineData
const& questLineData : itr->second)
178 if (!questLineData.Campaigns)
181 for (
CampaignEntry const* campaign : *questLineData.Campaigns)
207 std::vector<uint32> questIds;
209 for (CampaignQuestLine
const& campaignQuestLine : GetQuestLinesForCampaign(campaignId))
211 std::ptrdiff_t oldSize = std::ssize(questIds);
212 std::span<QuestLineXQuestEntry const* const> questLineQuests =
GetQuestsForQuestLine(campaignQuestLine.QuestLineId);
213 questIds.resize(oldSize + questLineQuests.size());
DB2Storage< CampaignEntry > sCampaignStore("Campaign.db2", &CampaignLoadInfo::Instance)
DB2Storage< CampaignXQuestLineEntry > sCampaignXQuestLineStore("CampaignXQuestLine.db2", &CampaignXQuestLineLoadInfo::Instance)
DB2Storage< QuestLineXQuestEntry > sQuestLineXQuestStore("QuestLineXQuest.db2", &QuestLineXQuestLoadInfo::Instance)
@ DontUseJourneyQuestBang
std::strong_ordering operator<=>(WowTime const &left, WowTime const &right)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
bool IsQuestCompletedBitSet(uint32 questId) const
void SkipQuests(std::span< uint32 const > questIds)
bool IsActiveQuest(uint32 quest_id) const
bool CanTakeQuest(Quest const *quest, bool msg) const
Utility class to enable range for loop syntax for multimap.equal_range uses.
TC_GAME_API bool IsQuestLineQuestActiveForPlayer(uint32 questLineId, Player const *player)
TC_GAME_API void SkipCampaignForPlayer(uint32 campaignId, Player *player)
TC_GAME_API bool IsQuestLineCompletedByPlayer(uint32 questLineId, Player const *player)
TC_GAME_API bool IsCampaignCompletedByPlayer(uint32 campaignId, Player const *player)
TC_GAME_API bool IsQuestLineQuestAvailableForPlayer(uint32 questLineId, Player const *player)
TC_GAME_API bool IsCampaignQuestStatusVisibleForPlayer(uint32 questId, Player const *player)
TC_GAME_API QuestLineStats GetQuestLineStatsForPlayer(uint32 questLineId, Player const *player)
TC_GAME_API void SkipQuestLineForPlayer(uint32 questLineId, Player *player)
TC_GAME_API std::span< QuestLineXQuestEntry const *const > GetQuestsForQuestLine(uint32 questLineId)
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
bool operator==(unique_trackable_ptr< T1 > const &left, unique_trackable_ptr< T2 > const &right)