diff options
-rw-r--r-- | sql/base/characters_database.sql | 69 | ||||
-rw-r--r-- | sql/updates/characters/3.3.5/2019_07_14_00_characters.sql | 20 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 18 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.h | 15 | ||||
-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, 72 insertions, 126 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 961819e2f8e..bc4a691747c 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1447,32 +1447,24 @@ LOCK TABLES `corpse` WRITE; UNLOCK TABLES; -- --- Table structure for table `creature_respawn` +-- Table structure for table `respawn` -- -DROP TABLE IF EXISTS `creature_respawn`; +DROP TABLE IF EXISTS `respawn`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `creature_respawn` ( - `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `respawnTime` bigint(20) unsigned 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`), +CREATE TABLE `respawn` ( + `type` smallint(10) unsigned NOT NULL, + `spawnId` int(10) unsigned NOT NULL, + `respawnTime` bigint(20) unsigned 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='Grid Loading System'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stored respawn times'; /*!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` -- @@ -1521,32 +1513,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` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `respawnTime` bigint(20) unsigned 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_subsurvey` -- @@ -2616,23 +2582,24 @@ INSERT INTO `updates` VALUES ('2016_03_13_2016_01_05_00_characters.sql','0EAD24977F40DE2476B4567DA2B477867CC0DA1A','ARCHIVED','2016-03-13 20:03:56',0), ('2016_04_11_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2016-04-11 03:18:17',0), ('2016_09_13_00_characters.sql','27A04615B11B2CFC3A26778F52F74C071E4F9C54','ARCHIVED','2016-07-06 18:55:18',0), -('2016_10_16_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2016-10-16 14:02:49',35), +('2016_10_16_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2016-10-16 14:02:49',0), ('2016_10_30_00_characters.sql','7E2D5B226907B5A9AF320797F46E86DC27B7EC90','ARCHIVED','2016-10-30 00:00:00',0), ('2017_04_03_00_characters.sql','CB072C56692C9FBF170C4036F15773DD86D368B5','ARCHIVED','2017-04-03 00:00:00',0), ('2017_04_12_00_characters.sql','4FE3C6866A6DCD4926D451F6009464D290C2EF1F','ARCHIVED','2017-04-12 00:00:00',0), ('2017_04_12_01_characters.sql','5A8A1215E3A2356722F52CD7A64BBE03D21FBEA3','ARCHIVED','2017-04-12 00:00:00',0), -('2017_04_19_00_characters.sql','CE06FA9005C8A8EE4BDD925520278A5D83E87485','ARCHIVED','2017-04-19 00:07:40',25), -('2017_10_29_00_characters.sql','8CFC473E7E87E58C317A72016BF69E9050D3BC83','ARCHIVED','2017-04-19 00:07:40',25), +('2017_04_19_00_characters.sql','CE06FA9005C8A8EE4BDD925520278A5D83E87485','ARCHIVED','2017-04-19 00:07:40',0), +('2017_10_29_00_characters.sql','8CFC473E7E87E58C317A72016BF69E9050D3BC83','ARCHIVED','2017-04-19 00:07:40',0), ('2017_11_27_00_characters.sql','6FF1F84B8985ADFC7FF97F0BF8E53403CF13C320','ARCHIVED','2017-11-27 22:08:42',0), ('2018_01_13_00_characters.sql','E3C0DA9995BA71ED5A267294470CD03DC51862DD','ARCHIVED','2018-01-13 00:00:00',0), ('2018_02_19_00_characters.sql','FE5C5F9B88F0791549DDE680942493781E2269E6','ARCHIVED','2018-02-18 19:49:38',0), ('2018_04_24_00_characters.sql','77264AB7BEF421C0A4BB81EEAFD0D8C1CBCA840F','ARCHIVED','2018-04-20 09:38:10',0), ('2018_07_09_00_characters.sql','6F3EA22DD5E4CD9F9C60C4332B147E3DBF2E8A44','ARCHIVED','2018-07-09 18:19:18',0), ('2018_11_09_00_characters.sql','50429D68E6EBD1149CDA14A9EA642BC06A1FAE3D','ARCHIVED','2018-11-09 20:49:47',0), -('2019_03_19_00_characters.sql','1FD394E354CB9E854ABDC8CFD02329240AE07C3F','ARCHIVED','2019-03-19 07:17:45',5), -('2019_04_15_00_characters.sql','942FB57BF890E523B35B9BFEF3686CB0AA52B795','ARCHIVED','2019-04-15 06:16:09',5), -('2019_05_15_00_characters.sql','A12F21C8044C8BC8E2AA17F4C6CEB8B722CBC714','ARCHIVED','2019-05-15 06:13:20',5), -('2019_06_15_00_characters.sql','32DA6E004D7DD6EFFB0BB26238D17F6CC9E51DE6','ARCHIVED','2019-06-15 07:33:45',4); +('2019_03_19_00_characters.sql','1FD394E354CB9E854ABDC8CFD02329240AE07C3F','ARCHIVED','2019-03-19 07:17:45',0), +('2019_04_15_00_characters.sql','942FB57BF890E523B35B9BFEF3686CB0AA52B795','ARCHIVED','2019-04-15 06:16:09',0), +('2019_05_15_00_characters.sql','A12F21C8044C8BC8E2AA17F4C6CEB8B722CBC714','ARCHIVED','2019-05-15 06:13:20',0), +('2019_06_15_00_characters.sql','32DA6E004D7DD6EFFB0BB26238D17F6CC9E51DE6','ARCHIVED','2019-06-15 07:33:45',0), +('2019_07_14_00_characters.sql','A141F4F15BDF0320483921429871D4C572BD7E2D','ARCHIVED','2019-07-04 00:00:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/3.3.5/2019_07_14_00_characters.sql b/sql/updates/characters/3.3.5/2019_07_14_00_characters.sql new file mode 100644 index 00000000000..24fc278db61 --- /dev/null +++ b/sql/updates/characters/3.3.5/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` int(10) unsigned NOT NULL, + `respawnTime` bigint(20) unsigned 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 2141121aa77..c7eab8ba321 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -315,18 +315,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSES_FROM_MAP, "DELETE FROM corpse WHERE mapId = ? AND instanceId = ?", 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 Tickets PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT id, type, playerGuid, name, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp FROM gm_ticket", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 2951eff15ca..2397b620a06 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -262,16 +262,11 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_CORPSE, CHAR_DEL_CORPSES_FROM_MAP, 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_TICKETS, CHAR_REP_GM_TICKET, diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index b3591988332..461bd562fd6 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -280,8 +280,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 47005d0a2a6..0fc84d4b446 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3162,22 +3162,11 @@ void Map::DeleteRespawnInfo(RespawnInfo* info) void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, SQLTransaction dbTrans) { - PreparedStatement* 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 %u map %u", uint32(info->type), info->spawnId, GetId()); - return; - } - stmt->setUInt32(0, info->spawnId); - stmt->setUInt16(1, GetId()); - stmt->setUInt32(2, GetInstanceId()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_RESPAWN); + stmt->setUInt16(0, info->type); + stmt->setUInt32(1, info->spawnId); + stmt->setUInt16(2, GetId()); + stmt->setUInt32(3, GetInstanceId()); CharacterDatabase.ExecuteOrAppend(dbTrans, stmt); if (doRespawn) @@ -4344,17 +4333,18 @@ void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uin void Map::SaveRespawnTimeDB(SpawnObjectType type, ObjectGuid::LowType spawnId, time_t respawnTime, SQLTransaction dbTrans) { // Just here for support of compatibility mode - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement((type == SPAWN_TYPE_GAMEOBJECT) ? CHAR_REP_GO_RESPAWN : CHAR_REP_CREATURE_RESPAWN); - stmt->setUInt32(0, spawnId); - stmt->setUInt64(1, uint64(respawnTime)); - stmt->setUInt16(2, GetId()); - stmt->setUInt32(3, GetInstanceId()); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_RESPAWN); + stmt->setUInt16(0, type); + stmt->setUInt32(1, spawnId); + stmt->setUInt64(2, uint64(respawnTime)); + stmt->setUInt16(3, GetId()); + stmt->setUInt32(4, GetInstanceId()); CharacterDatabase.ExecuteOrAppend(dbTrans, stmt); } void Map::LoadRespawnTimes() { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_RESPAWNS); stmt->setUInt16(0, GetId()); stmt->setUInt32(1, GetInstanceId()); if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) @@ -4362,41 +4352,22 @@ void Map::LoadRespawnTimes() do { Field* fields = result->Fetch(); - ObjectGuid::LowType loguid = fields[0].GetUInt32(); - uint64 respawnTime = fields[1].GetUInt64(); + SpawnObjectType type = SpawnObjectType(fields[0].GetUInt16()); + ObjectGuid::LowType spawnId = fields[1].GetUInt32(); + uint64 respawnTime = fields[2].GetUInt64(); - if (CreatureData const* cdata = sObjectMgr->GetCreatureData(loguid)) - SaveRespawnTime(SPAWN_TYPE_CREATURE, loguid, cdata->id, time_t(respawnTime), GetZoneId(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].GetUInt32(); - uint64 respawnTime = fields[1].GetUInt64(); - - if (GameObjectData const* godata = sObjectMgr->GetGameObjectData(loguid)) - SaveRespawnTime(SPAWN_TYPE_GAMEOBJECT, loguid, godata->id, time_t(respawnTime), GetZoneId(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(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,%u) - 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) { - PreparedStatement* 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); + PreparedStatement* 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 d3d65b19f14..6c08313665f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1611,7 +1611,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(); |