diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2019-07-14 18:49:38 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-12-16 01:10:06 +0100 |
| commit | be05590a12607cbf6c7f8e5436cfac0fb3625128 (patch) | |
| tree | c3cb4d96bbfec428a7fc8f750465a5be902ee317 | |
| parent | 58fb2ef631e17686981c97b22693e141beafecd3 (diff) | |
Core/DB: Unify `creature_respawn` and `gameobject_respawn` into a single `respawn` table
(cherry picked from commit 374597c8e96c886f1e3647d405bf3160c8b98bf8)
| -rw-r--r-- | sql/base/characters_database.sql | 82 | ||||
| -rw-r--r-- | sql/updates/characters/master/2021_12_16_00_characters_2019_07_14_00_characters.sql | 20 | ||||
| -rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 16 | ||||
| -rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.h | 13 | ||||
| -rw-r--r-- | src/server/game/Instances/InstanceSaveMgr.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 71 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 2 |
7 files changed, 81 insertions, 126 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index ee52a3e8884..651be3c5c17 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1964,32 +1964,6 @@ LOCK TABLES `corpse_phases` WRITE; UNLOCK TABLES; -- --- Table structure for table `creature_respawn` --- - -DROP TABLE IF EXISTS `creature_respawn`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `creature_respawn` ( - `guid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `respawnTime` bigint(20) NOT NULL DEFAULT '0', - `mapId` smallint(10) unsigned NOT NULL DEFAULT '0', - `instanceId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Instance Identifier', - PRIMARY KEY (`guid`,`instanceId`), - KEY `idx_instance` (`instanceId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Grid Loading System'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `creature_respawn` --- - -LOCK TABLES `creature_respawn` WRITE; -/*!40000 ALTER TABLE `creature_respawn` DISABLE KEYS */; -/*!40000 ALTER TABLE `creature_respawn` ENABLE KEYS */; -UNLOCK TABLES; - --- -- Table structure for table `game_event_condition_save` -- @@ -2038,32 +2012,6 @@ LOCK TABLES `game_event_save` WRITE; UNLOCK TABLES; -- --- Table structure for table `gameobject_respawn` --- - -DROP TABLE IF EXISTS `gameobject_respawn`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `gameobject_respawn` ( - `guid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `respawnTime` bigint(20) NOT NULL DEFAULT '0', - `mapId` smallint(10) unsigned NOT NULL DEFAULT '0', - `instanceId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Instance Identifier', - PRIMARY KEY (`guid`,`instanceId`), - KEY `idx_instance` (`instanceId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Grid Loading System'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `gameobject_respawn` --- - -LOCK TABLES `gameobject_respawn` WRITE; -/*!40000 ALTER TABLE `gameobject_respawn` DISABLE KEYS */; -/*!40000 ALTER TABLE `gameobject_respawn` ENABLE KEYS */; -UNLOCK TABLES; - --- -- Table structure for table `gm_bug` -- @@ -3530,6 +3478,33 @@ LOCK TABLES `reserved_name` WRITE; UNLOCK TABLES; -- +-- Table structure for table `respawn` +-- + +DROP TABLE IF EXISTS `respawn`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `respawn` ( + `type` smallint(10) unsigned NOT NULL, + `spawnId` bigint(20) unsigned NOT NULL, + `respawnTime` bigint(20) NOT NULL, + `mapId` smallint(10) unsigned NOT NULL, + `instanceId` int(10) unsigned NOT NULL, + PRIMARY KEY (`type`,`spawnId`,`instanceId`), + KEY `idx_instance` (`instanceId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stored respawn times'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `respawn` +-- + +LOCK TABLES `respawn` WRITE; +/*!40000 ALTER TABLE `respawn` DISABLE KEYS */; +/*!40000 ALTER TABLE `respawn` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `updates` -- @@ -3674,7 +3649,8 @@ INSERT INTO `updates` VALUES ('2021_10_16_00_characters.sql','B5A31BB6FBC34512767475EDF13099DEC948EBB7','ARCHIVED','2021-10-16 01:12:20',0), ('2021_11_02_00_characters.sql','A3C0A6DA70CC70803C80685E4E2ED6255156520A','ARCHIVED','2021-11-02 18:11:13',0), ('2021_11_04_00_characters.sql','ED533235ADAD174F91A6B8E51D1046243B78B46D','ARCHIVED','2021-11-04 21:53:04',0), -('2021_11_17_00_characters.sql','03A0AB8ECD8BE5D818D41A8A610097C94A9C7DB9','ARCHIVED','2021-11-17 13:23:17',0); +('2021_11_17_00_characters.sql','03A0AB8ECD8BE5D818D41A8A610097C94A9C7DB9','ARCHIVED','2021-11-17 13:23:17',0), +('2021_12_16_00_characters_2019_07_14_00_characters.sql','DC1A3D3311FCF9106B4D91F8D2C5B893AD66C093','RELEASED','2021-12-16 01:06:53',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2021_12_16_00_characters_2019_07_14_00_characters.sql b/sql/updates/characters/master/2021_12_16_00_characters_2019_07_14_00_characters.sql new file mode 100644 index 00000000000..ca35b4b6994 --- /dev/null +++ b/sql/updates/characters/master/2021_12_16_00_characters_2019_07_14_00_characters.sql @@ -0,0 +1,20 @@ +-- +DROP TABLE IF EXISTS `respawn`; +CREATE TABLE `respawn` ( + `type` smallint(10) unsigned NOT NULL, + `spawnId` bigint(20) unsigned NOT NULL, + `respawnTime` bigint(20) NOT NULL, + `mapId` smallint(10) unsigned NOT NULL, + `instanceId` int(10) unsigned NOT NULL, + PRIMARY KEY (`type`,`spawnId`,`instanceId`), + KEY `idx_instance` (`instanceId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stored respawn times'; + +INSERT INTO `respawn` (`type`,`spawnId`,`respawnTime`,`mapId`,`instanceId`) +SELECT 0 as `type`,`guid`,`respawnTime`,`mapId`,`instanceId` FROM `creature_respawn`; + +INSERT INTO `respawn` (`type`,`spawnId`,`respawnTime`,`mapId`,`instanceId`) +SELECT 1 as `type`,`guid`,`respawnTime`,`mapId`,`instanceId` FROM `gameobject_respawn`; + +DROP TABLE `creature_respawn`; +DROP TABLE `gameobject_respawn`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index bc6cffcee26..4bc1dc7b802 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -435,17 +435,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CORPSE_CUSTOMIZATIONS, "DELETE FROM corpse_customizations WHERE ownerGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CORPSE_LOCATION, "SELECT mapId, posX, posY, posZ, orientation FROM corpse WHERE guid = ?", CONNECTION_ASYNC); - // Creature respawn - PrepareStatement(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC); - - // Gameobject respawn - PrepareStatement(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC); + // Respawns + PrepareStatement(CHAR_SEL_RESPAWNS, "SELECT type, spawnId, respawnTime FROM respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_REP_RESPAWN, "REPLACE INTO respawn (type, spawnId, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_RESPAWN, "DELETE FROM respawn WHERE type = ? AND spawnId = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ALL_RESPAWNS, "DELETE FROM respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC); // GM Bug PrepareStatement(CHAR_SEL_GM_BUGS, "SELECT id, playerGuid, note, createTime, mapId, posX, posY, posZ, facing, closedBy, assignedTo, comment FROM gm_bug", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 460a6ef1886..1de37e1a2ca 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -342,15 +342,10 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_CORPSE_CUSTOMIZATIONS, CHAR_SEL_CORPSE_LOCATION, - CHAR_SEL_CREATURE_RESPAWNS, - CHAR_REP_CREATURE_RESPAWN, - CHAR_DEL_CREATURE_RESPAWN, - CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, - - CHAR_SEL_GO_RESPAWNS, - CHAR_REP_GO_RESPAWN, - CHAR_DEL_GO_RESPAWN, - CHAR_DEL_GO_RESPAWN_BY_INSTANCE, + CHAR_SEL_RESPAWNS, + CHAR_REP_RESPAWN, + CHAR_DEL_RESPAWN, + CHAR_DEL_ALL_RESPAWNS, CHAR_SEL_GM_BUGS, CHAR_REP_GM_BUG, diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index c28f9ed7a8a..741a3e98697 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -292,8 +292,7 @@ void InstanceSaveManager::LoadInstances() CharacterDatabase.DirectExecute("DELETE i.* FROM instance AS i LEFT JOIN character_instance AS ci ON i.id = ci.instance LEFT JOIN group_instance AS gi ON i.id = gi.instance WHERE ci.guid IS NULL AND gi.guid IS NULL"); // Delete invalid references to instance - CharacterDatabase.DirectExecute("DELETE FROM creature_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); - CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); + CharacterDatabase.DirectExecute("DELETE FROM respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)"); CharacterDatabase.DirectExecute("DELETE tmp.* FROM character_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL"); CharacterDatabase.DirectExecute("DELETE tmp.* FROM group_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL"); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 699954c799d..462c75b933c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3324,22 +3324,11 @@ void Map::DeleteRespawnInfo(RespawnInfo* info) void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, CharacterDatabaseTransaction dbTrans) { - CharacterDatabasePreparedStatement* stmt; - switch (info->type) - { - case SPAWN_TYPE_CREATURE: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); - break; - case SPAWN_TYPE_GAMEOBJECT: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN); - break; - default: - ASSERT(false, "Invalid respawninfo type %u for spawnid " UI64FMTD " map %u", uint32(info->type), info->spawnId, GetId()); - return; - } - stmt->setUInt64(0, info->spawnId); - stmt->setUInt16(1, GetId()); - stmt->setUInt32(2, GetInstanceId()); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_RESPAWN); + stmt->setUInt16(0, info->type); + stmt->setUInt64(1, info->spawnId); + stmt->setUInt16(2, GetId()); + stmt->setUInt32(3, GetInstanceId()); CharacterDatabase.ExecuteOrAppend(dbTrans, stmt); if (doRespawn) @@ -4557,17 +4546,18 @@ void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uin void Map::SaveRespawnTimeDB(SpawnObjectType type, ObjectGuid::LowType spawnId, time_t respawnTime, CharacterDatabaseTransaction dbTrans) { // Just here for support of compatibility mode - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement((type == SPAWN_TYPE_GAMEOBJECT) ? CHAR_REP_GO_RESPAWN : CHAR_REP_CREATURE_RESPAWN); - stmt->setUInt64(0, spawnId); - stmt->setInt64(1, respawnTime); - stmt->setUInt16(2, GetId()); - stmt->setUInt32(3, GetInstanceId()); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_RESPAWN); + stmt->setUInt16(0, type); + stmt->setUInt64(1, spawnId); + stmt->setInt64(2, respawnTime); + stmt->setUInt16(3, GetId()); + stmt->setUInt32(4, GetInstanceId()); CharacterDatabase.ExecuteOrAppend(dbTrans, stmt); } void Map::LoadRespawnTimes() { - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_RESPAWNS); stmt->setUInt16(0, GetId()); stmt->setUInt32(1, GetInstanceId()); if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) @@ -4575,41 +4565,22 @@ void Map::LoadRespawnTimes() do { Field* fields = result->Fetch(); - ObjectGuid::LowType loguid = fields[0].GetUInt64(); - time_t respawnTime = fields[1].GetInt64(); + SpawnObjectType type = SpawnObjectType(fields[0].GetUInt16()); + ObjectGuid::LowType spawnId = fields[1].GetUInt64(); + time_t respawnTime = fields[2].GetInt64(); - if (CreatureData const* cdata = sObjectMgr->GetCreatureData(loguid)) - SaveRespawnTime(SPAWN_TYPE_CREATURE, loguid, cdata->id, respawnTime, GetZoneId(PhasingHandler::GetEmptyPhaseShift(), cdata->spawnPoint), Trinity::ComputeGridCoord(cdata->spawnPoint.GetPositionX(), cdata->spawnPoint.GetPositionY()).GetId(), false); - - } while (result->NextRow()); - } - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS); - stmt->setUInt16(0, GetId()); - stmt->setUInt32(1, GetInstanceId()); - if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) - { - do - { - Field* fields = result->Fetch(); - ObjectGuid::LowType loguid = fields[0].GetUInt64(); - time_t respawnTime = fields[1].GetInt64(); - - if (GameObjectData const* godata = sObjectMgr->GetGameObjectData(loguid)) - SaveRespawnTime(SPAWN_TYPE_GAMEOBJECT, loguid, godata->id, respawnTime, GetZoneId(PhasingHandler::GetEmptyPhaseShift(), godata->spawnPoint), Trinity::ComputeGridCoord(godata->spawnPoint.GetPositionX(), godata->spawnPoint.GetPositionY()).GetId(), false); + if (SpawnData const* data = sObjectMgr->GetSpawnData(type, spawnId)) + SaveRespawnTime(type, spawnId, data->id, time_t(respawnTime), GetZoneId(PhasingHandler::GetEmptyPhaseShift(), data->spawnPoint), Trinity::ComputeGridCoord(data->spawnPoint.GetPositionX(), data->spawnPoint.GetPositionY()).GetId(), false); + else + TC_LOG_ERROR("maps", "Loading saved respawn time of %" PRIu64 " for spawnid (%u," UI64FMTD ") - spawn does not exist, ignoring", respawnTime, uint32(type), spawnId); } while (result->NextRow()); } } -void Map::DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId) +/*static*/ void Map::DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId) { - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE); - stmt->setUInt16(0, mapId); - stmt->setUInt32(1, instanceId); - CharacterDatabase.Execute(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ALL_RESPAWNS); stmt->setUInt16(0, mapId); stmt->setUInt32(1, instanceId); CharacterDatabase.Execute(stmt); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2e83c4365a7..13c0bcdde0f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1791,7 +1791,7 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Instance Template..."); sObjectMgr->LoadInstanceTemplate(); - // Must be called before `creature_respawn`/`gameobject_respawn` tables + // Must be called before `respawn` data TC_LOG_INFO("server.loading", "Loading instances..."); sInstanceSaveMgr->LoadInstances(); |
