47 scenarioID = dbDataItr->second.Scenario_A;
50 scenarioID = dbDataItr->second.Scenario_H;
64 TC_LOG_ERROR(
"scenario",
"No scenario data was found related to scenario (Id: {}) for map (Id: {}), difficulty (Id: {}).", scenarioID, map->
GetId(), map->
GetDifficultyID());
81 TC_LOG_INFO(
"server.loading",
">> Loaded 0 scenarios. DB table `scenarios` is empty!");
87 Field* fields = result->Fetch();
93 if (scenarioAllianceId > 0 && !
_scenarioData.contains(scenarioAllianceId))
95 TC_LOG_ERROR(
"sql.sql",
"ScenarioMgr::LoadDBData: DB Table `scenarios`, column scenario_A contained an invalid scenario (Id: {})!", scenarioAllianceId);
100 if (scenarioHordeId > 0 && !
_scenarioData.contains(scenarioHordeId))
102 TC_LOG_ERROR(
"sql.sql",
"ScenarioMgr::LoadDBData: DB Table `scenarios`, column scenario_H contained an invalid scenario (Id: {})!", scenarioHordeId);
106 if (scenarioHordeId == 0)
107 scenarioHordeId = scenarioAllianceId;
115 while (result->NextRow());
124 std::unordered_map<uint32, std::map<uint8, ScenarioStepEntry const*>> scenarioSteps;
125 uint32 deepestCriteriaTreeSize = 0;
129 scenarioSteps[step->ScenarioID][step->OrderIndex] = step;
132 uint32 criteriaTreeSize = 0;
137 deepestCriteriaTreeSize = std::max(deepestCriteriaTreeSize, criteriaTreeSize);
146 data.
Entry = scenario;
147 data.
Steps = std::move(scenarioSteps[scenario->ID]);
160 QueryResult result =
WorldDatabase.Query(
"SELECT CriteriaTreeID, BlobIndex, Idx1, MapID, UiMapID, Priority, Flags, WorldEffectID, PlayerConditionID, NavigationPlayerConditionID FROM scenario_poi ORDER BY CriteriaTreeID, Idx1");
163 TC_LOG_ERROR(
"server.loading",
">> Loaded 0 scenario POI definitions. DB table `scenario_poi` is empty.");
168 QueryResult pointsResult =
WorldDatabase.Query(
"SELECT CriteriaTreeID, Idx1, X, Y, Z FROM scenario_poi_points ORDER BY CriteriaTreeID DESC, Idx1, Idx2");
170 std::unordered_map<int32, std::map<int32, std::vector<ScenarioPOIPoint>>> allPoints;
174 Field* fields = pointsResult->Fetch();
178 fields = pointsResult->Fetch();
186 allPoints[CriteriaTreeID][Idx1].emplace_back(X, Y, Z);
187 }
while (pointsResult->NextRow());
192 Field* fields = result->Fetch();
206 TC_LOG_ERROR(
"sql.sql",
"`scenario_poi` CriteriaTreeID ({}) Idx1 ({}) does not correspond to a valid criteria tree", criteriaTreeID, idx1);
212 _scenarioPOIStore[criteriaTreeID].emplace_back(blobIndex, mapID, uiMapID, priority,
flags, worldEffectID, playerConditionID, navigationPlayerConditionID, std::move(*points));
218 TC_LOG_ERROR(
"server.loading",
"Table scenario_poi references unknown scenario poi points for criteria tree id {} POI id {}", criteriaTreeID, blobIndex);
220 }
while (result->NextRow());
DB2Storage< ScenarioEntry > sScenarioStore("Scenario.db2", &ScenarioLoadInfo::Instance)
DB2Storage< ScenarioStepEntry > sScenarioStepStore("ScenarioStep.db2", &ScenarioStepLoadInfo::Instance)
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
std::vector< ScenarioPOI > ScenarioPOIVector
#define MAX_ALLOWED_SCENARIO_POI_QUERY_SIZE
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
static void WalkCriteriaTree(CriteriaTree const *tree, Func const &func)
Class used to access individual fields of database query result.
uint32 GetUInt32() const noexcept
int32 GetInt32() const noexcept
Difficulty GetDifficultyID() const
ScenarioDataContainer _scenarioData
ScenarioDBDataContainer _scenarioDBData
InstanceScenario * CreateInstanceScenarioForTeam(InstanceMap *map, TeamId team) const
InstanceScenario * CreateInstanceScenario(InstanceMap *map, uint32 scenarioID) const
ScenarioPOIVector const * GetScenarioPOIs(int32 criteriaTreeID) const
ScenarioPOIContainer _scenarioPOIStore
static ScenarioMgr * Instance()
auto MapGetValuePtr(M &map, typename M::key_type const &key)
std::map< uint8, ScenarioStepEntry const * > Steps
ScenarioEntry const * Entry