From 72385804faa0dccba8fff684d6adcb289e769802 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 16 Jun 2026 14:07:17 +0200 Subject: [PATCH] fix(Core/DB): clean up creature_multispawn on spawn delete and fix .npc info DB output (#26230) Co-authored-by: Claude Opus 4.8 (1M context) --- data/sql/updates/pending_db_world/rev_1781589522985731400.sql | 2 ++ src/server/database/Database/Implementation/WorldDatabase.cpp | 1 + src/server/database/Database/Implementation/WorldDatabase.h | 1 + src/server/game/Entities/Creature/Creature.cpp | 4 ++++ src/server/scripts/Commands/cs_npc.cpp | 2 +- 5 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1781589522985731400.sql diff --git a/data/sql/updates/pending_db_world/rev_1781589522985731400.sql b/data/sql/updates/pending_db_world/rev_1781589522985731400.sql new file mode 100644 index 0000000000..a6d814d140 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781589522985731400.sql @@ -0,0 +1,2 @@ +-- Remove creature_multispawn rows orphaned by deleted creature spawns +DELETE FROM `creature_multispawn` WHERE `spawnId` NOT IN (SELECT `guid` FROM `creature`); diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index 77ca6da16f..dfe7b047d4 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -76,6 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(WORLD_DEL_CREATURE_MULTISPAWN, "DELETE FROM creature_multispawn WHERE spawnId = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, speed_swim, speed_flight, detection_range, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, CreatureImmunitiesId, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h index 3c0ad9c15d..6874a81d46 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.h +++ b/src/server/database/Database/Implementation/WorldDatabase.h @@ -81,6 +81,7 @@ enum WorldDatabaseStatements : uint32 WORLD_UPD_WAYPOINT_SCRIPT_O, WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, WORLD_DEL_CREATURE, + WORLD_DEL_CREATURE_MULTISPAWN, WORLD_SEL_COMMANDS, WORLD_SEL_CREATURE_TEMPLATE, WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index daa849503a..dac755c749 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1850,6 +1850,10 @@ void Creature::DeleteFromDB() stmt->SetData(0, m_spawnId); trans->Append(stmt); + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_MULTISPAWN); + stmt->SetData(0, m_spawnId); + trans->Append(stmt); + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAME_EVENT_CREATURE); stmt->SetData(0, m_spawnId); trans->Append(stmt); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 19421af288..0616f12b73 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -731,7 +731,7 @@ public: handler->PSendSysMessage("(Not in world - showing DB data)"); uint32 scriptId = cData->ScriptId ? cData->ScriptId : cInfo->ScriptID; handler->PSendSysMessage(LANG_NPCINFO_CHAR, lowGuid, ObjectGuid::Create(cData->id, lowGuid).ToString(), cData->id, - cData->id2, cData->id3, cData->displayid, cData->displayid, cInfo->faction, + cData->id, cData->id2, cData->id3, cData->displayid, cData->displayid, cInfo->faction, cData->npcflag); handler->PSendSysMessage(LANG_NPCINFO_PHASEMASK, cData->phaseMask); handler->PSendSysMessage(LANG_NPCINFO_POSITION, cData->posX, cData->posY, cData->posZ);