aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/characters_database.sql51
-rw-r--r--sql/updates/characters/master/2017_01_29_00_characters.sql2
-rw-r--r--sql/updates/world/master/2017_01_29_02_world.sql16
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp2
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp15
-rw-r--r--src/server/game/Globals/CharacterTemplateDataStore.cpp118
-rw-r--r--src/server/game/Globals/CharacterTemplateDataStore.h58
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp75
-rw-r--r--src/server/game/Globals/ObjectMgr.h32
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp5
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp19
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp23
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h4
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp3
16 files changed, 232 insertions, 196 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index 0a6277c4a6e..eed75db20bb 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -1462,55 +1462,6 @@ LOCK TABLES `character_talent` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `character_template`
---
-
-DROP TABLE IF EXISTS `character_template`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `character_template` (
- `id` int(10) unsigned NOT NULL,
- `name` varchar(70) NOT NULL,
- `description` varchar(100) NOT NULL,
- `level` tinyint(3) unsigned NOT NULL DEFAULT '1',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `character_template`
---
-
-LOCK TABLES `character_template` WRITE;
-/*!40000 ALTER TABLE `character_template` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_template` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `character_template_class`
---
-
-DROP TABLE IF EXISTS `character_template_class`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `character_template_class` (
- `templateId` int(10) unsigned NOT NULL,
- `factionGroup` tinyint(3) unsigned NOT NULL COMMENT '3 - Alliance, 5 - Horde',
- `class` tinyint(3) unsigned NOT NULL,
- PRIMARY KEY (`templateId`,`factionGroup`,`class`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `character_template_class`
---
-
-LOCK TABLES `character_template_class` WRITE;
-/*!40000 ALTER TABLE `character_template_class` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_template_class` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `character_transmog_outfits`
--
@@ -3276,7 +3227,7 @@ CREATE TABLE `updates` (
LOCK TABLES `updates` WRITE;
/*!40000 ALTER TABLE `updates` DISABLE KEYS */;
-INSERT INTO `updates` VALUES ('2014_10_20_00_characters.sql','A5882DA0979CF4DAE33DA011EBAA006C24BE7230','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_00_characters.sql','E2AC4758133EE19B7F08464A445802154D1261C8','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_01_characters.sql','20029E6323D9773B32C34D84FFED1711CC60F09F','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_02_characters.sql','8A7A16886EE71E7ACDDB3DDA6D0ECAC2FD2FDCA8','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_24_00_characters.sql','D008FE81AE844FCA686439D6ECC5108FB0DD1EB9','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_25_00_characters.sql','A39C7BE46686B54776BDAB9D7A882D91EDEC51A4','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_26_00_characters.sql','C787954CC35FE34B4101FDE6527F14C027F4947C','ARCHIVED','2015-03-21 15:55:55',0),('2014_11_12_00_characters.sql','B160BB2313F1BD5F3B076A5A9279DC10D4796E34','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_23_00_characters.sql','3D9D648B2387B357F4BD090B33F80682F7924882','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_28_00_characters.sql','5362922FF4483A336311D73082A5727309CD9219','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_31_00_characters.sql','498DDF2DD936CF156D74A8208DC93DCE9FCAB5AA','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_02_00_characters.sql','E5940BE836F253982E07930120422E598D08BDE1','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_10_00_characters.sql','30796056C8623699B2FE1BF626A19D38262E9284','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_16_00_characters.sql','96642760A54C8D799AAFE438049A63AA521656F2','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_27_00_characters.sql','EB710E3EB9F2CAFD84AB62CDC84E898403A80A4F','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_13_00_characters.sql','405BEB4ED207DC6076442A37EE2AFB1F21E274A0','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_13_01_characters.sql','35F582D4F33BF55D1685A1BA89273ED895FD09C5','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_17_00_characters.sql','8D21FC5A55BF8B55D6DCDCE5F02CF2B640230E94','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_10_00_characters.sql','E565B89B145C340067742DFF2DEF1B74F5F1BD4E','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_01_characters.sql','20BD68468C57FCF7E665B4DA185DCD52FACE8B3F','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_02_characters.sql','0296995DCD3676BA9AE6024CA7C91C5F39D927A3','ARCHIVED','2015-03-21 15:56:46',0),('2015_03_29_00_characters.sql','95D6A46BB746A8BD3EE3FE2086DF1A07F7C33B92','ARCHIVED','2015-05-02 15:43:06',0),('2015_04_21_00_characters.sql','F2032B9BF4EDA7EDE5065554724ED392FD91657D','ARCHIVED','2015-05-02 15:43:06',0),('2015_04_28_00_characters.sql','949F62DB3A3461D420A1230ECF7A6A3ED6435703','ARCHIVED','2015-05-02 15:43:06',0),('2015_05_08_00_characters.sql','0F14B7821618D1C872625B6EDDAA9A667B211167','ARCHIVED','2015-07-10 19:32:17',0),('2015_05_22_00_characters.sql','65B82152413FAB23BE413656E59A486A74447FF7','ARCHIVED','2015-07-10 19:32:17',0),('2015_07_08_00_characters.sql','DAB25360ACB5244C8F8E6214CF6BD97160588A5B','ARCHIVED','2015-07-10 19:32:17',0),('2015_07_11_00_characters.sql','B421B6C0E57BD0FD587071358863D9DABF4BA849','ARCHIVED','2015-07-13 21:50:02',0),('2015_07_12_00_characters.sql','E98E7FD61EF6426E7EDE8ED9AD8C15D8D7132589','ARCHIVED','2015-07-13 21:50:02',0),('2015_07_28_00_characters.sql','0711BC3A658D189EF71B0CB68DCFF2E9B781C4A0','ARCHIVED','2015-07-29 16:23:56',0),('2015_08_08_00_characters.sql','EA12BB2DC24FAF2300A96D0888A45BBEA158D5DC','ARCHIVED','2015-08-08 16:34:07',0),('2015_08_12_00_characters.sql','4FD7F89FE5DA51D4E0C33E520719986AA3EBD31B','ARCHIVED','2015-08-12 12:35:20',0),('2015_09_05_00_characters.sql','4C22BB29365BE4B6B95E64DAD84B63CA002304EA','ARCHIVED','2015-09-05 12:35:20',0),('2015_09_09_00_characters.sql','AFC32E693BC17CFD9A17919FE5317B8FE337ACAD','ARCHIVED','2015-09-09 12:35:20',0),('2015_09_10_00_characters.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-09-10 22:50:42',0),('2015_10_16_00_characters.sql','E3A3FFF0CB42F04A8DCF0CE4362143C16E2083AF','ARCHIVED','2015-10-15 21:54:11',0),('2015_11_06_00_characters_2015_10_12_00.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-11-06 23:43:27',0),('2015_11_08_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2015-11-08 00:51:45',15),('2015_11_23_00_characters.sql','9FC828E9E48E8E2E9B99A5A0073D6614C5BFC6B5','ARCHIVED','2015-11-22 23:27:34',0),('2016_01_05_00_characters.sql','0EAD24977F40DE2476B4567DA2B477867CC0DA1A','ARCHIVED','2016-01-04 23:07:40',0),('2016_04_05_00_characters_2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','ARCHIVED','2016-04-05 20:34:41',0),('2016_04_11_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2016-04-11 02:24:14',30),('2016_04_11_01_characters.sql','CA90F6D99C1EEA7B25BD58BC8368A8D78234BBEF','ARCHIVED','2016-04-11 18:14:18',0),('2016_05_07_00_characters.sql','D1DB5557B21A552C935564D829B4E98B98149077','ARCHIVED','2016-05-07 00:00:00',0),('2016_05_26_00_characters.sql','4179ADC32B96FD8D7D4CF5509A470B1ACE00BE85','ARCHIVED','2016-05-26 17:06:16',0),('2016_07_16_00_characters.sql','EF267FCB92B383FFB33C700508EAF3FBC1F8AC23','ARCHIVED','2016-07-16 14:45:12',0),('2016_07_19_00_characters.sql','AA2C516FA81B451071EA82F58F447E9D13E5D1BD','ARCHIVED','2016-07-19 14:36:25',0),('2016_07_19_01_characters.sql','E9AF46AF4C7CC2E2779E44254AEEDF880D020166','ARCHIVED','2016-07-19 14:36:25',0),('2016_07_19_02_characters.sql','5B1B334449996F3639C9226F587129E03DC4BF6D','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_03_characters.sql','7787C8A67D720492FED4BF60ADB22D3CDE1C536D','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_04_characters.sql','6D4B536094367AC9EF7CDFF41A4F96EB00B25EE5','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_05_characters.sql','12639268DC5F78CE900B59D5C646B10D70842928','ARCHIVED','2016-07-19 14:36:27',0),('2016_07_19_06_characters.sql','9F5A4B533E6BFBAA718DE5160E1FDCB8471A88BF','ARCHIVED','2016-07-19 14:36:28',0),('2016_07_19_07_characters.sql','1E8273FFD4340CBD7BB71D2406E23E9EF7230CFA','ARCHIVED','2016-07-19 14:36:29',0),('2016_07_19_08_characters.sql','FB41FD2F8A7114FEE154021A9D47488C4B12E2A9','ARCHIVED','2016-07-19 14:36:29',0),('2016_08_15_00_characters.sql','BF0B5F453384210CD77C54E262A19B888AAA4095','ARCHIVED','2016-08-14 18:14:32',0),('2016_08_25_00_characters.sql','4AD506C3FCE54238EF452AC07EC562BD41A9D50C','ARCHIVED','2016-08-25 22:54:11',0),('2016_10_17_00_characters.sql','A0EF594CD73690D46A46031137DB0E895F079235','RELEASED','2016-10-16 16:33:05',25),('2016_10_25_00_characters.sql','CC894484561CE138C10B69D34F7831CEDFAF496B','RELEASED','2016-10-25 17:19:35',0),('2016_11_06_00_characters.sql','C7EC8B65C1BE7722C53BAB79C52C1549054178C0','RELEASED','2016-11-06 23:05:44',0),('2016_12_09_00_characters.sql','2A68E4187CE7F7294CBC3804AC39F48B2727E64E','RELEASED','2016-12-09 18:38:46',0),('2016_12_26_00_characters.sql','D265DE655DDBFC13E2FA1EB021A435A21189B6E4','RELEASED','2016-12-26 18:45:15',0),('2017_01_22_00_characters.sql','62B08B5FB1DA7B207C74DC000C42517A2D6F6BCC','RELEASED','2017-01-22 02:06:31',0);
+INSERT INTO `updates` VALUES ('2014_10_20_00_characters.sql','A5882DA0979CF4DAE33DA011EBAA006C24BE7230','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_00_characters.sql','E2AC4758133EE19B7F08464A445802154D1261C8','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_01_characters.sql','20029E6323D9773B32C34D84FFED1711CC60F09F','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_23_02_characters.sql','8A7A16886EE71E7ACDDB3DDA6D0ECAC2FD2FDCA8','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_24_00_characters.sql','D008FE81AE844FCA686439D6ECC5108FB0DD1EB9','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_25_00_characters.sql','A39C7BE46686B54776BDAB9D7A882D91EDEC51A4','ARCHIVED','2015-03-21 15:55:55',0),('2014_10_26_00_characters.sql','C787954CC35FE34B4101FDE6527F14C027F4947C','ARCHIVED','2015-03-21 15:55:55',0),('2014_11_12_00_characters.sql','B160BB2313F1BD5F3B076A5A9279DC10D4796E34','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_23_00_characters.sql','3D9D648B2387B357F4BD090B33F80682F7924882','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_28_00_characters.sql','5362922FF4483A336311D73082A5727309CD9219','ARCHIVED','2015-03-21 15:55:55',0),('2014_12_31_00_characters.sql','498DDF2DD936CF156D74A8208DC93DCE9FCAB5AA','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_02_00_characters.sql','E5940BE836F253982E07930120422E598D08BDE1','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_10_00_characters.sql','30796056C8623699B2FE1BF626A19D38262E9284','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_16_00_characters.sql','96642760A54C8D799AAFE438049A63AA521656F2','ARCHIVED','2015-03-21 15:55:55',0),('2015_01_27_00_characters.sql','EB710E3EB9F2CAFD84AB62CDC84E898403A80A4F','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_13_00_characters.sql','405BEB4ED207DC6076442A37EE2AFB1F21E274A0','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_13_01_characters.sql','35F582D4F33BF55D1685A1BA89273ED895FD09C5','ARCHIVED','2015-03-21 15:55:55',0),('2015_02_17_00_characters.sql','8D21FC5A55BF8B55D6DCDCE5F02CF2B640230E94','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_10_00_characters.sql','E565B89B145C340067742DFF2DEF1B74F5F1BD4E','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_01_characters.sql','20BD68468C57FCF7E665B4DA185DCD52FACE8B3F','ARCHIVED','2015-03-21 15:55:55',0),('2015_03_20_02_characters.sql','0296995DCD3676BA9AE6024CA7C91C5F39D927A3','ARCHIVED','2015-03-21 15:56:46',0),('2015_03_29_00_characters.sql','95D6A46BB746A8BD3EE3FE2086DF1A07F7C33B92','ARCHIVED','2015-05-02 15:43:06',0),('2015_04_21_00_characters.sql','F2032B9BF4EDA7EDE5065554724ED392FD91657D','ARCHIVED','2015-05-02 15:43:06',0),('2015_04_28_00_characters.sql','949F62DB3A3461D420A1230ECF7A6A3ED6435703','ARCHIVED','2015-05-02 15:43:06',0),('2015_05_08_00_characters.sql','0F14B7821618D1C872625B6EDDAA9A667B211167','ARCHIVED','2015-07-10 19:32:17',0),('2015_05_22_00_characters.sql','65B82152413FAB23BE413656E59A486A74447FF7','ARCHIVED','2015-07-10 19:32:17',0),('2015_07_08_00_characters.sql','DAB25360ACB5244C8F8E6214CF6BD97160588A5B','ARCHIVED','2015-07-10 19:32:17',0),('2015_07_11_00_characters.sql','B421B6C0E57BD0FD587071358863D9DABF4BA849','ARCHIVED','2015-07-13 21:50:02',0),('2015_07_12_00_characters.sql','E98E7FD61EF6426E7EDE8ED9AD8C15D8D7132589','ARCHIVED','2015-07-13 21:50:02',0),('2015_07_28_00_characters.sql','0711BC3A658D189EF71B0CB68DCFF2E9B781C4A0','ARCHIVED','2015-07-29 16:23:56',0),('2015_08_08_00_characters.sql','EA12BB2DC24FAF2300A96D0888A45BBEA158D5DC','ARCHIVED','2015-08-08 16:34:07',0),('2015_08_12_00_characters.sql','4FD7F89FE5DA51D4E0C33E520719986AA3EBD31B','ARCHIVED','2015-08-12 12:35:20',0),('2015_09_05_00_characters.sql','4C22BB29365BE4B6B95E64DAD84B63CA002304EA','ARCHIVED','2015-09-05 12:35:20',0),('2015_09_09_00_characters.sql','AFC32E693BC17CFD9A17919FE5317B8FE337ACAD','ARCHIVED','2015-09-09 12:35:20',0),('2015_09_10_00_characters.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-09-10 22:50:42',0),('2015_10_16_00_characters.sql','E3A3FFF0CB42F04A8DCF0CE4362143C16E2083AF','ARCHIVED','2015-10-15 21:54:11',0),('2015_11_06_00_characters_2015_10_12_00.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-11-06 23:43:27',0),('2015_11_08_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2015-11-08 00:51:45',15),('2015_11_23_00_characters.sql','9FC828E9E48E8E2E9B99A5A0073D6614C5BFC6B5','ARCHIVED','2015-11-22 23:27:34',0),('2016_01_05_00_characters.sql','0EAD24977F40DE2476B4567DA2B477867CC0DA1A','ARCHIVED','2016-01-04 23:07:40',0),('2016_04_05_00_characters_2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','ARCHIVED','2016-04-05 20:34:41',0),('2016_04_11_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','ARCHIVED','2016-04-11 02:24:14',30),('2016_04_11_01_characters.sql','CA90F6D99C1EEA7B25BD58BC8368A8D78234BBEF','ARCHIVED','2016-04-11 18:14:18',0),('2016_05_07_00_characters.sql','D1DB5557B21A552C935564D829B4E98B98149077','ARCHIVED','2016-05-07 00:00:00',0),('2016_05_26_00_characters.sql','4179ADC32B96FD8D7D4CF5509A470B1ACE00BE85','ARCHIVED','2016-05-26 17:06:16',0),('2016_07_16_00_characters.sql','EF267FCB92B383FFB33C700508EAF3FBC1F8AC23','ARCHIVED','2016-07-16 14:45:12',0),('2016_07_19_00_characters.sql','AA2C516FA81B451071EA82F58F447E9D13E5D1BD','ARCHIVED','2016-07-19 14:36:25',0),('2016_07_19_01_characters.sql','E9AF46AF4C7CC2E2779E44254AEEDF880D020166','ARCHIVED','2016-07-19 14:36:25',0),('2016_07_19_02_characters.sql','5B1B334449996F3639C9226F587129E03DC4BF6D','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_03_characters.sql','7787C8A67D720492FED4BF60ADB22D3CDE1C536D','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_04_characters.sql','6D4B536094367AC9EF7CDFF41A4F96EB00B25EE5','ARCHIVED','2016-07-19 14:36:26',0),('2016_07_19_05_characters.sql','12639268DC5F78CE900B59D5C646B10D70842928','ARCHIVED','2016-07-19 14:36:27',0),('2016_07_19_06_characters.sql','9F5A4B533E6BFBAA718DE5160E1FDCB8471A88BF','ARCHIVED','2016-07-19 14:36:28',0),('2016_07_19_07_characters.sql','1E8273FFD4340CBD7BB71D2406E23E9EF7230CFA','ARCHIVED','2016-07-19 14:36:29',0),('2016_07_19_08_characters.sql','FB41FD2F8A7114FEE154021A9D47488C4B12E2A9','ARCHIVED','2016-07-19 14:36:29',0),('2016_08_15_00_characters.sql','BF0B5F453384210CD77C54E262A19B888AAA4095','ARCHIVED','2016-08-14 18:14:32',0),('2016_08_25_00_characters.sql','4AD506C3FCE54238EF452AC07EC562BD41A9D50C','ARCHIVED','2016-08-25 22:54:11',0),('2016_10_17_00_characters.sql','A0EF594CD73690D46A46031137DB0E895F079235','RELEASED','2016-10-16 16:33:05',25),('2016_10_25_00_characters.sql','CC894484561CE138C10B69D34F7831CEDFAF496B','RELEASED','2016-10-25 17:19:35',0),('2016_11_06_00_characters.sql','C7EC8B65C1BE7722C53BAB79C52C1549054178C0','RELEASED','2016-11-06 23:05:44',0),('2016_12_09_00_characters.sql','2A68E4187CE7F7294CBC3804AC39F48B2727E64E','RELEASED','2016-12-09 18:38:46',0),('2016_12_26_00_characters.sql','D265DE655DDBFC13E2FA1EB021A435A21189B6E4','RELEASED','2016-12-26 18:45:15',0),('2017_01_22_00_characters.sql','62B08B5FB1DA7B207C74DC000C42517A2D6F6BCC','RELEASED','2017-01-22 02:06:31',0),('2017_01_29_00_characters.sql','E7475DCC13A0910FF23BF0EFB731629950A73A0D','RELEASED','2017-01-29 15:00:00',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/characters/master/2017_01_29_00_characters.sql b/sql/updates/characters/master/2017_01_29_00_characters.sql
new file mode 100644
index 00000000000..b7cb4126ccd
--- /dev/null
+++ b/sql/updates/characters/master/2017_01_29_00_characters.sql
@@ -0,0 +1,2 @@
+DROP TABLE IF EXISTS `character_template`;
+DROP TABLE IF EXISTS `character_template_class`;
diff --git a/sql/updates/world/master/2017_01_29_02_world.sql b/sql/updates/world/master/2017_01_29_02_world.sql
new file mode 100644
index 00000000000..d50e0a41d82
--- /dev/null
+++ b/sql/updates/world/master/2017_01_29_02_world.sql
@@ -0,0 +1,16 @@
+DROP TABLE IF EXISTS `character_template`;
+CREATE TABLE IF NOT EXISTS `character_template` (
+ `Id` int(10) unsigned NOT NULL,
+ `Name` varchar(70) NOT NULL,
+ `Description` varchar(100) NOT NULL,
+ `Level` tinyint(3) unsigned NOT NULL DEFAULT '1',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `character_template_class`;
+CREATE TABLE IF NOT EXISTS `character_template_class` (
+ `TemplateId` int(10) unsigned NOT NULL,
+ `FactionGroup` tinyint(3) unsigned NOT NULL COMMENT '3 - Alliance, 5 - Horde',
+ `Class` tinyint(3) unsigned NOT NULL,
+ PRIMARY KEY (`TemplateId`,`FactionGroup`,`Class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index 4f93df640ea..af2d0fdd355 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -73,8 +73,6 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PrepareStatement(CHAR_SEL_CHARACTER_TEMPLATES, "SELECT id, name, description, level FROM character_template", CONNECTION_SYNCH);
- PrepareStatement(CHAR_SEL_CHARACTER_TEMPLATE_CLASSES, "SELECT factionGroup, class FROM character_template_class WHERE templateId = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM_ALL, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index 414330ea187..4cbe44edcde 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -58,8 +58,6 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHAR_ZONE,
CHAR_SEL_CHAR_POSITION_XYZ,
CHAR_SEL_CHAR_POSITION,
- CHAR_SEL_CHARACTER_TEMPLATES,
- CHAR_SEL_CHARACTER_TEMPLATE_CLASSES,
CHAR_DEL_BATTLEGROUND_RANDOM_ALL,
CHAR_DEL_BATTLEGROUND_RANDOM,
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bfb0bc377f2..455aaa6b238 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -33,6 +33,7 @@
#include "Channel.h"
#include "ChannelMgr.h"
#include "CharacterDatabaseCleaner.h"
+#include "CharacterTemplateDataStore.h"
#include "CharacterPackets.h"
#include "Chat.h"
#include "ChatPackets.h"
@@ -487,6 +488,20 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
else if (getClass() == CLASS_DEMON_HUNTER)
start_level = sWorld->getIntConfig(CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL);
+ if (createInfo->TemplateSet)
+ {
+ if (m_session->HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
+ {
+ if (CharacterTemplate const* charTemplate = sCharacterTemplateDataStore->GetCharacterTemplate(*createInfo->TemplateSet))
+ {
+ if (charTemplate->Level > start_level)
+ start_level = charTemplate->Level;
+ }
+ }
+ else
+ TC_LOG_WARN("cheat", "Account: %u (IP: %s) tried to use a character template without given permission. Possible cheating attempt.", m_session->GetAccountId(), m_session->GetRemoteAddress().c_str());
+ }
+
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
{
uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
diff --git a/src/server/game/Globals/CharacterTemplateDataStore.cpp b/src/server/game/Globals/CharacterTemplateDataStore.cpp
new file mode 100644
index 00000000000..2ee235e52d9
--- /dev/null
+++ b/src/server/game/Globals/CharacterTemplateDataStore.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "CharacterTemplateDataStore.h"
+#include "DatabaseEnv.h"
+#include "DB2Stores.h"
+#include "Log.h"
+#include "Timer.h"
+
+namespace
+{
+ CharacterTemplateContainer _characterTemplateStore;
+}
+
+void CharacterTemplateDataStore::LoadCharacterTemplates()
+{
+ uint32 oldMSTime = getMSTime();
+ _characterTemplateStore.clear();
+
+ std::unordered_map<uint32, std::vector<CharacterTemplateClass>> characterTemplateClasses;
+
+ if (QueryResult classesResult = WorldDatabase.Query("SELECT TemplateId, FactionGroup, Class FROM character_template_class"))
+ {
+ do
+ {
+ Field* fields = classesResult->Fetch();
+
+ uint32 templateId = fields[0].GetUInt32();
+ uint8 factionGroup = fields[1].GetUInt8();
+ uint8 classID = fields[2].GetUInt8();
+
+ if (!((factionGroup & (FACTION_MASK_PLAYER | FACTION_MASK_ALLIANCE)) == (FACTION_MASK_PLAYER | FACTION_MASK_ALLIANCE)) &&
+ !((factionGroup & (FACTION_MASK_PLAYER | FACTION_MASK_HORDE)) == (FACTION_MASK_PLAYER | FACTION_MASK_HORDE)))
+ {
+ TC_LOG_ERROR("sql.sql", "Faction group %u defined for character template %u in `character_template_class` is invalid. Skipped.", factionGroup, templateId);
+ continue;
+ }
+
+ ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(classID);
+ if (!classEntry)
+ {
+ TC_LOG_ERROR("sql.sql", "Class %u defined for character template %u in `character_template_class` does not exists, skipped.", classID, templateId);
+ continue;
+ }
+
+ characterTemplateClasses[templateId].emplace_back(factionGroup, classID);
+ }
+ while (classesResult->NextRow());
+ }
+ else
+ {
+ TC_LOG_INFO("server.loading", ">> Loaded 0 character template classes. DB table `character_template_class` is empty.");
+ }
+
+ QueryResult templates = WorldDatabase.Query("SELECT Id, Name, Description, Level FROM character_template");
+ if (!templates)
+ {
+ TC_LOG_INFO("server.loading", ">> Loaded 0 character templates. DB table `character_template` is empty.");
+ return;
+ }
+
+ do
+ {
+ Field* fields = templates->Fetch();
+
+ CharacterTemplate templ;
+ templ.TemplateSetId = fields[0].GetUInt32();
+ templ.Name = fields[1].GetString();
+ templ.Description = fields[2].GetString();
+ templ.Level = fields[3].GetUInt8();
+ templ.Classes = std::move(characterTemplateClasses[templ.TemplateSetId]);
+
+ if (templ.Classes.empty())
+ {
+ TC_LOG_ERROR("sql.sql", "Character template %u does not have any classes defined in `character_template_class`. Skipped.", templ.TemplateSetId);
+ continue;
+ }
+
+ _characterTemplateStore[templ.TemplateSetId] = templ;
+ }
+ while (templates->NextRow());
+
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " character templates in %u ms.", _characterTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime));
+}
+
+CharacterTemplateContainer const& CharacterTemplateDataStore::GetCharacterTemplates() const
+{
+ return _characterTemplateStore;
+}
+
+CharacterTemplate const* CharacterTemplateDataStore::GetCharacterTemplate(uint32 templateId) const
+{
+ auto itr = _characterTemplateStore.find(templateId);
+ if (itr != _characterTemplateStore.end())
+ return &itr->second;
+
+ return nullptr;
+}
+
+CharacterTemplateDataStore* CharacterTemplateDataStore::Instance()
+{
+ static CharacterTemplateDataStore instance;
+ return &instance;
+}
diff --git a/src/server/game/Globals/CharacterTemplateDataStore.h b/src/server/game/Globals/CharacterTemplateDataStore.h
new file mode 100644
index 00000000000..570adb33019
--- /dev/null
+++ b/src/server/game/Globals/CharacterTemplateDataStore.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CharacterTemplateDataStore_h__
+#define CharacterTemplateDataStore_h__
+
+#include "Define.h"
+
+#include <unordered_map>
+
+struct CharacterTemplateClass
+{
+ CharacterTemplateClass(uint8 factionGroup, uint8 classID)
+ : FactionGroup(factionGroup), ClassID(classID) { }
+
+ uint8 FactionGroup;
+ uint8 ClassID;
+};
+
+struct CharacterTemplate
+{
+ uint32 TemplateSetId;
+ std::vector<CharacterTemplateClass> Classes;
+ std::string Name;
+ std::string Description;
+ uint8 Level;
+};
+
+typedef std::unordered_map<uint32, CharacterTemplate> CharacterTemplateContainer;
+
+class TC_GAME_API CharacterTemplateDataStore
+{
+public:
+ void LoadCharacterTemplates();
+
+ CharacterTemplateContainer const& GetCharacterTemplates() const;
+ CharacterTemplate const* GetCharacterTemplate(uint32 templateId) const;
+
+ static CharacterTemplateDataStore* Instance();
+};
+
+#define sCharacterTemplateDataStore CharacterTemplateDataStore::Instance()
+
+#endif // CharacterTemplateDataStore_h__
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 1ee182f4273..0144dc27549 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -9407,81 +9407,6 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements()
TC_LOG_INFO("server.loading", ">> Loaded 0 class expansion requirements. DB table `class_expansion_requirement` is empty.");
}
-void ObjectMgr::LoadCharacterTemplates()
-{
- uint32 oldMSTime = getMSTime();
- _characterTemplateStore.clear();
-
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_TEMPLATES);
- PreparedQueryResult templates = CharacterDatabase.Query(stmt);
-
- if (!templates)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 character templates. DB table `character_template` is empty.");
- return;
- }
-
- PreparedQueryResult classes;
- uint32 count = 0;
-
- do
- {
- Field* fields = templates->Fetch();
-
- uint32 templateSetId = fields[0].GetUInt32();
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_TEMPLATE_CLASSES);
- stmt->setUInt32(0, templateSetId);
- classes = CharacterDatabase.Query(stmt);
-
- if (classes)
- {
- CharacterTemplate templ;
- templ.TemplateSetId = templateSetId;
- templ.Name = fields[1].GetString();
- templ.Description = fields[2].GetString();
- templ.Level = fields[3].GetUInt8();
-
- do
- {
- fields = classes->Fetch();
-
- uint8 factionGroup = fields[0].GetUInt8();
- uint8 classID = fields[1].GetUInt8();
-
- if (!((factionGroup & (FACTION_MASK_PLAYER | FACTION_MASK_ALLIANCE)) == (FACTION_MASK_PLAYER | FACTION_MASK_ALLIANCE)) &&
- !((factionGroup & (FACTION_MASK_PLAYER | FACTION_MASK_HORDE)) == (FACTION_MASK_PLAYER | FACTION_MASK_HORDE)))
- {
- TC_LOG_ERROR("sql.sql", "Faction group %u defined for character template %u in `character_template_class` is invalid. Skipped.", factionGroup, templateSetId);
- continue;
- }
-
- ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(classID);
- if (!classEntry)
- {
- TC_LOG_ERROR("sql.sql", "Class %u defined for character template %u in `character_template_class` does not exists, skipped.", classID, templateSetId);
- continue;
- }
-
- templ.Classes.emplace_back(factionGroup, classID);
-
- } while (classes->NextRow());
-
- if (!templ.Classes.empty())
- {
- _characterTemplateStore[templateSetId] = templ;
- ++count;
- }
- }
- else
- {
- TC_LOG_ERROR("sql.sql", "Character template %u does not have any classes defined in `character_template_class`. Skipped.", templateSetId);
- continue;
- }
- } while (templates->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %u character templates in %u ms.", count, GetMSTimeDiffToNow(oldMSTime));
-}
-
void ObjectMgr::LoadRealmNames()
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index d8fc9830844..03cc59171af 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -604,26 +604,6 @@ typedef std::unordered_map<uint32, TrainerSpellData> CacheTrainerSpellContainer;
typedef std::unordered_map<uint8, uint8> ExpansionRequirementContainer;
typedef std::unordered_map<uint32, std::string> RealmNameContainer;
-struct CharcterTemplateClass
-{
- CharcterTemplateClass(uint8 factionGroup, uint8 classID) :
- FactionGroup(factionGroup), ClassID(classID) { }
-
- uint8 FactionGroup;
- uint8 ClassID;
-};
-
-struct CharacterTemplate
-{
- uint32 TemplateSetId;
- std::vector<CharcterTemplateClass> Classes;
- std::string Name;
- std::string Description;
- uint8 Level;
-};
-
-typedef std::unordered_map<uint32, CharacterTemplate> CharacterTemplateContainer;
-
struct SceneTemplate
{
uint32 SceneId;
@@ -1381,7 +1361,6 @@ class TC_GAME_API ObjectMgr
bool IsTransportMap(uint32 mapId) const { return _transportMaps.count(mapId) != 0; }
void LoadRaceAndClassExpansionRequirements();
- void LoadCharacterTemplates();
void LoadRealmNames();
std::string GetRealmName(uint32 realm) const;
@@ -1405,16 +1384,6 @@ class TC_GAME_API ObjectMgr
return EXPANSION_CLASSIC;
}
- CharacterTemplateContainer const& GetCharacterTemplates() const { return _characterTemplateStore; }
- CharacterTemplate const* GetCharacterTemplate(uint32 id) const
- {
- auto itr = _characterTemplateStore.find(id);
- if (itr != _characterTemplateStore.end())
- return &itr->second;
-
- return nullptr;
- }
-
SceneTemplate const* GetSceneTemplate(uint32 sceneId) const
{
auto itr = _sceneTemplateStore.find(sceneId);
@@ -1576,7 +1545,6 @@ class TC_GAME_API ObjectMgr
ExpansionRequirementContainer _classExpansionRequirementStore;
RealmNameContainer _realmNameStore;
- CharacterTemplateContainer _characterTemplateStore;
SceneTemplateContainer _sceneTemplateStore;
enum CreatureLinkedRespawnType
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index c4309271b7d..342982bbe00 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -18,6 +18,7 @@
#include "WorldSession.h"
#include "AuthenticationPackets.h"
#include "BattlenetRpcErrorCodes.h"
+#include "CharacterTemplateDataStore.h"
#include "ClientConfigPackets.h"
#include "ObjectMgr.h"
#include "SystemPackets.h"
@@ -41,8 +42,8 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos)
sObjectMgr->GetRealmName(realm.Id.Realm), sObjectMgr->GetNormalizedRealmName(realm.Id.Realm));
if (HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
- for (auto& templ : sObjectMgr->GetCharacterTemplates())
- response.SuccessInfo->Templates.emplace_back(templ.second);
+ for (auto const& templ : sCharacterTemplateDataStore->GetCharacterTemplates())
+ response.SuccessInfo->Templates.push_back(&templ.second);
response.SuccessInfo->AvailableClasses = &sObjectMgr->GetClassExpansionRequirements();
response.SuccessInfo->AvailableRaces = &sObjectMgr->GetRaceExpansionRequirements();
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index c32f6d4a149..d97a020b56e 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -761,25 +761,6 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
LoginDatabase.CommitTransaction(trans);
- if (createInfo->TemplateSet)
- {
- if (HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
- {
- if (CharacterTemplate const* charTemplate = sObjectMgr->GetCharacterTemplate(*createInfo->TemplateSet))
- {
- if (charTemplate->Level != 1)
- {
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_LEVEL);
- stmt->setUInt8(0, uint8(charTemplate->Level));
- stmt->setUInt64(1, newChar.GetGUID().GetCounter());
- CharacterDatabase.Execute(stmt);
- }
- }
- }
- else
- TC_LOG_WARN("cheat", "Account: %u (IP: %s) tried to use a character template without given permission. Possible cheating attempt.", GetAccountId(), GetRemoteAddress().c_str());
- }
-
SendCharCreate(CHAR_CREATE_SUCCESS);
TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Create Character: %s %s", GetAccountId(), GetRemoteAddress().c_str(), createInfo->Name.c_str(), newChar.GetGUID().ToString().c_str());
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index d8e94418d8e..70dec6bd274 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -16,6 +16,7 @@
*/
#include "AuthenticationPackets.h"
+#include "CharacterTemplateDataStore.h"
#include "HmacHash.h"
bool WorldPackets::Auth::EarlyProcessClientPacket::ReadNoThrow()
@@ -109,13 +110,13 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket << uint32(SuccessInfo->CurrencyID);
_worldPacket << int32(SuccessInfo->Time);
- for (auto& race : *SuccessInfo->AvailableRaces)
+ for (auto const& race : *SuccessInfo->AvailableRaces)
{
_worldPacket << uint8(race.first); /// the current race
_worldPacket << uint8(race.second); /// the required Expansion
}
- for (auto& klass : *SuccessInfo->AvailableClasses)
+ for (auto const& klass : *SuccessInfo->AvailableClasses)
{
_worldPacket << uint8(klass.first); /// the current class
_worldPacket << uint8(klass.second); /// the required Expansion
@@ -143,7 +144,7 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
if (SuccessInfo->NumPlayersAlliance)
_worldPacket << uint16(*SuccessInfo->NumPlayersAlliance);
- for (auto& virtualRealm : SuccessInfo->VirtualRealms)
+ for (auto const& virtualRealm : SuccessInfo->VirtualRealms)
{
_worldPacket << uint32(virtualRealm.RealmAddress);
_worldPacket.WriteBit(virtualRealm.IsLocal);
@@ -156,22 +157,22 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket.WriteString(virtualRealm.RealmNameNormalized);
}
- for (auto& templat : SuccessInfo->Templates)
+ for (CharacterTemplate const* templat : SuccessInfo->Templates)
{
- _worldPacket << uint32(templat.TemplateSetId);
- _worldPacket << uint32(templat.Classes.size());
- for (auto& templateClass : templat.Classes)
+ _worldPacket << uint32(templat->TemplateSetId);
+ _worldPacket << uint32(templat->Classes.size());
+ for (CharacterTemplateClass const& templateClass : templat->Classes)
{
_worldPacket << uint8(templateClass.ClassID);
_worldPacket << uint8(templateClass.FactionGroup);
}
- _worldPacket.WriteBits(templat.Name.length(), 7);
- _worldPacket.WriteBits(templat.Description.length(), 10);
+ _worldPacket.WriteBits(templat->Name.length(), 7);
+ _worldPacket.WriteBits(templat->Description.length(), 10);
_worldPacket.FlushBits();
- _worldPacket.WriteString(templat.Name);
- _worldPacket.WriteString(templat.Description);
+ _worldPacket.WriteString(templat->Name);
+ _worldPacket.WriteString(templat->Description);
}
}
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index b5fc2b62044..68f32e6ce5e 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -25,6 +25,8 @@
#include "SHA1.h"
#include <boost/asio/ip/tcp.hpp>
+struct CharacterTemplate;
+
using boost::asio::ip::tcp;
namespace WorldPackets
@@ -142,7 +144,7 @@ namespace WorldPackets
BillingInfo Billing;
std::vector<RealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement
- std::vector<CharacterTemplate> Templates; ///< list of pre-made character templates.
+ std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates.
ExpansionRequirementContainer const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes
ExpansionRequirementContainer const* AvailableRaces = nullptr; ///< the minimum AccountExpansion required to select the races
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 382d1cd3b65..aa34b58a910 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -34,6 +34,7 @@
#include "CalendarMgr.h"
#include "Channel.h"
#include "CharacterDatabaseCleaner.h"
+#include "CharacterTemplateDataStore.h"
#include "Chat.h"
#include "Config.h"
#include "CreatureAIRegistry.h"
@@ -2117,7 +2118,7 @@ void World::SetInitialWorldSettings()
sObjectMgr->LoadRaceAndClassExpansionRequirements();
TC_LOG_INFO("server.loading", "Loading character templates...");
- sObjectMgr->LoadCharacterTemplates();
+ sCharacterTemplateDataStore->LoadCharacterTemplates();
TC_LOG_INFO("server.loading", "Loading realm names...");
sObjectMgr->LoadRealmNames();
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 4bc97623254..e547002ea37 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -27,6 +27,7 @@ EndScriptData */
#include "AreaTriggerDataStore.h"
#include "AuctionHouseMgr.h"
#include "BattlegroundMgr.h"
+#include "CharacterTemplateDataStore.h"
#include "Chat.h"
#include "CreatureTextMgr.h"
#include "DisableMgr.h"
@@ -387,7 +388,7 @@ public:
static bool HandleReloadCharacterTemplate(ChatHandler* handler, char const* /*args*/)
{
TC_LOG_INFO("misc", "Re-Loading Character Templates...");
- sObjectMgr->LoadCharacterTemplates();
+ sCharacterTemplateDataStore->LoadCharacterTemplates();
handler->SendGlobalGMSysMessage("DB table `character_template` and `character_template_class` reloaded.");
return true;
}