diff --git a/Source/Framework/Constants/CreatureConst.cs b/Source/Framework/Constants/CreatureConst.cs index f2cd193c6..7d076b25d 100644 --- a/Source/Framework/Constants/CreatureConst.cs +++ b/Source/Framework/Constants/CreatureConst.cs @@ -19,10 +19,10 @@ namespace Framework.Constants { public enum CreatureLinkedRespawnType { - CreatureToCreature, - CreatureToGO, // Creature is dependant on GO - GOToGO, - GOToCreature // GO is dependant on creature + CreatureToCreature = 0, + CreatureToGO = 1, // Creature is dependant on GO + GOToGO = 2, + GOToCreature = 3 // GO is dependant on creature } public enum AiReaction diff --git a/Source/Framework/Database/Databases/WorldDatabase.cs b/Source/Framework/Database/Databases/WorldDatabase.cs index 4216c22cb..8f39a2b96 100644 --- a/Source/Framework/Database/Databases/WorldDatabase.cs +++ b/Source/Framework/Database/Databases/WorldDatabase.cs @@ -22,8 +22,9 @@ namespace Framework.Database public override void PreparedStatements() { PrepareStatement(WorldStatements.SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest"); - PrepareStatement(WorldStatements.DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?"); - PrepareStatement(WorldStatements.REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)"); + PrepareStatement(WorldStatements.DEL_LINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ? AND linkType = ?"); + PrepareStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER, "DELETE FROM linked_respawn WHERE linkedGuid = ? AND linkType = ?"); + PrepareStatement(WorldStatements.REP_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid, linkType) VALUES (?, ?, ?)"); PrepareStatement(WorldStatements.SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, BroadcastTextId, TextRange FROM creature_text"); PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link"); PrepareStatement(WorldStatements.SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid"); @@ -97,8 +98,9 @@ namespace Framework.Database public enum WorldStatements { SEL_QUEST_POOLS, - DEL_CRELINKED_RESPAWN, - REP_CREATURE_LINKED_RESPAWN, + DEL_LINKED_RESPAWN, + DEL_LINKED_RESPAWN_MASTER, + REP_LINKED_RESPAWN, SEL_CREATURE_TEXT, SEL_SMART_SCRIPTS, SEL_SMARTAI_WP, diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 787af739b..47550d453 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -1660,6 +1660,26 @@ namespace Game.Entities stmt.AddValue(0, m_spawnId); trans.Append(stmt); + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature); + trans.Append(stmt); + DB.World.CommitTransaction(trans); // then delete any active instances of the creature diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 89110ccaf..2158163e5 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -1075,6 +1075,26 @@ namespace Game.Entities stmt.AddValue(0, m_spawnId); trans.Append(stmt); + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO); + trans.Append(stmt); + + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); + stmt.AddValue(0, m_spawnId); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO); + trans.Append(stmt); + DB.World.CommitTransaction(trans); } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index c8aa951ee..1e21fe978 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -3523,8 +3523,9 @@ namespace Game if (linkedGuidLow == 0) // we're removing the linking { linkedRespawnStorage.Remove(guid); - stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CRELINKED_RESPAWN); + stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); stmt.AddValue(0, guidLow); + stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature); DB.World.Execute(stmt); return true; } @@ -3553,9 +3554,10 @@ namespace Game ObjectGuid linkedGuid = ObjectGuid.Create(HighGuid.Creature, slave.spawnPoint.GetMapId(), slave.Id, linkedGuidLow); linkedRespawnStorage[guid] = linkedGuid; - stmt = DB.World.GetPreparedStatement(WorldStatements.REP_CREATURE_LINKED_RESPAWN); + stmt = DB.World.GetPreparedStatement(WorldStatements.REP_LINKED_RESPAWN); stmt.AddValue(0, guidLow); stmt.AddValue(1, linkedGuidLow); + stmt.AddValue(2, (uint)CreatureLinkedRespawnType.CreatureToCreature); DB.World.Execute(stmt); return true; }