diff options
| author | kelno <kelno@users.noreply.github.com> | 2018-01-08 00:32:22 +0100 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2018-01-08 00:32:22 +0100 |
| commit | 70eb18d0e58ecf0cfcda4f410a183c671fbafe5c (patch) | |
| tree | 0b85cad9a399dd58169018dd6fa6ab328843744d /src/server/game | |
| parent | f0a394753ad9f1614fd696027c51ed2e297a02f6 (diff) | |
Core/Creature: improve DB linked_respawn handling (#21172)
* Fixed SetCreatureLinkedRespawn function possible erasing/replacing a GameObject link (instead of a creature one)
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 20 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 20 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 8 | ||||
| -rw-r--r-- | src/server/game/Maps/SpawnData.h | 8 |
5 files changed, 56 insertions, 14 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7fe461772bd..573f90f2c07 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1792,6 +1792,26 @@ void Creature::DeleteFromDB() stmt->setUInt32(0, m_spawnId); trans->Append(stmt); + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_GO); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER); + stmt->setUInt32(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 13ff24c60e6..b85deb07578 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1029,6 +1029,26 @@ void GameObject::DeleteFromDB() stmt->setUInt32(0, m_spawnId); trans->Append(stmt); + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_GO); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_CREATURE); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER); + stmt->setUInt32(0, m_spawnId); + stmt->setUInt32(1, LINKED_RESPAWN_GO_TO_GO); + trans->Append(stmt); + + stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN_MASTER); + stmt->setUInt32(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 91f75fb1975..a79a5b5ce76 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1466,7 +1466,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) @@ -1503,7 +1503,7 @@ void ObjectMgr::LoadLinkedRespawn() linkedGuid = ObjectGuid(HighGuid::Unit, master->id, linkedGuidLow); break; } - case CREATURE_TO_GO: + case LINKED_RESPAWN_CREATURE_TO_GO: { CreatureData const* slave = GetCreatureData(guidLow); if (!slave) @@ -1540,7 +1540,7 @@ void ObjectMgr::LoadLinkedRespawn() linkedGuid = ObjectGuid(HighGuid::GameObject, master->id, linkedGuidLow); break; } - case GO_TO_GO: + case LINKED_RESPAWN_GO_TO_GO: { GameObjectData const* slave = GetGameObjectData(guidLow); if (!slave) @@ -1577,7 +1577,7 @@ void ObjectMgr::LoadLinkedRespawn() linkedGuid = ObjectGuid(HighGuid::GameObject, master->id, linkedGuidLow); break; } - case GO_TO_CREATURE: + case LINKED_RESPAWN_GO_TO_CREATURE: { GameObjectData const* slave = GetGameObjectData(guidLow); if (!slave) @@ -1636,8 +1636,9 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid if (!linkedGuidLow) // we're removing the linking { _linkedRespawnStore.erase(guid); - PreparedStatement *stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CRELINKED_RESPAWN); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_LINKED_RESPAWN); stmt->setUInt32(0, guidLow); + stmt->setUInt32(1, LINKED_RESPAWN_CREATURE_TO_CREATURE); WorldDatabase.Execute(stmt); return true; } @@ -1665,9 +1666,10 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid ObjectGuid linkedGuid(HighGuid::Unit, slave->id, linkedGuidLow); _linkedRespawnStore[guid] = linkedGuid; - PreparedStatement *stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_CREATURE_LINKED_RESPAWN); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_LINKED_RESPAWN); stmt->setUInt32(0, guidLow); stmt->setUInt32(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 86abec73d3f..e5f8cb7f3bc 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1676,14 +1676,6 @@ class TC_GAME_API ObjectMgr std::set<uint32> _difficultyEntries[MAX_DIFFICULTY - 1]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate std::set<uint32> _hasDifficultyEntries[MAX_DIFFICULTY - 1]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate - 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 7d28896c0fe..cf454e0ce74 100644 --- a/src/server/game/Maps/SpawnData.h +++ b/src/server/game/Maps/SpawnData.h @@ -73,4 +73,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 |
