From 4fe41bba8e7ffaa514856c51218df26784ecb0f6 Mon Sep 17 00:00:00 2001 From: ModoX Date: Mon, 8 Jan 2024 21:51:46 +0100 Subject: Core/Creatures: Added possibility to automatically despawn personal summons on quest remove (#29114) (cherry picked from commit b3dce0ac08d4f740505037aff2cad7685444db15) --- src/server/game/Globals/ObjectMgr.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'src/server/game/Globals/ObjectMgr.cpp') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 8c14a95a2d2..78540a5c6eb 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -393,8 +393,6 @@ void ObjectMgr::LoadCreatureTemplates() // We load the creature models after loading but before checking LoadCreatureTemplateModels(); - LoadCreatureSummonedData(); - // Checking needs to be done after loading because of the difficulty self referencing for (auto const& ctPair : _creatureTemplateStore) CheckCreatureTemplate(&ctPair.second); @@ -676,8 +674,8 @@ void ObjectMgr::LoadCreatureSummonedData() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 - QueryResult result = WorldDatabase.Query("SELECT CreatureID, CreatureIDVisibleToSummoner, GroundMountDisplayID, FlyingMountDisplayID FROM creature_summoned_data"); + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT CreatureID, CreatureIDVisibleToSummoner, GroundMountDisplayID, FlyingMountDisplayID, DespawnOnQuestsRemoved FROM creature_summoned_data"); if (!result) { @@ -731,6 +729,30 @@ void ObjectMgr::LoadCreatureSummonedData() } } + if (!fields[4].IsNull()) + { + std::vector questList; + for (std::string_view questStr : Trinity::Tokenize(fields[4].GetStringView(), ',', false)) + { + Optional questId = Trinity::StringTo(questStr); + if (!questId) + continue; + + Quest const* quest = GetQuestTemplate(*questId); + if (!quest) + { + TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing quest {} in DespawnOnQuestsRemoved for creature {}, skipping", + *questId, creatureId); + continue; + } + + questList.push_back(*questId); + } + + if (!questList.empty()) + summonedData.DespawnOnQuestsRemoved = std::move(questList); + } + } while (result->NextRow()); TC_LOG_INFO("server.loading", ">> Loaded {} creature summoned data definitions in {} ms", _creatureSummonedDataStore.size(), GetMSTimeDiffToNow(oldMSTime)); -- cgit v1.2.3