aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkelno <kelno@users.noreply.github.com>2018-01-08 00:32:22 +0100
committerShauren <shauren.trinity@gmail.com>2021-05-16 21:56:06 +0200
commit1206e815cd9785e4671f30548140f038567811a2 (patch)
tree798be0c5ffde7a2b0ec3f0201843e3ba57af06c5
parenta121f47ba3d37c190c13068b2a5b0a1e9d8edc8c (diff)
Core/Creature: improve DB linked_respawn handling (#21172)
* Fixed SetCreatureLinkedRespawn function possible erasing/replacing a GameObject link (instead of a creature one) (cherry picked from commit 70eb18d0e58ecf0cfcda4f410a183c671fbafe5c)
-rw-r--r--src/server/database/Database/Implementation/WorldDatabase.cpp5
-rw-r--r--src/server/database/Database/Implementation/WorldDatabase.h5
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp20
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp20
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp14
-rw-r--r--src/server/game/Globals/ObjectMgr.h8
-rw-r--r--src/server/game/Maps/SpawnData.h8
7 files changed, 62 insertions, 18 deletions
diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp
index 06a9cfeb27d..a5ff404397f 100644
--- a/src/server/database/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/database/Database/Implementation/WorldDatabase.cpp
@@ -24,8 +24,9 @@ void WorldDatabaseConnection::DoPrepareStatements()
m_stmts.resize(MAX_WORLDDATABASE_STATEMENTS);
PrepareStatement(WORLD_SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest", CONNECTION_SYNCH);
- PrepareStatement(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_LINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ? AND linkType = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_LINKED_RESPAWN_MASTER, "DELETE FROM linked_respawn WHERE linkedGuid = ? AND linkType = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_REP_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid, linkType) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(WORLD_SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, BroadcastTextId, TextRange FROM creature_text", CONNECTION_SYNCH);
PrepareStatement(WORLD_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", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h
index 0bac46285ef..99a54fc35ae 100644
--- a/src/server/database/Database/Implementation/WorldDatabase.h
+++ b/src/server/database/Database/Implementation/WorldDatabase.h
@@ -29,8 +29,9 @@ enum WorldDatabaseStatements : uint32
*/
WORLD_SEL_QUEST_POOLS,
- WORLD_DEL_CRELINKED_RESPAWN,
- WORLD_REP_CREATURE_LINKED_RESPAWN,
+ WORLD_DEL_LINKED_RESPAWN,
+ WORLD_DEL_LINKED_RESPAWN_MASTER,
+ WORLD_REP_LINKED_RESPAWN,
WORLD_SEL_CREATURE_TEXT,
WORLD_SEL_SMART_SCRIPTS,
WORLD_SEL_SMARTAI_WP,
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 38e034c5b61..95d9abe058c 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1945,6 +1945,26 @@ void Creature::DeleteFromDB()
stmt->setUInt64(0, m_spawnId);
trans->Append(stmt);
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_GO);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_CREATURE);
+ trans->Append(stmt);
+
WorldDatabase.CommitTransaction(trans);
// then delete any active instances of the creature
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 6c50228e32c..b6e621c13b4 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1181,6 +1181,26 @@ void GameObject::DeleteFromDB()
stmt->setUInt64(0, m_spawnId);
trans->Append(stmt);
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_GO);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_CREATURE);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_GO);
+ trans->Append(stmt);
+
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER);
+ stmt->setUInt64(0, m_spawnId);
+ stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_GO);
+ trans->Append(stmt);
+
WorldDatabase.CommitTransaction(trans);
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index ad23bd14251..d1001dbb8e1 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1578,7 +1578,7 @@ void ObjectMgr::LoadLinkedRespawn()
bool error = false;
switch (linkType)
{
- case CREATURE_TO_CREATURE:
+ case LINKED_RESPAWN_CREATURE_TO_CREATURE:
{
CreatureData const* slave = GetCreatureData(guidLow);
if (!slave)
@@ -1616,7 +1616,7 @@ void ObjectMgr::LoadLinkedRespawn()
linkedGuid = ObjectGuid::Create<HighGuid::Creature>(master->spawnPoint.GetMapId(), master->id, linkedGuidLow);
break;
}
- case CREATURE_TO_GO:
+ case LINKED_RESPAWN_CREATURE_TO_GO:
{
CreatureData const* slave = GetCreatureData(guidLow);
if (!slave)
@@ -1654,7 +1654,7 @@ void ObjectMgr::LoadLinkedRespawn()
linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->spawnPoint.GetMapId(), master->id, linkedGuidLow);
break;
}
- case GO_TO_GO:
+ case LINKED_RESPAWN_GO_TO_GO:
{
GameObjectData const* slave = GetGameObjectData(guidLow);
if (!slave)
@@ -1692,7 +1692,7 @@ void ObjectMgr::LoadLinkedRespawn()
linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->spawnPoint.GetMapId(), master->id, linkedGuidLow);
break;
}
- case GO_TO_CREATURE:
+ case LINKED_RESPAWN_GO_TO_CREATURE:
{
GameObjectData const* slave = GetGameObjectData(guidLow);
if (!slave)
@@ -1752,8 +1752,9 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid
if (!linkedGuidLow) // we're removing the linking
{
_linkedRespawnStore.erase(guid);
- WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CRELINKED_RESPAWN);
+ WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN);
stmt->setUInt64(0, guidLow);
+ stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE);
WorldDatabase.Execute(stmt);
return true;
}
@@ -1782,9 +1783,10 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid
ObjectGuid linkedGuid = ObjectGuid::Create<HighGuid::Creature>(slave->spawnPoint.GetMapId(), slave->id, linkedGuidLow);
_linkedRespawnStore[guid] = linkedGuid;
- WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_CREATURE_LINKED_RESPAWN);
+ WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_LINKED_RESPAWN);
stmt->setUInt64(0, guidLow);
stmt->setUInt64(1, linkedGuidLow);
+ stmt->setUInt32(2, LINKED_RESPAWN_CREATURE_TO_CREATURE);
WorldDatabase.Execute(stmt);
return true;
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 66d2f3e4b89..c3d99b2369d 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1846,14 +1846,6 @@ class TC_GAME_API ObjectMgr
SceneTemplateContainer _sceneTemplateStore;
- enum CreatureLinkedRespawnType
- {
- CREATURE_TO_CREATURE,
- CREATURE_TO_GO, // Creature is dependant on GO
- GO_TO_GO,
- GO_TO_CREATURE // GO is dependant on creature
- };
-
std::set<uint32> _transportMaps; // Helper container storing map ids that are for transports only, loaded from gameobject_template
};
diff --git a/src/server/game/Maps/SpawnData.h b/src/server/game/Maps/SpawnData.h
index 34c250ec1f3..40972a5a8f1 100644
--- a/src/server/game/Maps/SpawnData.h
+++ b/src/server/game/Maps/SpawnData.h
@@ -78,4 +78,12 @@ struct SpawnData
SpawnData(SpawnObjectType t) : type(t) {}
};
+enum LinkedRespawnType
+{
+ LINKED_RESPAWN_CREATURE_TO_CREATURE = 0,
+ LINKED_RESPAWN_CREATURE_TO_GO = 1, // Creature is dependant on GameObject
+ LINKED_RESPAWN_GO_TO_GO = 2,
+ LINKED_RESPAWN_GO_TO_CREATURE = 3, // GameObject is dependant on Creature
+};
+
#endif