aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2025-06-28 01:38:43 +0200
committerGitHub <noreply@github.com>2025-06-28 01:38:43 +0200
commit138b1b1a21ff871b54f1f2bd815de30a93b803eb (patch)
tree2d1f454eb9173417e622d8fcfea2901f41246a67 /src/server/game/Globals/ObjectMgr.cpp
parent60400d25f5fff2dabd4aa74bbdbc0d2370360a35 (diff)
Core/SpawnTracking: Allow linking a spawn to more than one quest objective (#30995)
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index d47d494a313..ba7f7d79edc 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -11811,7 +11811,7 @@ void ObjectMgr::LoadSpawnTrackings()
_spawnTrackingMapStore.clear();
// 0 1 2 3
- QueryResult result = WorldDatabase.Query("SELECT SpawnTrackingId, SpawnType, SpawnId, QuestObjectiveId FROM spawn_tracking");
+ QueryResult result = WorldDatabase.Query("SELECT SpawnTrackingId, SpawnType, SpawnId, QuestObjectiveIds FROM spawn_tracking");
if (!result)
{
@@ -11827,7 +11827,6 @@ void ObjectMgr::LoadSpawnTrackings()
uint32 spawnTrackingId = fields[0].GetUInt32();
SpawnObjectType spawnType = SpawnObjectType(fields[1].GetUInt8());
ObjectGuid::LowType spawnId = fields[2].GetUInt64();
- uint32 objectiveId = fields[3].GetUInt32();
if (!SpawnData::TypeIsValid(spawnType))
{
@@ -11860,12 +11859,6 @@ void ObjectMgr::LoadSpawnTrackings()
continue;
}
- if (!IsQuestObjectiveForSpawnTracking(spawnTrackingId, objectiveId))
- {
- TC_LOG_ERROR("sql.sql", "Table `spawn_tracking` has spawn tracking {} assigned to spawn ({},{}), but spawn tracking is not linked to quest objective {}. Skipped.", spawnTrackingId, uint32(spawnType), spawnId, objectiveId);
- continue;
- }
-
if (spawnTrackingTemplateData->MapId != data->mapId)
{
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking` has spawn tracking {} (map {}) assigned to spawn ({},{}), but spawn has map {} - spawn NOT added to spawn tracking!",
@@ -11883,8 +11876,33 @@ void ObjectMgr::LoadSpawnTrackings()
continue;
}
+ std::vector<uint32> objectiveList;
+ if (Optional<std::string_view> objectivesStr = fields[3].GetStringViewOrNull())
+ {
+ for (std::string_view objectiveStr : Trinity::Tokenize(*objectivesStr, ',', false))
+ {
+ Optional<uint32> objectiveId = Trinity::StringTo<uint32>(objectiveStr);
+ if (!objectiveId)
+ continue;
+
+ if (!IsQuestObjectiveForSpawnTracking(spawnTrackingId, *objectiveId))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `spawn_tracking` has spawn tracking {} assigned to spawn ({},{}), but spawn tracking is not linked to quest objective {}. Skipped.", spawnTrackingId, uint32(spawnType), spawnId, objectiveId);
+ continue;
+ }
+
+ objectiveList.push_back(*objectiveId);
+ }
+
+ if (objectiveList.empty())
+ {
+ TC_LOG_ERROR("sql.sql", "Table `spawn_tracking` has spawn tracking {} assigned to spawn ({},{}), but spawn tracking is not linked to any quest objective - spawn NOT added to spawn tracking!", spawnTrackingId, uint32(spawnType), spawnId);
+ continue;
+ }
+ }
+
const_cast<SpawnMetadata*>(data)->spawnTrackingData = spawnTrackingTemplateData;
- const_cast<SpawnMetadata*>(data)->spawnTrackingQuestObjectiveId = objectiveId;
+ const_cast<SpawnMetadata*>(data)->spawnTrackingQuestObjectives = std::move(objectiveList);
_spawnTrackingMapStore.emplace(spawnTrackingId, data);
++count;
@@ -11981,7 +11999,7 @@ void ObjectMgr::LoadSpawnTrackingStates()
if (!sWorldEffectStore.HasRecord(*worldEffectId))
{
- TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateAnimKitId {} for spawn ({},{}). Skipped.",
+ TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid WorldEffectId {} for spawn ({},{}). Skipped.",
*worldEffectId, uint32(spawnType), spawnId);
continue;
}