69 std::unordered_map<uint32, std::pair<std::vector<QuestPool>*,
uint32>> lookup;
78 QueryResult result =
WorldDatabase.Query(
"SELECT qpm.questId, qpm.poolId, qpm.poolIndex, qpt.numActive FROM quest_pool_members qpm LEFT JOIN quest_pool_template qpt ON qpm.poolId = qpt.poolId");
81 TC_LOG_INFO(
"server.loading",
">> Loaded 0 quest pools. DB table `quest_pool_members` is empty.");
87 Field* fields = result->Fetch();
88 if (fields[2].IsNull())
90 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_members` contains reference to non-existing pool {}. Skipped.", fields[1].GetUInt32());
102 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_members` contains reference to non-existing quest {}. Skipped.", questId);
107 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_members` contains reference to quest {}, which is neither daily, weekly nor monthly. Skipped.", questId);
111 auto& pair = lookup[poolId];
115 pair.first->emplace_back();
116 pair.second = (pair.first->size()-1);
118 pair.first->back().poolId = poolId;
119 pair.first->back().numActive = numActive;
123 if (!(poolIndex < members.size()))
124 members.resize(poolIndex+1);
125 members[poolIndex].push_back(questId);
126 }
while (result->NextRow());
134 std::unordered_set<uint32> unknownPoolIds;
137 Field* fields = result->Fetch();
142 auto it = lookup.find(poolId);
143 if (it == lookup.end() || !it->second.first)
145 TC_LOG_ERROR(
"sql.sql",
"Table `pool_quest_save` contains reference to non-existant quest pool {}. Deleted.", poolId);
146 unknownPoolIds.insert(poolId);
150 (*it->second.first)[it->second.second].activeQuests.insert(questId);
151 }
while (result->NextRow());
154 for (
uint32 poolId : unknownPoolIds)
166 for (
auto pair : lookup)
168 if (!pair.second.first)
170 QuestPool& pool = (*pair.second.first)[pair.second.second];
173 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_template` contains quest pool {} requesting {} spawns, but only has {} members. Requested spawns reduced.", pool.
poolId, pool.
numActive, pool.
members.size());
180 std::unordered_set<uint32> accountedFor;
182 for (
size_t i = pool.
members.size(); (i--);)
187 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_members` contains no entries at index {} for quest pool {}. Index removed.", i, pool.
poolId);
199 accountedFor.insert(member[0]);
204 for (
auto it = member.begin(); (++it) != member.end();)
207 bool otherStatus = (itOther != pool.
activeQuests.end());
208 if (status != otherStatus)
209 TC_LOG_WARN(
"sql.sql",
"Table `pool_quest_save` {} quest {} (in pool {}, index {}) saved, but its index is{} active (because quest {} is{} in the table). Set quest {} to {}active.", (status ?
"does not have" :
"has"), *it, pool.
poolId, i, (status ?
"" :
" not"), member[0], (status ?
"" :
" not"), *it, (status ?
"" :
"in"));
213 accountedFor.insert(*it);
222 TC_LOG_WARN(
"sql.sql",
"Table `pool_quest_save` has saved quest {} for pool {}, but that quest is not part of the pool. Skipped.", quest, pool.
poolId);
230 TC_LOG_ERROR(
"sql.sql",
"Table `pool_quest_save` has {} active members saved for pool {}, which requests {} active members. Pool spawns re-generated.", activeCount, pool.
poolId, pool.
numActive);
242 for (
uint32 quest : member)
247 TC_LOG_ERROR(
"sql.sql",
"Table `quest_pool_members` lists quest {} as member of pool {}, but it is already a member of pool {}. Skipped.", quest, pool.
poolId, ref->
poolId);