diff options
80 files changed, 15338 insertions, 3266 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 316d02288b7..ce07da33798 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -705,6 +705,29 @@ LOCK TABLES `character_currency` WRITE; UNLOCK TABLES; -- +-- Table structure for table `character_customizations` +-- +DROP TABLE IF EXISTS `character_customizations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `character_customizations` ( + `guid` bigint(20) unsigned NOT NULL, + `chrCustomizationOptionID` int(10) unsigned NOT NULL, + `chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guid`,`chrCustomizationOptionID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_customizations` +-- + +LOCK TABLES `character_customizations` WRITE; +/*!40000 ALTER TABLE `character_customizations` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_customizations` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `character_declinedname` -- @@ -1736,14 +1759,6 @@ CREATE TABLE `characters` ( `level` tinyint(3) unsigned NOT NULL DEFAULT '0', `xp` int(10) unsigned NOT NULL DEFAULT '0', `money` bigint(20) unsigned NOT NULL DEFAULT '0', - `skin` tinyint(3) unsigned NOT NULL DEFAULT '0', - `face` tinyint(3) unsigned NOT NULL DEFAULT '0', - `hairStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', - `hairColor` tinyint(3) unsigned NOT NULL DEFAULT '0', - `facialStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', - `customDisplay1` tinyint(3) unsigned NOT NULL DEFAULT '0', - `customDisplay2` tinyint(3) unsigned NOT NULL DEFAULT '0', - `customDisplay3` tinyint(3) unsigned NOT NULL DEFAULT '0', `inventorySlots` tinyint(3) unsigned NOT NULL DEFAULT '16', `bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0', `restState` tinyint(3) unsigned NOT NULL DEFAULT '0', @@ -1841,8 +1856,8 @@ CREATE TABLE `corpse` ( `mapId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Map Identifier', `displayId` int(10) unsigned NOT NULL DEFAULT '0', `itemCache` text NOT NULL, - `bytes1` int(10) unsigned NOT NULL DEFAULT '0', - `bytes2` int(10) unsigned NOT NULL DEFAULT '0', + `race` tinyint(3) unsigned NOT NULL DEFAULT '0', + `gender` tinyint(3) unsigned NOT NULL DEFAULT '0', `flags` tinyint(3) unsigned NOT NULL DEFAULT '0', `dynFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', `time` int(10) unsigned NOT NULL DEFAULT '0', @@ -1865,6 +1880,30 @@ LOCK TABLES `corpse` WRITE; UNLOCK TABLES; -- +-- Table structure for table `corpse_customizations` +-- + +DROP TABLE IF EXISTS `corpse_customizations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `corpse_customizations` ( + `ownerGuid` bigint(20) unsigned NOT NULL, + `chrCustomizationOptionID` int(10) unsigned NOT NULL, + `chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`ownerGuid`,`chrCustomizationOptionID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `corpse_customizations` +-- + +LOCK TABLES `corpse_customizations` WRITE; +/*!40000 ALTER TABLE `corpse_customizations` DISABLE KEYS */; +/*!40000 ALTER TABLE `corpse_customizations` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `corpse_phases` -- @@ -3780,7 +3819,8 @@ INSERT INTO `updates` VALUES ('2020_06_12_00_characters.sql','DF16C99EFACA4DFADDDF35644AAC63F9B4AA2BD6','ARCHIVED','2020-06-11 16:24:56',0), ('2020_06_17_00_characters.sql','C3EE0D751E4B97CDF15F3BE27AAAE3646514A358','ARCHIVED','2020-06-17 17:04:56',0), ('2020_08_14_00_characters.sql','355685FF86EE64E2ED9D4B7D1311D53A9C2E0FA5','ARCHIVED','2020-08-14 21:41:24',0), -('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0); +('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0), +('2020_11_16_00_characters.sql','8F9D4738BA4A91307AD90F7B5C9AEA998CE82CF1','RELEASED','2020-11-16 19:16:31',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2020_11_16_00_characters.sql b/sql/updates/characters/master/2020_11_16_00_characters.sql new file mode 100644 index 00000000000..52cd9c89b42 --- /dev/null +++ b/sql/updates/characters/master/2020_11_16_00_characters.sql @@ -0,0 +1,8660 @@ +-- Prepare conversion data +-- +-- Table structure for table `chr_customization_conversion` +-- +DROP TABLE IF EXISTS `chr_customization_conversion`; +CREATE TABLE `chr_customization_conversion` ( + `ID` int NOT NULL, + `RaceMask` bigint unsigned DEFAULT NULL, + `ClassMask` int unsigned DEFAULT NULL, + `Sex` int DEFAULT NULL, + `OptionID` int DEFAULT NULL, + `Data` int DEFAULT NULL, + `ChrCustomizationOptionID` int DEFAULT NULL, + `ChrCustomizationChoiceID` int DEFAULT NULL, + `DependentOptionID` int DEFAULT NULL, + `DependentData` int DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `chr_customization_conversion` +-- +LOCK TABLES `chr_customization_conversion` WRITE; +ALTER TABLE `chr_customization_conversion` DISABLE KEYS; +INSERT INTO `chr_customization_conversion` VALUES +(1,1,4095,0,1,0,9,1,0,0), +(2,1,4095,0,1,1,9,2,0,0), +(3,1,4095,0,1,2,9,3,0,0), +(4,1,4095,0,1,3,9,4,0,0), +(5,1,4095,0,1,4,9,5,0,0), +(6,1,4095,0,1,5,9,6,0,0), +(7,1,4095,0,1,6,9,7,0,0), +(8,1,4095,0,1,7,9,8,0,0), +(9,1,4095,0,1,8,9,9,0,0), +(10,1,4095,0,1,9,9,10,0,0), +(11,1,4095,0,1,10,9,11,0,0), +(12,1,4095,0,1,11,9,12,0,0), +(13,1,32,0,1,12,9,13,0,0), +(14,1,32,0,1,13,9,14,0,0), +(15,1,32,0,1,14,9,15,0,0), +(16,1,4095,0,1,15,9,16,0,0), +(17,1,4095,0,1,16,9,17,0,0), +(18,1,4095,0,1,17,9,18,0,0), +(20,1,4095,0,2,0,10,20,0,0), +(21,1,4095,0,2,1,10,21,0,0), +(22,1,4095,0,2,2,10,22,0,0), +(23,1,4095,0,2,3,10,23,0,0), +(24,1,4095,0,2,4,10,24,0,0), +(25,1,4095,0,2,5,10,25,0,0), +(26,1,4095,0,2,6,10,26,0,0), +(27,1,4095,0,2,7,10,27,0,0), +(28,1,4095,0,2,8,10,28,0,0), +(29,1,4095,0,2,9,10,29,0,0), +(30,1,4095,0,2,10,10,30,0,0), +(31,1,4095,0,2,11,10,31,0,0), +(32,1,4095,0,2,12,10,20,0,0), +(33,1,4095,0,2,13,10,21,0,0), +(34,1,4095,0,2,14,10,22,0,0), +(35,1,4095,0,2,15,10,23,0,0), +(36,1,4095,0,2,16,10,24,0,0), +(37,1,4095,0,2,17,10,25,0,0), +(38,1,4095,0,2,18,10,26,0,0), +(39,1,4095,0,2,19,10,27,0,0), +(40,1,4095,0,2,20,10,28,0,0), +(41,1,4095,0,2,21,10,29,0,0), +(42,1,4095,0,2,22,10,30,0,0), +(43,1,4095,0,2,23,10,31,0,0), +(44,1,4095,0,3,0,11,44,0,0), +(45,1,4095,0,3,1,11,45,0,0), +(46,1,4095,0,3,2,11,46,0,0), +(47,1,4095,0,3,3,11,47,0,0), +(48,1,4095,0,3,4,11,48,0,0), +(49,1,4095,0,3,5,11,49,0,0), +(50,1,4095,0,3,6,11,50,0,0), +(51,1,4095,0,3,7,11,51,0,0), +(52,1,4095,0,3,8,11,52,0,0), +(53,1,4095,0,3,9,11,53,0,0), +(54,1,4095,0,3,10,11,54,0,0), +(55,1,4095,0,3,11,11,55,0,0), +(56,1,4095,0,3,12,11,56,0,0), +(57,1,4095,0,3,13,11,57,0,0), +(58,1,4095,0,3,14,11,58,0,0), +(59,1,4095,0,3,15,11,59,0,0), +(60,1,4095,0,3,16,11,60,0,0), +(61,1,4095,0,4,0,12,61,0,0), +(62,1,4095,0,4,1,12,62,0,0), +(63,1,4095,0,4,2,12,63,0,0), +(64,1,4095,0,4,3,12,64,0,0), +(65,1,4095,0,4,4,12,65,0,0), +(66,1,4095,0,4,5,12,66,0,0), +(67,1,4095,0,4,6,12,67,0,0), +(68,1,4095,0,4,7,12,68,0,0), +(69,1,4095,0,4,8,12,69,0,0), +(70,1,4095,0,4,9,12,70,0,0), +(71,1,4095,0,4,10,12,71,0,0), +(72,1,4095,0,4,11,12,72,0,0), +(73,1,4095,0,4,12,12,73,0,0), +(74,1,4095,0,4,13,12,74,0,0), +(76,1,4095,0,5,0,13,81,0,0), +(77,1,4095,0,5,1,13,82,0,0), +(78,1,4095,0,5,2,13,83,0,0), +(79,1,4095,0,5,3,13,77,0,0), +(80,1,4095,0,5,4,13,77,0,0), +(81,1,4095,0,5,5,13,76,0,0), +(82,1,4095,0,5,6,13,77,0,0), +(83,1,4095,0,5,7,13,76,0,0), +(84,1,4095,0,5,8,13,76,0,0), +(85,1,4095,1,1,0,14,85,0,0), +(86,1,4095,1,1,1,14,86,0,0), +(87,1,4095,1,1,2,14,87,0,0), +(88,1,4095,1,1,3,14,88,0,0), +(89,1,4095,1,1,4,14,89,0,0), +(90,1,4095,1,1,5,14,90,0,0), +(91,1,4095,1,1,6,14,91,0,0), +(92,1,4095,1,1,7,14,92,0,0), +(93,1,4095,1,1,8,14,93,0,0), +(94,1,4095,1,1,9,14,94,0,0), +(95,1,4095,1,1,10,14,95,0,0), +(96,1,4095,1,1,11,14,96,0,0), +(97,1,32,1,1,12,14,97,0,0), +(98,1,32,1,1,13,14,98,0,0), +(99,1,32,1,1,14,14,99,0,0), +(100,1,4095,1,1,15,14,100,0,0), +(101,1,4095,1,1,16,14,101,0,0), +(102,1,4095,1,2,0,15,102,0,0), +(103,1,4095,1,2,1,15,103,0,0), +(104,1,4095,1,2,2,15,104,0,0), +(105,1,4095,1,2,3,15,105,0,0), +(106,1,4095,1,2,4,15,106,0,0), +(107,1,4095,1,2,5,15,107,0,0), +(108,1,4095,1,2,6,15,108,0,0), +(109,1,4095,1,2,7,15,109,0,0), +(110,1,4095,1,2,8,15,110,0,0), +(111,1,4095,1,2,9,15,111,0,0), +(112,1,4095,1,2,10,15,112,0,0), +(113,1,4095,1,2,11,15,113,0,0), +(114,1,4095,1,2,12,15,114,0,0), +(115,1,4095,1,2,13,15,115,0,0), +(116,1,4095,1,2,14,15,116,0,0), +(117,1,4095,1,2,15,15,102,0,0), +(118,1,4095,1,2,16,15,103,0,0), +(119,1,4095,1,2,17,15,104,0,0), +(120,1,4095,1,2,18,15,105,0,0), +(121,1,4095,1,2,19,15,106,0,0), +(122,1,4095,1,2,20,15,107,0,0), +(123,1,4095,1,2,21,15,108,0,0), +(124,1,4095,1,2,22,15,109,0,0), +(125,1,4095,1,2,23,15,110,0,0), +(126,1,4095,1,2,24,15,111,0,0), +(127,1,4095,1,2,25,15,112,0,0), +(128,1,4095,1,2,26,15,113,0,0), +(129,1,4095,1,2,27,15,114,0,0), +(130,1,4095,1,2,28,15,115,0,0), +(131,1,4095,1,2,29,15,116,0,0), +(132,1,4095,1,3,0,16,132,0,0), +(133,1,4095,1,3,1,16,133,0,0), +(134,1,4095,1,3,2,16,134,0,0), +(135,1,4095,1,3,3,16,135,0,0), +(136,1,4095,1,3,4,16,136,0,0), +(137,1,4095,1,3,5,16,137,0,0), +(138,1,4095,1,3,6,16,138,0,0), +(139,1,4095,1,3,7,16,139,0,0), +(140,1,4095,1,3,8,16,140,0,0), +(141,1,4095,1,3,9,16,141,0,0), +(142,1,4095,1,3,10,16,142,0,0), +(143,1,4095,1,3,11,16,143,0,0), +(144,1,4095,1,3,12,16,144,0,0), +(145,1,4095,1,3,13,16,145,0,0), +(146,1,4095,1,3,14,16,146,0,0), +(147,1,4095,1,3,15,16,147,0,0), +(148,1,4095,1,3,16,16,148,0,0), +(149,1,4095,1,3,17,16,149,0,0), +(150,1,4095,1,3,18,16,150,0,0), +(151,1,4095,1,3,19,16,151,0,0), +(152,1,4095,1,3,20,16,152,0,0), +(153,1,4095,1,3,21,16,153,0,0), +(154,1,4095,1,3,22,16,154,0,0), +(155,1,4095,1,3,23,16,155,0,0), +(156,1,4095,1,4,0,17,156,0,0), +(157,1,4095,1,4,1,17,157,0,0), +(158,1,4095,1,4,2,17,158,0,0), +(159,1,4095,1,4,3,17,159,0,0), +(160,1,4095,1,4,4,17,160,0,0), +(161,1,4095,1,4,5,17,161,0,0), +(162,1,4095,1,4,6,17,162,0,0), +(163,1,4095,1,4,7,17,163,0,0), +(164,1,4095,1,4,8,17,164,0,0), +(165,1,4095,1,4,9,17,165,0,0), +(166,1,4095,1,4,10,17,166,0,0), +(167,1,4095,1,4,11,17,167,0,0), +(168,1,4095,1,4,12,17,168,0,0), +(169,1,4095,1,4,13,17,169,0,0), +(177,2,4095,0,1,0,19,353,0,0), +(178,2,4095,0,1,1,19,354,0,0), +(179,2,4095,0,1,2,19,355,0,0), +(180,2,4095,0,1,3,19,356,0,0), +(181,2,4095,0,1,4,19,357,0,0), +(182,2,4095,0,1,5,19,358,0,0), +(183,2,4095,0,1,6,19,359,0,0), +(184,2,4095,0,1,7,19,360,0,0), +(185,2,4095,0,1,8,19,361,0,0), +(186,2,4095,0,1,9,19,362,0,0), +(187,2,4095,0,1,10,19,363,0,0), +(188,2,4095,0,1,11,19,364,0,0), +(189,2,4095,0,1,12,19,365,0,0), +(190,2,4095,0,1,13,19,366,0,0), +(191,2,4095,0,1,14,19,367,0,0), +(192,2,32,0,1,15,19,368,0,0), +(193,2,32,0,1,16,19,369,0,0), +(194,2,32,0,1,17,19,370,0,0), +(195,2,4095,0,1,18,19,371,0,0), +(196,2,4095,0,1,19,19,372,0,0), +(197,2,4095,0,1,20,19,373,0,0), +(198,2,4095,0,1,21,19,374,0,0), +(199,2,4095,0,1,22,19,375,0,0), +(200,2,4095,0,1,23,19,376,0,0), +(201,2,4095,0,1,24,19,377,0,0), +(202,2,4095,0,1,25,19,378,0,0), +(203,2,4095,0,1,26,19,379,0,0), +(204,2,4095,0,1,27,19,380,0,0), +(205,2,4095,0,1,28,19,381,0,0), +(206,2,4095,0,1,29,19,382,0,0), +(207,2,4095,0,1,30,19,383,0,0), +(208,2,4063,0,2,0,20,384,1,0), +(209,2,4063,0,2,1,20,385,1,0), +(210,2,4063,0,2,2,20,386,0,0), +(211,2,4063,0,2,3,20,387,0,0), +(212,2,4063,0,2,4,20,388,0,0), +(213,2,4063,0,2,5,20,389,1,0), +(214,2,4063,0,2,6,20,390,0,0), +(215,2,4063,0,2,7,20,391,0,0), +(216,2,4063,0,2,8,20,392,0,0), +(217,2,32,0,2,9,20,393,0,0), +(218,2,32,0,2,10,20,394,0,0), +(219,2,32,0,2,11,20,395,0,0), +(220,2,32,0,2,12,20,396,0,0), +(221,2,32,0,2,13,20,397,0,0), +(222,2,32,0,2,14,20,398,0,0), +(223,2,32,0,2,15,20,399,0,0), +(224,2,32,0,2,16,20,400,0,0), +(225,2,32,0,2,17,20,401,0,0), +(226,2,4095,0,3,0,21,402,0,0), +(227,2,4095,0,3,1,21,403,0,0), +(228,2,4095,0,3,2,21,404,0,0), +(229,2,4095,0,3,3,21,405,0,0), +(230,2,4095,0,3,4,21,406,0,0), +(231,2,4095,0,3,5,21,407,0,0), +(232,2,4095,0,3,6,21,408,0,0), +(233,2,4095,0,3,7,21,409,0,0), +(234,2,4095,0,3,8,21,410,0,0), +(235,2,4095,0,3,9,21,411,0,0), +(236,2,4095,0,3,10,21,412,0,0), +(237,2,4095,0,3,11,21,413,0,0), +(238,2,4095,0,3,12,21,414,0,0), +(239,2,4095,0,4,0,22,415,0,0), +(240,2,4095,0,4,1,22,416,0,0), +(241,2,4095,0,4,2,22,417,0,0), +(242,2,4095,0,4,3,22,418,0,0), +(243,2,4095,0,4,4,22,419,0,0), +(244,2,4095,0,4,5,22,420,0,0), +(245,2,4095,0,4,6,22,421,0,0), +(246,2,4095,0,4,7,22,422,0,0), +(247,2,4095,0,4,8,22,423,0,0), +(248,2,4095,0,4,9,22,424,0,0), +(249,2,4095,0,4,10,22,425,0,0), +(250,2,4095,0,4,11,22,426,0,0), +(251,2,4095,0,5,0,23,427,0,0), +(252,2,4095,0,5,1,23,428,0,0), +(253,2,4095,0,5,2,23,433,0,0), +(254,2,4095,0,5,3,23,432,0,0), +(255,2,4095,0,5,4,23,434,0,0), +(256,2,4095,0,5,5,23,436,0,0), +(257,2,4095,0,5,6,23,9813,0,0), +(258,2,4095,0,5,7,23,427,0,0), +(259,2,4095,0,5,8,23,437,0,0), +(260,2,4095,0,5,9,23,431,0,0), +(261,2,4095,0,5,10,23,430,0,0), +(262,2,4095,0,8,0,24,438,0,0), +(263,2,4095,0,8,1,24,439,0,0), +(264,2,4095,1,1,0,25,440,0,0), +(265,2,4095,1,1,1,25,441,0,0), +(266,2,4095,1,1,2,25,442,0,0), +(267,2,4095,1,1,3,25,443,0,0), +(268,2,4095,1,1,4,25,444,0,0), +(269,2,4095,1,1,5,25,445,0,0), +(270,2,4095,1,1,6,25,446,0,0), +(271,2,4095,1,1,7,25,447,0,0), +(272,2,4095,1,1,8,25,448,0,0), +(273,2,4095,1,1,9,25,449,0,0), +(274,2,4095,1,1,10,25,450,0,0), +(275,2,32,1,1,11,25,451,0,0), +(276,2,32,1,1,12,25,452,0,0), +(277,2,32,1,1,13,25,453,0,0), +(278,2,4095,1,1,14,25,454,0,0), +(279,2,4095,1,1,15,25,455,0,0), +(280,2,4095,1,1,16,25,456,0,0), +(281,2,4095,1,1,17,25,457,0,0), +(282,2,4095,1,1,18,25,458,0,0), +(283,2,4095,1,1,19,25,459,0,0), +(284,2,4095,1,1,20,25,460,0,0), +(285,2,4095,1,1,21,25,461,0,0), +(286,2,4095,1,1,22,25,462,0,0), +(287,2,4095,1,1,23,25,463,0,0), +(288,2,4095,1,1,24,25,464,0,0), +(289,2,4095,1,1,25,25,465,0,0), +(290,2,4095,1,1,26,25,466,0,0), +(291,2,4095,1,1,27,25,467,0,0), +(292,2,4095,1,1,28,25,468,0,0), +(293,2,4095,1,1,29,25,469,0,0), +(294,2,4095,1,1,30,25,470,0,0), +(295,2,4095,1,1,31,25,471,0,0), +(296,2,4063,1,2,0,26,472,1,0), +(297,2,4063,1,2,1,26,473,0,0), +(298,2,4063,1,2,2,26,474,0,0), +(299,2,4063,1,2,3,26,475,0,0), +(300,2,4063,1,2,4,26,476,0,0), +(301,2,4063,1,2,5,26,477,0,0), +(302,2,4063,1,2,6,26,478,0,0), +(303,2,4063,1,2,7,26,479,1,0), +(304,2,4063,1,2,8,26,480,1,0), +(305,2,32,1,2,9,26,481,0,0), +(306,2,32,1,2,10,26,482,0,0), +(307,2,32,1,2,11,26,483,0,0), +(308,2,32,1,2,12,26,484,0,0), +(309,2,32,1,2,13,26,485,0,0), +(310,2,32,1,2,14,26,486,0,0), +(311,2,32,1,2,15,26,487,0,0), +(312,2,32,1,2,16,26,488,0,0), +(313,2,32,1,2,17,26,489,0,0), +(314,2,4095,1,3,0,27,490,0,0), +(315,2,4095,1,3,1,27,491,0,0), +(316,2,4095,1,3,2,27,492,0,0), +(317,2,4095,1,3,3,27,493,0,0), +(318,2,4095,1,3,4,27,494,0,0), +(319,2,4095,1,3,5,27,495,0,0), +(320,2,4095,1,3,6,27,496,0,0), +(321,2,4095,1,3,7,27,497,0,0), +(322,2,4095,1,3,8,27,498,0,0), +(323,2,4095,1,3,9,27,499,0,0), +(324,2,4095,1,3,10,27,500,0,0), +(325,2,4095,1,3,11,27,501,0,0), +(326,2,4095,1,3,12,27,502,0,0), +(327,2,4095,1,3,13,27,503,0,0), +(328,2,4095,1,3,14,27,504,0,0), +(329,2,4095,1,4,0,28,505,0,0), +(330,2,4095,1,4,1,28,506,0,0), +(331,2,4095,1,4,2,28,507,0,0), +(332,2,4095,1,4,3,28,508,0,0), +(333,2,4095,1,4,4,28,509,0,0), +(334,2,4095,1,4,5,28,510,0,0), +(335,2,4095,1,4,6,28,511,0,0), +(336,2,4095,1,4,7,28,512,0,0), +(337,2,4095,1,4,8,28,513,0,0), +(338,2,4095,1,4,9,28,514,0,0), +(339,2,4095,1,4,10,28,515,0,0), +(340,2,4095,1,4,11,28,516,0,0), +(341,2,4095,1,5,0,29,517,0,0), +(342,2,4095,1,5,1,29,518,0,0), +(343,2,4095,1,5,2,29,519,0,0), +(344,2,4095,1,5,3,29,517,0,0), +(345,2,4095,1,5,4,29,518,0,0), +(346,2,4095,1,5,5,29,519,0,0), +(347,2,4095,1,5,6,29,521,0,0), +(348,4,4095,0,1,0,30,524,0,0), +(349,4,4095,0,1,1,30,525,0,0), +(350,4,4095,0,1,2,30,526,0,0), +(351,4,4095,0,1,3,30,527,0,0), +(352,4,4095,0,1,4,30,528,0,0), +(353,4,4095,0,1,5,30,529,0,0), +(354,4,4095,0,1,6,30,530,0,0), +(355,4,4095,0,1,7,30,531,0,0), +(356,4,4095,0,1,8,30,532,0,0), +(357,4,4095,0,1,9,30,533,0,0), +(358,4,4095,0,1,10,30,534,0,0), +(359,4,4095,0,1,11,30,535,0,0), +(360,4,4095,0,1,12,30,536,0,0), +(361,4,4095,0,1,13,30,537,0,0), +(362,4,4095,0,1,14,30,538,0,0), +(363,4,4095,0,1,15,30,539,0,0), +(364,4,4095,0,1,16,30,540,0,0), +(365,4,4095,0,1,17,30,541,0,0), +(366,4,4095,0,1,18,30,542,0,0), +(367,4,32,0,1,19,30,543,0,0), +(368,4,32,0,1,20,30,544,0,0), +(369,4,32,0,1,21,30,545,0,0), +(370,4,4095,0,1,22,30,546,0,0), +(371,4,4095,0,1,23,30,547,0,0), +(372,4,4095,0,1,24,30,548,0,0), +(373,4,4095,0,1,25,30,549,0,0), +(374,4,4095,0,1,26,30,550,0,0), +(375,4,4063,0,2,0,31,551,1,0), +(376,4,4063,0,2,1,31,552,1,0), +(377,4,4063,0,2,2,31,553,0,0), +(378,4,4063,0,2,3,31,554,0,0), +(379,4,4063,0,2,4,31,555,0,0), +(380,4,4063,0,2,5,31,556,0,0), +(381,4,4063,0,2,6,31,557,0,0), +(382,4,4063,0,2,7,31,558,0,0), +(383,4,4063,0,2,8,31,559,0,0), +(384,4,4063,0,2,9,31,560,1,0), +(385,4,32,0,2,10,31,561,0,0), +(386,4,32,0,2,11,31,562,0,0), +(387,4,32,0,2,12,31,563,0,0), +(388,4,32,0,2,13,31,564,0,0), +(389,4,32,0,2,14,31,565,0,0), +(390,4,32,0,2,15,31,566,0,0), +(391,4,32,0,2,16,31,567,0,0), +(392,4,32,0,2,17,31,568,0,0), +(393,4,32,0,2,18,31,569,0,0), +(394,4,32,0,2,19,31,570,0,0), +(395,4,4095,0,3,0,32,571,0,0), +(396,4,4095,0,3,1,32,572,0,0), +(397,4,4095,0,3,2,32,573,0,0), +(398,4,4095,0,3,3,32,574,0,0), +(399,4,4095,0,3,4,32,575,0,0), +(400,4,4095,0,3,5,32,576,0,0), +(401,4,4095,0,3,6,32,577,0,0), +(402,4,4095,0,3,7,32,578,0,0), +(403,4,4095,0,3,8,32,579,0,0), +(404,4,4095,0,3,9,32,580,0,0), +(405,4,4095,0,3,10,32,581,0,0), +(406,4,4095,0,3,11,32,582,0,0), +(407,4,4095,0,3,12,32,583,0,0), +(408,4,4095,0,3,13,32,584,0,0), +(409,4,4095,0,3,14,32,585,0,0), +(410,4,4095,0,3,15,32,586,0,0), +(411,4,4095,0,3,16,32,587,0,0), +(412,4,4095,0,3,17,32,588,0,0), +(413,4,4095,0,3,18,32,589,0,0), +(414,4,4095,0,4,0,33,590,0,0), +(415,4,4095,0,4,1,33,591,0,0), +(416,4,4095,0,4,2,33,592,0,0), +(417,4,4095,0,4,3,33,593,0,0), +(418,4,4095,0,4,4,33,594,0,0), +(419,4,4095,0,4,5,33,595,0,0), +(420,4,4095,0,4,6,33,596,0,0), +(421,4,4095,0,4,7,33,597,0,0), +(422,4,4095,0,4,8,33,598,0,0), +(423,4,4095,0,4,9,33,599,0,0), +(424,4,4095,0,4,10,33,600,0,0), +(425,4,4095,0,4,11,33,601,0,0), +(426,4,4095,0,4,12,33,602,0,0), +(427,4,4095,0,4,13,33,603,0,0), +(428,4,4095,0,5,0,34,604,0,0), +(429,4,4095,0,5,1,34,605,0,0), +(430,4,4095,0,5,2,34,606,0,0), +(431,4,4095,0,5,3,34,607,0,0), +(432,4,4095,0,5,4,34,608,0,0), +(433,4,4095,0,5,5,34,609,0,0), +(434,4,4095,0,5,6,34,610,0,0), +(435,4,4095,0,5,7,34,611,0,0), +(436,4,4095,0,5,8,34,612,0,0), +(437,4,4095,0,5,9,34,613,0,0), +(438,4,4095,0,5,10,34,614,0,0), +(439,4,4095,1,1,0,35,615,0,0), +(440,4,4095,1,1,1,35,616,0,0), +(441,4,4095,1,1,2,35,617,0,0), +(442,4,4095,1,1,3,35,618,0,0), +(443,4,4095,1,1,4,35,619,0,0), +(444,4,4095,1,1,5,35,620,0,0), +(445,4,4095,1,1,6,35,621,0,0), +(446,4,4095,1,1,7,35,622,0,0), +(447,4,4095,1,1,8,35,623,0,0), +(448,4,4095,1,1,9,35,624,0,0), +(449,4,4095,1,1,10,35,625,0,0), +(450,4,32,1,1,11,35,626,0,0), +(451,4,32,1,1,12,35,627,0,0), +(452,4,32,1,1,13,35,628,0,0), +(453,4,4095,1,1,14,35,629,0,0), +(454,4,4095,1,1,15,35,630,0,0), +(455,4,4095,1,1,16,35,631,0,0), +(456,4,4095,1,1,17,35,632,0,0), +(457,4,4095,1,1,18,35,633,0,0), +(458,4,4063,1,2,0,36,634,1,0), +(459,4,4063,1,2,1,36,635,0,0), +(460,4,4063,1,2,2,36,636,0,0), +(461,4,4063,1,2,3,36,637,0,0), +(462,4,4063,1,2,4,36,638,0,0), +(463,4,4063,1,2,5,36,639,1,0), +(464,4,4063,1,2,6,36,640,1,0), +(465,4,4063,1,2,7,36,641,0,0), +(466,4,4063,1,2,8,36,642,0,0), +(467,4,4063,1,2,9,36,643,0,0), +(468,4,32,1,2,10,36,644,0,0), +(469,4,32,1,2,11,36,645,0,0), +(470,4,32,1,2,12,36,646,0,0), +(471,4,32,1,2,13,36,647,0,0), +(472,4,32,1,2,14,36,648,0,0), +(473,4,32,1,2,15,36,649,0,0), +(474,4,32,1,2,16,36,650,0,0), +(475,4,32,1,2,17,36,651,0,0), +(476,4,32,1,2,18,36,652,0,0), +(477,4,32,1,2,19,36,653,0,0), +(478,4,4095,1,3,0,37,654,0,0), +(479,4,4095,1,3,1,37,655,0,0), +(480,4,4095,1,3,2,37,656,0,0), +(481,4,4095,1,3,3,37,657,0,0), +(482,4,4095,1,3,4,37,658,0,0), +(483,4,4095,1,3,5,37,659,0,0), +(484,4,4095,1,3,6,37,660,0,0), +(485,4,4095,1,3,7,37,661,0,0), +(486,4,4095,1,3,8,37,662,0,0), +(487,4,4095,1,3,9,37,663,0,0), +(488,4,4095,1,3,10,37,664,0,0), +(489,4,4095,1,3,11,37,665,0,0), +(490,4,4095,1,3,12,37,666,0,0), +(491,4,4095,1,3,13,37,667,0,0), +(492,4,4095,1,3,14,37,668,0,0), +(493,4,4095,1,3,15,37,669,0,0), +(494,4,4095,1,3,16,37,670,0,0), +(495,4,4095,1,3,17,37,671,0,0), +(496,4,4095,1,3,18,37,672,0,0), +(497,4,4095,1,3,19,37,673,0,0), +(498,4,4095,1,3,20,37,674,0,0), +(499,4,4095,1,4,0,38,675,0,0), +(500,4,4095,1,4,1,38,676,0,0), +(501,4,4095,1,4,2,38,677,0,0), +(502,4,4095,1,4,3,38,678,0,0), +(503,4,4095,1,4,4,38,679,0,0), +(504,4,4095,1,4,5,38,680,0,0), +(505,4,4095,1,4,6,38,681,0,0), +(506,4,4095,1,4,7,38,682,0,0), +(507,4,4095,1,4,8,38,683,0,0), +(508,4,4095,1,4,9,38,684,0,0), +(509,4,4095,1,4,10,38,685,0,0), +(510,4,4095,1,4,11,38,686,0,0), +(511,4,4095,1,4,12,38,687,0,0), +(512,4,4095,1,4,13,38,688,0,0), +(513,4,4095,1,5,0,601,6797,0,0), +(514,4,4095,1,5,1,601,6798,0,0), +(515,4,4095,1,5,2,601,6799,0,0), +(516,4,4095,1,5,3,601,6800,0,0), +(517,4,4095,1,5,4,605,6824,0,0), +(518,4,4095,1,5,5,601,6801,0,0), +(519,8,4095,0,1,0,40,695,0,0), +(520,8,4095,0,1,1,40,696,0,0), +(521,8,4095,0,1,2,40,697,0,0), +(522,8,4095,0,1,3,40,698,0,0), +(523,8,4095,0,1,4,40,699,0,0), +(524,8,4095,0,1,5,40,700,0,0), +(525,8,4095,0,1,6,40,701,0,0), +(526,8,4095,0,1,7,40,702,0,0), +(527,8,4095,0,1,8,40,703,0,0), +(528,8,32,0,1,9,40,704,0,0), +(529,8,32,0,1,10,40,705,0,0), +(530,8,32,0,1,11,40,706,0,0), +(531,8,4095,0,1,12,40,707,0,0), +(532,8,4095,0,1,13,40,708,0,0), +(533,8,2048,0,1,14,40,709,0,0), +(534,8,2048,0,1,15,40,710,0,0), +(535,8,2048,0,1,16,40,711,0,0), +(536,8,2048,0,1,17,40,712,0,0), +(537,8,2048,0,1,18,40,713,0,0), +(538,8,2048,0,1,19,40,714,0,0), +(539,8,4095,0,1,20,40,715,0,0), +(540,8,4095,0,1,21,40,716,0,0), +(541,8,4095,0,1,22,40,717,0,0), +(542,8,4095,0,1,23,40,718,0,0), +(543,8,4063,0,2,0,41,719,1,0), +(544,8,4063,0,2,1,41,720,1,0), +(545,8,4063,0,2,2,41,721,0,0), +(546,8,4063,0,2,3,41,722,0,0), +(547,8,4063,0,2,4,41,723,1,0), +(548,8,4063,0,2,5,41,724,0,0), +(549,8,4063,0,2,6,41,725,0,0), +(550,8,4063,0,2,7,41,726,0,0), +(551,8,4063,0,2,8,41,727,0,0), +(552,8,32,0,2,9,41,728,0,0), +(553,8,32,0,2,10,41,729,0,0), +(554,8,32,0,2,11,41,730,0,0), +(555,8,32,0,2,12,41,731,0,0), +(556,8,32,0,2,13,41,732,0,0), +(557,8,32,0,2,14,41,733,0,0), +(558,8,32,0,2,15,41,734,0,0), +(559,8,32,0,2,16,41,735,0,0), +(560,8,32,0,2,17,41,736,0,0), +(561,8,4095,0,3,0,42,737,0,0), +(562,8,4095,0,3,1,42,738,0,0), +(563,8,4095,0,3,2,42,739,0,0), +(564,8,4095,0,3,3,42,740,0,0), +(565,8,4095,0,3,4,42,741,0,0), +(566,8,4095,0,3,5,42,742,0,0), +(567,8,4095,0,3,6,42,743,0,0), +(568,8,4095,0,3,7,42,744,0,0), +(569,8,4095,0,3,8,42,745,0,0), +(570,8,4095,0,3,9,42,746,0,0), +(571,8,4095,0,3,10,42,747,0,0), +(572,8,4095,0,3,11,42,748,0,0), +(573,8,4095,0,4,0,43,749,0,0), +(574,8,4095,0,4,1,43,750,0,0), +(575,8,4095,0,4,2,43,751,0,0), +(576,8,4095,0,4,3,43,752,0,0), +(577,8,4095,0,4,4,43,753,0,0), +(578,8,4095,0,4,5,43,754,0,0), +(579,8,4095,0,4,6,43,755,0,0), +(580,8,4095,0,4,7,43,756,0,0), +(581,8,4095,0,4,8,43,757,0,0), +(582,8,4095,0,4,9,43,758,0,0), +(583,8,4095,0,4,10,43,759,0,0), +(584,8,4095,0,4,11,43,760,0,0), +(585,8,4095,0,4,12,43,761,0,0), +(586,8,4095,0,4,13,43,762,0,0), +(587,8,4095,0,4,14,43,3605,0,0), +(588,8,4095,0,4,15,43,3606,0,0), +(589,8,4095,0,5,0,44,763,0,0), +(590,8,4095,0,5,1,44,768,0,0), +(591,8,4095,0,5,2,44,765,0,0), +(592,8,4095,0,5,3,44,763,0,0), +(593,8,4095,0,5,4,44,8106,0,0), +(594,8,4095,0,5,5,44,764,0,0), +(595,8,4095,0,6,0,376,769,0,0), +(596,8,2048,0,6,1,376,770,0,0), +(597,8,2048,0,6,7,376,770,0,0), +(598,8,2048,0,6,13,376,770,0,0), +(599,8,2048,0,6,19,376,770,0,0), +(600,8,2048,0,6,25,376,770,0,0), +(601,8,2048,0,6,31,376,770,0,0), +(602,8,2048,0,6,2,376,771,0,0), +(603,8,2048,0,6,8,376,771,0,0), +(604,8,2048,0,6,14,376,771,0,0), +(605,8,2048,0,6,20,376,771,0,0), +(606,8,2048,0,6,26,376,771,0,0), +(607,8,2048,0,6,32,376,771,0,0), +(608,8,2048,0,6,3,376,772,0,0), +(609,8,2048,0,6,9,376,772,0,0), +(610,8,2048,0,6,15,376,772,0,0), +(611,8,2048,0,6,21,376,772,0,0), +(612,8,2048,0,6,27,376,772,0,0), +(613,8,2048,0,6,33,376,772,0,0), +(614,8,2048,0,6,4,376,773,0,0), +(615,8,2048,0,6,10,376,773,0,0), +(616,8,2048,0,6,16,376,773,0,0), +(617,8,2048,0,6,22,376,773,0,0), +(618,8,2048,0,6,28,376,773,0,0), +(619,8,2048,0,6,34,376,773,0,0), +(620,8,2048,0,6,5,376,774,0,0), +(621,8,2048,0,6,11,376,774,0,0), +(622,8,2048,0,6,17,376,774,0,0), +(623,8,2048,0,6,23,376,774,0,0), +(624,8,2048,0,6,29,376,774,0,0), +(625,8,2048,0,6,35,376,774,0,0), +(626,8,2048,0,6,6,376,3715,0,0), +(627,8,2048,0,6,12,376,3715,0,0), +(628,8,2048,0,6,18,376,3715,0,0), +(629,8,2048,0,6,24,376,3715,0,0), +(630,8,2048,0,6,30,376,3715,0,0), +(631,8,2048,0,6,36,376,3715,0,0), +(632,8,4095,0,6,0,46,8166,0,0), +(633,8,2048,0,6,1,46,775,0,0), +(634,8,2048,0,6,2,46,775,0,0), +(635,8,2048,0,6,3,46,775,0,0), +(636,8,2048,0,6,4,46,775,0,0), +(637,8,2048,0,6,5,46,775,0,0), +(638,8,2048,0,6,6,46,775,0,0), +(639,8,2048,0,6,7,46,776,0,0), +(640,8,2048,0,6,8,46,776,0,0), +(641,8,2048,0,6,9,46,776,0,0), +(642,8,2048,0,6,10,46,776,0,0), +(643,8,2048,0,6,11,46,776,0,0), +(644,8,2048,0,6,12,46,776,0,0), +(645,8,2048,0,6,13,46,777,0,0), +(646,8,2048,0,6,14,46,777,0,0), +(647,8,2048,0,6,15,46,777,0,0), +(648,8,2048,0,6,16,46,777,0,0), +(649,8,2048,0,6,17,46,777,0,0), +(650,8,2048,0,6,18,46,777,0,0), +(651,8,2048,0,6,19,46,778,0,0), +(652,8,2048,0,6,20,46,778,0,0), +(653,8,2048,0,6,21,46,778,0,0), +(654,8,2048,0,6,22,46,778,0,0), +(655,8,2048,0,6,23,46,778,0,0), +(656,8,2048,0,6,24,46,778,0,0), +(657,8,2048,0,6,25,46,779,0,0), +(658,8,2048,0,6,26,46,779,0,0), +(659,8,2048,0,6,27,46,779,0,0), +(660,8,2048,0,6,28,46,779,0,0), +(661,8,2048,0,6,29,46,779,0,0), +(662,8,2048,0,6,30,46,779,0,0), +(669,8,2048,0,6,31,46,780,0,0), +(670,8,2048,0,6,32,46,780,0,0), +(671,8,2048,0,6,33,46,780,0,0), +(672,8,2048,0,6,34,46,780,0,0), +(673,8,2048,0,6,35,46,780,0,0), +(674,8,2048,0,6,36,46,780,0,0), +(675,8,4095,0,7,0,47,782,0,0), +(676,8,2048,0,7,1,47,783,0,0), +(677,8,2048,0,7,2,47,784,0,0), +(678,8,2048,0,7,3,47,785,0,0), +(679,8,2048,0,7,4,47,786,0,0), +(680,8,2048,0,7,5,47,787,0,0), +(681,8,2048,0,7,6,47,788,0,0), +(682,8,2047,0,8,0,48,789,2,0), +(683,8,2048,0,8,1,48,790,0,0), +(684,8,2048,0,8,2,48,791,0,0), +(685,8,2048,0,8,3,48,792,0,0), +(686,8,2048,0,8,4,48,793,0,0), +(687,8,2048,0,8,5,48,794,0,0), +(688,8,4095,1,1,0,49,801,0,0), +(689,8,4095,1,1,1,49,802,0,0), +(690,8,4095,1,1,2,49,803,0,0), +(691,8,4095,1,1,3,49,804,0,0), +(692,8,4095,1,1,4,49,805,0,0), +(693,8,4095,1,1,5,49,806,0,0), +(694,8,4095,1,1,6,49,807,0,0), +(695,8,4095,1,1,7,49,808,0,0), +(696,8,4095,1,1,8,49,809,0,0), +(697,8,32,1,1,9,49,810,0,0), +(698,8,32,1,1,10,49,811,0,0), +(699,8,32,1,1,11,49,812,0,0), +(700,8,4095,1,1,12,49,813,0,0), +(701,8,4095,1,1,13,49,814,0,0), +(702,8,2048,1,1,14,49,815,0,0), +(703,8,2048,1,1,15,49,816,0,0), +(704,8,2048,1,1,16,49,817,0,0), +(705,8,2048,1,1,17,49,818,0,0), +(706,8,2048,1,1,18,49,819,0,0), +(707,8,2048,1,1,19,49,820,0,0), +(708,8,4095,1,1,20,49,821,0,0), +(709,8,4095,1,1,21,49,822,0,0), +(710,8,4095,1,1,22,49,823,0,0), +(711,8,4095,1,1,23,49,824,0,0), +(712,8,4063,1,2,0,50,825,1,0), +(713,8,4063,1,2,1,50,826,0,0), +(714,8,4063,1,2,2,50,827,0,0), +(715,8,4063,1,2,3,50,828,0,0), +(716,8,4063,1,2,4,50,829,0,0), +(717,8,4063,1,2,5,50,830,0,0), +(718,8,4063,1,2,6,50,831,1,0), +(719,8,4063,1,2,7,50,832,1,0), +(720,8,4063,1,2,8,50,833,0,0), +(721,8,32,1,2,9,50,834,0,0), +(722,8,32,1,2,10,50,835,0,0), +(723,8,32,1,2,11,50,836,0,0), +(724,8,32,1,2,12,50,837,0,0), +(725,8,32,1,2,13,50,838,0,0), +(726,8,32,1,2,14,50,839,0,0), +(727,8,32,1,2,15,50,840,0,0), +(728,8,32,1,2,16,50,841,0,0), +(729,8,32,1,2,17,50,842,0,0), +(730,8,4095,1,3,0,51,843,0,0), +(731,8,4095,1,3,1,51,844,0,0), +(732,8,4095,1,3,2,51,845,0,0), +(733,8,4095,1,3,3,51,846,0,0), +(734,8,4095,1,3,4,51,847,0,0), +(735,8,4095,1,3,5,51,848,0,0), +(736,8,4095,1,3,6,51,849,0,0), +(737,8,4095,1,3,7,51,850,0,0), +(738,8,4095,1,3,8,51,851,0,0), +(739,8,4095,1,3,9,51,852,0,0), +(740,8,4095,1,3,10,51,853,0,0), +(741,8,4095,1,3,11,51,854,0,0), +(742,8,4095,1,3,12,51,855,0,0), +(743,8,4095,1,3,13,51,856,0,0), +(744,8,4095,1,3,14,51,857,0,0), +(745,8,4095,1,4,0,52,858,0,0), +(746,8,4095,1,4,1,52,859,0,0), +(747,8,4095,1,4,2,52,860,0,0), +(748,8,4095,1,4,3,52,861,0,0), +(749,8,4095,1,4,4,52,862,0,0), +(750,8,4095,1,4,5,52,863,0,0), +(751,8,4095,1,4,6,52,864,0,0), +(752,8,4095,1,4,7,52,865,0,0), +(753,8,4095,1,4,8,52,866,0,0), +(754,8,4095,1,4,9,52,867,0,0), +(755,8,4095,1,4,10,52,868,0,0), +(756,8,4095,1,4,11,52,869,0,0), +(757,8,4095,1,4,12,52,870,0,0), +(758,8,4095,1,4,13,52,3607,0,0), +(759,8,4095,1,4,14,52,3608,0,0), +(760,8,4095,1,5,0,53,871,0,0), +(761,8,4095,1,5,1,53,872,0,0), +(762,8,4095,1,5,2,53,873,0,0), +(763,8,4095,1,5,3,53,874,0,0), +(764,8,4095,1,5,4,53,875,0,0), +(765,8,4095,1,5,5,53,876,0,0), +(766,8,4095,1,5,6,53,877,0,0), +(767,8,4095,1,5,7,53,878,0,0), +(768,8,4095,1,5,8,53,879,0,0), +(769,8,4095,1,5,9,53,880,0,0), +(770,8,4095,1,6,0,377,881,0,0), +(771,8,2048,1,6,1,377,882,0,0), +(772,8,2048,1,6,7,377,882,0,0), +(773,8,2048,1,6,13,377,882,0,0), +(774,8,2048,1,6,19,377,882,0,0), +(775,8,2048,1,6,25,377,882,0,0), +(776,8,2048,1,6,31,377,882,0,0), +(777,8,2048,1,6,2,377,883,0,0), +(778,8,2048,1,6,8,377,883,0,0), +(779,8,2048,1,6,14,377,883,0,0), +(780,8,2048,1,6,20,377,883,0,0), +(781,8,2048,1,6,26,377,883,0,0), +(782,8,2048,1,6,32,377,883,0,0), +(783,8,2048,1,6,3,377,884,0,0), +(784,8,2048,1,6,9,377,884,0,0), +(785,8,2048,1,6,15,377,884,0,0), +(786,8,2048,1,6,21,377,884,0,0), +(787,8,2048,1,6,27,377,884,0,0), +(788,8,2048,1,6,33,377,884,0,0), +(789,8,2048,1,6,4,377,885,0,0), +(790,8,2048,1,6,10,377,885,0,0), +(791,8,2048,1,6,16,377,885,0,0), +(792,8,2048,1,6,22,377,885,0,0), +(793,8,2048,1,6,28,377,885,0,0), +(794,8,2048,1,6,34,377,885,0,0), +(795,8,2048,1,6,5,377,886,0,0), +(796,8,2048,1,6,11,377,886,0,0), +(797,8,2048,1,6,17,377,886,0,0), +(798,8,2048,1,6,23,377,886,0,0), +(799,8,2048,1,6,29,377,886,0,0), +(800,8,2048,1,6,35,377,886,0,0), +(801,8,2048,1,6,6,377,3716,0,0), +(802,8,2048,1,6,12,377,3716,0,0), +(803,8,2048,1,6,18,377,3716,0,0), +(804,8,2048,1,6,24,377,3716,0,0), +(805,8,2048,1,6,30,377,3716,0,0), +(806,8,2048,1,6,36,377,3716,0,0), +(807,8,2048,1,6,0,55,887,0,0), +(808,8,2048,1,6,1,55,887,0,0), +(809,8,2048,1,6,2,55,887,0,0), +(810,8,2048,1,6,3,55,887,0,0), +(811,8,2048,1,6,4,55,887,0,0), +(812,8,2048,1,6,5,55,887,0,0), +(813,8,2048,1,6,6,55,887,0,0), +(814,8,2048,1,6,7,55,888,0,0), +(815,8,2048,1,6,8,55,888,0,0), +(816,8,2048,1,6,9,55,888,0,0), +(817,8,2048,1,6,10,55,888,0,0), +(818,8,2048,1,6,11,55,888,0,0), +(819,8,2048,1,6,12,55,888,0,0), +(820,8,2048,1,6,13,55,889,0,0), +(821,8,2048,1,6,14,55,889,0,0), +(822,8,2048,1,6,15,55,889,0,0), +(823,8,2048,1,6,16,55,889,0,0), +(824,8,2048,1,6,17,55,889,0,0), +(825,8,2048,1,6,18,55,889,0,0), +(826,8,2048,1,6,19,55,890,0,0), +(827,8,2048,1,6,20,55,890,0,0), +(828,8,2048,1,6,21,55,890,0,0), +(829,8,2048,1,6,22,55,890,0,0), +(830,8,2048,1,6,23,55,890,0,0), +(831,8,2048,1,6,24,55,890,0,0), +(832,8,2048,1,6,25,55,891,0,0), +(833,8,2048,1,6,26,55,891,0,0), +(834,8,2048,1,6,27,55,891,0,0), +(835,8,2048,1,6,28,55,891,0,0), +(836,8,2048,1,6,29,55,891,0,0), +(837,8,2048,1,6,30,55,891,0,0), +(844,8,2048,1,6,31,55,892,0,0), +(845,8,2048,1,6,32,55,892,0,0), +(846,8,2048,1,6,33,55,892,0,0), +(847,8,2048,1,6,34,55,892,0,0), +(848,8,2048,1,6,35,55,892,0,0), +(849,8,2048,1,6,36,55,892,0,0), +(850,8,4095,1,7,0,56,894,0,0), +(851,8,2048,1,7,1,56,895,0,0), +(852,8,2048,1,7,2,56,896,0,0), +(853,8,2048,1,7,3,56,897,0,0), +(854,8,2048,1,7,4,56,898,0,0), +(855,8,2048,1,7,5,56,899,0,0), +(856,8,2048,1,7,6,56,900,0,0), +(857,8,2047,1,8,0,57,901,0,0), +(858,8,2048,1,8,1,57,902,0,0), +(859,8,2048,1,8,2,57,903,0,0), +(860,8,2048,1,8,3,57,904,0,0), +(861,8,2048,1,8,4,57,905,0,0), +(862,8,2048,1,8,5,57,906,0,0), +(863,16,4095,0,1,0,58,913,0,0), +(864,16,4095,0,1,1,58,914,0,0), +(865,16,4095,0,1,2,58,915,0,0), +(866,16,4095,0,1,3,58,916,0,0), +(867,16,4095,0,1,4,58,917,0,0), +(868,16,4095,0,1,5,58,918,0,0), +(869,16,4095,0,1,6,58,919,0,0), +(870,16,4095,0,2,0,59,920,0,0), +(871,16,4095,0,2,1,59,921,0,0), +(872,16,4095,0,2,2,59,922,0,0), +(873,16,4095,0,2,3,59,923,0,0), +(874,16,4095,0,2,4,59,924,0,0), +(875,16,4095,0,2,5,59,925,0,0), +(876,16,4095,0,2,6,59,926,0,0), +(877,16,4095,0,2,7,59,927,0,0), +(878,16,4095,0,2,8,59,928,0,0), +(879,16,4095,0,2,9,59,929,0,0), +(880,16,4095,0,2,10,59,920,0,0), +(881,16,4095,0,2,11,59,921,0,0), +(882,16,4095,0,2,12,59,922,0,0), +(883,16,4095,0,2,13,59,923,0,0), +(884,16,4095,0,2,14,59,924,0,0), +(885,16,4095,0,2,15,59,925,0,0), +(886,16,4095,0,2,16,59,926,0,0), +(887,16,4095,0,2,17,59,927,0,0), +(888,16,4095,0,2,18,59,928,0,0), +(889,16,4095,0,2,19,59,929,0,0), +(890,16,4095,0,3,0,60,940,0,0), +(891,16,4095,0,3,1,60,941,0,0), +(892,16,4095,0,3,2,60,942,0,0), +(893,16,4095,0,3,3,60,943,0,0), +(894,16,4095,0,3,4,60,944,0,0), +(895,16,4095,0,3,5,60,945,0,0), +(896,16,4095,0,3,6,60,946,0,0), +(897,16,4095,0,3,7,60,947,0,0), +(898,16,4095,0,3,8,60,948,0,0), +(899,16,4095,0,3,9,60,949,0,0), +(900,16,4095,0,3,10,60,950,0,0), +(901,16,4095,0,3,11,60,951,0,0), +(902,16,4095,0,3,12,60,952,0,0), +(903,16,4095,0,3,13,60,953,0,0), +(904,16,4095,0,3,14,60,954,0,0), +(905,16,4095,0,3,15,60,955,0,0), +(906,16,4095,0,4,0,61,956,0,0), +(907,16,4095,0,4,1,61,957,0,0), +(908,16,4095,0,4,2,61,958,0,0), +(909,16,4095,0,4,3,61,959,0,0), +(910,16,4095,0,4,4,61,960,0,0), +(911,16,4095,0,4,5,61,961,0,0), +(912,16,4095,0,4,6,61,962,0,0), +(913,16,4095,0,4,7,61,963,0,0), +(914,16,4095,0,4,8,61,964,0,0), +(915,16,4095,0,4,9,61,965,0,0), +(916,16,4095,0,4,10,61,966,0,0), +(917,16,4095,0,5,0,62,967,0,0), +(918,16,4095,0,5,1,62,968,0,0), +(919,16,4095,0,5,2,62,967,0,0), +(920,16,4095,0,5,3,62,969,0,0), +(921,16,4095,0,5,4,62,971,0,0), +(922,16,4095,0,5,5,62,967,0,0), +(923,16,4095,0,5,6,62,969,0,0), +(924,16,4095,0,5,7,62,971,0,0), +(925,16,4095,0,5,8,62,975,0,0), +(926,16,4095,0,5,9,62,976,0,0), +(927,16,4095,0,5,10,62,977,0,0), +(928,16,4095,0,5,11,62,978,0,0), +(929,16,4095,0,5,12,62,979,0,0), +(930,16,4095,0,5,13,62,980,0,0), +(931,16,4095,0,5,14,62,967,0,0), +(932,16,4095,0,5,15,62,969,0,0), +(933,16,4095,0,5,16,62,983,0,0), +(934,16,4095,1,1,0,63,984,0,0), +(935,16,4095,1,1,1,63,985,0,0), +(936,16,4095,1,1,2,63,986,0,0), +(937,16,4095,1,1,3,63,987,0,0), +(938,16,4095,1,1,4,63,988,0,0), +(939,16,4095,1,1,5,63,989,0,0), +(940,16,4095,1,1,6,63,990,0,0), +(941,16,4095,1,2,0,64,991,0,0), +(942,16,4095,1,2,1,64,992,0,0), +(943,16,4095,1,2,2,64,993,0,0), +(944,16,4095,1,2,3,64,994,0,0), +(945,16,4095,1,2,4,64,995,0,0), +(946,16,4095,1,2,5,64,996,0,0), +(947,16,4095,1,2,6,64,997,0,0), +(948,16,4095,1,2,7,64,998,0,0), +(949,16,4095,1,2,8,64,999,0,0), +(950,16,4095,1,2,9,64,1000,0,0), +(951,16,4095,1,2,10,64,991,0,0), +(952,16,4095,1,2,11,64,992,0,0), +(953,16,4095,1,2,12,64,993,0,0), +(954,16,4095,1,2,13,64,994,0,0), +(955,16,4095,1,2,14,64,995,0,0), +(956,16,4095,1,2,15,64,996,0,0), +(957,16,4095,1,2,16,64,997,0,0), +(958,16,4095,1,2,17,64,998,0,0), +(959,16,4095,1,2,18,64,999,0,0), +(960,16,4095,1,2,19,64,1000,0,0), +(961,16,4095,1,3,0,65,1011,0,0), +(962,16,4095,1,3,1,65,1012,0,0), +(963,16,4095,1,3,2,65,1013,0,0), +(964,16,4095,1,3,3,65,1014,0,0), +(965,16,4095,1,3,4,65,1015,0,0), +(966,16,4095,1,3,5,65,1016,0,0), +(967,16,4095,1,3,6,65,1017,0,0), +(968,16,4095,1,3,7,65,1018,0,0), +(969,16,4095,1,3,8,65,1019,0,0), +(970,16,4095,1,3,9,65,1020,0,0), +(971,16,4095,1,3,10,65,1021,0,0), +(972,16,4095,1,3,11,65,1022,0,0), +(973,16,4095,1,3,12,65,1023,0,0), +(974,16,4095,1,3,13,65,1024,0,0), +(975,16,4095,1,3,14,65,1025,0,0), +(976,16,4095,1,4,0,66,1026,0,0), +(977,16,4095,1,4,1,66,1027,0,0), +(978,16,4095,1,4,2,66,1028,0,0), +(979,16,4095,1,4,3,66,1029,0,0), +(980,16,4095,1,4,4,66,1030,0,0), +(981,16,4095,1,4,5,66,1031,0,0), +(982,16,4095,1,4,6,66,1032,0,0), +(983,16,4095,1,4,7,66,1033,0,0), +(984,16,4095,1,4,8,66,1034,0,0), +(985,16,4095,1,4,9,66,1035,0,0), +(986,16,4095,1,4,10,66,1036,0,0), +(987,16,4095,1,5,0,67,1037,0,0), +(988,16,4095,1,5,1,67,1038,0,0), +(989,16,4095,1,5,2,559,6276,0,0), +(990,16,4095,1,5,3,559,6277,0,0), +(991,16,4095,1,5,4,67,1041,0,0), +(992,16,4095,1,5,5,67,1042,0,0), +(993,16,4095,1,5,6,67,1043,0,0), +(994,16,4095,1,5,7,559,6278,0,0), +(995,32,4095,0,1,0,68,1045,0,0), +(996,32,4095,0,1,1,68,1046,0,0), +(997,32,4095,0,1,2,68,1047,0,0), +(998,32,4095,0,1,3,68,1048,0,0), +(999,32,4095,0,1,4,68,1049,0,0), +(1000,32,4095,0,1,5,68,1050,0,0), +(1001,32,4095,0,1,6,68,1051,0,0), +(1002,32,4095,0,1,7,68,1052,0,0), +(1003,32,4095,0,1,8,68,1053,0,0), +(1004,32,4095,0,1,9,68,1054,0,0), +(1005,32,4095,0,1,10,68,1055,0,0), +(1006,32,4095,0,1,11,68,1056,0,0), +(1007,32,4095,0,1,12,68,1057,0,0), +(1008,32,4095,0,1,13,68,1058,0,0), +(1009,32,4095,0,1,14,68,1059,0,0), +(1010,32,4095,0,1,15,68,1060,0,0), +(1011,32,4095,0,1,16,68,1061,0,0), +(1012,32,4095,0,1,17,68,1062,0,0), +(1013,32,4095,0,1,18,68,1063,0,0), +(1014,32,32,0,1,19,68,1064,0,0), +(1015,32,32,0,1,20,68,1065,0,0), +(1016,32,32,0,1,21,68,1066,0,0), +(1017,32,4095,0,1,22,68,1067,0,0), +(1018,32,4095,0,1,23,68,1068,0,0), +(1019,32,4095,0,1,24,68,1069,0,0), +(1020,32,4095,0,1,25,68,1070,0,0), +(1021,32,4095,0,1,26,68,1071,0,0), +(1022,32,4095,0,1,27,68,1072,0,0), +(1023,32,4095,0,1,28,68,1073,0,0), +(1024,32,4063,0,2,0,378,1074,1,0), +(1025,32,4063,0,2,1,378,1075,0,0), +(1026,32,4063,0,2,2,378,1076,1,0), +(1027,32,4063,0,2,3,378,1077,0,0), +(1028,32,4063,0,2,4,378,1078,1,0), +(1029,32,32,0,2,5,378,1079,0,0), +(1030,32,32,0,2,6,378,1080,0,0), +(1031,32,32,0,2,7,378,1081,0,0), +(1032,32,32,0,2,8,378,1082,0,0), +(1033,32,32,0,2,9,378,1083,0,0), +(1034,32,4095,0,3,0,71,1084,0,0), +(1035,32,4095,0,3,1,71,1085,0,0), +(1036,32,4095,0,3,2,71,1086,0,0), +(1037,32,4095,0,3,3,71,1087,0,0), +(1038,32,4095,0,3,4,71,1088,0,0), +(1039,32,4095,0,3,5,71,1089,0,0), +(1040,32,4095,0,3,6,71,1090,0,0), +(1041,32,4095,0,3,7,71,1091,0,0), +(1042,32,4095,0,3,8,71,1092,0,0), +(1043,32,4095,0,3,9,71,1093,0,0), +(1044,32,4095,0,3,10,71,1094,0,0), +(1045,32,4095,0,3,11,71,1095,0,0), +(1046,32,4095,0,3,12,71,1096,0,0), +(1047,32,4095,0,3,13,71,1097,0,0), +(1048,32,4095,0,3,14,71,1098,0,0), +(1049,32,4095,0,3,15,71,1099,0,0), +(1050,32,4095,0,4,0,72,1100,0,0), +(1051,32,4095,0,4,1,72,1101,0,0), +(1052,32,4095,0,4,2,72,1102,0,0), +(1053,32,4095,0,4,3,72,1103,0,0), +(1054,32,4095,0,4,4,72,1104,0,0), +(1055,32,4095,0,4,5,72,1105,0,0), +(1056,32,4095,0,4,6,72,1106,0,0), +(1057,32,4095,0,5,0,73,1107,0,0), +(1058,32,4095,0,5,1,73,1108,0,0), +(1059,32,4095,0,5,2,73,1109,0,0), +(1060,32,4095,0,5,3,73,1110,0,0), +(1061,32,4095,0,5,4,73,1111,0,0), +(1062,32,4095,0,5,5,73,1107,0,0), +(1063,32,4095,0,5,6,73,1112,0,0), +(1064,32,4095,1,1,0,74,1114,0,0), +(1065,32,4095,1,1,1,74,1115,0,0), +(1066,32,4095,1,1,2,74,1116,0,0), +(1067,32,4095,1,1,3,74,1117,0,0), +(1068,32,4095,1,1,4,74,1118,0,0), +(1069,32,4095,1,1,5,74,1119,0,0), +(1070,32,4095,1,1,6,74,1120,0,0), +(1071,32,4095,1,1,7,74,1121,0,0), +(1072,32,4095,1,1,8,74,1122,0,0), +(1073,32,4095,1,1,9,74,1123,0,0), +(1074,32,4095,1,1,10,74,1124,0,0), +(1075,32,32,1,1,11,74,1125,0,0), +(1076,32,32,1,1,12,74,1126,0,0), +(1077,32,32,1,1,13,74,1127,0,0), +(1085,32,4063,1,2,0,379,1135,1,0), +(1086,32,4063,1,2,1,379,1136,0,0), +(1087,32,4063,1,2,2,379,1137,1,0), +(1088,32,4063,1,2,3,379,1138,1,0), +(1089,32,32,1,2,4,379,1139,0,0), +(1090,32,32,1,2,5,379,1140,0,0), +(1091,32,32,1,2,6,379,1141,0,0), +(1092,32,32,1,2,7,379,1142,0,0), +(1093,32,4095,1,3,0,77,1143,0,0), +(1094,32,4095,1,3,1,77,1144,0,0), +(1095,32,4095,1,3,2,77,1145,0,0), +(1096,32,4095,1,3,3,77,1146,0,0), +(1097,32,4095,1,3,4,77,1147,0,0), +(1098,32,4095,1,3,5,77,1148,0,0), +(1099,32,4095,1,3,6,77,1149,0,0), +(1100,32,4095,1,3,7,77,1150,0,0), +(1101,32,4095,1,3,8,77,1151,0,0), +(1102,32,4095,1,3,9,77,1152,0,0), +(1103,32,4095,1,3,10,77,1153,0,0), +(1104,32,4095,1,3,11,77,1154,0,0), +(1105,32,4095,1,3,12,77,1155,0,0), +(1106,32,4095,1,3,13,77,1156,0,0), +(1107,32,4095,1,3,14,77,1157,0,0), +(1108,32,4095,1,3,15,77,1158,0,0), +(1109,32,4095,1,3,16,77,1159,0,0), +(1110,32,4095,1,3,17,77,1160,0,0), +(1111,32,4095,1,4,0,78,1161,0,0), +(1112,32,4095,1,4,1,78,1162,0,0), +(1113,32,4095,1,4,2,78,1163,0,0), +(1114,32,4095,1,4,3,78,1164,0,0), +(1115,32,4095,1,4,4,78,1165,0,0), +(1116,32,4095,1,4,5,78,1166,0,0), +(1117,32,4095,1,4,6,78,1167,0,0), +(1118,32,4095,1,4,7,78,1168,0,0), +(1119,32,4095,1,5,0,79,1169,0,0), +(1120,32,4095,1,5,1,79,1170,0,0), +(1121,32,4095,1,5,2,79,1171,0,0), +(1122,32,4095,1,5,3,79,1172,0,0), +(1123,32,4095,1,5,4,79,1173,0,0), +(1124,64,4095,0,1,0,80,1174,0,0), +(1125,64,4095,0,1,1,80,1175,0,0), +(1126,64,4095,0,1,2,80,1176,0,0), +(1127,64,4095,0,1,3,80,1177,0,0), +(1128,64,4095,0,1,4,80,1178,0,0), +(1129,64,4095,0,1,5,80,1179,0,0), +(1130,64,4095,0,1,6,80,1180,0,0), +(1131,64,32,0,1,7,80,1181,0,0), +(1132,64,32,0,1,8,80,1182,0,0), +(1133,64,32,0,1,9,80,1183,0,0), +(1134,64,4095,0,1,10,80,1184,0,0), +(1135,64,4063,0,2,0,81,1185,1,0), +(1136,64,4063,0,2,1,81,1186,0,0), +(1137,64,4063,0,2,2,81,1187,1,0), +(1138,64,4063,0,2,3,81,1188,1,0), +(1139,64,4063,0,2,4,81,1189,0,0), +(1140,64,4063,0,2,5,81,1190,0,0), +(1141,64,4063,0,2,6,81,1191,0,0), +(1142,64,32,0,2,7,81,1192,0,0), +(1143,64,32,0,2,8,81,1193,0,0), +(1144,64,32,0,2,9,81,1194,0,0), +(1145,64,32,0,2,10,81,1195,0,0), +(1146,64,32,0,2,11,81,1196,0,0), +(1147,64,32,0,2,12,81,1197,0,0), +(1148,64,32,0,2,13,81,1198,0,0), +(1149,64,4095,0,3,0,82,1199,0,0), +(1150,64,4095,0,3,1,82,1200,0,0), +(1151,64,4095,0,3,2,82,1201,0,0), +(1152,64,4095,0,3,3,82,1202,0,0), +(1153,64,4095,0,3,4,82,1203,0,0), +(1154,64,4095,0,3,5,82,1204,0,0), +(1155,64,4095,0,3,6,82,1205,0,0), +(1156,64,4095,0,3,7,82,1206,0,0), +(1157,64,4095,0,3,8,82,1207,0,0), +(1158,64,4095,0,3,9,82,1208,0,0), +(1159,64,4095,0,3,10,82,1209,0,0), +(1160,64,4095,0,3,11,82,1210,0,0), +(1161,64,4095,0,3,12,82,1211,0,0), +(1162,64,4095,0,3,13,82,1212,0,0), +(1163,64,4095,0,3,14,82,1213,0,0), +(1164,64,4095,0,4,0,83,1214,0,0), +(1165,64,4095,0,4,1,83,1215,0,0), +(1166,64,4095,0,4,2,83,1216,0,0), +(1167,64,4095,0,4,3,83,1217,0,0), +(1168,64,4095,0,4,4,83,1218,0,0), +(1169,64,4095,0,4,5,83,1219,0,0), +(1170,64,4095,0,4,6,83,1220,0,0), +(1171,64,4095,0,4,7,83,1221,0,0), +(1172,64,4095,0,4,8,83,1222,0,0), +(1173,64,4095,0,4,9,83,1223,0,0), +(1174,64,4095,0,4,10,83,1224,0,0), +(1175,64,4095,0,4,11,83,1225,0,0), +(1176,64,4095,0,4,12,83,1226,0,0), +(1177,64,4095,0,5,0,84,1227,0,0), +(1178,64,4095,0,5,1,84,1228,0,0), +(1179,64,4095,0,5,2,84,1229,0,0), +(1180,64,4095,0,5,3,84,1230,0,0), +(1181,64,4095,0,5,4,84,1231,0,0), +(1182,64,4095,0,5,5,84,1232,0,0), +(1183,64,4095,0,5,6,84,1233,0,0), +(1184,64,4095,0,5,7,84,1227,0,0), +(1185,64,4095,1,1,0,85,1235,0,0), +(1186,64,4095,1,1,1,85,1236,0,0), +(1187,64,4095,1,1,2,85,1237,0,0), +(1188,64,4095,1,1,3,85,1238,0,0), +(1189,64,4095,1,1,4,85,1239,0,0), +(1190,64,4095,1,1,5,85,1240,0,0), +(1191,64,4095,1,1,6,85,1241,0,0), +(1192,64,32,1,1,7,85,1242,0,0), +(1193,64,32,1,1,8,85,1243,0,0), +(1194,64,32,1,1,9,85,1244,0,0), +(1195,64,4095,1,1,10,85,1245,0,0), +(1196,64,4063,1,2,0,86,1246,1,0), +(1197,64,4063,1,2,1,86,1247,0,0), +(1198,64,4063,1,2,2,86,1248,0,0), +(1199,64,4063,1,2,3,86,1249,1,0), +(1200,64,4063,1,2,4,86,1250,0,0), +(1201,64,4063,1,2,5,86,1251,1,0), +(1202,64,4063,1,2,6,86,1252,0,0), +(1203,64,32,1,2,7,86,1253,0,0), +(1204,64,32,1,2,8,86,1254,0,0), +(1205,64,32,1,2,9,86,1255,0,0), +(1206,64,32,1,2,10,86,1256,0,0), +(1207,64,32,1,2,11,86,1257,0,0), +(1208,64,32,1,2,12,86,1258,0,0), +(1209,64,32,1,2,13,86,1259,0,0), +(1210,64,4095,1,3,0,87,1260,0,0), +(1211,64,4095,1,3,1,87,1261,0,0), +(1212,64,4095,1,3,2,87,1262,0,0), +(1213,64,4095,1,3,3,87,1263,0,0), +(1214,64,4095,1,3,4,87,1264,0,0), +(1215,64,4095,1,3,5,87,1265,0,0), +(1216,64,4095,1,3,6,87,1266,0,0), +(1217,64,4095,1,3,7,87,1267,0,0), +(1218,64,4095,1,3,8,87,1268,0,0), +(1219,64,4095,1,3,9,87,1269,0,0), +(1220,64,4095,1,3,10,87,1270,0,0), +(1221,64,4095,1,3,11,87,1271,0,0), +(1222,64,4095,1,3,12,87,1272,0,0), +(1223,64,4095,1,3,13,87,1273,0,0), +(1224,64,4095,1,3,14,87,1274,0,0), +(1225,64,4095,1,3,15,87,1275,0,0), +(1226,64,4095,1,4,0,88,1276,0,0), +(1227,64,4095,1,4,1,88,1277,0,0), +(1228,64,4095,1,4,2,88,1278,0,0), +(1229,64,4095,1,4,3,88,1279,0,0), +(1230,64,4095,1,4,4,88,1280,0,0), +(1231,64,4095,1,4,5,88,1281,0,0), +(1232,64,4095,1,4,6,88,1282,0,0), +(1233,64,4095,1,4,7,88,1283,0,0), +(1234,64,4095,1,4,8,88,1284,0,0), +(1235,64,4095,1,4,9,88,1285,0,0), +(1236,64,4095,1,4,10,88,1286,0,0), +(1237,64,4095,1,4,11,88,1287,0,0), +(1238,64,4095,1,4,12,88,1288,0,0), +(1239,64,4095,1,5,0,89,1289,0,0), +(1240,64,4095,1,5,1,89,1290,0,0), +(1241,64,4095,1,5,2,89,1291,0,0), +(1242,64,4095,1,5,3,89,1292,0,0), +(1243,64,4095,1,5,4,89,1293,0,0), +(1244,64,4095,1,5,5,89,1294,0,0), +(1245,64,4095,1,5,6,89,1295,0,0), +(1246,128,4095,0,1,0,90,1296,0,0), +(1247,128,4095,0,1,1,90,1297,0,0), +(1248,128,4095,0,1,2,90,1298,0,0), +(1249,128,4095,0,1,3,90,1299,0,0), +(1250,128,4095,0,1,4,90,1300,0,0), +(1251,128,4095,0,1,5,90,1301,0,0), +(1252,128,4095,0,1,6,90,1302,0,0), +(1253,128,4095,0,1,7,90,1303,0,0), +(1254,128,4095,0,1,8,90,1304,0,0), +(1255,128,4095,0,1,9,90,1305,0,0), +(1256,128,4095,0,1,10,90,1306,0,0), +(1257,128,4095,0,1,11,90,1307,0,0), +(1258,128,4095,0,1,12,90,1308,0,0), +(1259,128,4095,0,1,13,90,1309,0,0), +(1260,128,4095,0,1,14,90,1310,0,0), +(1261,128,32,0,1,15,90,1311,0,0), +(1262,128,32,0,1,16,90,1312,0,0), +(1263,128,32,0,1,17,90,1313,0,0), +(1264,128,4095,0,1,18,90,1314,0,0), +(1265,128,4063,0,2,0,91,1315,1,0), +(1266,128,4063,0,2,1,91,1316,1,0), +(1267,128,4063,0,2,2,91,1317,0,0), +(1268,128,4063,0,2,3,91,1318,1,0), +(1269,128,4063,0,2,4,91,1319,0,0), +(1270,128,32,0,2,5,91,1320,0,0), +(1271,128,32,0,2,6,91,1321,0,0), +(1272,128,32,0,2,7,91,1322,0,0), +(1273,128,32,0,2,8,91,1323,0,0), +(1274,128,32,0,2,9,91,1324,0,0), +(1275,128,4095,0,3,0,92,1325,0,0), +(1276,128,4095,0,3,1,92,1326,0,0), +(1277,128,4095,0,3,2,92,1327,0,0), +(1278,128,4095,0,3,3,92,1328,0,0), +(1279,128,4095,0,3,4,92,1329,0,0), +(1280,128,4095,0,3,5,92,1330,0,0), +(1281,128,4095,0,3,6,92,1331,0,0), +(1282,128,4095,0,3,7,92,1332,0,0), +(1283,128,4095,0,3,8,92,1333,0,0), +(1284,128,4095,0,3,9,92,1334,0,0), +(1285,128,4095,0,3,10,92,1335,0,0), +(1286,128,4095,0,3,11,92,1336,0,0), +(1287,128,4095,0,3,12,92,1337,0,0), +(1288,128,4095,0,4,0,93,1338,0,0), +(1289,128,4095,0,4,1,93,1339,0,0), +(1290,128,4095,0,4,2,93,1340,0,0), +(1291,128,4095,0,4,3,93,1341,0,0), +(1292,128,4095,0,4,4,93,1342,0,0), +(1293,128,4095,0,4,5,93,1343,0,0), +(1294,128,4095,0,4,6,93,1344,0,0), +(1295,128,4095,0,4,7,93,1345,0,0), +(1296,128,4095,0,4,8,93,1346,0,0), +(1297,128,4095,0,4,9,93,1347,0,0), +(1298,128,4095,0,4,10,93,1348,0,0), +(1299,128,4095,0,4,11,93,1349,0,0), +(1300,128,4095,0,4,12,93,1350,0,0), +(1301,128,4095,0,4,13,93,1351,0,0), +(1302,128,4095,0,5,0,94,1352,0,0), +(1303,128,4095,0,5,1,94,1353,0,0), +(1304,128,4095,0,5,2,94,1354,0,0), +(1305,128,4095,0,5,3,94,1355,0,0), +(1306,128,4095,0,5,4,94,1356,0,0), +(1307,128,4095,0,5,5,94,1352,0,0), +(1308,128,4095,0,5,6,94,1353,0,0), +(1309,128,4095,0,5,7,94,1354,0,0), +(1310,128,4095,0,5,8,94,1355,0,0), +(1311,128,4095,0,5,9,94,1356,0,0), +(1312,128,4095,0,5,10,94,1354,0,0), +(1313,128,4095,1,1,0,95,1363,0,0), +(1314,128,4095,1,1,1,95,1364,0,0), +(1315,128,4095,1,1,2,95,1365,0,0), +(1316,128,4095,1,1,3,95,1366,0,0), +(1317,128,4095,1,1,4,95,1367,0,0), +(1318,128,4095,1,1,5,95,1368,0,0), +(1319,128,4095,1,1,6,95,1369,0,0), +(1320,128,4095,1,1,7,95,1370,0,0), +(1321,128,4095,1,1,8,95,1371,0,0), +(1322,128,4095,1,1,9,95,1372,0,0), +(1323,128,4095,1,1,10,95,1373,0,0), +(1324,128,4095,1,1,11,95,1374,0,0), +(1325,128,4095,1,1,12,95,1375,0,0), +(1326,128,4095,1,1,13,95,1376,0,0), +(1327,128,4095,1,1,14,95,1377,0,0), +(1328,128,32,1,1,15,95,1378,0,0), +(1329,128,32,1,1,16,95,1379,0,0), +(1330,128,32,1,1,17,95,1380,0,0), +(1331,128,4095,1,1,18,95,1381,0,0), +(1332,128,4063,1,2,0,96,1382,1,0), +(1333,128,4063,1,2,1,96,1383,0,0), +(1334,128,4063,1,2,2,96,1384,0,0), +(1335,128,4063,1,2,3,96,1385,1,0), +(1336,128,4063,1,2,4,96,1386,0,0), +(1337,128,4063,1,2,5,96,1387,1,0), +(1338,128,32,1,2,6,96,1388,0,0), +(1339,128,32,1,2,7,96,1389,0,0), +(1340,128,32,1,2,8,96,1390,0,0), +(1341,128,32,1,2,9,96,1391,0,0), +(1342,128,32,1,2,10,96,1392,0,0), +(1343,128,32,1,2,11,96,1393,0,0), +(1344,128,4095,1,3,0,97,1394,0,0), +(1345,128,4095,1,3,1,97,1395,0,0), +(1346,128,4095,1,3,2,97,1396,0,0), +(1347,128,4095,1,3,3,97,1397,0,0), +(1348,128,4095,1,3,4,97,1398,0,0), +(1349,128,4095,1,3,5,97,1399,0,0), +(1350,128,4095,1,3,6,97,1400,0,0), +(1351,128,4095,1,3,7,97,1401,0,0), +(1352,128,4095,1,3,8,97,1402,0,0), +(1353,128,4095,1,3,9,97,1403,0,0), +(1354,128,4095,1,3,10,97,1404,0,0), +(1355,128,4095,1,3,11,97,1405,0,0), +(1356,128,4095,1,4,0,98,1406,0,0), +(1357,128,4095,1,4,1,98,1407,0,0), +(1358,128,4095,1,4,2,98,1408,0,0), +(1359,128,4095,1,4,3,98,1409,0,0), +(1360,128,4095,1,4,4,98,1410,0,0), +(1361,128,4095,1,4,5,98,1411,0,0), +(1362,128,4095,1,4,6,98,1412,0,0), +(1363,128,4095,1,4,7,98,1413,0,0), +(1364,128,4095,1,4,8,98,1414,0,0), +(1365,128,4095,1,4,9,98,1415,0,0), +(1366,128,4095,1,4,10,98,1416,0,0), +(1367,128,4095,1,4,11,98,1417,0,0), +(1368,128,4095,1,4,12,98,1418,0,0), +(1369,128,4095,1,4,13,98,1419,0,0), +(1370,128,4095,1,5,0,99,1420,0,0), +(1371,128,4095,1,5,1,99,1421,0,0), +(1372,128,4095,1,5,2,99,1422,0,0), +(1373,128,4095,1,5,3,99,1423,0,0), +(1374,128,4095,1,5,4,99,1424,0,0), +(1375,128,4095,1,5,5,99,1425,0,0), +(1376,256,4095,0,1,0,100,1426,0,0), +(1377,256,4095,0,1,1,100,1427,0,0), +(1378,256,4095,0,1,2,100,1428,0,0), +(1379,256,4095,0,1,3,100,1429,0,0), +(1380,256,4095,0,1,4,100,1430,0,0), +(1381,256,4095,0,1,5,100,1431,0,0), +(1382,256,4095,0,1,6,100,1432,0,0), +(1383,256,4095,0,1,7,100,1433,0,0), +(1384,256,4095,0,1,8,100,1434,0,0), +(1385,256,32,0,1,9,100,1435,0,0), +(1386,256,32,0,1,10,100,1436,0,0), +(1387,256,32,0,1,11,100,1437,0,0), +(1388,256,4095,0,1,12,100,1438,0,0), +(1389,256,4095,0,1,13,100,1439,0,0), +(1390,256,4095,0,1,14,100,1440,0,0), +(1391,256,4095,0,1,15,100,1441,0,0), +(1392,256,4095,0,1,16,100,1442,0,0), +(1393,256,4095,0,1,17,100,1443,0,0), +(1394,256,4095,0,1,18,100,1444,0,0), +(1395,256,4095,0,1,19,100,1445,0,0), +(1396,256,4063,0,2,0,101,1446,1,0), +(1397,256,4063,0,2,1,101,1447,1,0), +(1398,256,4063,0,2,2,101,1448,1,0), +(1399,256,4063,0,2,3,101,1449,0,0), +(1400,256,4063,0,2,4,101,1450,0,0), +(1401,256,32,0,2,5,101,1451,0,0), +(1402,256,32,0,2,6,101,1452,0,0), +(1403,256,32,0,2,7,101,1453,0,0), +(1404,256,32,0,2,8,101,1454,0,0), +(1405,256,32,0,2,9,101,1455,0,0), +(1406,256,4095,0,3,0,102,1456,0,0), +(1407,256,4095,0,3,1,102,1457,0,0), +(1408,256,4095,0,3,2,102,1458,0,0), +(1409,256,4095,0,3,3,102,1459,0,0), +(1410,256,4095,0,3,4,102,1460,0,0), +(1411,256,4095,0,3,5,102,1461,0,0), +(1412,256,4095,0,3,6,102,1462,0,0), +(1413,256,4095,0,3,7,102,1463,0,0), +(1414,256,4095,0,3,8,102,1464,0,0), +(1415,256,4095,0,3,9,102,1465,0,0), +(1416,256,4095,0,3,10,102,1466,0,0), +(1417,256,4095,0,3,11,102,1467,0,0), +(1418,256,4095,0,3,12,102,1468,0,0), +(1419,256,4095,0,3,13,102,1469,0,0), +(1420,256,4095,0,3,14,102,1470,0,0), +(1421,256,4095,0,3,15,102,1471,0,0), +(1422,256,4095,0,3,16,102,1472,0,0), +(1423,256,4095,0,3,17,102,1473,0,0), +(1424,256,4095,0,3,18,102,1474,0,0), +(1425,256,4095,0,4,0,103,1475,0,0), +(1426,256,4095,0,4,1,103,1476,0,0), +(1427,256,4095,0,4,2,103,1477,0,0), +(1428,256,4095,0,4,3,103,1478,0,0), +(1429,256,4095,0,4,4,103,1479,0,0), +(1430,256,4095,0,4,5,103,1480,0,0), +(1431,256,4095,0,4,6,103,1481,0,0), +(1432,256,4095,0,4,7,103,1482,0,0), +(1433,256,4095,0,4,8,103,1483,0,0), +(1434,256,4095,0,4,9,103,1484,0,0), +(1435,256,4095,0,4,10,103,1485,0,0), +(1436,256,4095,0,4,11,103,1486,0,0), +(1437,256,4095,0,4,12,103,1487,0,0), +(1438,256,4095,0,5,0,104,1488,0,0), +(1439,256,4095,0,5,1,104,1489,0,0), +(1440,256,4095,0,5,2,104,1490,0,0), +(1441,256,4095,0,5,3,104,1491,0,0), +(1442,256,4095,0,5,4,104,1492,0,0), +(1443,256,4095,0,5,5,104,1493,0,0), +(1444,256,4095,0,5,6,104,1494,0,0), +(1445,256,4095,0,5,7,104,1489,0,0), +(1446,256,4095,0,5,8,104,1494,0,0), +(1447,256,4095,0,5,9,104,1491,0,0), +(1448,256,4095,0,5,10,104,1490,0,0), +(1449,256,4095,0,5,11,104,1488,0,0), +(1450,256,4095,0,5,12,104,1488,0,0), +(1451,256,4095,0,5,13,104,1489,0,0), +(1452,256,4095,0,5,14,104,1490,0,0), +(1453,256,4095,0,5,15,104,1491,0,0), +(1454,256,4095,0,5,16,104,1492,0,0), +(1455,256,4095,0,5,17,104,1493,0,0), +(1456,256,4095,0,5,18,104,1494,0,0), +(1457,256,4095,0,5,19,104,1489,0,0), +(1458,256,4095,0,5,20,104,1494,0,0), +(1459,256,4095,0,5,21,104,1491,0,0), +(1460,256,4095,0,5,22,104,1490,0,0), +(1461,256,4095,0,5,23,104,1488,0,0), +(1462,256,4095,0,5,24,104,1488,0,0), +(1463,256,4095,1,1,0,105,1513,0,0), +(1464,256,4095,1,1,1,105,1514,0,0), +(1465,256,4095,1,1,2,105,1515,0,0), +(1466,256,4095,1,1,3,105,1516,0,0), +(1467,256,4095,1,1,4,105,1517,0,0), +(1468,256,4095,1,1,5,105,1518,0,0), +(1469,256,4095,1,1,6,105,1519,0,0), +(1470,256,4095,1,1,7,105,1520,0,0), +(1471,256,4095,1,1,8,105,1521,0,0), +(1472,256,32,1,1,9,105,1522,0,0), +(1473,256,32,1,1,10,105,1523,0,0), +(1474,256,32,1,1,11,105,1524,0,0), +(1475,256,4095,1,1,12,105,1525,0,0), +(1476,256,4063,1,2,0,106,1526,1,0), +(1477,256,4063,1,2,1,106,1527,0,0), +(1478,256,4063,1,2,2,106,1528,0,0), +(1479,256,4063,1,2,3,106,1529,0,0), +(1480,256,4063,1,2,4,106,1530,0,0), +(1481,256,4063,1,2,5,106,1531,0,0), +(1482,256,4063,1,2,6,106,1532,1,0), +(1483,256,4063,1,2,7,106,1533,0,0), +(1484,256,4063,1,2,8,106,1534,0,0), +(1485,256,4063,1,2,9,106,1535,1,0), +(1486,256,32,1,2,10,106,1536,0,0), +(1487,256,32,1,2,11,106,1537,0,0), +(1488,256,32,1,2,12,106,1538,0,0), +(1489,256,32,1,2,13,106,1539,0,0), +(1490,256,32,1,2,14,106,1540,0,0), +(1491,256,32,1,2,15,106,1541,0,0), +(1492,256,32,1,2,16,106,1542,0,0), +(1493,256,32,1,2,17,106,1543,0,0), +(1494,256,4095,1,3,0,107,1544,0,0), +(1495,256,4095,1,3,1,107,1545,0,0), +(1496,256,4095,1,3,2,107,1546,0,0), +(1497,256,4095,1,3,3,107,1547,0,0), +(1498,256,4095,1,3,4,107,1548,0,0), +(1499,256,4095,1,3,5,107,1549,0,0), +(1500,256,4095,1,3,6,107,1550,0,0), +(1501,256,4095,1,3,7,107,1551,0,0), +(1502,256,4095,1,3,8,107,1552,0,0), +(1503,256,4095,1,3,9,107,1553,0,0), +(1504,256,4095,1,3,10,107,1554,0,0), +(1505,256,4095,1,3,11,107,1555,0,0), +(1506,256,4095,1,3,12,107,1556,0,0), +(1507,256,4095,1,3,13,107,1557,0,0), +(1508,256,4095,1,3,14,107,1558,0,0), +(1509,256,4095,1,3,15,107,1559,0,0), +(1510,256,4095,1,3,16,107,1560,0,0), +(1511,256,4095,1,4,0,108,1561,0,0), +(1512,256,4095,1,4,1,108,1562,0,0), +(1513,256,4095,1,4,2,108,1563,0,0), +(1514,256,4095,1,4,3,108,1564,0,0), +(1515,256,4095,1,4,4,108,1565,0,0), +(1516,256,4095,1,4,5,108,1566,0,0), +(1517,256,4095,1,4,6,108,1567,0,0), +(1518,256,4095,1,4,7,108,1568,0,0), +(1519,256,4095,1,4,8,108,1569,0,0), +(1520,256,4095,1,4,9,108,1570,0,0), +(1521,256,4095,1,4,10,108,1571,0,0), +(1522,256,4095,1,4,11,108,1572,0,0), +(1523,256,4095,1,4,12,108,1573,0,0), +(1524,256,4095,1,5,0,109,1574,0,0), +(1525,256,4095,1,5,1,109,1575,0,0), +(1526,256,4095,1,5,2,109,1576,0,0), +(1527,256,4095,1,5,3,109,1574,0,0), +(1528,256,4095,1,5,4,109,1574,0,0), +(1529,256,4095,1,5,5,109,1574,0,0), +(1530,256,4095,1,5,6,109,1575,0,0), +(1531,256,4095,1,5,7,109,1575,0,0), +(1532,256,4095,1,5,8,109,1576,0,0), +(1533,256,4095,1,5,9,109,1574,0,0), +(1534,256,4095,1,5,10,109,1574,0,0), +(1535,256,4095,1,5,11,109,1575,0,0), +(1536,256,4095,1,5,12,109,1574,0,0), +(1537,256,4095,1,5,13,109,1575,0,0), +(1538,256,4095,1,5,14,109,1576,0,0), +(1539,256,4095,1,5,15,109,1574,0,0), +(1540,256,4095,1,5,16,109,1574,0,0), +(1541,256,4095,1,5,17,109,1574,0,0), +(1542,256,4095,1,5,18,109,1575,0,0), +(1543,256,4095,1,5,19,109,1575,0,0), +(1544,256,4095,1,5,20,109,1576,0,0), +(1545,256,4095,1,5,21,109,1574,0,0), +(1546,256,4095,1,5,22,109,1574,0,0), +(1547,256,4095,1,5,23,109,1575,0,0), +(1548,256,4095,1,5,24,109,1574,0,0), +(1549,512,4095,0,1,0,110,1599,0,0), +(1550,512,4095,0,1,1,110,1600,0,0), +(1551,512,4095,0,1,2,110,1601,0,0), +(1552,512,4095,0,1,3,110,1602,0,0), +(1553,512,4095,0,1,4,110,1603,0,0), +(1554,512,4095,0,1,5,110,1604,0,0), +(1555,512,4095,0,1,6,110,1605,0,0), +(1556,512,4095,0,1,7,110,1606,0,0), +(1557,512,4095,0,1,8,110,1607,0,0), +(1558,512,4095,0,1,9,110,1608,0,0), +(1559,512,4095,0,1,10,110,1609,0,0), +(1560,512,4095,0,1,11,110,1610,0,0), +(1561,512,4095,0,1,12,110,1611,0,0), +(1562,512,4095,0,1,13,110,1612,0,0), +(1563,512,4095,0,1,14,110,1613,0,0), +(1564,512,4095,0,1,15,110,1614,0,0), +(1565,512,32,0,1,16,110,1615,0,0), +(1566,512,32,0,1,17,110,1616,0,0), +(1567,512,32,0,1,18,110,1617,0,0), +(1568,512,2048,0,1,19,110,1618,0,0), +(1569,512,2048,0,1,20,110,1619,0,0), +(1570,512,2048,0,1,21,110,1620,0,0), +(1571,512,2048,0,1,22,110,1621,0,0), +(1572,512,2048,0,1,23,110,1622,0,0), +(1573,512,2048,0,1,24,110,1623,0,0), +(1574,512,4095,0,1,25,110,1624,0,0), +(1575,512,4095,0,1,26,110,1625,0,0), +(1576,512,4063,0,2,0,111,1626,0,0), +(1577,512,4063,0,2,1,111,1627,0,0), +(1578,512,4063,0,2,2,111,1628,1,0), +(1579,512,4063,0,2,3,111,1629,0,0), +(1580,512,4063,0,2,4,111,1630,1,0), +(1581,512,4063,0,2,5,111,1631,0,0), +(1582,512,2015,0,2,6,111,1632,0,0), +(1583,512,2015,0,2,7,111,1633,1,0), +(1584,512,2015,0,2,8,111,1634,0,0), +(1585,512,2015,0,2,9,111,1635,0,0), +(1586,512,32,0,2,10,111,1636,0,0), +(1587,512,32,0,2,11,111,1637,0,0), +(1588,512,32,0,2,12,111,1638,0,0), +(1589,512,32,0,2,13,111,1639,0,0), +(1590,512,32,0,2,14,111,1640,0,0), +(1591,512,32,0,2,15,111,1641,0,0), +(1592,512,32,0,2,16,111,1642,0,0), +(1593,512,32,0,2,17,111,1643,0,0), +(1594,512,32,0,2,18,111,1644,0,0), +(1595,512,32,0,2,19,111,1645,0,0), +(1596,512,4063,0,2,20,111,1626,0,0), +(1597,512,4063,0,2,21,111,1627,0,0), +(1598,512,4063,0,2,22,111,1628,0,0), +(1599,512,4095,0,3,0,112,1649,0,0), +(1600,512,4095,0,3,1,112,1650,0,0), +(1601,512,4095,0,3,2,112,1651,0,0), +(1602,512,4095,0,3,3,112,1652,0,0), +(1603,512,4095,0,3,4,112,1653,0,0), +(1604,512,4095,0,3,5,112,1654,0,0), +(1605,512,4095,0,3,6,112,1655,0,0), +(1606,512,4095,0,3,7,112,1656,0,0), +(1607,512,4095,0,3,8,112,1657,0,0), +(1608,512,4095,0,3,9,112,1658,0,0), +(1609,512,4095,0,3,10,112,1659,0,0), +(1610,512,4095,0,3,11,112,1660,0,0), +(1611,512,4095,0,3,12,112,1661,0,0), +(1612,512,4095,0,3,13,112,1662,0,0), +(1613,512,4095,0,3,14,112,1663,0,0), +(1614,512,4095,0,3,15,112,1664,0,0), +(1615,512,4095,0,3,16,112,1665,0,0), +(1616,512,4095,0,4,0,113,1666,0,0), +(1617,512,4095,0,4,1,113,1667,0,0), +(1618,512,4095,0,4,2,113,1668,0,0), +(1619,512,4095,0,4,3,113,1669,0,0), +(1620,512,4095,0,4,4,113,1670,0,0), +(1621,512,4095,0,4,5,113,1671,0,0), +(1622,512,4095,0,4,6,113,1672,0,0), +(1623,512,4095,0,4,7,113,1673,0,0), +(1624,512,4095,0,4,8,113,1674,0,0), +(1625,512,4095,0,4,9,113,1675,0,0), +(1626,512,4095,0,4,10,113,1676,0,0), +(1627,512,4095,0,4,11,113,1677,0,0), +(1628,512,4095,0,4,12,113,1678,0,0), +(1629,512,4095,0,4,13,113,1679,0,0), +(1630,512,4095,0,5,0,114,1680,0,0), +(1631,512,4095,0,5,1,114,1681,0,0), +(1632,512,4095,0,5,2,114,1682,0,0), +(1633,512,4095,0,5,3,114,1683,0,0), +(1634,512,4095,0,5,4,114,1684,0,0), +(1635,512,4095,0,5,5,114,1685,0,0), +(1636,512,4095,0,5,6,114,1686,0,0), +(1637,512,4095,0,5,7,114,1687,0,0), +(1638,512,4095,0,5,8,114,1688,0,0), +(1639,512,4095,0,5,9,114,1689,0,0), +(1640,512,4095,0,5,10,114,1680,0,0), +(1641,512,4095,0,5,11,114,1681,0,0), +(1642,512,4095,0,5,12,114,1682,0,0), +(1643,512,4095,0,5,13,114,1683,0,0), +(1644,512,4095,0,5,14,114,1684,0,0), +(1645,512,4095,0,5,15,114,1685,0,0), +(1646,512,4095,0,5,16,114,1686,0,0), +(1647,512,4095,0,5,17,114,1687,0,0), +(1648,512,4095,0,5,18,114,1688,0,0), +(1649,512,4095,0,5,19,114,1689,0,0), +(1650,512,4095,0,6,0,380,1700,0,0), +(1651,512,2048,0,6,1,380,1701,0,0), +(1652,512,2048,0,6,7,380,1701,0,0), +(1653,512,2048,0,6,13,380,1701,0,0), +(1654,512,2048,0,6,19,380,1701,0,0), +(1655,512,2048,0,6,25,380,1701,0,0), +(1656,512,2048,0,6,31,380,1701,0,0), +(1657,512,2048,0,6,2,380,1702,0,0), +(1658,512,2048,0,6,8,380,1702,0,0), +(1659,512,2048,0,6,14,380,1702,0,0), +(1660,512,2048,0,6,20,380,1702,0,0), +(1661,512,2048,0,6,26,380,1702,0,0), +(1662,512,2048,0,6,32,380,1702,0,0), +(1663,512,2048,0,6,3,380,1703,0,0), +(1664,512,2048,0,6,9,380,1703,0,0), +(1665,512,2048,0,6,15,380,1703,0,0), +(1666,512,2048,0,6,21,380,1703,0,0), +(1667,512,2048,0,6,27,380,1703,0,0), +(1668,512,2048,0,6,33,380,1703,0,0), +(1669,512,2048,0,6,4,380,1704,0,0), +(1670,512,2048,0,6,10,380,1704,0,0), +(1671,512,2048,0,6,16,380,1704,0,0), +(1672,512,2048,0,6,22,380,1704,0,0), +(1673,512,2048,0,6,28,380,1704,0,0), +(1674,512,2048,0,6,34,380,1704,0,0), +(1675,512,2048,0,6,5,380,1705,0,0), +(1676,512,2048,0,6,11,380,1705,0,0), +(1677,512,2048,0,6,17,380,1705,0,0), +(1678,512,2048,0,6,23,380,1705,0,0), +(1679,512,2048,0,6,29,380,1705,0,0), +(1680,512,2048,0,6,35,380,1705,0,0), +(1681,512,2048,0,6,6,380,3713,0,0), +(1682,512,2048,0,6,12,380,3713,0,0), +(1683,512,2048,0,6,18,380,3713,0,0), +(1684,512,2048,0,6,24,380,3713,0,0), +(1685,512,2048,0,6,30,380,3713,0,0), +(1686,512,2048,0,6,36,380,3713,0,0), +(1687,512,4095,0,6,0,116,1706,0,0), +(1688,512,2048,0,6,1,116,1707,0,0), +(1689,512,2048,0,6,2,116,1707,0,0), +(1690,512,2048,0,6,3,116,1707,0,0), +(1691,512,2048,0,6,4,116,1707,0,0), +(1692,512,2048,0,6,5,116,1707,0,0), +(1693,512,2048,0,6,6,116,1707,0,0), +(1694,512,2048,0,6,7,116,1708,0,0), +(1695,512,2048,0,6,8,116,1708,0,0), +(1696,512,2048,0,6,9,116,1708,0,0), +(1697,512,2048,0,6,10,116,1708,0,0), +(1698,512,2048,0,6,11,116,1708,0,0), +(1699,512,2048,0,6,12,116,1708,0,0), +(1700,512,2048,0,6,13,116,1709,0,0), +(1701,512,2048,0,6,14,116,1709,0,0), +(1702,512,2048,0,6,15,116,1709,0,0), +(1703,512,2048,0,6,16,116,1709,0,0), +(1704,512,2048,0,6,17,116,1709,0,0), +(1705,512,2048,0,6,18,116,1709,0,0), +(1706,512,2048,0,6,19,116,1710,0,0), +(1707,512,2048,0,6,20,116,1710,0,0), +(1708,512,2048,0,6,21,116,1710,0,0), +(1709,512,2048,0,6,22,116,1710,0,0), +(1710,512,2048,0,6,23,116,1710,0,0), +(1711,512,2048,0,6,24,116,1710,0,0), +(1712,512,2048,0,6,25,116,1711,0,0), +(1713,512,2048,0,6,26,116,1711,0,0), +(1714,512,2048,0,6,27,116,1711,0,0), +(1715,512,2048,0,6,28,116,1711,0,0), +(1716,512,2048,0,6,29,116,1711,0,0), +(1717,512,2048,0,6,30,116,1711,0,0), +(1724,512,2048,0,6,31,116,9931,0,0), +(1725,512,2048,0,6,32,116,9931,0,0), +(1726,512,2048,0,6,33,116,9931,0,0), +(1727,512,2048,0,6,34,116,9931,0,0), +(1728,512,2048,0,6,35,116,9931,0,0), +(1729,512,2048,0,6,36,116,9931,0,0), +(1730,512,4095,0,7,0,117,1713,0,0), +(1731,512,2048,0,7,1,117,1714,0,0), +(1732,512,2048,0,7,2,117,1715,0,0), +(1733,512,2048,0,7,3,117,1716,0,0), +(1734,512,2048,0,7,4,117,1717,0,0), +(1735,512,2048,0,7,5,117,1718,0,0), +(1736,512,2048,0,7,6,117,1719,0,0), +(1737,512,2047,0,8,0,118,1720,0,0), +(1738,512,2048,0,8,1,118,1721,0,0), +(1739,512,2048,0,8,2,118,1722,0,0), +(1740,512,2048,0,8,3,118,1723,0,0), +(1741,512,2048,0,8,4,118,1724,0,0), +(1742,512,2048,0,8,5,118,1725,0,0), +(1743,512,4095,1,1,0,119,1732,0,0), +(1744,512,4095,1,1,1,119,1733,0,0), +(1745,512,4095,1,1,2,119,1734,0,0), +(1746,512,4095,1,1,3,119,1735,0,0), +(1747,512,4095,1,1,4,119,1736,0,0), +(1748,512,4095,1,1,5,119,1737,0,0), +(1749,512,4095,1,1,6,119,1738,0,0), +(1750,512,4095,1,1,7,119,1739,0,0), +(1751,512,4095,1,1,8,119,1740,0,0), +(1752,512,4095,1,1,9,119,1741,0,0), +(1753,512,4095,1,1,10,119,1742,0,0), +(1754,512,4095,1,1,11,119,1743,0,0), +(1755,512,4095,1,1,12,119,1744,0,0), +(1756,512,4095,1,1,13,119,1745,0,0), +(1757,512,4095,1,1,14,119,1746,0,0), +(1758,512,4095,1,1,15,119,1747,0,0), +(1759,512,32,1,1,16,119,1748,0,0), +(1760,512,32,1,1,17,119,1749,0,0), +(1761,512,32,1,1,18,119,1750,0,0), +(1762,512,2048,1,1,19,119,1751,0,0), +(1763,512,2048,1,1,20,119,1752,0,0), +(1764,512,2048,1,1,21,119,1753,0,0), +(1765,512,2048,1,1,22,119,1754,0,0), +(1766,512,2048,1,1,23,119,1755,0,0), +(1767,512,2048,1,1,24,119,1756,0,0), +(1768,512,4095,1,1,25,119,1757,0,0), +(1769,512,4063,1,2,0,120,1758,1,0), +(1770,512,4063,1,2,1,120,1759,0,0), +(1771,512,4063,1,2,2,120,1760,0,0), +(1772,512,4063,1,2,3,120,1761,1,0), +(1773,512,4063,1,2,4,120,1762,0,0), +(1774,512,4063,1,2,5,120,1763,0,0), +(1775,512,2015,1,2,6,120,1764,0,0), +(1776,512,2015,1,2,7,120,1765,0,0), +(1777,512,2015,1,2,8,120,1766,1,0), +(1778,512,2015,1,2,9,120,1767,0,0), +(1779,512,32,1,2,10,120,1768,0,0), +(1780,512,32,1,2,11,120,1769,0,0), +(1781,512,32,1,2,12,120,1770,0,0), +(1782,512,32,1,2,13,120,1771,0,0), +(1783,512,32,1,2,14,120,1772,0,0), +(1784,512,32,1,2,15,120,1773,0,0), +(1785,512,32,1,2,16,120,1774,0,0), +(1786,512,32,1,2,17,120,1775,0,0), +(1787,512,32,1,2,18,120,1776,0,0), +(1788,512,32,1,2,19,120,1777,0,0), +(1789,512,4063,1,2,20,120,1758,0,0), +(1790,512,4063,1,2,21,120,1759,0,0), +(1791,512,4063,1,2,22,120,1760,0,0), +(1792,512,4095,1,3,0,121,1781,0,0), +(1793,512,4095,1,3,1,121,1782,0,0), +(1794,512,4095,1,3,2,121,1783,0,0), +(1795,512,4095,1,3,3,121,1784,0,0), +(1796,512,4095,1,3,4,121,1785,0,0), +(1797,512,4095,1,3,5,121,1786,0,0), +(1798,512,4095,1,3,6,121,1787,0,0), +(1799,512,4095,1,3,7,121,1788,0,0), +(1800,512,4095,1,3,8,121,1789,0,0), +(1801,512,4095,1,3,9,121,1790,0,0), +(1802,512,4095,1,3,10,121,1791,0,0), +(1803,512,4095,1,3,11,121,1792,0,0), +(1804,512,4095,1,3,12,121,1793,0,0), +(1805,512,4095,1,3,13,121,1794,0,0), +(1806,512,4095,1,3,14,121,1795,0,0), +(1807,512,4095,1,3,15,121,1796,0,0), +(1808,512,4095,1,3,16,121,1797,0,0), +(1809,512,4095,1,3,17,121,1798,0,0), +(1810,512,4095,1,3,18,121,1799,0,0), +(1811,512,4095,1,3,19,121,1800,0,0), +(1812,512,4095,1,4,0,122,1801,0,0), +(1813,512,4095,1,4,1,122,1802,0,0), +(1814,512,4095,1,4,2,122,1803,0,0), +(1815,512,4095,1,4,3,122,1804,0,0), +(1816,512,4095,1,4,4,122,1805,0,0), +(1817,512,4095,1,4,5,122,1806,0,0), +(1818,512,4095,1,4,6,122,1807,0,0), +(1819,512,4095,1,4,7,122,1808,0,0), +(1820,512,4095,1,4,8,122,1809,0,0), +(1821,512,4095,1,4,9,122,1810,0,0), +(1822,512,4095,1,4,10,122,1811,0,0), +(1823,512,4095,1,4,11,122,1812,0,0), +(1824,512,4095,1,4,12,122,1813,0,0), +(1825,512,4095,1,4,13,122,1814,0,0), +(1826,512,4095,1,5,0,123,1815,0,0), +(1827,512,4095,1,5,1,123,1816,0,0), +(1828,512,4095,1,5,2,123,1817,0,0), +(1829,512,4095,1,5,3,123,1818,0,0), +(1830,512,4095,1,5,4,123,1819,0,0), +(1831,512,4095,1,5,5,123,1820,0,0), +(1832,512,4095,1,5,6,123,1821,0,0), +(1833,512,4095,1,5,7,123,1822,0,0), +(1834,512,4095,1,5,8,123,1823,0,0), +(1835,512,4095,1,5,9,123,1824,0,0), +(1836,512,4095,1,5,10,123,1825,0,0), +(1837,512,4095,1,5,11,123,1815,0,0), +(1838,512,4095,1,5,12,123,1816,0,0), +(1839,512,4095,1,5,13,123,1817,0,0), +(1840,512,4095,1,5,14,123,1818,0,0), +(1841,512,4095,1,5,15,123,1819,0,0), +(1842,512,4095,1,5,16,123,1820,0,0), +(1843,512,4095,1,5,17,123,1821,0,0), +(1844,512,4095,1,5,18,123,1822,0,0), +(1845,512,4095,1,5,19,123,1823,0,0), +(1846,512,4095,1,5,20,123,1824,0,0), +(1847,512,4095,1,5,21,123,1825,0,0), +(1848,512,4095,1,6,0,381,1837,0,0), +(1849,512,2048,1,6,1,381,1838,0,0), +(1850,512,2048,1,6,7,381,1838,0,0), +(1851,512,2048,1,6,13,381,1838,0,0), +(1852,512,2048,1,6,19,381,1838,0,0), +(1853,512,2048,1,6,25,381,1838,0,0), +(1854,512,2048,1,6,31,381,1838,0,0), +(1855,512,2048,1,6,2,381,1839,0,0), +(1856,512,2048,1,6,8,381,1839,0,0), +(1857,512,2048,1,6,14,381,1839,0,0), +(1858,512,2048,1,6,20,381,1839,0,0), +(1859,512,2048,1,6,26,381,1839,0,0), +(1860,512,2048,1,6,32,381,1839,0,0), +(1861,512,2048,1,6,3,381,1840,0,0), +(1862,512,2048,1,6,9,381,1840,0,0), +(1863,512,2048,1,6,15,381,1840,0,0), +(1864,512,2048,1,6,21,381,1840,0,0), +(1865,512,2048,1,6,27,381,1840,0,0), +(1866,512,2048,1,6,33,381,1840,0,0), +(1867,512,2048,1,6,4,381,1841,0,0), +(1868,512,2048,1,6,10,381,1841,0,0), +(1869,512,2048,1,6,16,381,1841,0,0), +(1870,512,2048,1,6,22,381,1841,0,0), +(1871,512,2048,1,6,28,381,1841,0,0), +(1872,512,2048,1,6,34,381,1841,0,0), +(1873,512,2048,1,6,5,381,1842,0,0), +(1874,512,2048,1,6,11,381,1842,0,0), +(1875,512,2048,1,6,17,381,1842,0,0), +(1876,512,2048,1,6,23,381,1842,0,0), +(1877,512,2048,1,6,29,381,1842,0,0), +(1878,512,2048,1,6,35,381,1842,0,0), +(1879,512,2048,1,6,6,381,3714,0,0), +(1880,512,2048,1,6,12,381,3714,0,0), +(1881,512,2048,1,6,18,381,3714,0,0), +(1882,512,2048,1,6,24,381,3714,0,0), +(1883,512,2048,1,6,30,381,3714,0,0), +(1884,512,2048,1,6,36,381,3714,0,0), +(1885,512,4095,1,6,0,125,1843,0,0), +(1886,512,2048,1,6,1,125,1844,0,0), +(1887,512,2048,1,6,2,125,1844,0,0), +(1888,512,2048,1,6,3,125,1844,0,0), +(1889,512,2048,1,6,4,125,1844,0,0), +(1890,512,2048,1,6,5,125,1844,0,0), +(1891,512,2048,1,6,6,125,1844,0,0), +(1892,512,2048,1,6,7,125,1845,0,0), +(1893,512,2048,1,6,8,125,1845,0,0), +(1894,512,2048,1,6,9,125,1845,0,0), +(1895,512,2048,1,6,10,125,1845,0,0), +(1896,512,2048,1,6,11,125,1845,0,0), +(1897,512,2048,1,6,12,125,1845,0,0), +(1898,512,2048,1,6,13,125,1846,0,0), +(1899,512,2048,1,6,14,125,1846,0,0), +(1900,512,2048,1,6,15,125,1846,0,0), +(1901,512,2048,1,6,16,125,1846,0,0), +(1902,512,2048,1,6,17,125,1846,0,0), +(1903,512,2048,1,6,18,125,1846,0,0), +(1904,512,2048,1,6,19,125,1847,0,0), +(1905,512,2048,1,6,20,125,1847,0,0), +(1906,512,2048,1,6,21,125,1847,0,0), +(1907,512,2048,1,6,22,125,1847,0,0), +(1908,512,2048,1,6,23,125,1847,0,0), +(1909,512,2048,1,6,24,125,1847,0,0), +(1910,512,2048,1,6,25,125,1848,0,0), +(1911,512,2048,1,6,26,125,1848,0,0), +(1912,512,2048,1,6,27,125,1848,0,0), +(1913,512,2048,1,6,28,125,1848,0,0), +(1914,512,2048,1,6,29,125,1848,0,0), +(1915,512,2048,1,6,30,125,1848,0,0), +(1922,512,2048,1,6,31,125,9930,0,0), +(1923,512,2048,1,6,32,125,9930,0,0), +(1924,512,2048,1,6,33,125,9930,0,0), +(1925,512,2048,1,6,34,125,9930,0,0), +(1926,512,2048,1,6,35,125,9930,0,0), +(1927,512,2048,1,6,36,125,9930,0,0), +(1928,512,4095,1,7,0,126,1850,0,0), +(1929,512,2048,1,7,1,126,1851,0,0), +(1930,512,2048,1,7,2,126,1852,0,0), +(1931,512,2048,1,7,3,126,1853,0,0), +(1932,512,2048,1,7,4,126,1854,0,0), +(1933,512,2048,1,7,5,126,1855,0,0), +(1934,512,2048,1,7,6,126,1856,0,0), +(1935,512,2047,1,8,0,127,1857,0,0), +(1936,512,2048,1,8,1,127,1858,0,0), +(1937,512,2048,1,8,2,127,1859,0,0), +(1938,512,2048,1,8,3,127,1860,0,0), +(1939,512,2048,1,8,4,127,1861,0,0), +(1940,512,2048,1,8,5,127,1862,0,0), +(1941,1024,4095,0,1,0,128,1869,0,0), +(1942,1024,4095,0,1,1,128,1870,0,0), +(1943,1024,4095,0,1,2,128,1871,0,0), +(1944,1024,4095,0,1,3,128,1872,0,0), +(1945,1024,4095,0,1,4,128,1873,0,0), +(1946,1024,4095,0,1,5,128,1874,0,0), +(1947,1024,4095,0,1,6,128,1875,0,0), +(1948,1024,4095,0,1,7,128,1876,0,0), +(1949,1024,4095,0,1,8,128,1877,0,0), +(1950,1024,4095,0,1,9,128,1878,0,0), +(1951,1024,4095,0,1,10,128,1879,0,0), +(1952,1024,4095,0,1,11,128,1880,0,0), +(1953,1024,4095,0,1,12,128,1881,0,0), +(1954,1024,4095,0,1,13,128,1882,0,0), +(1955,1024,32,0,1,14,128,1883,0,0), +(1956,1024,32,0,1,15,128,1884,0,0), +(1957,1024,32,0,1,16,128,1885,0,0), +(1958,1024,4095,0,1,17,128,1886,0,0), +(1959,1024,4095,0,1,18,128,1887,0,0), +(1960,1024,4095,0,1,19,128,1888,0,0), +(1961,1024,4095,0,1,20,128,1889,0,0), +(1962,1024,4063,0,2,0,129,1890,0,0), +(1963,1024,4063,0,2,1,129,1891,1,0), +(1964,1024,4063,0,2,2,129,1892,0,0), +(1965,1024,4063,0,2,3,129,1893,0,0), +(1966,1024,4063,0,2,4,129,1894,1,0), +(1967,1024,4063,0,2,5,129,1895,0,0), +(1968,1024,4063,0,2,6,129,1896,0,0), +(1969,1024,4063,0,2,7,129,1897,0,0), +(1970,1024,4063,0,2,8,129,1898,0,0), +(1971,1024,4063,0,2,9,129,1899,1,0), +(1972,1024,32,0,2,10,129,1900,0,0), +(1973,1024,32,0,2,11,129,1901,0,0), +(1974,1024,32,0,2,12,129,1902,0,0), +(1975,1024,32,0,2,13,129,1903,0,0), +(1976,1024,32,0,2,14,129,1904,0,0), +(1977,1024,32,0,2,15,129,1905,0,0), +(1978,1024,32,0,2,16,129,1906,0,0), +(1979,1024,32,0,2,17,129,1907,0,0), +(1980,1024,32,0,2,18,129,1908,0,0), +(1981,1024,32,0,2,19,129,1909,0,0), +(1982,1024,4095,0,3,0,130,1910,0,0), +(1983,1024,4095,0,3,1,130,1911,0,0), +(1984,1024,4095,0,3,2,130,1912,0,0), +(1985,1024,4095,0,3,3,130,1913,0,0), +(1986,1024,4095,0,3,4,130,1914,0,0), +(1987,1024,4095,0,3,5,130,1915,0,0), +(1988,1024,4095,0,3,6,130,1916,0,0), +(1989,1024,4095,0,3,7,130,1917,0,0), +(1990,1024,4095,0,3,8,130,1918,0,0), +(1991,1024,4095,0,3,9,130,1919,0,0), +(1992,1024,4095,0,3,10,130,1920,0,0), +(1993,1024,4095,0,3,11,130,1921,0,0), +(1994,1024,4095,0,3,12,130,1922,0,0), +(1995,1024,4095,0,3,13,130,1923,0,0), +(1996,1024,4095,0,4,0,131,1924,0,0), +(1997,1024,4095,0,4,1,131,1925,0,0), +(1998,1024,4095,0,4,2,131,1926,0,0), +(1999,1024,4095,0,4,3,131,1927,0,0), +(2000,1024,4095,0,4,4,131,1928,0,0), +(2001,1024,4095,0,4,5,131,1929,0,0), +(2002,1024,4095,0,4,6,131,1930,0,0), +(2003,1024,4095,0,4,7,131,1931,0,0), +(2004,1024,4095,0,4,8,131,1932,0,0), +(2005,1024,4095,0,4,9,131,1933,0,0), +(2006,1024,4095,0,4,10,131,1934,0,0), +(2007,1024,4095,0,4,11,131,1935,0,0), +(2008,1024,4095,0,5,0,132,7767,0,0), +(2009,1024,4095,0,5,1,132,7767,0,0), +(2010,1024,4095,0,5,2,132,1936,0,0), +(2011,1024,4095,0,5,3,132,1937,0,0), +(2012,1024,4095,0,5,4,132,1938,0,0), +(2013,1024,4095,0,5,5,132,1939,0,0), +(2014,1024,4095,0,5,6,132,1940,0,0), +(2015,1024,4095,0,5,7,132,7767,0,0), +(2016,1024,4095,1,1,0,133,1944,0,0), +(2017,1024,4095,1,1,1,133,1945,0,0), +(2018,1024,4095,1,1,2,133,1946,0,0), +(2019,1024,4095,1,1,3,133,1947,0,0), +(2020,1024,4095,1,1,4,133,1948,0,0), +(2021,1024,4095,1,1,5,133,1949,0,0), +(2022,1024,4095,1,1,6,133,1950,0,0), +(2023,1024,4095,1,1,7,133,1951,0,0), +(2024,1024,4095,1,1,8,133,1952,0,0), +(2025,1024,4095,1,1,9,133,1953,0,0), +(2026,1024,4095,1,1,10,133,1954,0,0), +(2027,1024,4095,1,1,11,133,1955,0,0), +(2028,1024,32,1,1,12,133,1956,0,0), +(2029,1024,32,1,1,13,133,1957,0,0), +(2030,1024,32,1,1,14,133,1958,0,0), +(2031,1024,4095,1,1,15,133,1959,0,0), +(2032,1024,4095,1,1,16,133,1960,0,0), +(2033,1024,4095,1,1,17,133,1961,0,0), +(2034,1024,4095,1,1,18,133,1962,0,0), +(2035,1024,4063,1,2,0,134,1963,1,0), +(2036,1024,4063,1,2,1,134,1964,0,0), +(2037,1024,4063,1,2,2,134,1965,0,0), +(2038,1024,4063,1,2,3,134,1966,0,0), +(2039,1024,4063,1,2,4,134,1967,1,0), +(2040,1024,4063,1,2,5,134,1968,0,0), +(2041,1024,4063,1,2,6,134,1969,0,0), +(2042,1024,4063,1,2,7,134,1970,0,0), +(2043,1024,4063,1,2,8,134,1971,1,0), +(2044,1024,4063,1,2,9,134,1972,0,0), +(2045,1024,32,1,2,10,134,1973,0,0), +(2046,1024,32,1,2,11,134,1974,0,0), +(2047,1024,32,1,2,12,134,1975,0,0), +(2048,1024,32,1,2,13,134,1976,0,0), +(2049,1024,32,1,2,14,134,1977,0,0), +(2050,1024,32,1,2,15,134,1978,0,0), +(2051,1024,32,1,2,16,134,1979,0,0), +(2052,1024,32,1,2,17,134,1980,0,0), +(2053,1024,32,1,2,18,134,1981,0,0), +(2054,1024,32,1,2,19,134,1982,0,0), +(2055,1024,4095,1,3,0,135,1983,0,0), +(2056,1024,4095,1,3,1,135,1984,0,0), +(2057,1024,4095,1,3,2,135,1985,0,0), +(2058,1024,4095,1,3,3,135,1986,0,0), +(2059,1024,4095,1,3,4,135,1987,0,0), +(2060,1024,4095,1,3,5,135,1988,0,0), +(2061,1024,4095,1,3,6,135,1989,0,0), +(2062,1024,4095,1,3,7,135,1990,0,0), +(2063,1024,4095,1,3,8,135,1991,0,0), +(2064,1024,4095,1,3,9,135,1992,0,0), +(2065,1024,4095,1,3,10,135,1993,0,0), +(2066,1024,4095,1,3,11,135,1994,0,0), +(2067,1024,4095,1,3,12,135,1995,0,0), +(2068,1024,4095,1,3,13,135,1996,0,0), +(2069,1024,4095,1,3,14,135,1997,0,0), +(2070,1024,4095,1,3,15,135,1998,0,0), +(2071,1024,4095,1,3,16,135,1999,0,0), +(2072,1024,4095,1,4,0,136,2000,0,0), +(2073,1024,4095,1,4,1,136,2001,0,0), +(2074,1024,4095,1,4,2,136,2002,0,0), +(2075,1024,4095,1,4,3,136,2003,0,0), +(2076,1024,4095,1,4,4,136,2004,0,0), +(2077,1024,4095,1,4,5,136,2005,0,0), +(2078,1024,4095,1,4,6,136,2006,0,0), +(2079,1024,4095,1,4,7,136,2007,0,0), +(2080,1024,4095,1,4,8,136,2008,0,0), +(2081,1024,4095,1,4,9,136,2009,0,0), +(2082,1024,4095,1,4,10,136,2010,0,0), +(2083,1024,4095,1,5,0,137,2011,0,0), +(2084,1024,4095,1,5,1,137,2012,0,0), +(2085,1024,4095,1,5,2,137,2013,0,0), +(2086,1024,4095,1,5,3,137,2014,0,0), +(2087,1024,4095,1,5,4,137,2015,0,0), +(2088,1024,4095,1,5,5,137,2016,0,0), +(2089,1024,4095,1,5,6,137,2017,0,0), +(2090,1024,4095,1,5,7,137,2018,0,0), +(2091,2048,4063,0,1,0,138,2019,0,0), +(2092,2048,4063,0,1,1,138,2020,0,0), +(2093,2048,4063,0,1,2,138,2021,0,0), +(2094,2048,4063,0,2,0,139,2022,0,0), +(2095,2048,4063,0,3,0,140,2023,0,0), +(2096,2048,4063,0,4,0,141,2024,0,0), +(2097,2048,4063,1,3,0,142,2025,0,0), +(2098,2048,4063,1,4,0,143,2026,0,0), +(2099,4096,4063,0,1,0,144,2027,0,0), +(2100,4096,4063,0,1,1,144,2028,0,0), +(2101,4096,4063,0,1,2,144,2029,0,0), +(2102,4096,4063,0,1,3,144,2030,0,0), +(2103,4096,4063,0,1,4,144,2031,0,0), +(2104,4096,4063,0,1,5,144,2032,0,0), +(2105,4096,4063,0,3,0,145,2033,0,0), +(2106,4096,4063,0,4,0,146,2034,0,0), +(2107,4096,4063,1,1,0,147,2035,0,0), +(2108,4096,4063,1,1,1,147,2036,0,0), +(2109,4096,4063,1,1,2,147,2037,0,0), +(2110,4096,4063,1,1,3,147,2038,0,0), +(2111,4096,4063,1,1,4,147,2039,0,0), +(2112,4096,4063,1,1,5,147,2040,0,0), +(2113,4096,4063,1,3,0,148,2041,0,0), +(2114,4096,4063,1,4,0,149,2042,0,0), +(2115,8192,4063,0,1,0,150,2043,0,0), +(2116,8192,4063,0,1,1,150,2044,0,0), +(2117,8192,4063,0,1,2,150,2045,0,0), +(2118,8192,4063,0,1,3,150,2046,0,0), +(2119,8192,4063,0,1,4,150,2047,0,0), +(2120,8192,4063,0,1,5,150,2048,0,0), +(2121,8192,4063,0,2,0,151,2049,0,0), +(2122,8192,4063,0,3,0,152,2050,0,0), +(2123,8192,4063,0,3,1,152,2051,0,0), +(2124,8192,4063,0,3,2,152,2052,0,0), +(2125,8192,4063,0,4,0,153,2053,0,0), +(2126,8192,4063,0,4,1,153,2054,0,0), +(2127,8192,4063,0,4,2,153,2055,0,0), +(2128,8192,4063,0,4,3,153,2056,0,0), +(2129,8192,4063,0,4,4,153,2057,0,0), +(2130,8192,4063,0,4,5,153,2058,0,0), +(2131,8192,4063,0,4,6,153,2059,0,0), +(2132,8192,4063,0,4,7,153,2060,0,0), +(2133,8192,4063,0,4,8,153,2061,0,0), +(2134,8192,4063,0,4,9,153,2062,0,0), +(2135,8192,4063,1,3,0,154,2063,0,0), +(2136,8192,4063,1,4,0,155,2064,0,0), +(2137,16384,4063,0,1,0,156,2065,0,0), +(2138,16384,4063,0,2,0,157,2066,0,0), +(2139,16384,4063,0,3,0,158,2067,0,0), +(2140,16384,4063,0,4,0,159,2068,0,0), +(2141,16384,4063,1,3,0,160,2069,0,0), +(2142,16384,4063,1,4,0,161,2070,0,0), +(2143,32768,4063,0,1,0,162,2071,0,0), +(2144,32768,4063,0,1,1,162,2072,0,0), +(2145,32768,4063,0,1,2,162,2073,0,0), +(2146,32768,4063,0,1,3,162,2074,0,0), +(2147,32768,4063,0,1,4,162,2075,0,0), +(2148,32768,4063,0,1,5,162,2076,0,0), +(2149,32768,4063,0,2,0,163,2077,0,0), +(2150,32768,4063,0,3,0,164,2078,0,0), +(2151,32768,4063,0,3,1,164,2079,0,0), +(2152,32768,4063,0,3,2,164,2080,0,0), +(2153,32768,4063,0,3,3,164,2081,0,0), +(2154,32768,4063,0,3,4,164,2082,0,0), +(2155,32768,4063,0,3,5,164,2083,0,0), +(2156,32768,4063,0,4,0,165,2084,0,0), +(2157,32768,4063,0,4,1,165,2085,0,0), +(2158,32768,4063,0,4,2,165,2086,0,0), +(2159,32768,4063,0,4,3,165,2087,0,0), +(2160,32768,4063,0,4,4,165,2088,0,0), +(2161,32768,4063,0,5,0,166,2089,0,0), +(2162,32768,4063,0,5,1,166,2090,0,0), +(2163,32768,4063,0,5,2,166,2091,0,0), +(2164,32768,4063,0,5,3,166,2092,0,0), +(2165,32768,4063,0,5,4,166,2093,0,0), +(2166,32768,4095,0,5,5,166,2094,0,0), +(2167,32768,4063,1,3,0,167,2095,0,0), +(2168,32768,4063,1,4,0,168,2096,0,0), +(2169,65536,4063,0,1,0,169,2097,0,0), +(2170,65536,4063,0,1,1,169,2098,0,0), +(2171,65536,4063,0,1,2,169,2099,0,0), +(2172,65536,4063,0,1,3,169,2100,0,0), +(2173,65536,4063,0,1,4,169,2101,0,0), +(2174,65536,4063,0,1,5,169,2102,0,0), +(2175,65536,4063,0,1,6,169,2103,0,0), +(2176,65536,4063,0,2,0,170,2104,0,0), +(2177,65536,4063,0,3,0,171,2105,0,0), +(2178,65536,4063,0,3,1,171,2106,0,0), +(2179,65536,4063,0,3,2,171,2107,0,0), +(2180,65536,4063,0,3,3,171,2108,0,0), +(2181,65536,4063,0,3,4,171,2109,0,0), +(2182,65536,4063,0,3,5,171,2110,0,0), +(2183,65536,4063,0,3,6,171,2111,0,0), +(2184,65536,4063,0,4,0,172,2112,0,0), +(2185,65536,4063,0,4,1,172,2113,0,0), +(2186,65536,4063,0,4,2,172,2114,0,0), +(2187,65536,4063,0,4,3,172,2115,0,0), +(2188,65536,4063,0,4,4,172,2116,0,0), +(2189,65536,4063,0,4,5,172,2117,0,0), +(2190,65536,4063,0,4,6,172,2118,0,0), +(2191,65536,4063,0,5,0,173,2119,0,0), +(2192,65536,4095,0,5,1,173,2120,0,0), +(2193,65536,4095,0,5,2,173,2121,0,0), +(2194,65536,4095,0,5,3,173,2122,0,0), +(2195,65536,4095,0,5,4,173,2123,0,0), +(2196,65536,4095,0,5,5,173,2124,0,0), +(2197,65536,4095,0,5,6,173,2125,0,0), +(2198,65536,4063,1,3,0,174,2126,0,0), +(2199,65536,4063,1,4,0,175,2127,0,0), +(2200,131072,4063,0,1,0,176,2128,0,0), +(2201,131072,4063,0,1,1,176,2129,0,0), +(2202,131072,4063,0,1,2,176,2130,0,0), +(2203,131072,4063,0,1,3,176,2131,0,0), +(2204,131072,4063,0,1,4,176,2132,0,0), +(2205,131072,4063,0,1,5,176,2133,0,0), +(2206,131072,4095,0,1,6,176,2134,0,0), +(2207,131072,4095,0,1,7,176,2135,0,0), +(2208,131072,4095,0,1,8,176,2136,0,0), +(2209,131072,4095,0,1,9,176,2137,0,0), +(2210,131072,4095,0,1,10,176,2138,0,0), +(2211,131072,4095,0,1,11,176,2139,0,0), +(2212,131072,4095,0,1,12,176,2140,0,0), +(2213,131072,4095,0,1,13,176,2141,0,0), +(2214,131072,4095,0,1,14,176,2142,0,0), +(2215,131072,4063,0,2,0,177,2143,0,0), +(2216,131072,4063,0,2,1,177,2144,0,0), +(2217,131072,4063,0,2,2,177,2145,0,0), +(2218,131072,4063,0,2,3,177,2146,0,0), +(2219,131072,4063,0,2,4,177,2147,0,0), +(2220,131072,4063,0,3,0,178,2148,0,0), +(2221,131072,4063,0,3,1,178,2149,0,0), +(2222,131072,4063,0,3,2,178,2150,0,0), +(2223,131072,4063,0,3,3,178,2151,0,0), +(2224,131072,4063,0,3,4,178,2152,0,0), +(2225,131072,4063,0,3,5,178,2153,0,0), +(2226,131072,4063,0,4,0,179,2154,0,0), +(2227,131072,4063,0,4,1,179,2155,0,0), +(2228,131072,4063,0,4,2,179,2156,0,0), +(2229,131072,4063,0,4,3,179,2157,0,0), +(2230,131072,4063,0,4,4,179,2158,0,0), +(2231,131072,4063,0,4,5,179,2159,0,0), +(2232,131072,4063,0,4,6,179,2160,0,0), +(2233,131072,4063,0,4,7,179,2161,0,0), +(2234,131072,4063,0,4,8,179,2162,0,0), +(2235,131072,4063,0,4,9,179,2163,0,0), +(2236,131072,4063,0,5,0,180,2164,0,0), +(2237,131072,4063,0,5,1,180,2165,0,0), +(2238,131072,4063,0,5,2,180,2166,0,0), +(2239,131072,4063,0,5,3,180,2167,0,0), +(2240,131072,4063,0,5,4,180,2168,0,0), +(2241,131072,4063,0,5,5,180,2169,0,0), +(2242,131072,4063,0,5,6,180,2170,0,0), +(2243,131072,4063,0,5,7,180,2171,0,0), +(2244,131072,4063,0,5,8,180,2172,0,0), +(2245,131072,4063,0,5,9,180,2173,0,0), +(2246,131072,4063,0,5,10,180,2174,0,0), +(2247,131072,4063,1,3,0,181,2175,0,0), +(2248,131072,4063,1,4,0,182,2176,0,0), +(2249,262144,4063,0,1,0,183,2177,0,0), +(2250,262144,4063,0,1,1,183,2178,0,0), +(2251,262144,4063,0,1,2,183,2179,0,0), +(2252,262144,4063,0,1,3,183,2180,0,0), +(2253,262144,4063,0,2,0,184,2181,0,0), +(2254,262144,4063,0,3,0,185,2182,0,0), +(2255,262144,4063,0,4,0,186,3604,0,0), +(2256,262144,4063,0,5,0,187,2183,0,0), +(2257,262144,4095,0,5,1,187,2184,0,0), +(2258,262144,4095,0,5,2,187,2185,0,0), +(2259,262144,4063,1,3,0,188,2186,0,0), +(2260,262144,4063,1,4,0,189,2187,0,0), +(2261,524288,4095,0,1,0,190,2188,0,0), +(2262,524288,4095,0,1,1,190,2189,0,0), +(2263,524288,4095,0,1,2,190,2190,0,0), +(2264,524288,4095,0,1,3,190,2191,0,0), +(2265,524288,4063,0,3,0,191,2192,0,0), +(2266,524288,4063,0,4,0,192,2193,0,0), +(2267,524288,4063,0,4,1,192,2194,0,0), +(2268,524288,4063,0,4,2,192,2195,0,0), +(2269,524288,4063,0,4,3,192,2196,0,0), +(2270,524288,4095,0,5,0,193,2197,0,0), +(2271,524288,4095,0,5,1,193,2198,0,0), +(2272,524288,4095,0,5,2,193,2199,0,0), +(2273,524288,4095,0,5,3,193,2200,0,0), +(2274,524288,4095,0,5,4,193,2201,0,0), +(2275,524288,4063,1,3,0,194,2202,0,0), +(2276,524288,4063,1,4,0,195,2203,0,0), +(2277,1048576,4063,0,1,0,196,2204,0,0), +(2278,1048576,4063,0,1,1,196,2205,0,0), +(2279,1048576,4063,0,1,2,196,2206,0,0), +(2280,1048576,4063,0,1,3,196,2207,0,0), +(2281,1048576,4063,0,1,4,196,2208,0,0), +(2282,1048576,4063,0,1,5,196,2209,0,0), +(2283,1048576,4063,0,1,6,196,2210,0,0), +(2284,1048576,4063,0,1,7,196,2211,0,0), +(2285,1048576,4063,0,2,0,197,2212,0,0), +(2286,1048576,4063,0,3,0,198,2213,0,0), +(2287,1048576,4063,0,3,1,198,2214,0,0), +(2288,1048576,4063,0,3,2,198,2215,0,0), +(2289,1048576,4063,0,3,3,198,2216,0,0), +(2290,1048576,4063,0,3,4,198,2217,0,0), +(2291,1048576,4095,0,3,5,198,2218,0,0), +(2292,1048576,4063,0,4,0,199,2219,0,0), +(2293,1048576,4063,0,4,1,199,2220,0,0), +(2294,1048576,4063,0,4,2,199,2221,0,0), +(2295,1048576,4063,0,4,3,199,2222,0,0), +(2296,1048576,4063,0,4,4,199,2223,0,0), +(2297,1048576,4063,0,4,5,199,2224,0,0), +(2298,1048576,4095,0,5,0,200,2225,0,0), +(2299,1048576,4095,0,5,1,200,2226,0,0), +(2300,1048576,4095,0,5,2,200,2227,0,0), +(2301,1048576,4095,0,5,3,200,2228,0,0), +(2302,1048576,4095,0,5,4,200,2229,0,0), +(2303,1048576,4063,1,3,0,201,2230,0,0), +(2304,1048576,4063,1,4,0,202,2231,0,0), +(2305,2097152,4095,0,1,0,203,2232,0,0), +(2306,2097152,4095,0,1,1,203,2233,0,0), +(2307,2097152,4095,0,1,2,203,2234,0,0), +(2308,2097152,4095,0,1,3,203,2235,0,0), +(2309,2097152,4095,0,1,4,203,2236,0,0), +(2310,2097152,32,0,1,5,203,2237,0,0), +(2311,2097152,32,0,1,6,203,2238,0,0), +(2312,2097152,32,0,1,7,203,2239,0,0), +(2313,2097152,4095,0,1,8,203,2240,0,0), +(2314,2097152,4063,0,2,0,204,2241,1,0), +(2315,2097152,4063,0,2,1,204,2242,0,0), +(2316,2097152,4063,0,2,2,204,2243,0,0), +(2317,2097152,4063,0,2,3,204,2244,0,0), +(2318,2097152,4063,0,2,4,204,2245,0,0), +(2319,2097152,32,0,2,5,204,2246,0,0), +(2320,2097152,32,0,2,6,204,2247,0,0), +(2321,2097152,32,0,2,7,204,2248,0,0), +(2322,2097152,32,0,2,8,204,2249,0,0), +(2323,2097152,32,0,2,9,204,2250,0,0), +(2324,2097152,32,0,2,10,204,2251,0,0), +(2325,2097152,32,0,2,11,204,2252,0,0), +(2326,2097152,32,0,2,12,204,2253,0,0), +(2327,2097152,32,0,2,13,204,2254,0,0), +(2328,2097152,32,0,2,14,204,2255,0,0), +(2329,2097152,4063,0,2,15,204,2256,0,0), +(2330,2097152,4063,0,2,16,204,2257,0,0), +(2331,2097152,32,0,2,17,204,2258,0,0), +(2332,2097152,32,0,2,18,204,2259,0,0), +(2333,2097152,4095,0,3,0,205,2260,0,0), +(2334,2097152,4095,0,3,1,205,2261,0,0), +(2335,2097152,4095,0,3,2,205,2262,0,0), +(2336,2097152,4095,0,3,3,205,2263,0,0), +(2337,2097152,4095,0,3,4,205,2264,0,0), +(2338,2097152,4095,0,3,5,205,2265,0,0), +(2339,2097152,4095,0,3,6,205,2266,0,0), +(2340,2097152,4095,0,3,7,205,2267,0,0), +(2341,2097152,4095,0,3,8,205,2268,0,0), +(2342,2097152,4095,0,3,9,205,2269,0,0), +(2343,2097152,4095,0,3,10,205,2270,0,0), +(2344,2097152,4095,0,3,11,205,2271,0,0), +(2345,2097152,4095,0,3,12,205,2272,0,0), +(2352,2097152,4095,0,5,0,207,2279,0,0), +(2353,2097152,4095,0,5,1,207,2280,0,0), +(2354,2097152,4095,0,5,2,207,2281,0,0), +(2355,2097152,4095,0,5,3,207,2282,0,0), +(2356,2097152,4095,0,5,4,207,2283,0,0), +(2357,2097152,4095,0,5,5,207,2279,0,0), +(2358,2097152,4095,0,5,6,207,2284,0,0), +(2359,2097152,4095,0,5,7,207,2285,0,0), +(2360,2097152,4095,0,5,8,207,2279,0,0), +(2376,2097152,4095,1,1,0,208,2303,0,0), +(2377,2097152,4095,1,1,1,208,2304,0,0), +(2378,2097152,4095,1,1,2,208,2305,0,0), +(2379,2097152,4095,1,1,3,208,2306,0,0), +(2380,2097152,4095,1,1,4,208,2307,0,0), +(2381,2097152,4095,1,1,5,208,2308,0,0), +(2382,2097152,4095,1,1,6,208,2309,0,0), +(2383,2097152,4095,1,1,7,208,2310,0,0), +(2384,2097152,4095,1,1,8,208,2311,0,0), +(2385,2097152,32,1,1,9,208,2312,0,0), +(2386,2097152,32,1,1,10,208,2313,0,0), +(2387,2097152,32,1,1,11,208,2314,0,0), +(2388,2097152,4095,1,1,12,208,2315,0,0), +(2389,2097152,4063,1,2,0,209,2316,0,0), +(2390,2097152,4063,1,2,1,209,2317,0,0), +(2391,2097152,4063,1,2,2,209,2318,0,0), +(2392,2097152,4063,1,2,3,209,2319,0,0), +(2393,2097152,4063,1,2,4,209,2320,0,0), +(2394,2097152,4063,1,2,5,209,2321,0,0), +(2395,2097152,4063,1,2,6,209,2322,0,0), +(2396,2097152,4063,1,2,7,209,2323,1,0), +(2397,2097152,4063,1,2,8,209,2324,0,0), +(2398,2097152,4063,1,2,9,209,2325,1,0), +(2399,2097152,4063,1,2,10,209,2326,0,0), +(2400,2097152,4063,1,2,11,209,2327,0,0), +(2401,2097152,4063,1,2,12,209,2328,0,0), +(2402,2097152,4063,1,2,13,209,2329,1,0), +(2403,2097152,32,1,2,14,209,2330,0,0), +(2404,2097152,32,1,2,15,209,2331,0,0), +(2405,2097152,32,1,2,16,209,2332,0,0), +(2406,2097152,32,1,2,17,209,2333,0,0), +(2407,2097152,32,1,2,18,209,2334,0,0), +(2408,2097152,32,1,2,19,209,2335,0,0), +(2409,2097152,32,1,2,20,209,2336,0,0), +(2410,2097152,32,1,2,21,209,2337,0,0), +(2411,2097152,32,1,2,22,209,2338,0,0), +(2412,2097152,32,1,2,23,209,2339,0,0), +(2413,2097152,32,1,2,24,209,2340,0,0), +(2414,2097152,32,1,2,25,209,2341,0,0), +(2415,2097152,32,1,2,26,209,2342,0,0), +(2416,2097152,32,1,2,27,209,2343,0,0), +(2417,2097152,4063,1,2,28,209,2344,0,0), +(2418,2097152,32,1,2,29,209,2345,0,0), +(2419,2097152,4063,1,2,30,209,2346,0,0), +(2420,2097152,32,1,2,31,209,2347,0,0), +(2421,2097152,4095,1,3,0,210,2348,0,0), +(2422,2097152,4095,1,3,1,210,2349,0,0), +(2423,2097152,4095,1,3,2,210,2350,0,0), +(2424,2097152,4095,1,3,3,210,2351,0,0), +(2425,2097152,4095,1,3,4,210,2352,0,0), +(2426,2097152,4095,1,3,5,210,2353,0,0), +(2427,2097152,4095,1,3,6,210,2354,0,0), +(2428,2097152,4095,1,3,7,210,2355,0,0), +(2429,2097152,4095,1,3,8,210,2356,0,0), +(2430,2097152,4095,1,3,9,210,2357,0,0), +(2431,2097152,4095,1,3,10,210,2358,0,0), +(2432,2097152,4095,1,3,11,210,2359,0,0), +(2433,2097152,4095,1,3,12,210,2360,0,0), +(2434,2097152,4095,1,3,13,210,2361,0,0), +(2435,2097152,4095,1,3,14,210,2362,0,0), +(2436,2097152,4095,1,3,15,210,2363,0,0), +(2443,2097152,4095,1,5,0,212,2370,0,0), +(2444,2097152,4095,1,5,1,212,2371,0,0), +(2445,2097152,4095,1,5,2,212,2372,0,0), +(2446,2097152,4095,1,5,3,212,2373,0,0), +(2447,2097152,4095,1,5,4,212,2374,0,0), +(2448,2097152,4095,1,5,5,212,2375,0,0), +(2449,2097152,4095,1,5,6,212,2376,0,0), +(2450,2097152,4095,1,5,7,212,2377,0,0), +(2451,2097152,4095,1,5,8,212,2378,0,0), +(2452,2097152,4095,1,5,9,212,2379,0,0), +(2453,2097152,4095,1,5,10,212,2380,0,0), +(2454,2097152,4095,1,5,11,212,2381,0,0), +(2455,6291456,4095,0,1,0,9,1,0,0), +(2456,6291456,4095,0,1,1,9,4,0,0), +(2457,6291456,4095,0,1,2,9,6,0,0), +(2458,6291456,4095,0,1,3,9,8,0,0), +(2459,6291456,4095,0,1,4,9,10,0,0), +(2460,6291456,32,0,1,5,9,13,0,0), +(2461,6291456,32,0,1,6,9,14,0,0), +(2462,6291456,32,0,1,7,9,15,0,0), +(2463,6291456,4095,0,1,8,9,17,0,0), +(2464,6291456,4095,0,2,0,10,20,1,0), +(2465,6291456,4095,0,2,1,10,21,0,0), +(2466,6291456,4095,0,2,2,10,22,0,0), +(2467,6291456,4095,0,2,3,10,23,0,0), +(2468,6291456,4095,0,2,4,10,24,0,0), +(2469,6291456,4095,0,2,5,10,25,0,0), +(2470,6291456,4095,0,2,6,10,26,0,0), +(2471,6291456,4095,0,2,7,10,27,0,0), +(2472,6291456,4095,0,2,8,10,28,0,0), +(2473,6291456,4095,0,2,9,10,29,0,0), +(2474,6291456,4095,0,2,10,10,22,1,5), +(2475,6291456,4095,0,2,11,10,20,1,5), +(2476,6291456,4095,0,2,12,10,22,1,5), +(2477,6291456,4095,0,2,13,10,31,1,5), +(2478,6291456,4095,0,2,14,10,20,1,5), +(2479,6291456,4095,0,2,15,10,21,0,0), +(2480,6291456,4095,0,2,16,10,22,0,0), +(2481,6291456,4095,0,2,17,10,27,0,0), +(2482,6291456,4095,0,2,18,10,28,0,0), +(2483,6291456,4095,0,3,0,11,48,0,0), +(2484,6291456,4095,0,3,1,11,45,0,0), +(2485,6291456,4095,0,3,2,11,46,0,0), +(2486,6291456,4095,0,3,3,11,45,0,0), +(2487,6291456,4095,0,3,4,11,48,0,0), +(2488,6291456,4095,0,3,5,11,49,0,0), +(2489,6291456,4095,0,3,6,11,50,0,0), +(2490,6291456,4095,0,3,7,11,51,0,0), +(2491,6291456,4095,0,3,8,11,50,0,0), +(2492,6291456,4095,0,3,9,11,53,0,0), +(2493,6291456,4095,0,3,10,11,54,0,0), +(2494,6291456,4095,0,3,11,11,55,0,0), +(2495,6291456,4095,0,3,12,11,56,0,0), +(2496,6291456,4095,0,3,13,11,57,0,0), +(2497,6291456,4095,0,3,14,11,58,0,0), +(2498,6291456,4095,0,3,15,11,59,0,0), +(2499,6291456,4095,0,3,16,11,60,0,0), +(2500,6291456,4095,0,4,0,12,61,0,0), +(2501,6291456,4095,0,4,1,12,62,0,0), +(2502,6291456,4095,0,4,2,12,63,0,0), +(2503,6291456,4095,0,4,3,12,64,0,0), +(2504,6291456,4095,0,4,4,12,65,0,0), +(2505,6291456,4095,0,4,5,12,74,0,0), +(2506,6291456,4095,0,5,0,13,81,0,0), +(2507,6291456,4095,0,5,1,13,82,0,0), +(2508,6291456,4095,0,5,2,13,83,0,0), +(2509,6291456,4095,0,5,3,13,77,0,0), +(2510,6291456,4095,0,5,4,13,77,0,0), +(2511,6291456,4095,0,5,5,13,76,0,0), +(2512,6291456,4095,0,5,6,13,77,0,0), +(2513,6291456,4095,0,5,7,13,76,0,0), +(2514,6291456,4095,0,5,8,13,76,0,0), +(2515,6291456,4095,1,1,0,14,85,0,0), +(2516,6291456,4095,1,1,1,14,86,0,0), +(2517,6291456,4095,1,1,2,14,87,0,0), +(2518,6291456,4095,1,1,3,14,88,0,0), +(2519,6291456,4095,1,1,4,14,89,0,0), +(2520,6291456,4095,1,1,5,14,90,0,0), +(2521,6291456,4095,1,1,6,14,91,0,0), +(2522,6291456,4095,1,1,7,14,92,0,0), +(2523,6291456,4095,1,1,8,14,93,0,0), +(2524,6291456,32,1,1,9,14,97,0,0), +(2525,6291456,32,1,1,10,14,98,0,0), +(2526,6291456,32,1,1,11,14,99,0,0), +(2527,6291456,4095,1,1,12,14,100,0,0), +(2528,6291456,4095,1,2,0,15,102,0,0), +(2529,6291456,4095,1,2,1,15,103,0,0), +(2530,6291456,4095,1,2,2,15,104,0,0), +(2531,6291456,4095,1,2,3,15,105,0,0), +(2532,6291456,4095,1,2,4,15,106,0,0), +(2533,6291456,4095,1,2,5,15,107,0,0), +(2534,6291456,4095,1,2,6,15,108,0,0), +(2535,6291456,4095,1,2,7,15,109,1,12), +(2536,6291456,4095,1,2,8,15,110,0,0), +(2537,6291456,4095,1,2,9,15,111,1,12), +(2538,6291456,4095,1,2,10,15,112,0,0), +(2539,6291456,4095,1,2,11,15,113,0,0), +(2540,6291456,4095,1,2,12,15,114,0,0), +(2541,6291456,4095,1,2,13,15,115,1,12), +(2542,6291456,4095,1,2,14,15,116,0,0), +(2543,6291456,4095,1,2,15,15,102,0,0), +(2544,6291456,4095,1,2,16,15,103,0,0), +(2545,6291456,4095,1,2,17,15,104,0,0), +(2546,6291456,4095,1,2,18,15,105,0,0), +(2547,6291456,4095,1,2,19,15,106,0,0), +(2548,6291456,4095,1,2,20,15,107,0,0), +(2549,6291456,4095,1,2,21,15,108,0,0), +(2550,6291456,4095,1,2,22,15,109,0,0), +(2551,6291456,4095,1,2,23,15,110,0,0), +(2552,6291456,4095,1,2,24,15,111,0,0), +(2553,6291456,4095,1,2,25,15,112,0,0), +(2554,6291456,4095,1,2,26,15,113,0,0), +(2555,6291456,4095,1,2,27,15,114,0,0), +(2556,6291456,4095,1,2,28,15,112,0,0), +(2557,6291456,4095,1,2,29,15,107,0,0), +(2558,6291456,4095,1,2,30,15,114,0,0), +(2559,6291456,4095,1,2,31,15,110,0,0), +(2588,6291456,4095,1,4,0,17,156,0,0), +(2589,6291456,4095,1,4,1,17,157,0,0), +(2590,6291456,4095,1,4,2,17,158,0,0), +(2591,6291456,4095,1,4,3,17,159,0,0), +(2592,6291456,4095,1,4,4,17,160,0,0), +(2593,6291456,4095,1,4,5,17,169,0,0), +(2594,6291456,4095,1,5,0,501,4752,0,0), +(2595,6291456,4095,1,5,1,501,4753,0,0), +(2596,6291456,4095,1,5,2,501,4754,0,0), +(2597,6291456,4095,1,5,3,501,4755,0,0), +(2598,6291456,4095,1,5,4,501,4756,0,0), +(2599,6291456,4095,1,5,5,501,4757,0,0), +(2600,6291456,4095,1,5,6,501,4758,0,0), +(2601,58720256,4095,0,1,0,383,2528,0,0), +(2602,58720256,4095,0,1,1,383,2529,0,0), +(2603,58720256,4095,0,1,2,383,2530,0,0), +(2604,58720256,4095,0,1,3,383,2531,0,0), +(2605,58720256,4095,0,1,4,383,2532,0,0), +(2606,58720256,4095,0,1,5,383,2533,0,0), +(2607,58720256,4095,0,1,6,383,2534,0,0), +(2608,58720256,4095,0,1,7,383,2535,0,0), +(2609,58720256,4095,0,1,8,383,2536,0,0), +(2610,58720256,4095,0,1,9,383,2537,0,0), +(2611,58720256,4095,0,1,10,383,2538,0,0), +(2612,58720256,4095,0,1,11,383,2539,0,0), +(2613,58720256,4095,0,1,12,383,2540,0,0), +(2614,58720256,4095,0,1,13,383,2541,0,0), +(2615,58720256,4095,0,1,14,383,2542,0,0), +(2616,58720256,4095,0,2,0,384,2543,0,0), +(2617,58720256,4095,0,2,1,384,2544,0,0), +(2618,58720256,4095,0,2,2,384,2545,0,0), +(2619,58720256,4095,0,2,3,384,2546,0,0), +(2620,58720256,4095,0,2,4,384,2547,0,0), +(2621,58720256,4095,0,2,5,384,2548,0,0), +(2622,58720256,4095,0,2,6,384,2549,0,0), +(2623,58720256,4095,0,2,7,384,2550,0,0), +(2624,58720256,4095,0,2,8,384,2551,0,0), +(2625,58720256,4095,0,2,9,384,2552,0,0), +(2626,58720256,4095,0,2,10,384,2553,0,0), +(2627,58720256,4095,0,2,11,384,2554,0,0), +(2628,58720256,4095,0,2,12,384,2555,0,0), +(2629,58720256,4095,0,2,13,384,2556,0,0), +(2630,58720256,4095,0,2,14,384,2557,0,0), +(2631,58720256,4095,0,2,15,384,2558,0,0), +(2632,58720256,4095,0,2,16,384,2559,0,0), +(2633,58720256,4095,0,2,17,384,2560,0,0), +(2634,58720256,4095,0,2,18,384,2561,0,0), +(2635,58720256,4095,0,2,19,384,2562,0,0), +(2636,58720256,4095,0,2,20,384,2563,0,0), +(2637,58720256,4095,0,3,0,385,2564,0,0), +(2638,58720256,4095,0,3,1,385,2565,0,0), +(2639,58720256,4095,0,3,2,385,2566,0,0), +(2640,58720256,4095,0,3,3,385,2567,0,0), +(2641,58720256,4095,0,3,4,385,2568,0,0), +(2642,58720256,4095,0,3,5,385,2569,0,0), +(2643,58720256,4095,0,3,6,385,2570,0,0), +(2644,58720256,4095,0,3,7,385,2571,0,0), +(2645,58720256,4095,0,3,8,385,2572,0,0), +(2646,58720256,4095,0,3,9,385,2573,0,0), +(2647,58720256,4095,0,3,10,385,2574,0,0), +(2648,58720256,4095,0,3,11,385,2575,0,0), +(2649,58720256,4095,0,3,12,385,2576,0,0), +(2650,58720256,4095,0,3,13,385,2577,0,0), +(2651,58720256,4095,0,3,14,385,2578,0,0), +(2652,58720256,4095,0,3,15,385,2579,0,0), +(2653,58720256,4095,0,3,16,385,2580,0,0), +(2654,58720256,4095,0,3,17,385,2581,0,0), +(2655,58720256,4095,0,3,18,385,2582,0,0), +(2656,58720256,4095,0,5,0,386,2614,0,0), +(2657,58720256,4095,0,5,1,386,2584,0,0), +(2658,58720256,4095,0,5,2,386,2585,0,0), +(2659,58720256,4095,0,5,3,386,2586,0,0), +(2660,58720256,4095,0,5,4,386,2587,0,0), +(2661,58720256,4095,0,5,5,386,2586,0,0), +(2662,58720256,4095,0,5,6,386,2589,0,0), +(2663,58720256,4095,0,5,7,386,2590,0,0), +(2664,58720256,4095,0,5,8,386,2591,0,0), +(2665,58720256,4095,0,5,9,386,2592,0,0), +(2666,58720256,4095,0,5,10,386,2593,0,0), +(2667,58720256,4095,0,5,11,386,2594,0,0), +(2668,58720256,4095,0,5,12,386,2584,0,0), +(2669,58720256,4095,0,5,13,386,2596,0,0), +(2670,58720256,4095,0,5,14,386,2594,0,0), +(2671,58720256,4095,0,5,15,386,2598,0,0), +(2672,58720256,4095,0,5,16,386,2599,0,0), +(2673,58720256,4095,0,5,17,386,2600,0,0), +(2674,58720256,4095,0,5,18,386,2601,0,0), +(2675,58720256,4095,0,5,19,386,2591,0,0), +(2676,58720256,4095,0,5,20,386,2589,0,0), +(2677,58720256,4095,0,5,21,386,2586,0,0), +(2678,58720256,4095,0,5,22,386,2589,0,0), +(2679,58720256,4095,0,5,23,386,2599,0,0), +(2680,58720256,4095,0,5,24,386,2607,0,0), +(2681,58720256,4095,0,5,25,386,2608,0,0), +(2682,58720256,4095,0,5,26,386,2609,0,0), +(2683,58720256,4095,0,5,27,386,2592,0,0), +(2684,58720256,4095,0,5,28,386,2586,0,0), +(2685,58720256,4095,0,5,29,386,2590,0,0), +(2686,58720256,4095,0,5,30,386,2587,0,0), +(2687,58720256,4095,0,5,31,386,2614,0,0), +(2688,58720256,4095,0,5,32,386,2614,0,0), +(2689,58720256,4095,0,5,33,386,2614,0,0), +(2690,58720256,4095,0,5,34,386,2614,0,0), +(2691,58720256,4095,1,1,0,387,2618,0,0), +(2692,58720256,4095,1,1,1,387,2619,0,0), +(2693,58720256,4095,1,1,2,387,2620,0,0), +(2694,58720256,4095,1,1,3,387,2621,0,0), +(2695,58720256,4095,1,1,4,387,2622,0,0), +(2696,58720256,4095,1,1,5,387,2623,0,0), +(2697,58720256,4095,1,1,6,387,2624,0,0), +(2698,58720256,4095,1,1,7,387,2625,0,0), +(2699,58720256,4095,1,1,8,387,2626,0,0), +(2700,58720256,4095,1,1,9,387,2627,0,0), +(2701,58720256,4095,1,1,10,387,2628,0,0), +(2702,58720256,4095,1,1,11,387,2629,0,0), +(2703,58720256,4095,1,1,12,387,2630,0,0), +(2704,58720256,4095,1,1,13,387,2631,0,0), +(2705,58720256,4095,1,1,14,387,2632,0,0), +(2706,58720256,4095,1,2,0,388,2633,0,0), +(2707,58720256,4095,1,2,1,388,2634,0,0), +(2708,58720256,4095,1,2,2,388,2635,0,0), +(2709,58720256,4095,1,2,3,388,2636,0,0), +(2710,58720256,4095,1,2,4,388,2637,0,0), +(2711,58720256,4095,1,2,5,388,2638,0,0), +(2712,58720256,4095,1,2,6,388,2639,0,0), +(2713,58720256,4095,1,2,7,388,2640,0,0), +(2714,58720256,4095,1,2,8,388,2641,0,0), +(2715,58720256,4095,1,2,9,388,2642,0,0), +(2716,58720256,4095,1,2,10,388,2643,0,0), +(2717,58720256,4095,1,2,11,388,2644,0,0), +(2718,58720256,4095,1,2,12,388,2645,0,0), +(2719,58720256,4095,1,2,13,388,2646,0,0), +(2720,58720256,4095,1,2,14,388,2647,0,0), +(2721,58720256,4095,1,2,15,388,2648,0,0), +(2722,58720256,4095,1,2,16,388,2649,0,0), +(2723,58720256,4095,1,2,17,388,2650,0,0), +(2724,58720256,4095,1,2,18,388,2651,0,0), +(2725,58720256,4095,1,2,19,388,2652,0,0), +(2726,58720256,4095,1,3,0,230,2653,0,0), +(2727,58720256,4095,1,3,1,230,2654,0,0), +(2728,58720256,4095,1,3,2,230,2655,0,0), +(2729,58720256,4095,1,3,3,230,2656,0,0), +(2730,58720256,4095,1,3,4,230,2657,0,0), +(2731,58720256,4095,1,3,5,230,2658,0,0), +(2732,58720256,4095,1,3,6,230,2659,0,0), +(2733,58720256,4095,1,3,7,230,2660,0,0), +(2734,58720256,4095,1,3,8,230,2661,0,0), +(2735,58720256,4095,1,3,9,230,2662,0,0), +(2736,58720256,4095,1,3,10,230,2663,0,0), +(2737,58720256,4095,1,3,11,230,2664,0,0), +(2738,58720256,4095,1,3,12,230,2665,0,0), +(2739,58720256,4095,1,3,13,230,2666,0,0), +(2740,58720256,4095,1,3,14,230,2667,0,0), +(2741,58720256,4095,1,3,15,230,2668,0,0), +(2742,58720256,4095,1,3,16,230,2669,0,0), +(2743,58720256,4095,1,4,0,231,2670,0,0), +(2744,58720256,4095,1,4,1,231,2671,0,0), +(2745,58720256,4095,1,4,2,231,2672,0,0), +(2746,58720256,4095,1,4,3,231,2673,0,0), +(2747,58720256,4095,1,4,4,231,2674,0,0), +(2748,58720256,4095,1,4,5,231,2675,0,0), +(2749,58720256,4095,1,4,6,231,2676,0,0), +(2750,58720256,4095,1,4,7,231,2677,0,0), +(2751,58720256,4095,1,4,8,231,2678,0,0), +(2752,58720256,4095,1,4,9,231,2679,0,0), +(2753,58720256,4095,1,4,10,231,2680,0,0), +(2754,58720256,4095,1,4,11,231,2681,0,0), +(2755,58720256,4095,1,4,12,231,2682,0,0), +(2756,58720256,4095,1,5,0,232,2683,0,0), +(2757,58720256,4095,1,5,1,232,2684,0,0), +(2758,58720256,4095,1,5,2,232,2685,0,0), +(2759,58720256,4095,1,5,3,232,2686,0,0), +(2760,58720256,4095,1,5,4,232,2687,0,0), +(2761,58720256,4095,1,5,5,232,2688,0,0), +(2762,67108864,4095,0,1,0,233,2689,0,0), +(2763,67108864,4095,0,1,1,233,2690,0,0), +(2764,67108864,4095,0,1,2,233,2691,0,0), +(2765,67108864,4095,0,1,3,233,2692,0,0), +(2766,67108864,4095,0,2,0,234,2693,0,0), +(2767,67108864,4095,0,2,1,234,2694,0,0), +(2768,67108864,4095,0,2,2,234,2695,0,0), +(2769,67108864,4095,0,2,3,234,2696,0,0), +(2770,67108864,4095,0,2,4,234,2697,0,0), +(2771,67108864,4095,0,2,5,234,2698,0,0), +(2772,67108864,4095,0,3,0,235,2699,0,0), +(2773,67108864,4095,0,3,1,235,2700,0,0), +(2774,67108864,4095,0,3,2,235,2701,0,0), +(2775,67108864,4095,0,3,3,235,2702,0,0), +(2776,67108864,4095,0,3,4,235,2703,0,0), +(2777,67108864,4095,0,3,5,235,2704,0,0), +(2778,67108864,4095,0,3,6,235,2705,0,0), +(2779,67108864,4095,0,4,0,236,2706,0,0), +(2780,67108864,4095,0,4,1,236,2707,0,0), +(2781,67108864,4095,0,4,2,236,2708,0,0), +(2782,67108864,4095,0,4,3,236,2709,0,0), +(2783,67108864,4095,0,4,4,236,2710,0,0), +(2784,67108864,4095,0,4,5,236,2711,0,0), +(2785,67108864,4095,0,4,6,236,2712,0,0), +(2786,67108864,4095,0,5,0,237,2713,0,0), +(2787,67108864,4095,0,5,1,237,2714,0,0), +(2788,67108864,4095,0,5,2,237,2715,0,0), +(2789,67108864,4095,0,5,3,237,2716,0,0), +(2790,67108864,4095,0,5,4,237,2717,0,0), +(2791,67108864,4095,0,5,5,237,2718,0,0), +(2792,67108864,4095,0,5,6,237,2719,0,0), +(2793,67108864,4095,0,6,0,389,2720,0,0), +(2794,67108864,4095,0,6,1,389,2721,0,0), +(2795,67108864,4095,0,6,2,389,2722,0,0), +(2796,67108864,4095,0,6,3,389,2723,0,0), +(2797,67108864,4095,1,1,0,239,2724,0,0), +(2798,67108864,4095,1,1,1,239,2725,0,0), +(2799,67108864,4095,1,1,2,239,2726,0,0), +(2800,67108864,4095,1,1,3,239,2727,0,0), +(2801,67108864,4095,1,2,0,240,2728,0,0), +(2802,67108864,4095,1,2,1,240,2729,0,0), +(2803,67108864,4095,1,2,2,240,2730,0,0), +(2804,67108864,4095,1,2,3,240,2731,0,0), +(2805,67108864,4095,1,2,4,240,2732,0,0), +(2806,67108864,4095,1,2,5,240,2733,0,0), +(2807,67108864,4095,1,3,0,241,2734,0,0), +(2808,67108864,4095,1,3,1,241,2735,0,0), +(2809,67108864,4095,1,3,2,241,2736,0,0), +(2810,67108864,4095,1,3,3,241,2737,0,0), +(2811,67108864,4095,1,3,4,241,2738,0,0), +(2812,67108864,4095,1,3,5,241,2739,0,0), +(2813,67108864,4095,1,4,0,242,2740,0,0), +(2814,67108864,4095,1,4,1,242,2741,0,0), +(2815,67108864,4095,1,4,2,242,2742,0,0), +(2816,67108864,4095,1,4,3,242,2743,0,0), +(2817,67108864,4095,1,4,4,242,2744,0,0), +(2818,67108864,4095,1,4,5,242,2745,0,0), +(2819,67108864,4095,1,4,6,242,2746,0,0), +(2820,67108864,4095,1,5,0,243,2747,0,0), +(2821,67108864,4095,1,5,1,243,2748,0,0), +(2822,67108864,4095,1,5,2,243,2749,0,0), +(2823,67108864,4095,1,5,3,243,2750,0,0), +(2824,67108864,4095,1,5,4,243,2751,0,0), +(2825,67108864,4095,1,5,5,243,2752,0,0), +(2826,67108864,4095,1,5,6,243,2753,0,0), +(2827,67108864,4095,1,5,7,243,2754,0,0), +(2828,67108864,4095,1,6,0,390,2755,0,0), +(2829,67108864,4095,1,6,1,390,2756,0,0), +(2830,67108864,4095,1,6,2,390,2757,0,0), +(2831,67108864,4095,1,6,3,390,2758,0,0), +(2832,134217728,4095,0,1,0,391,2759,0,0), +(2833,134217728,4095,0,1,1,391,2760,0,0), +(2834,134217728,4095,0,1,2,391,2761,0,0), +(2835,134217728,4095,0,1,3,391,2762,0,0), +(2836,134217728,4095,0,1,4,391,2763,0,0), +(2837,134217728,4095,0,2,0,392,2764,0,0), +(2838,134217728,4095,0,2,1,392,2765,0,0), +(2839,134217728,4095,0,2,2,392,2766,0,0), +(2840,134217728,4095,0,2,3,392,2767,0,0), +(2841,134217728,4095,0,2,4,392,2768,0,0), +(2842,134217728,4095,0,3,0,247,2769,0,0), +(2843,134217728,4095,0,3,1,247,2770,0,0), +(2844,134217728,4095,0,3,2,247,2771,0,0), +(2845,134217728,4095,0,3,3,247,2772,0,0), +(2846,134217728,4095,0,3,4,247,2773,0,0), +(2847,134217728,4095,0,4,0,248,2774,0,0), +(2848,134217728,4095,0,4,1,248,2775,0,0), +(2849,134217728,4095,0,4,2,248,2776,0,0), +(2850,134217728,4095,0,5,0,393,2777,0,0), +(2851,134217728,4095,0,5,1,393,2778,0,0), +(2852,134217728,4095,0,5,2,393,2779,0,0), +(2853,134217728,4095,0,5,3,393,2780,0,0), +(2854,134217728,4095,0,5,4,393,2781,0,0), +(2855,134217728,4095,0,6,0,865,9631,0,0), +(2856,134217728,4095,0,6,1,865,9632,0,0), +(2857,134217728,4095,0,6,2,865,9633,0,0), +(2858,134217728,4095,0,6,3,865,9634,0,0), +(2859,134217728,4095,0,6,4,865,9632,0,0), +(2860,134217728,4095,0,6,5,865,9633,0,0), +(2861,134217728,4095,0,6,6,865,9634,0,0), +(2862,134217728,4095,0,6,7,865,9632,0,0), +(2863,134217728,4095,0,6,8,865,9633,0,0), +(2864,134217728,4095,0,6,9,865,9634,0,0), +(2865,134217728,4095,1,1,0,395,2792,0,0), +(2866,134217728,4095,1,1,1,395,2793,0,0), +(2867,134217728,4095,1,1,2,395,2794,0,0), +(2868,134217728,4095,1,1,3,395,2795,0,0), +(2869,134217728,4095,1,1,4,395,2796,0,0), +(2870,134217728,4095,1,2,0,396,2797,0,0), +(2871,134217728,4095,1,2,1,396,2798,0,0), +(2872,134217728,4095,1,2,2,396,2799,0,0), +(2873,134217728,4095,1,2,3,396,2800,0,0), +(2874,134217728,4095,1,3,0,254,2801,0,0), +(2875,134217728,4095,1,3,1,254,2802,0,0), +(2876,134217728,4095,1,3,2,254,2803,0,0), +(2877,134217728,4095,1,3,3,254,2804,0,0), +(2878,134217728,4095,1,3,4,254,2805,0,0), +(2879,134217728,4095,1,4,0,255,2806,0,0), +(2880,134217728,4095,1,4,1,255,2807,0,0), +(2881,134217728,4095,1,4,2,255,2808,0,0), +(2882,134217728,4095,1,5,0,256,2809,0,0), +(2883,134217728,4095,1,5,1,256,2810,0,0), +(2884,134217728,4095,1,5,2,256,2811,0,0), +(2885,134217728,4095,1,5,3,256,2812,0,0), +(2886,134217728,4095,1,5,4,256,2813,0,0), +(2887,134217728,4095,1,6,0,866,9635,0,0), +(2888,134217728,4095,1,6,1,866,9636,0,0), +(2889,134217728,4095,1,6,2,866,9637,0,0), +(2890,134217728,4095,1,6,3,866,9638,0,0), +(2891,134217728,4095,1,6,4,866,9636,0,0), +(2892,134217728,4095,1,6,5,866,9637,0,0), +(2893,134217728,4095,1,6,6,866,9638,0,0), +(2894,134217728,4095,1,6,7,866,9636,0,0), +(2895,134217728,4095,1,6,8,866,9637,0,0), +(2896,134217728,4095,1,6,9,866,9638,0,0), +(2897,268435456,4095,0,1,0,259,2824,0,0), +(2898,268435456,4095,0,1,1,259,2825,0,0), +(2899,268435456,4095,0,1,2,259,2826,0,0), +(2900,268435456,4095,0,1,3,259,2827,0,0), +(2901,268435456,4095,0,1,4,259,2828,0,0), +(2902,268435456,4095,0,1,5,259,2829,0,0), +(2903,268435456,4095,0,1,6,259,2830,0,0), +(2904,268435456,4095,0,1,7,259,2831,0,0), +(2905,268435456,4095,0,2,0,260,2832,0,0), +(2906,268435456,4095,0,2,1,260,2833,0,0), +(2907,268435456,4095,0,2,2,260,2834,0,0), +(2908,268435456,4095,0,2,3,260,2835,0,0), +(2909,268435456,4095,0,2,4,260,2836,0,0), +(2910,268435456,4095,0,2,5,260,2837,0,0), +(2911,268435456,4095,0,2,6,260,2838,0,0), +(2912,268435456,4095,0,2,7,260,2839,0,0), +(2913,268435456,4095,0,3,0,261,2840,0,0), +(2914,268435456,4095,0,3,1,261,2841,0,0), +(2915,268435456,4095,0,3,2,261,2842,0,0), +(2916,268435456,4095,0,3,3,261,2843,0,0), +(2917,268435456,4095,0,3,4,261,2844,0,0), +(2918,268435456,4095,0,3,5,261,2845,0,0), +(2919,268435456,4095,0,3,6,261,2846,0,0), +(2920,268435456,4095,0,3,7,261,2847,0,0), +(2921,268435456,4095,0,3,8,261,2848,0,0), +(2922,268435456,4095,0,3,9,261,2849,0,0), +(2923,268435456,4095,0,3,10,261,2850,0,0), +(2924,268435456,4095,0,3,11,261,2851,0,0), +(2925,268435456,4095,0,4,0,262,2852,0,0), +(2926,268435456,4095,0,4,1,262,2853,0,0), +(2927,268435456,4095,0,4,2,262,2854,0,0), +(2928,268435456,4095,0,4,3,262,2855,0,0), +(2929,268435456,4095,0,4,4,262,2856,0,0), +(2930,268435456,4095,0,4,5,262,2857,0,0), +(2931,268435456,4095,0,4,6,262,2858,0,0), +(2932,268435456,4095,0,4,7,262,2859,0,0), +(2933,268435456,4095,0,4,8,262,2860,0,0), +(2934,268435456,4095,0,4,9,262,2861,0,0), +(2935,268435456,4095,0,5,0,263,2862,0,0), +(2936,268435456,4095,0,5,1,263,2863,0,0), +(2937,268435456,4095,0,5,2,263,2864,0,0), +(2938,268435456,4095,0,5,3,263,2865,0,0), +(2939,268435456,4095,0,5,4,263,2866,0,0), +(2940,268435456,4095,0,5,5,263,2867,0,0), +(2941,268435456,4095,0,5,6,263,2868,0,0), +(2942,268435456,4095,0,5,7,263,2869,0,0), +(2943,268435456,4095,1,1,0,264,2870,0,0), +(2944,268435456,4095,1,1,1,264,2871,0,0), +(2945,268435456,4095,1,1,2,264,2872,0,0), +(2946,268435456,4095,1,1,3,264,2873,0,0), +(2947,268435456,4095,1,1,4,264,2874,0,0), +(2948,268435456,4095,1,1,5,264,2875,0,0), +(2949,268435456,4095,1,1,6,264,2876,0,0), +(2950,268435456,4095,1,1,7,264,2877,0,0), +(2951,268435456,4095,1,2,0,265,2878,0,0), +(2952,268435456,4095,1,2,1,265,2879,0,0), +(2953,268435456,4095,1,2,2,265,2880,0,0), +(2954,268435456,4095,1,2,3,265,2881,0,0), +(2955,268435456,4095,1,2,4,265,2882,0,0), +(2956,268435456,4095,1,2,5,265,2883,0,0), +(2957,268435456,4095,1,2,6,265,2884,0,0), +(2958,268435456,4095,1,2,7,265,2885,0,0), +(2959,268435456,4095,1,3,0,266,2886,0,0), +(2960,268435456,4095,1,3,1,266,2887,0,0), +(2961,268435456,4095,1,3,2,266,2888,0,0), +(2962,268435456,4095,1,3,3,266,2889,0,0), +(2963,268435456,4095,1,3,4,266,2890,0,0), +(2964,268435456,4095,1,3,5,266,2891,0,0), +(2965,268435456,4095,1,3,6,266,2892,0,0), +(2966,268435456,4095,1,3,7,266,2893,0,0), +(2967,268435456,4095,1,3,8,266,2894,0,0), +(2968,268435456,4095,1,3,9,266,2895,0,0), +(2969,268435456,4095,1,4,0,267,2896,0,0), +(2970,268435456,4095,1,4,1,267,2897,0,0), +(2971,268435456,4095,1,4,2,267,2898,0,0), +(2972,268435456,4095,1,4,3,267,2899,0,0), +(2973,268435456,4095,1,4,4,267,2900,0,0), +(2974,268435456,4095,1,4,5,267,2901,0,0), +(2975,268435456,4095,1,4,6,267,2902,0,0), +(2976,268435456,4095,1,4,7,267,2903,0,0), +(2977,268435456,4095,1,4,8,267,2904,0,0), +(2978,268435456,4095,1,4,9,267,2905,0,0), +(2979,268435456,4095,1,5,0,268,2906,0,0), +(2980,268435456,4095,1,5,1,268,2907,0,0), +(2981,268435456,4095,1,5,2,268,2908,0,0), +(2982,268435456,4095,1,5,3,268,2909,0,0), +(2983,268435456,4095,1,5,4,268,2910,0,0), +(2984,536870912,4095,0,1,0,269,2911,0,0), +(2985,536870912,4095,0,1,1,269,2912,0,0), +(2986,536870912,4095,0,1,2,269,2913,0,0), +(2987,536870912,4095,0,1,3,269,2914,0,0), +(2988,536870912,4095,0,2,0,270,2915,0,0), +(2989,536870912,4095,0,2,1,270,2916,0,0), +(2990,536870912,4095,0,2,2,270,2917,0,0), +(2991,536870912,4095,0,2,3,270,2918,0,0), +(2992,536870912,4095,0,2,4,270,2919,0,0), +(2993,536870912,4095,0,2,5,270,2920,0,0), +(2994,536870912,4095,0,2,6,270,2921,0,0), +(2995,536870912,4095,0,2,7,270,2922,0,0), +(2996,536870912,4095,0,2,8,270,2923,0,0), +(2997,536870912,4095,0,2,9,270,2924,0,0), +(2998,536870912,4095,0,3,0,271,2925,0,0), +(2999,536870912,4095,0,3,1,271,2926,0,0), +(3000,536870912,4095,0,3,2,271,2927,0,0), +(3001,536870912,4095,0,3,3,271,2928,0,0), +(3002,536870912,4095,0,3,4,271,2929,0,0), +(3003,536870912,4095,0,3,5,271,2930,0,0), +(3004,536870912,4095,0,4,0,272,2931,0,0), +(3005,536870912,4095,0,4,1,272,2932,0,0), +(3006,536870912,4095,0,4,2,272,2933,0,0), +(3007,536870912,4095,0,4,3,272,2934,0,0), +(3008,536870912,4095,0,4,4,272,2935,0,0), +(3009,536870912,4095,0,4,5,272,2936,0,0), +(3010,536870912,4095,0,5,0,273,2937,0,0), +(3011,536870912,4095,0,5,1,273,2940,0,0), +(3012,536870912,4095,0,5,2,273,2941,0,0), +(3013,536870912,4095,0,5,3,273,2941,0,0), +(3014,536870912,4095,0,5,4,273,2939,0,0), +(3015,536870912,4095,0,5,5,273,2938,0,0), +(3016,536870912,4095,0,5,6,273,2937,0,0), +(3017,536870912,4095,0,5,7,273,2937,0,0), +(3018,536870912,4095,0,5,8,273,2939,0,0), +(3019,536870912,4095,0,6,0,398,2946,0,0), +(3020,536870912,4095,0,6,1,398,2947,0,0), +(3021,536870912,4095,0,6,2,398,2948,0,0), +(3022,536870912,4095,0,6,3,398,2949,0,0), +(3023,536870912,4095,0,8,0,275,2950,0,0), +(3024,536870912,4095,0,8,1,275,2951,0,0), +(3025,536870912,4095,0,8,2,275,2952,0,0), +(3026,536870912,4095,0,8,3,275,2953,0,0), +(3027,536870912,4095,0,8,4,275,2954,0,0), +(3028,536870912,4095,0,8,5,275,2955,0,0), +(3029,536870912,4095,1,1,0,276,2956,0,0), +(3030,536870912,4095,1,1,1,276,2957,0,0), +(3031,536870912,4095,1,1,2,276,2958,0,0), +(3032,536870912,4095,1,1,3,276,2959,0,0), +(3033,536870912,4095,1,2,0,277,2960,0,0), +(3034,536870912,4095,1,2,1,277,2961,0,0), +(3035,536870912,4095,1,2,2,277,2962,0,0), +(3036,536870912,4095,1,2,3,277,2963,0,0), +(3037,536870912,4095,1,2,4,277,2964,0,0), +(3038,536870912,4095,1,2,5,277,2965,0,0), +(3039,536870912,4095,1,2,6,277,2966,0,0), +(3040,536870912,4095,1,2,7,277,2967,0,0), +(3041,536870912,4095,1,2,8,277,2968,0,0), +(3042,536870912,4095,1,2,9,277,2969,0,0), +(3043,536870912,4095,1,3,0,278,2970,0,0), +(3044,536870912,4095,1,3,1,278,2971,0,0), +(3045,536870912,4095,1,3,2,278,2972,0,0), +(3046,536870912,4095,1,3,3,278,2973,0,0), +(3047,536870912,4095,1,3,4,278,2974,0,0), +(3048,536870912,4095,1,3,5,278,2975,0,0), +(3049,536870912,4095,1,3,6,278,2976,0,0), +(3050,536870912,4095,1,4,0,279,2977,0,0), +(3051,536870912,4095,1,4,1,279,2978,0,0), +(3052,536870912,4095,1,4,2,279,2979,0,0), +(3053,536870912,4095,1,4,3,279,2980,0,0), +(3054,536870912,4095,1,4,4,279,2981,0,0), +(3055,536870912,4095,1,4,5,279,2982,0,0), +(3056,536870912,4095,1,5,0,280,2983,0,0), +(3057,536870912,4095,1,5,1,280,2984,0,0), +(3058,536870912,4095,1,5,2,280,2985,0,0), +(3059,536870912,4095,1,5,3,280,2986,0,0), +(3060,536870912,4095,1,5,4,280,2987,0,0), +(3061,536870912,4095,1,5,5,280,2988,0,0), +(3062,536870912,4095,1,6,0,399,2989,0,0), +(3063,536870912,4095,1,6,1,399,2990,0,0), +(3064,536870912,4095,1,6,2,399,2991,0,0), +(3065,536870912,4095,1,6,3,399,2992,0,0), +(3066,536870912,4095,1,8,0,282,2993,0,0), +(3067,536870912,4095,1,8,1,282,2994,0,0), +(3068,536870912,4095,1,8,2,282,2995,0,0), +(3069,536870912,4095,1,8,3,282,2996,0,0), +(3070,536870912,4095,1,8,4,282,2997,0,0), +(3071,536870912,4095,1,8,5,282,2998,0,0), +(3072,1073741824,4095,0,1,0,283,2999,0,0), +(3073,1073741824,4095,0,1,1,283,3000,0,0), +(3074,1073741824,4095,0,1,2,283,3001,0,0), +(3075,1073741824,4095,0,1,3,283,3002,0,0), +(3076,1073741824,4095,0,1,4,283,3003,0,0), +(3077,1073741824,4095,0,1,5,283,3004,0,0), +(3078,1073741824,4095,0,1,6,283,3005,0,0), +(3079,1073741824,4095,0,1,7,283,3006,0,0), +(3080,1073741824,4095,0,2,0,284,3007,0,0), +(3081,1073741824,4095,0,2,1,284,3008,0,0), +(3082,1073741824,4095,0,2,2,284,3009,0,0), +(3083,1073741824,4095,0,2,3,284,3010,0,0), +(3084,1073741824,4095,0,2,4,284,3011,0,0), +(3085,1073741824,4095,0,2,5,284,3012,0,0), +(3086,1073741824,4095,0,3,0,285,3013,0,0), +(3087,1073741824,4095,0,3,1,285,3014,0,0), +(3088,1073741824,4095,0,3,2,285,3015,0,0), +(3089,1073741824,4095,0,3,3,285,3016,0,0), +(3090,1073741824,4095,0,3,4,285,3017,0,0), +(3091,1073741824,4095,0,3,5,285,3018,0,0), +(3092,1073741824,4095,0,3,6,285,3019,0,0), +(3093,1073741824,4095,0,3,7,285,3020,0,0), +(3094,1073741824,4095,0,3,8,285,3021,0,0), +(3095,1073741824,4095,0,3,9,285,3022,0,0), +(3096,1073741824,4095,0,3,10,285,3023,0,0), +(3097,1073741824,4095,0,3,11,285,3024,0,0), +(3098,1073741824,4095,0,4,0,286,3025,0,0), +(3099,1073741824,4095,0,4,1,286,3026,0,0), +(3100,1073741824,4095,0,4,2,286,3027,0,0), +(3101,1073741824,4095,0,4,3,286,3028,0,0), +(3102,1073741824,4095,0,4,4,286,3029,0,0), +(3103,1073741824,4095,0,4,5,286,3030,0,0), +(3104,1073741824,4095,0,4,6,286,3031,0,0), +(3105,1073741824,4095,0,6,0,400,3032,0,0), +(3106,1073741824,4095,0,6,1,400,3033,0,0), +(3107,1073741824,4095,0,6,2,400,3034,0,0), +(3108,1073741824,4095,0,6,3,400,3035,0,0), +(3109,1073741824,4095,0,7,0,288,3036,0,0), +(3110,1073741824,4095,0,7,1,288,3037,0,0), +(3111,1073741824,4095,0,7,2,288,3038,0,0), +(3112,1073741824,4095,0,7,3,288,3039,0,0), +(3113,1073741824,4095,0,7,4,288,3040,0,0), +(3114,1073741824,4095,0,7,5,288,3041,0,0), +(3115,1073741824,4095,0,7,6,288,3042,0,0), +(3116,1073741824,4095,0,8,0,289,3043,0,0), +(3117,1073741824,4095,0,8,1,289,3044,0,0), +(3118,1073741824,4095,0,8,2,289,3045,0,0), +(3119,1073741824,4095,0,8,3,289,3046,0,0), +(3120,1073741824,4095,0,8,4,289,3047,0,0), +(3121,1073741824,4095,0,8,5,289,3048,0,0), +(3122,1073741824,4095,1,1,0,290,3049,0,0), +(3123,1073741824,4095,1,1,1,290,3050,0,0), +(3124,1073741824,4095,1,1,2,290,3051,0,0), +(3125,1073741824,4095,1,1,3,290,3052,0,0), +(3126,1073741824,4095,1,1,4,290,3053,0,0), +(3127,1073741824,4095,1,1,5,290,3054,0,0), +(3128,1073741824,4095,1,1,6,290,3055,0,0), +(3129,1073741824,4095,1,1,7,290,3056,0,0), +(3130,1073741824,4095,1,2,0,291,3057,0,0), +(3131,1073741824,4095,1,2,1,291,3058,0,0), +(3132,1073741824,4095,1,2,2,291,3059,0,0), +(3133,1073741824,4095,1,2,3,291,3060,0,0), +(3134,1073741824,4095,1,2,4,291,3061,0,0), +(3135,1073741824,4095,1,2,5,291,3062,0,0), +(3136,1073741824,4095,1,3,0,292,3063,0,0), +(3137,1073741824,4095,1,3,1,292,3064,0,0), +(3138,1073741824,4095,1,3,2,292,3065,0,0), +(3139,1073741824,4095,1,3,3,292,3066,0,0), +(3140,1073741824,4095,1,3,4,292,3067,0,0), +(3141,1073741824,4095,1,3,5,292,3068,0,0), +(3142,1073741824,4095,1,3,6,292,3069,0,0), +(3143,1073741824,4095,1,3,7,292,3070,0,0), +(3144,1073741824,4095,1,3,8,292,3071,0,0), +(3145,1073741824,4095,1,3,9,292,3072,0,0), +(3146,1073741824,4095,1,4,0,293,3073,0,0), +(3147,1073741824,4095,1,4,1,293,3074,0,0), +(3148,1073741824,4095,1,4,2,293,3075,0,0), +(3149,1073741824,4095,1,4,3,293,3076,0,0), +(3150,1073741824,4095,1,4,4,293,3077,0,0), +(3151,1073741824,4095,1,4,5,293,3078,0,0), +(3152,1073741824,4095,1,4,6,293,3079,0,0), +(3153,1073741824,4095,1,5,0,297,3097,0,0), +(3154,1073741824,4095,1,5,1,297,3097,0,0), +(3155,1073741824,4095,1,5,2,297,3097,0,0), +(3156,1073741824,4095,1,5,3,297,3097,0,0), +(3157,1073741824,4095,1,5,4,297,3097,0,0), +(3158,1073741824,4095,1,5,5,297,9681,0,0), +(3159,1073741824,4095,1,6,0,401,3086,0,0), +(3160,1073741824,4095,1,6,1,401,3087,0,0), +(3161,1073741824,4095,1,6,2,401,3088,0,0), +(3162,1073741824,4095,1,6,3,401,3089,0,0), +(3163,1073741824,4095,1,7,0,296,3090,0,0), +(3164,1073741824,4095,1,7,1,296,3091,0,0), +(3165,1073741824,4095,1,7,2,296,3092,0,0), +(3166,1073741824,4095,1,7,3,296,3093,0,0), +(3167,1073741824,4095,1,7,4,296,3094,0,0), +(3168,1073741824,4095,1,7,5,296,3095,0,0), +(3169,1073741824,4095,1,7,6,296,3096,0,0), +(3170,1073741824,4095,1,8,0,294,3080,0,0), +(3171,1073741824,4095,1,8,1,294,3098,0,0), +(3172,1073741824,4095,1,8,2,294,3099,0,0), +(3173,2147483648,4095,0,1,0,298,3100,0,0), +(3174,2147483648,4095,0,1,1,298,3101,0,0), +(3175,2147483648,4095,0,1,2,298,3102,0,0), +(3176,2147483648,4095,0,1,3,298,3103,0,0), +(3177,2147483648,4095,0,1,4,298,3104,0,0), +(3178,2147483648,4095,0,1,5,298,3105,0,0), +(3179,2147483648,4095,0,1,6,298,3106,0,0), +(3180,2147483648,4095,0,2,0,299,3107,0,0), +(3181,2147483648,4095,0,2,1,299,3108,0,0), +(3182,2147483648,4095,0,2,2,299,3109,0,0), +(3183,2147483648,4095,0,2,3,299,3110,0,0), +(3184,2147483648,4095,0,2,4,299,3111,0,0), +(3185,2147483648,4095,0,2,5,299,3112,0,0), +(3186,2147483648,4095,0,2,6,299,3113,0,0), +(3187,2147483648,4095,0,3,0,300,3114,0,0), +(3188,2147483648,4095,0,3,1,300,3115,0,0), +(3189,2147483648,4095,0,3,2,300,3116,0,0), +(3190,2147483648,4095,0,3,3,300,3117,0,0), +(3191,2147483648,4095,0,3,4,300,3118,0,0), +(3192,2147483648,4095,0,3,5,300,3119,0,0), +(3193,2147483648,4095,0,4,0,301,3120,0,0), +(3194,2147483648,4095,0,4,1,301,3121,0,0), +(3195,2147483648,4095,0,4,2,301,3122,0,0), +(3196,2147483648,4095,0,4,3,301,3123,0,0), +(3197,2147483648,4095,0,4,4,301,3124,0,0), +(3198,2147483648,4095,0,4,5,301,3125,0,0), +(3199,2147483648,4095,0,4,6,301,3126,0,0), +(3200,2147483648,4095,0,4,7,301,3127,0,0), +(3201,2147483648,4095,0,5,0,302,3128,0,0), +(3202,2147483648,4095,0,5,1,706,3129,0,0), +(3203,2147483648,4095,0,5,2,302,3130,0,0), +(3204,2147483648,4095,0,5,3,706,3131,0,0), +(3205,2147483648,4095,0,5,4,302,3132,0,0), +(3206,2147483648,4095,0,5,5,302,3133,0,0), +(3207,2147483648,4095,0,5,6,302,3134,0,0), +(3208,2147483648,4095,0,5,7,302,3135,0,0), +(3213,2147483648,4095,1,1,0,303,3140,0,0), +(3214,2147483648,4095,1,1,1,303,3141,0,0), +(3215,2147483648,4095,1,1,2,303,3142,0,0), +(3216,2147483648,4095,1,1,3,303,3143,0,0), +(3217,2147483648,4095,1,1,4,303,3144,0,0), +(3218,2147483648,4095,1,1,5,303,3145,0,0), +(3219,2147483648,4095,1,1,6,303,3146,0,0), +(3220,2147483648,4095,1,2,0,304,3147,0,0), +(3221,2147483648,4095,1,2,1,304,3148,0,0), +(3222,2147483648,4095,1,2,2,304,3149,0,0), +(3223,2147483648,4095,1,2,3,304,3150,0,0), +(3224,2147483648,4095,1,2,4,304,3151,0,0), +(3225,2147483648,4095,1,2,5,304,3152,0,0), +(3226,2147483648,4095,1,2,6,304,3153,0,0), +(3227,2147483648,4095,1,3,0,305,3154,0,0), +(3228,2147483648,4095,1,3,1,305,3155,0,0), +(3229,2147483648,4095,1,3,2,305,3156,0,0), +(3230,2147483648,4095,1,3,3,305,3157,0,0), +(3231,2147483648,4095,1,3,4,305,3158,0,0), +(3232,2147483648,4095,1,3,5,305,3159,0,0), +(3233,2147483648,4095,1,3,6,305,3160,0,0), +(3234,2147483648,4095,1,3,7,305,3161,0,0), +(3235,2147483648,4095,1,3,8,305,3162,0,0), +(3236,2147483648,4095,1,4,0,306,3163,0,0), +(3237,2147483648,4095,1,4,1,306,3164,0,0), +(3238,2147483648,4095,1,4,2,306,3165,0,0), +(3239,2147483648,4095,1,4,3,306,3166,0,0), +(3240,2147483648,4095,1,4,4,306,3167,0,0), +(3241,2147483648,4095,1,4,5,306,3168,0,0), +(3242,2147483648,4095,1,4,6,306,3169,0,0), +(3243,2147483648,4095,1,4,7,306,3170,0,0), +(3245,2147483648,4095,1,7,0,308,3172,0,0), +(3246,2147483648,4095,1,7,1,308,3173,0,0), +(3247,2147483648,4095,1,7,2,308,3174,0,0), +(3248,2147483648,4095,1,7,3,308,3175,0,0), +(3249,2147483648,4095,1,7,4,308,3176,0,0), +(3250,2147483648,4095,1,7,5,308,3177,0,0), +(3251,2147483648,4095,1,7,6,308,3178,0,0), +(3252,2147483648,4095,1,8,0,309,3179,0,0), +(3253,2147483648,4095,1,8,1,309,3180,0,0), +(3254,2147483648,4095,1,8,2,309,3181,0,0), +(3255,2147483648,4095,1,8,3,309,3182,0,0), +(3256,2147483648,4095,1,8,4,309,3183,0,0), +(3257,2147483648,4095,1,8,5,309,3184,0,0), +(3258,2147483648,4095,1,8,6,309,3185,0,0), +(3259,4294967296,4095,0,1,0,310,3186,0,0), +(3260,4294967296,4095,0,1,1,310,3187,0,0), +(3261,4294967296,4095,0,1,2,310,3188,0,0), +(3262,4294967296,4095,0,1,3,310,3189,0,0), +(3263,4294967296,4095,0,2,0,311,3190,0,0), +(3264,4294967296,4095,0,3,0,312,3191,0,0), +(3265,4294967296,4095,0,3,1,312,3192,0,0), +(3266,4294967296,4095,0,3,2,312,3193,0,0), +(3267,4294967296,4095,0,3,3,312,3194,0,0), +(3268,4294967296,4095,0,4,0,313,3195,0,0), +(3269,4294967296,4095,0,4,1,313,3196,0,0), +(3270,4294967296,4095,0,4,2,313,3197,0,0), +(3271,4294967296,4095,0,4,3,313,3198,0,0), +(3272,4294967296,4095,0,5,0,314,3199,0,0), +(3273,4294967296,4095,0,5,1,314,3200,0,0), +(3274,4294967296,4095,0,5,2,314,3201,0,0), +(3275,4294967296,4095,0,5,3,314,3202,0,0), +(3276,4294967296,4095,0,5,4,314,3203,0,0), +(3277,4294967296,4095,0,5,5,314,3204,0,0), +(3278,4294967296,4095,0,5,6,314,3205,0,0), +(3279,8589934592,4095,0,1,0,318,3209,0,0), +(3280,8589934592,4095,0,1,1,318,3210,0,0), +(3281,8589934592,4095,0,1,2,318,3211,0,0), +(3282,8589934592,4095,0,1,3,318,3212,0,0), +(3283,8589934592,4095,0,1,4,318,3213,0,0), +(3284,8589934592,4095,0,2,0,319,3214,0,0), +(3285,8589934592,4095,0,2,1,319,3215,0,0), +(3286,8589934592,4095,0,2,2,319,3216,0,0), +(3287,8589934592,4095,0,2,3,319,3217,0,0), +(3288,8589934592,4095,0,2,4,319,3218,0,0), +(3289,8589934592,4095,0,2,5,319,3219,0,0), +(3290,8589934592,4095,0,2,6,319,3220,0,0), +(3291,8589934592,4095,0,2,7,319,3221,0,0), +(3292,8589934592,4095,0,2,8,319,3222,0,0), +(3293,8589934592,4095,0,2,9,319,3223,0,0), +(3294,8589934592,4095,0,3,0,320,3224,0,0), +(3295,8589934592,4095,0,3,1,320,3225,0,0), +(3296,8589934592,4095,0,3,2,320,3226,0,0), +(3297,8589934592,4095,0,3,3,320,3227,0,0), +(3298,8589934592,4095,0,3,4,320,3228,0,0), +(3299,8589934592,4095,0,3,5,320,3229,0,0), +(3300,8589934592,4095,0,3,6,320,3230,0,0), +(3301,8589934592,4095,0,3,7,320,3231,0,0), +(3302,8589934592,4095,0,4,0,321,3232,0,0), +(3303,8589934592,4095,0,4,1,321,3233,0,0), +(3304,8589934592,4095,0,4,2,321,3234,0,0), +(3305,8589934592,4095,0,4,3,321,3235,0,0), +(3306,8589934592,4095,0,4,4,321,3236,0,0), +(3307,8589934592,4095,0,4,5,321,3237,0,0), +(3308,8589934592,4095,0,4,6,321,3238,0,0), +(3309,8589934592,4095,0,5,0,322,3239,0,0), +(3310,8589934592,4095,0,5,1,322,3240,0,0), +(3311,8589934592,4095,0,5,2,322,3241,0,0), +(3312,8589934592,4095,0,5,3,322,3242,0,0), +(3313,8589934592,4095,0,5,4,322,3243,0,0), +(3314,8589934592,4095,0,5,5,322,3244,0,0), +(3315,8589934592,4095,0,5,6,322,3245,0,0), +(3316,8589934592,4095,0,6,0,403,3246,0,0), +(3317,8589934592,4095,0,6,1,403,3247,0,0), +(3318,8589934592,4095,0,6,2,403,3248,0,0), +(3319,8589934592,4095,0,6,3,403,3249,0,0), +(3320,8589934592,4095,0,6,4,403,3250,0,0), +(3321,8589934592,4095,0,6,5,403,3251,0,0), +(3322,8589934592,4095,0,7,0,324,3252,0,0), +(3323,8589934592,4095,0,7,1,324,3253,0,0), +(3324,8589934592,4095,0,7,2,324,3254,0,0), +(3325,8589934592,4095,0,7,3,324,3255,0,0), +(3326,8589934592,4095,0,7,4,324,3256,0,0), +(3327,8589934592,4095,0,7,5,324,3257,0,0), +(3328,8589934592,4095,1,1,0,325,3258,0,0), +(3329,8589934592,4095,1,1,1,325,3259,0,0), +(3330,8589934592,4095,1,1,2,325,3260,0,0), +(3331,8589934592,4095,1,1,3,325,3261,0,0), +(3332,8589934592,4095,1,1,4,325,3262,0,0), +(3333,8589934592,4095,1,2,0,326,3263,0,0), +(3334,8589934592,4095,1,2,1,326,3264,0,0), +(3335,8589934592,4095,1,2,2,326,3265,0,0), +(3336,8589934592,4095,1,2,3,326,3266,0,0), +(3337,8589934592,4095,1,2,4,326,3267,0,0), +(3338,8589934592,4095,1,2,5,326,3268,0,0), +(3339,8589934592,4095,1,2,6,326,3269,0,0), +(3340,8589934592,4095,1,2,7,326,3270,0,0), +(3341,8589934592,4095,1,2,8,326,3271,0,0), +(3342,8589934592,4095,1,2,9,326,3272,0,0), +(3343,8589934592,4095,1,3,0,327,3273,0,0), +(3344,8589934592,4095,1,3,1,327,3274,0,0), +(3345,8589934592,4095,1,3,2,327,3275,0,0), +(3346,8589934592,4095,1,3,3,327,3276,0,0), +(3347,8589934592,4095,1,3,4,327,3277,0,0), +(3348,8589934592,4095,1,3,5,327,3278,0,0), +(3349,8589934592,4095,1,3,6,327,3279,0,0), +(3350,8589934592,4095,1,3,7,327,3280,0,0), +(3351,8589934592,4095,1,3,8,327,3281,0,0), +(3352,8589934592,4095,1,3,9,327,3282,0,0), +(3353,8589934592,4095,1,3,10,327,3283,0,0), +(3354,8589934592,4095,1,4,0,328,3284,0,0), +(3355,8589934592,4095,1,4,1,328,3285,0,0), +(3356,8589934592,4095,1,4,2,328,3286,0,0), +(3357,8589934592,4095,1,4,3,328,3287,0,0), +(3358,8589934592,4095,1,4,4,328,3288,0,0), +(3359,8589934592,4095,1,4,5,328,3289,0,0), +(3360,8589934592,4095,1,4,6,328,3290,0,0), +(3361,8589934592,4095,1,5,0,404,3291,0,0), +(3362,8589934592,4095,1,5,1,404,3292,0,0), +(3363,8589934592,4095,1,5,2,404,3293,0,0), +(3364,8589934592,4095,1,5,3,404,3294,0,0), +(3365,8589934592,4095,1,5,4,404,3295,0,0), +(3366,8589934592,4095,1,5,5,404,3296,0,0), +(3367,8589934592,4095,1,5,6,404,3297,0,0), +(3368,8589934592,4095,1,6,0,405,3298,0,0), +(3369,8589934592,4095,1,6,1,405,3299,0,0), +(3370,8589934592,4095,1,6,2,405,3300,0,0), +(3371,8589934592,4095,1,6,3,405,3301,0,0), +(3372,8589934592,4095,1,6,4,405,3302,0,0), +(3373,8589934592,4095,1,6,5,405,3303,0,0), +(3374,17179869184,4095,0,1,0,331,3304,0,0), +(3375,17179869184,4095,0,1,1,331,3305,0,0), +(3376,17179869184,4095,0,1,2,331,3306,0,0), +(3377,17179869184,4095,0,1,3,331,3307,0,0), +(3378,17179869184,4095,0,1,4,331,3308,0,0), +(3379,17179869184,4095,0,1,5,331,3309,0,0), +(3380,17179869184,4095,0,1,6,331,3310,0,0), +(3381,17179869184,4095,0,1,7,331,3311,0,0), +(3382,17179869184,4095,0,1,8,331,3312,0,0), +(3383,17179869184,4095,0,2,0,406,3313,0,0), +(3384,17179869184,4095,0,2,1,406,3314,0,0), +(3385,17179869184,4095,0,2,2,406,3315,0,0), +(3386,17179869184,4095,0,2,3,406,3316,0,0), +(3387,17179869184,4095,0,2,4,406,3317,0,0), +(3388,17179869184,4095,0,2,5,406,3318,0,0), +(3389,17179869184,4095,0,3,0,407,3319,0,0), +(3390,17179869184,4095,0,5,0,336,3321,0,0), +(3391,17179869184,4095,0,5,1,336,3321,0,0), +(3392,17179869184,4095,0,5,2,336,3323,0,0), +(3393,17179869184,4095,0,5,3,336,3323,0,0), +(3394,17179869184,4095,0,5,4,336,3325,0,0), +(3395,17179869184,4095,0,5,5,336,3325,0,0), +(3396,17179869184,4095,0,5,6,336,3327,0,0), +(3397,17179869184,4095,0,5,7,336,3327,0,0), +(3398,17179869184,4095,0,5,8,336,3329,0,0), +(3399,17179869184,4095,0,5,9,336,3329,0,0), +(3400,17179869184,4095,0,5,10,336,3331,0,0), +(3401,17179869184,4095,0,5,11,336,3331,0,0), +(3402,17179869184,4095,0,6,0,408,3332,0,0), +(3403,17179869184,4095,0,6,1,408,3333,0,0), +(3404,17179869184,4095,0,6,2,408,3334,0,0), +(3405,17179869184,4095,0,7,0,338,3335,0,0), +(3406,17179869184,4095,0,7,1,338,3336,0,0), +(3407,17179869184,4095,0,7,2,338,3337,0,0), +(3408,17179869184,4095,0,7,3,338,3338,0,0), +(3409,17179869184,4095,0,7,4,338,3339,0,0), +(3410,17179869184,4095,0,7,5,338,3340,0,0), +(3411,17179869184,4095,1,1,0,339,3341,0,0), +(3412,17179869184,4095,1,1,1,339,3342,0,0), +(3413,17179869184,4095,1,1,2,339,3343,0,0), +(3414,17179869184,4095,1,1,3,339,3344,0,0), +(3415,17179869184,4095,1,1,4,339,3345,0,0), +(3416,17179869184,4095,1,1,5,339,3346,0,0), +(3417,17179869184,4095,1,1,6,339,3347,0,0), +(3418,17179869184,4095,1,1,7,339,3348,0,0), +(3419,17179869184,4095,1,1,8,339,3349,0,0), +(3420,17179869184,4095,1,2,0,409,3350,0,0), +(3421,17179869184,4095,1,2,1,409,3351,0,0), +(3422,17179869184,4095,1,2,2,409,3352,0,0), +(3423,17179869184,4095,1,2,3,409,3353,0,0), +(3424,17179869184,4095,1,2,4,409,3354,0,0), +(3425,17179869184,4095,1,2,5,409,3355,0,0), +(3426,17179869184,4095,1,3,0,410,3356,0,0), +(3427,17179869184,4095,1,5,0,344,3358,0,0), +(3428,17179869184,4095,1,5,1,344,3358,0,0), +(3429,17179869184,4095,1,5,2,344,3360,0,0), +(3430,17179869184,4095,1,5,3,344,3360,0,0), +(3431,17179869184,4095,1,5,4,344,3362,0,0), +(3432,17179869184,4095,1,5,5,344,3362,0,0), +(3433,17179869184,4095,1,5,6,344,3364,0,0), +(3434,17179869184,4095,1,5,7,344,3364,0,0), +(3435,17179869184,4095,1,5,8,344,3366,0,0), +(3436,17179869184,4095,1,5,9,344,3366,0,0), +(3437,17179869184,4095,1,5,10,344,3368,0,0), +(3438,17179869184,4095,1,5,11,344,3368,0,0), +(3439,17179869184,4095,1,5,12,344,3370,0,0), +(3440,17179869184,4095,1,5,13,344,3370,0,0), +(3441,17179869184,4095,1,5,14,344,3372,0,0), +(3442,17179869184,4095,1,5,15,344,3372,0,0), +(3443,17179869184,4095,1,6,0,411,3373,0,0), +(3444,17179869184,4095,1,6,1,411,3374,0,0), +(3445,17179869184,4095,1,6,2,411,3375,0,0), +(3446,17179869184,4095,1,7,0,346,3376,0,0), +(3447,17179869184,4095,1,7,1,346,3377,0,0), +(3448,17179869184,4095,1,7,2,346,3378,0,0), +(3449,17179869184,4095,1,7,3,346,3379,0,0), +(3450,17179869184,4095,1,7,4,346,3380,0,0), +(3451,17179869184,4095,1,7,5,346,3381,0,0), +(3452,34359738368,4095,0,1,0,347,3382,0,0), +(3453,34359738368,4095,0,1,1,347,3383,0,0), +(3454,34359738368,4095,0,1,2,347,3384,0,0), +(3455,34359738368,4095,0,1,3,347,3385,0,0), +(3456,34359738368,4095,0,1,4,347,3386,0,0), +(3457,34359738368,4095,0,1,5,347,3387,0,0), +(3458,34359738368,4095,0,1,6,347,3388,0,0), +(3459,34359738368,4095,0,1,7,347,3389,0,0), +(3460,34359738368,4095,0,1,8,347,3390,0,0), +(3461,34359738368,4095,0,1,9,347,3391,0,0), +(3462,34359738368,4095,0,1,10,347,3392,0,0), +(3463,34359738368,4095,0,2,0,412,3393,0,0), +(3464,34359738368,4095,0,2,1,412,3394,0,0), +(3465,34359738368,4095,0,2,2,412,3395,0,0), +(3466,34359738368,4095,0,2,3,412,3396,0,0), +(3467,34359738368,4095,0,2,4,412,3397,0,0), +(3468,34359738368,4095,0,2,5,412,3398,0,0), +(3469,34359738368,4095,0,2,6,412,3399,0,0), +(3470,34359738368,4095,0,2,7,412,3400,0,0), +(3471,34359738368,4095,0,2,8,412,3401,0,0), +(3472,34359738368,4095,0,3,0,350,3402,0,0), +(3473,34359738368,4095,0,3,1,350,3403,0,0), +(3474,34359738368,4095,0,3,2,350,3404,0,0), +(3475,34359738368,4095,0,3,3,350,3405,0,0), +(3476,34359738368,4095,0,3,4,350,3406,0,0), +(3477,34359738368,4095,0,3,5,350,3407,0,0), +(3478,34359738368,4095,0,3,6,350,3408,0,0), +(3479,34359738368,4095,0,3,7,350,3409,0,0), +(3480,34359738368,4095,0,4,0,351,3410,0,0), +(3481,34359738368,4095,0,4,1,351,3411,0,0), +(3482,34359738368,4095,0,4,2,351,3412,0,0), +(3483,34359738368,4095,0,4,3,351,3413,0,0), +(3484,34359738368,4095,0,4,4,351,3414,0,0), +(3485,34359738368,4095,0,4,5,351,3415,0,0), +(3486,34359738368,4095,0,4,6,351,3416,0,0), +(3487,34359738368,4095,0,4,7,351,3417,0,0), +(3488,34359738368,4095,0,4,8,351,3418,0,0), +(3489,34359738368,4095,0,5,0,352,3419,0,0), +(3490,34359738368,4095,0,5,1,352,3421,0,0), +(3491,34359738368,4095,0,5,2,352,3422,0,0), +(3492,34359738368,4095,0,5,3,352,3420,0,0), +(3493,34359738368,4095,0,5,4,352,3423,0,0), +(3494,34359738368,4095,0,5,5,352,3419,0,0), +(3495,34359738368,4095,0,5,6,352,3425,0,0), +(3496,34359738368,4095,0,8,0,353,3426,0,0), +(3497,34359738368,4095,0,8,1,353,3427,0,0), +(3498,34359738368,4095,1,1,0,354,3428,0,0), +(3499,34359738368,4095,1,1,1,354,3429,0,0), +(3500,34359738368,4095,1,1,2,354,3430,0,0), +(3501,34359738368,4095,1,1,3,354,3431,0,0), +(3502,34359738368,4095,1,1,4,354,3432,0,0), +(3503,34359738368,4095,1,1,5,354,3433,0,0), +(3504,34359738368,4095,1,1,6,354,3434,0,0), +(3505,34359738368,4095,1,1,7,354,3435,0,0), +(3506,34359738368,4095,1,1,8,354,3436,0,0), +(3507,34359738368,4095,1,1,9,354,3437,0,0), +(3508,34359738368,4095,1,1,10,354,3438,0,0), +(3509,34359738368,4095,1,1,11,354,3439,0,0), +(3510,34359738368,4095,1,2,0,413,3440,0,0), +(3511,34359738368,4095,1,2,1,413,3441,0,0), +(3512,34359738368,4095,1,2,2,413,3442,0,0), +(3513,34359738368,4095,1,2,3,413,3443,0,0), +(3514,34359738368,4095,1,2,4,413,3444,0,0), +(3515,34359738368,4095,1,2,5,413,3445,0,0), +(3516,34359738368,4095,1,2,6,413,3446,0,0), +(3517,34359738368,4095,1,2,7,413,3447,0,0), +(3518,34359738368,4095,1,2,8,413,3448,0,0), +(3519,34359738368,4095,1,3,0,357,3449,0,0), +(3520,34359738368,4095,1,3,1,357,3450,0,0), +(3521,34359738368,4095,1,3,2,357,3451,0,0), +(3522,34359738368,4095,1,3,3,357,3452,0,0), +(3523,34359738368,4095,1,3,4,357,3453,0,0), +(3524,34359738368,4095,1,3,5,357,3454,0,0), +(3525,34359738368,4095,1,3,6,357,3455,0,0), +(3526,34359738368,4095,1,3,7,357,3456,0,0), +(3527,34359738368,4095,1,4,0,358,3457,0,0), +(3528,34359738368,4095,1,4,1,358,3458,0,0), +(3529,34359738368,4095,1,4,2,358,3459,0,0), +(3530,34359738368,4095,1,4,3,358,3460,0,0), +(3531,34359738368,4095,1,4,4,358,3461,0,0), +(3532,34359738368,4095,1,4,5,358,3462,0,0), +(3533,34359738368,4095,1,4,6,358,3463,0,0), +(3534,34359738368,4095,1,4,7,358,3464,0,0), +(3535,34359738368,4095,1,4,8,358,3465,0,0), +(3536,34359738368,4095,1,5,0,414,3466,0,0), +(3537,34359738368,4095,1,5,1,414,3467,0,0), +(3538,34359738368,4095,1,5,2,414,3468,0,0), +(3539,34359738368,4095,1,5,3,414,3469,0,0), +(3540,34359738368,4095,1,5,4,886,3470,0,0), +(3541,34359738368,4095,1,5,5,887,3471,0,0), +(3563,68719476736,4095,0,3,0,362,3493,0,0), +(3564,68719476736,4095,0,3,1,362,3494,0,0), +(3565,68719476736,4095,0,3,2,362,3495,0,0), +(3566,68719476736,4095,0,3,3,362,3496,0,0), +(3567,68719476736,4095,0,3,4,362,3497,0,0), +(3568,68719476736,4095,0,3,5,362,3498,0,0), +(3569,68719476736,4095,0,3,6,362,3499,0,0), +(3570,68719476736,4095,0,4,0,363,3500,0,0), +(3571,68719476736,4095,0,4,1,363,3501,0,0), +(3572,68719476736,4095,0,4,2,363,3502,0,0), +(3573,68719476736,4095,0,4,3,363,3503,0,0), +(3574,68719476736,4095,0,4,4,363,3504,0,0), +(3575,68719476736,4095,0,4,5,363,3505,0,0), +(3576,68719476736,4095,0,4,6,363,3506,0,0), +(3577,68719476736,4095,0,4,7,363,3507,0,0), +(3578,68719476736,4095,0,5,0,364,3508,0,0), +(3579,68719476736,4095,0,5,1,364,3509,0,0), +(3580,68719476736,4095,0,5,2,364,3510,0,0), +(3581,68719476736,4095,0,5,3,364,3511,0,0), +(3582,68719476736,4095,0,5,4,364,3512,0,0), +(3583,68719476736,4095,0,5,5,364,3513,0,0), +(3584,68719476736,4095,0,6,0,415,3514,0,0), +(3585,68719476736,4095,0,6,1,415,3515,0,0), +(3586,68719476736,4095,0,6,2,415,3516,0,0), +(3587,68719476736,4095,0,6,3,415,3517,0,0), +(3588,68719476736,4095,0,6,4,415,3518,0,0), +(3589,68719476736,4095,0,6,5,415,3519,0,0), +(3590,68719476736,4095,0,6,6,415,3520,0,0), +(3591,68719476736,4095,0,6,7,415,3521,0,0), +(3592,68719476736,4095,0,6,8,415,3522,0,0), +(3593,68719476736,4095,0,6,9,415,3523,0,0), +(3594,68719476736,4095,0,6,10,415,3524,0,0), +(3595,68719476736,4095,0,6,11,415,3525,0,0), +(3596,68719476736,4095,0,6,12,415,3526,0,0), +(3597,68719476736,4095,0,6,13,415,3527,0,0), +(3598,68719476736,4095,0,6,14,415,3528,0,0), +(3599,68719476736,4095,0,6,15,415,3529,0,0), +(3600,68719476736,4095,0,6,16,415,3530,0,0), +(3601,68719476736,4095,0,6,17,415,3531,0,0), +(3602,68719476736,4095,0,6,18,415,3532,0,0), +(3603,68719476736,4095,0,6,19,415,3533,0,0), +(3604,68719476736,4095,0,7,0,366,3534,0,0), +(3605,68719476736,4095,0,7,1,366,3535,0,0), +(3606,68719476736,4095,0,7,2,366,3536,0,0), +(3607,68719476736,4095,0,7,3,366,3537,0,0), +(3608,68719476736,4095,0,8,0,367,3538,0,0), +(3609,68719476736,4095,0,8,1,367,3539,0,0), +(3632,68719476736,4095,1,3,0,370,3562,0,0), +(3633,68719476736,4095,1,3,1,370,3563,0,0), +(3634,68719476736,4095,1,3,2,370,3564,0,0), +(3635,68719476736,4095,1,3,3,370,3565,0,0), +(3636,68719476736,4095,1,3,4,370,3566,0,0), +(3637,68719476736,4095,1,3,5,370,3567,0,0), +(3638,68719476736,4095,1,3,6,370,3568,0,0), +(3639,68719476736,4095,1,3,7,370,3569,0,0), +(3640,68719476736,4095,1,4,0,371,3570,0,0), +(3641,68719476736,4095,1,4,1,371,3571,0,0), +(3642,68719476736,4095,1,4,2,371,3572,0,0), +(3643,68719476736,4095,1,4,3,371,3573,0,0), +(3644,68719476736,4095,1,4,4,371,3574,0,0), +(3645,68719476736,4095,1,4,5,371,3575,0,0), +(3646,68719476736,4095,1,4,6,371,3576,0,0), +(3647,68719476736,4095,1,4,7,371,3577,0,0), +(3648,68719476736,4095,1,6,0,416,3578,0,0), +(3649,68719476736,4095,1,6,1,416,3579,0,0), +(3650,68719476736,4095,1,6,2,416,3580,0,0), +(3651,68719476736,4095,1,6,3,416,3581,0,0), +(3652,68719476736,4095,1,6,4,416,3582,0,0), +(3653,68719476736,4095,1,6,5,416,3583,0,0), +(3654,68719476736,4095,1,6,6,416,3584,0,0), +(3655,68719476736,4095,1,6,7,416,3585,0,0), +(3656,68719476736,4095,1,6,8,416,3586,0,0), +(3657,68719476736,4095,1,6,9,416,3587,0,0), +(3658,68719476736,4095,1,6,10,416,3588,0,0), +(3659,68719476736,4095,1,6,11,416,3589,0,0), +(3660,68719476736,4095,1,6,12,416,3590,0,0), +(3661,68719476736,4095,1,6,13,416,3591,0,0), +(3662,68719476736,4095,1,6,14,416,3592,0,0), +(3663,68719476736,4095,1,6,15,416,3593,0,0), +(3664,68719476736,4095,1,6,16,416,3594,0,0), +(3665,68719476736,4095,1,6,17,416,3595,0,0), +(3666,68719476736,4095,1,6,18,416,3596,0,0), +(3667,68719476736,4095,1,6,19,416,3597,0,0), +(3668,68719476736,4095,1,7,0,374,3598,0,0), +(3669,68719476736,4095,1,7,1,374,3599,0,0), +(3670,68719476736,4095,1,7,2,374,3600,0,0), +(3671,68719476736,4095,1,7,3,374,3601,0,0), +(3672,68719476736,4095,1,8,0,375,3602,0,0), +(3673,68719476736,4095,1,8,1,375,3603,0,0), +(3674,512,2048,0,8,6,118,1726,0,0), +(3675,512,2048,0,8,7,118,1727,0,0), +(3676,512,2048,0,8,8,118,1728,0,0), +(3677,512,2048,0,8,9,118,1729,0,0), +(3678,512,2048,0,8,10,118,1730,0,0), +(3679,512,2048,0,8,11,118,1731,0,0), +(3680,512,2048,1,8,6,127,1863,0,0), +(3681,512,2048,1,8,7,127,1864,0,0), +(3682,512,2048,1,8,8,127,1865,0,0), +(3683,512,2048,1,8,9,127,1866,0,0), +(3684,512,2048,1,8,10,127,1867,0,0), +(3685,512,2048,1,8,11,127,1868,0,0), +(3686,8,4095,0,8,6,48,795,0,0), +(3687,8,2048,0,8,7,48,796,0,0), +(3688,8,2048,0,8,8,48,797,0,0), +(3689,8,2048,0,8,9,48,798,0,0), +(3690,8,2048,0,8,10,48,799,0,0), +(3691,8,2048,0,8,11,48,800,0,0), +(3692,8,2048,1,8,6,57,907,0,0), +(3693,8,2048,1,8,7,57,908,0,0), +(3694,8,2048,1,8,8,57,909,0,0), +(3695,8,2048,1,8,9,57,910,0,0), +(3696,8,2048,1,8,10,57,911,0,0), +(3697,8,2048,1,8,11,57,912,0,0), +(3698,1,4095,1,5,0,501,4752,0,0), +(3699,1,4095,1,5,1,501,4753,0,0), +(3700,1,4095,1,5,2,501,4754,0,0), +(3701,1,4095,1,5,3,501,4755,0,0), +(3702,1,4095,1,5,4,501,4756,0,0), +(3703,1,4095,1,5,5,501,4757,0,0), +(3704,1,4095,1,5,6,501,4758,0,0), +(3705,1,4063,0,2,0,463,4138,1,0), +(3706,1,4063,0,2,1,463,4140,1,0), +(3707,1,4063,0,2,2,463,4133,1,0), +(3708,1,4063,0,2,3,463,4135,1,0), +(3709,1,4063,0,2,4,463,4141,1,0), +(3710,1,4063,0,2,5,463,4134,0,0), +(3711,1,4063,0,2,6,463,4130,0,0), +(3712,1,4063,0,2,7,463,4138,1,0), +(3713,1,4063,0,2,8,463,4140,1,0), +(3714,1,4063,0,2,9,463,4135,1,0), +(3715,1,4063,0,2,10,463,4134,0,0), +(3716,1,4063,0,2,11,463,4136,1,0), +(3717,1,32,0,2,12,463,4534,0,0), +(3718,1,32,0,2,13,463,4534,0,0), +(3719,1,32,0,2,23,463,4534,0,0), +(3720,1,32,0,2,22,463,4534,0,0), +(3721,1,32,0,2,21,463,4534,0,0), +(3722,1,32,0,2,20,463,4534,0,0), +(3723,1,32,0,2,19,463,4534,0,0), +(3724,1,32,0,2,18,463,4534,0,0), +(3725,1,32,0,2,17,463,4534,0,0), +(3726,1,32,0,2,16,463,4534,0,0), +(3727,1,32,0,2,15,463,4534,0,0), +(3728,1,32,0,2,14,463,4534,0,0), +(3729,1,4063,1,2,0,464,4162,0,0), +(3730,1,4063,1,2,1,464,4153,0,0), +(3731,1,4063,1,2,2,464,4161,0,0), +(3732,1,4063,1,2,3,464,4163,0,0), +(3733,1,4063,1,2,4,464,4154,0,0), +(3734,1,4063,1,2,5,464,4160,0,0), +(3735,1,4063,1,2,6,464,4160,0,0), +(3736,1,4063,1,2,7,464,4156,0,0), +(3737,1,4063,1,2,8,464,4152,0,0), +(3738,1,4063,1,2,9,464,4154,0,0), +(3739,1,4063,1,2,10,464,4155,0,0), +(3740,1,4063,1,2,11,464,4165,0,0), +(3741,1,4063,1,2,12,464,4165,0,0), +(3742,1,4063,1,2,13,464,4155,0,0), +(3743,1,4063,1,2,14,464,4151,0,0), +(3744,1,32,1,2,15,464,4535,0,0), +(3745,1,32,1,2,29,464,4535,0,0), +(3746,1,32,1,2,28,464,4535,0,0), +(3747,1,32,1,2,27,464,4535,0,0), +(3748,1,32,1,2,26,464,4535,0,0), +(3749,1,32,1,2,25,464,4535,0,0), +(3750,1,32,1,2,24,464,4535,0,0), +(3751,1,32,1,2,23,464,4535,0,0), +(3752,1,32,1,2,22,464,4535,0,0), +(3753,1,32,1,2,21,464,4535,0,0), +(3754,1,32,1,2,20,464,4535,0,0), +(3755,1,32,1,2,19,464,4535,0,0), +(3756,1,32,1,2,18,464,4535,0,0), +(3757,1,32,1,2,17,464,4535,0,0), +(3758,1,32,1,2,16,464,4535,0,0), +(3759,4,4063,0,2,0,544,5533,1,0), +(3760,4,4063,0,2,1,544,5534,1,0), +(3761,4,4063,0,2,2,544,5535,1,0), +(3763,4,32,0,2,18,544,5559,0,0), +(3764,4,32,0,2,17,544,5559,0,0), +(3765,4,32,0,2,16,544,5559,0,0), +(3766,4,32,0,2,15,544,5559,0,0), +(3767,4,32,0,2,14,544,5559,0,0), +(3768,4,32,0,2,13,544,5559,0,0), +(3769,4,32,0,2,12,544,5559,0,0), +(3770,4,32,0,2,11,544,5559,0,0), +(3771,4,32,0,2,10,544,5559,0,0), +(3772,4,4063,0,2,9,544,5540,1,0), +(3773,4,4063,0,2,8,544,5541,1,0), +(3774,4,4063,0,2,7,544,5540,1,0), +(3775,4,4063,0,2,6,544,5539,1,0), +(3776,4,4063,0,2,5,544,5538,1,0), +(3777,4,4063,0,2,4,544,5537,1,0), +(3778,4,4063,0,2,3,544,5536,1,0), +(3779,4,32,1,2,19,545,5587,0,0), +(3780,4,32,1,2,17,545,5587,0,0), +(3781,4,32,1,2,16,545,5587,0,0), +(3782,4,32,1,2,15,545,5587,0,0), +(3783,4,32,1,2,14,545,5587,0,0), +(3784,4,32,1,2,13,545,5587,0,0), +(3785,4,32,1,2,12,545,5587,0,0), +(3786,4,32,1,2,11,545,5587,0,0), +(3787,4,32,1,2,10,545,5587,0,0), +(3788,4,4063,1,2,9,545,5563,0,0), +(3789,4,4063,1,2,8,545,5564,0,0), +(3790,4,4063,1,2,7,545,5578,0,0), +(3791,4,4063,1,2,6,545,5575,0,0), +(3792,4,4063,1,2,5,545,5566,0,0), +(3793,4,4063,1,2,4,545,5577,0,0), +(3794,4,4063,1,2,3,545,5576,0,0), +(3795,4,4063,1,2,2,545,5575,0,0), +(3796,4,4063,1,2,1,545,5574,0,0), +(3797,4,4063,1,2,0,545,5564,0,0), +(3798,4,32,0,2,19,544,5559,0,0), +(3799,64,32,0,2,13,548,5629,0,0), +(3800,64,32,0,2,12,548,5629,0,0), +(3801,64,32,0,2,11,548,5629,0,0), +(3802,64,32,0,2,10,548,5629,0,0), +(3803,64,32,0,2,9,548,5629,0,0), +(3804,64,32,0,2,8,548,5629,0,0), +(3805,64,32,0,2,7,548,5629,0,0), +(3806,64,4063,0,2,6,548,5622,0,0), +(3807,64,4063,0,2,5,548,5618,0,0), +(3808,64,4063,0,2,4,548,5620,0,0), +(3809,64,4063,0,2,3,548,5619,0,0), +(3810,64,4063,0,2,2,548,5618,0,0), +(3811,64,4063,0,2,1,548,5617,0,0), +(3812,64,4063,0,2,0,548,6523,0,0), +(3813,64,32,1,2,13,549,5643,0,0), +(3814,64,32,1,2,12,549,5643,0,0), +(3815,64,32,1,2,11,549,5643,0,0), +(3816,64,32,1,2,10,549,5643,0,0), +(3817,64,32,1,2,9,549,5643,0,0), +(3818,64,32,1,2,8,549,5643,0,0), +(3819,64,32,1,2,7,549,5643,0,0), +(3820,64,4063,1,2,6,549,5641,0,0), +(3821,64,4063,1,2,5,549,5640,0,0), +(3822,64,4063,1,2,4,549,5638,0,0), +(3823,64,4063,1,2,3,549,5635,0,0), +(3824,64,4063,1,2,2,549,5639,0,0), +(3825,64,4063,1,2,1,549,5638,0,0), +(3826,64,4063,1,2,0,549,5637,0,0), +(3867,256,32,0,2,9,552,5676,0,0), +(3868,256,32,0,2,8,552,5676,0,0), +(3869,256,32,0,2,7,552,5676,0,0), +(3870,256,32,0,2,6,552,5676,0,0), +(3871,256,32,0,2,5,552,5676,0,0), +(3872,256,4063,0,2,4,552,5670,0,0), +(3873,256,4063,0,2,3,552,5667,0,0), +(3874,256,4063,0,2,2,552,5668,0,0), +(3875,256,4063,0,2,1,552,5667,0,0), +(3876,256,4063,0,2,0,552,5666,0,0), +(3877,256,32,1,2,17,553,5687,0,0), +(3878,256,32,1,2,16,553,5687,0,0), +(3879,256,32,1,2,15,553,5687,0,0), +(3880,256,32,1,2,14,553,5687,0,0), +(3881,256,32,1,2,13,553,5687,0,0), +(3882,256,32,1,2,12,553,5687,0,0), +(3883,256,32,1,2,11,553,5687,0,0), +(3884,256,32,1,2,10,553,5687,0,0), +(3885,256,4063,1,2,9,553,5686,0,0), +(3886,256,4063,1,2,8,553,5685,0,0), +(3887,256,4063,1,2,7,553,5684,0,0), +(3888,256,4063,1,2,6,553,5681,0,0), +(3889,256,4063,1,2,5,553,5682,0,0), +(3890,256,4063,1,2,4,553,5681,0,0), +(3891,256,4063,1,2,3,553,5678,0,0), +(3892,256,4063,1,2,2,553,5677,0,0), +(3893,256,4063,1,2,1,553,5678,0,0), +(3894,256,4063,1,2,0,553,5677,0,0), +(3895,16,4095,0,5,2,563,6288,0,0), +(3896,16,4095,0,5,3,563,6288,0,0), +(3897,16,4095,0,5,4,563,6288,0,0), +(3898,16,4095,0,5,5,563,6289,0,0), +(3899,16,4095,0,5,6,563,6292,0,0), +(3900,16,4095,0,5,7,563,6292,0,0), +(3901,16,4095,0,5,14,563,6293,0,0), +(3902,16,4095,0,5,15,563,6293,0,0), +(3903,16,4095,1,5,2,67,1037,0,0), +(3904,16,4095,1,5,3,67,1037,0,0), +(3905,16,4095,1,5,7,67,1037,0,0), +(3906,16,4063,0,5,2,534,6304,0,0), +(3907,16,4063,0,5,3,534,6304,0,0), +(3908,16,4063,0,5,4,534,6304,0,0), +(3909,16,4063,0,5,10,534,6304,0,0), +(3910,16,4063,0,5,11,534,6304,0,0), +(3911,16,4063,0,5,0,534,5330,0,0), +(3912,16,4063,0,5,1,534,5330,0,0), +(3913,16,4063,0,5,5,534,5330,0,0), +(3914,16,4063,0,5,6,534,5330,0,0), +(3915,16,4063,0,5,7,534,5330,0,0), +(3916,16,4063,0,5,8,534,5330,0,0), +(3917,16,4063,0,5,9,534,5330,0,0), +(3918,16,4063,0,5,12,534,5330,0,0), +(3919,16,4063,0,5,13,534,5330,0,0), +(3920,16,4063,0,5,14,534,5330,0,0), +(3921,16,4063,0,5,15,534,5330,0,0), +(3922,16,4063,0,5,16,534,5330,0,0), +(3923,16,4063,1,5,0,535,5337,0,0), +(3924,16,4063,1,5,1,535,5337,0,0), +(3925,16,4063,1,5,2,535,6305,0,0), +(3926,16,4063,1,5,3,535,5337,0,0), +(3927,16,4063,1,5,4,535,5337,0,0), +(3928,16,4063,1,5,5,535,6305,0,0), +(3929,16,4063,1,5,6,535,5337,0,0), +(3930,16,4063,1,5,7,535,5337,0,0), +(3931,512,2015,0,2,22,571,6572,0,0), +(3932,512,2015,0,2,21,571,6572,0,0), +(3933,512,2015,0,2,20,571,6572,0,0), +(3934,512,32,0,2,19,571,6586,0,0), +(3935,512,32,0,2,18,571,6586,0,0), +(3936,512,32,0,2,17,571,6586,0,0), +(3937,512,32,0,2,16,571,6586,0,0), +(3938,512,32,0,2,15,571,6586,0,0), +(3939,512,32,0,2,14,571,6586,0,0), +(3940,512,32,0,2,13,571,6586,0,0), +(3941,512,32,0,2,12,571,6586,0,0), +(3942,512,32,0,2,11,571,6586,0,0), +(3943,512,32,0,2,10,571,6586,0,0), +(3944,512,2015,0,2,9,571,6568,0,0), +(3945,512,2015,0,2,8,571,6568,0,0), +(3946,512,2015,0,2,7,571,6568,0,0), +(3947,512,2015,0,2,6,571,6568,0,0), +(3948,512,2015,0,2,5,571,6568,0,0), +(3949,512,2015,0,2,4,571,6568,0,0), +(3950,512,2015,0,2,3,571,6568,0,0), +(3951,512,2015,0,2,2,571,6568,0,0), +(3952,512,2015,0,2,1,571,6568,0,0), +(3953,512,2015,0,2,0,571,6568,0,0), +(3954,512,2015,1,2,22,572,6591,0,0), +(3955,512,2015,1,2,21,572,6591,0,0), +(3956,512,2015,1,2,20,572,6591,0,0), +(3957,512,32,1,2,19,572,6605,0,0), +(3958,512,32,1,2,18,572,6605,0,0), +(3959,512,32,1,2,17,572,6605,0,0), +(3960,512,32,1,2,16,572,6605,0,0), +(3961,512,32,1,2,15,572,6605,0,0), +(3962,512,32,1,2,14,572,6605,0,0), +(3963,512,32,1,2,13,572,6605,0,0), +(3964,512,32,1,2,12,572,6605,0,0), +(3965,512,32,1,2,11,572,6605,0,0), +(3966,512,32,1,2,10,572,6605,0,0), +(3967,512,2015,1,2,9,572,6587,0,0), +(3968,512,2015,1,2,8,572,6587,0,0), +(3969,512,2015,1,2,7,572,6587,0,0), +(3970,512,2015,1,2,6,572,6587,0,0), +(3971,512,2015,1,2,5,572,6587,0,0), +(3972,512,2015,1,2,4,572,6587,0,0), +(3973,512,2015,1,2,3,572,6587,0,0), +(3974,512,2015,1,2,2,572,6587,0,0), +(3975,512,2015,1,2,1,572,6587,0,0), +(3976,512,2015,1,2,0,572,6587,0,0), +(3977,268435456,4063,0,2,7,578,6667,0,0), +(3978,268435456,4063,0,2,6,578,6667,0,0), +(3979,268435456,4063,0,2,5,578,6667,0,0), +(3980,268435456,4063,0,2,4,578,6667,0,0), +(3981,268435456,4063,0,2,3,578,6667,0,0), +(3982,268435456,4063,0,2,2,578,6667,0,0), +(3983,268435456,4063,0,2,1,578,6667,0,0), +(3984,268435456,4063,0,2,0,578,6667,0,0), +(3985,268435456,4063,1,2,7,579,6675,0,0), +(3986,268435456,4063,1,2,6,579,6675,0,0), +(3987,268435456,4063,1,2,5,579,6675,0,0), +(3988,268435456,4063,1,2,4,579,6675,0,0), +(3989,268435456,4063,1,2,3,579,6675,0,0), +(3990,268435456,4063,1,2,2,579,6675,0,0), +(3991,268435456,4063,1,2,1,579,6675,0,0), +(3992,268435456,4063,1,2,0,579,6675,0,0), +(3993,512,4095,0,1,26,582,6714,0,0), +(3994,512,4095,0,1,25,582,6714,0,0), +(3995,512,4095,0,1,24,582,6714,0,0), +(3996,512,4095,0,1,23,582,6714,0,0), +(3997,512,4095,0,1,22,582,6714,0,0), +(3998,512,4095,0,1,21,582,6714,0,0), +(3999,512,4095,0,1,20,582,6714,0,0), +(4000,512,4095,0,1,19,582,6714,0,0), +(4001,512,4095,0,1,18,582,6714,0,0), +(4002,512,4095,0,1,17,582,6714,0,0), +(4003,512,4095,0,1,16,582,6714,0,0), +(4004,512,4095,0,1,15,582,6714,0,0), +(4005,512,4095,0,1,14,582,6714,0,0), +(4006,512,4095,0,1,13,582,6714,0,0), +(4007,512,4095,0,1,12,582,6714,0,0), +(4008,512,4095,0,1,11,582,6714,0,0), +(4009,512,4095,0,1,10,582,6714,0,0), +(4010,512,4095,0,1,9,582,6714,0,0), +(4011,512,4095,0,1,8,582,6714,0,0), +(4012,512,4095,0,1,7,582,6714,0,0), +(4013,512,4095,0,1,6,582,6714,0,0), +(4014,512,4095,0,1,5,582,6714,0,0), +(4015,512,4095,0,1,4,582,6714,0,0), +(4016,512,4095,0,1,3,582,6714,0,0), +(4017,512,4095,0,1,2,582,6714,0,0), +(4018,512,4095,0,1,1,582,6714,0,0), +(4019,512,4095,0,1,0,582,6714,0,0), +(4020,512,4095,1,1,25,583,6719,0,0), +(4021,512,4095,1,1,24,583,6719,0,0), +(4022,512,4095,1,1,23,583,6719,0,0), +(4023,512,4095,1,1,22,583,6719,0,0), +(4024,512,4095,1,1,21,583,6719,0,0), +(4025,512,4095,1,1,20,583,6719,0,0), +(4026,512,4095,1,1,19,583,6719,0,0), +(4027,512,4095,1,1,18,583,6719,0,0), +(4028,512,4095,1,1,17,583,6719,0,0), +(4029,512,4095,1,1,16,583,6719,0,0), +(4030,512,4095,1,1,15,583,6719,0,0), +(4031,512,4095,1,1,14,583,6719,0,0), +(4032,512,4095,1,1,13,583,6719,0,0), +(4033,512,4095,1,1,12,583,6719,0,0), +(4034,512,4095,1,1,11,583,6719,0,0), +(4035,512,4095,1,1,10,583,6719,0,0), +(4036,512,4095,1,1,9,583,6719,0,0), +(4037,512,4095,1,1,8,583,6719,0,0), +(4038,512,4095,1,1,7,583,6719,0,0), +(4039,512,4095,1,1,6,583,6719,0,0), +(4040,512,4095,1,1,5,583,6719,0,0), +(4041,512,4095,1,1,4,583,6719,0,0), +(4042,512,4095,1,1,3,583,6719,0,0), +(4043,512,4095,1,1,2,583,6719,0,0), +(4044,512,4095,1,1,1,583,6719,0,0), +(4045,512,4095,1,1,0,583,6719,0,0), +(4059,8589934592,4063,0,2,0,614,6968,0,0), +(4060,8589934592,4063,0,2,1,614,6968,0,0), +(4061,8589934592,4063,0,2,2,614,6968,0,0), +(4062,8589934592,4063,0,2,3,614,6968,0,0), +(4063,8589934592,4063,0,2,4,614,6968,0,0), +(4064,8589934592,4063,0,2,5,614,6968,0,0), +(4065,8589934592,4063,0,2,6,614,6968,0,0), +(4066,8589934592,4063,0,2,7,614,6968,0,0), +(4067,8589934592,4063,0,2,8,614,6968,0,0), +(4068,8589934592,4063,0,2,9,614,6968,0,0), +(4069,8589934592,4063,1,2,0,615,6970,0,0), +(4070,8589934592,4063,1,2,1,615,6970,0,0), +(4071,8589934592,4063,1,2,2,615,6970,0,0), +(4072,8589934592,4063,1,2,3,615,6970,0,0), +(4073,8589934592,4063,1,2,4,615,6970,0,0), +(4074,8589934592,4063,1,2,5,615,6970,0,0), +(4075,8589934592,4063,1,2,6,615,6970,0,0), +(4076,8589934592,4063,1,2,7,615,6970,0,0), +(4077,8589934592,4063,1,2,8,615,6970,0,0), +(4078,8589934592,4063,1,2,9,615,6970,0,0), +(4079,1024,4063,0,2,0,618,6976,0,0), +(4080,1024,4063,0,2,1,618,6976,0,0), +(4081,1024,4063,0,2,2,618,6976,0,0), +(4082,1024,4063,0,2,3,618,6976,0,0), +(4083,1024,4063,0,2,4,618,6976,0,0), +(4084,1024,4063,0,2,5,618,6976,0,0), +(4085,1024,4063,0,2,6,618,6976,0,0), +(4086,1024,4063,0,2,7,618,6976,0,0), +(4087,1024,4063,0,2,8,618,6976,0,0), +(4088,1024,4063,0,2,9,618,6976,0,0), +(4089,1024,4063,0,2,10,618,6976,0,0), +(4090,1024,4063,0,2,11,618,6976,0,0), +(4091,1024,4063,0,2,12,618,6976,0,0), +(4092,1024,4063,0,2,13,618,6976,0,0), +(4093,1024,4063,0,2,14,618,6976,0,0), +(4094,1024,4063,0,2,15,618,6976,0,0), +(4095,1024,4063,0,2,16,618,6976,0,0), +(4096,1024,4063,0,2,17,618,6976,0,0), +(4097,1024,4063,0,2,18,618,6976,0,0), +(4098,1024,4063,0,2,19,618,6976,0,0), +(4099,1024,4063,1,2,0,619,6978,0,0), +(4100,1024,4063,1,2,1,619,6978,0,0), +(4101,1024,4063,1,2,2,619,6978,0,0), +(4102,1024,4063,1,2,3,619,6978,0,0), +(4103,1024,4063,1,2,4,619,6978,0,0), +(4104,1024,4063,1,2,5,619,6978,0,0), +(4105,1024,4063,1,2,6,619,6978,0,0), +(4106,1024,4063,1,2,7,619,6978,0,0), +(4107,1024,4063,1,2,8,619,6978,0,0), +(4108,1024,4063,1,2,9,619,6978,0,0), +(4109,1024,4063,1,2,10,619,6978,0,0), +(4110,1024,4063,1,2,11,619,6978,0,0), +(4111,1024,4063,1,2,12,619,6978,0,0), +(4112,1024,4063,1,2,13,619,6978,0,0), +(4113,1024,4063,1,2,14,619,6978,0,0), +(4114,1024,4063,1,2,15,619,6978,0,0), +(4115,1024,4063,1,2,16,619,6978,0,0), +(4116,1024,4063,1,2,17,619,6978,0,0), +(4117,1024,4063,1,2,18,619,6978,0,0), +(4118,1024,4063,1,2,19,619,6978,0,0), +(4119,2097152,4063,0,2,0,622,7042,0,0), +(4120,2097152,4063,0,2,1,622,7043,0,0), +(4121,2097152,4063,0,2,2,622,7044,0,0), +(4122,2097152,4063,0,2,3,622,7045,0,0), +(4123,2097152,4063,0,2,4,622,7046,0,0), +(4124,2097152,32,0,2,5,622,7072,0,0), +(4125,2097152,32,0,2,6,622,7072,0,0), +(4126,2097152,32,0,2,7,622,7072,0,0), +(4127,2097152,32,0,2,8,622,7072,0,0), +(4128,2097152,32,0,2,9,622,7072,0,0), +(4129,2097152,32,0,2,10,622,7072,0,0), +(4130,2097152,32,0,2,11,622,7072,0,0), +(4131,2097152,32,0,2,12,622,7072,0,0), +(4132,2097152,32,0,2,13,622,7072,0,0), +(4133,2097152,32,0,2,14,622,7072,0,0), +(4134,2097152,4063,0,2,15,622,7053,0,0), +(4135,2097152,4063,0,2,16,622,7058,0,0), +(4136,2097152,32,0,2,17,622,7072,0,0), +(4137,2097152,32,0,2,18,622,7072,0,0), +(4138,2097152,4063,1,2,0,623,7092,0,0), +(4139,2097152,4063,1,2,1,623,7089,0,0), +(4140,2097152,4063,1,2,2,623,7092,0,0), +(4141,2097152,4063,1,2,3,623,7092,0,0), +(4142,2097152,4063,1,2,4,623,7085,0,0), +(4143,2097152,4063,1,2,5,623,7092,0,0), +(4144,2097152,4063,1,2,6,623,7087,0,0), +(4145,2097152,4063,1,2,7,623,7091,0,0), +(4146,2097152,4063,1,2,8,623,7087,0,0), +(4147,2097152,4063,1,2,9,623,7092,0,0), +(4148,2097152,4063,1,2,10,623,7093,0,0), +(4149,2097152,4063,1,2,11,623,7093,0,0), +(4150,2097152,4063,1,2,12,623,7092,0,0), +(4151,2097152,4063,1,2,13,623,7087,0,0), +(4152,2097152,32,1,2,14,623,7103,0,0), +(4153,2097152,32,1,2,15,623,7103,0,0), +(4154,2097152,32,1,2,16,623,7103,0,0), +(4155,2097152,32,1,2,17,623,7103,0,0), +(4156,2097152,32,1,2,18,623,7103,0,0), +(4157,2097152,32,1,2,19,623,7103,0,0), +(4158,2097152,32,1,2,20,623,7103,0,0), +(4159,2097152,32,1,2,21,623,7103,0,0), +(4160,2097152,32,1,2,22,623,7103,0,0), +(4161,2097152,32,1,2,23,623,7103,0,0), +(4162,2097152,32,1,2,24,623,7103,0,0), +(4163,2097152,32,1,2,25,623,7103,0,0), +(4164,2097152,32,1,2,26,623,7103,0,0), +(4165,2097152,32,1,2,27,623,7103,0,0), +(4166,2097152,4063,1,2,28,623,7073,0,0), +(4167,2097152,32,1,2,29,623,7103,0,0), +(4168,2097152,4063,1,2,30,623,7073,0,0), +(4169,2097152,32,1,2,31,623,7103,0,0), +(4170,4,4095,0,1,0,611,6956,0,0), +(4171,4,4095,0,1,1,611,6956,0,0), +(4172,4,4095,0,1,2,611,6956,0,0), +(4173,4,4095,0,1,3,611,6956,0,0), +(4174,4,4095,0,1,4,611,6956,0,0), +(4175,4,4095,0,1,5,611,6956,0,0), +(4176,4,4095,0,1,6,611,6956,0,0), +(4177,4,4095,0,1,7,611,6956,0,0), +(4178,4,4095,0,1,8,611,6956,0,0), +(4179,4,4095,0,1,9,611,6956,0,0), +(4180,4,4095,0,1,10,611,6956,0,0), +(4181,4,4095,0,1,11,611,6956,0,0), +(4182,4,4095,0,1,12,611,6956,0,0), +(4183,4,4095,0,1,13,611,6956,0,0), +(4184,4,4095,0,1,14,611,6956,0,0), +(4185,4,4095,0,1,15,611,6956,0,0), +(4186,4,4095,0,1,16,611,6956,0,0), +(4187,4,4095,0,1,17,611,6956,0,0), +(4188,4,4095,0,1,18,611,6956,0,0), +(4189,4,4095,0,1,19,611,6956,0,0), +(4190,4,4095,0,1,20,611,6956,0,0), +(4191,4,4095,0,1,21,611,6956,0,0), +(4192,4,4095,0,1,22,611,6956,0,0), +(4193,4,4095,0,1,23,611,6956,0,0), +(4194,4,4095,0,1,24,611,6956,0,0), +(4195,4,4095,0,1,25,611,6956,0,0), +(4196,4,4095,0,1,26,611,6956,0,0), +(4197,1,4095,0,2,0,525,5056,0,0), +(4198,1,4095,0,2,1,525,5056,0,0), +(4199,1,4095,0,2,2,525,5056,0,0), +(4200,1,4095,0,2,3,525,5056,0,0), +(4201,1,4095,0,2,4,525,5056,0,0), +(4202,1,4095,0,2,5,525,5056,0,0), +(4203,1,4095,0,2,6,525,5056,0,0), +(4204,1,4095,0,2,7,525,5056,0,0), +(4205,1,4095,0,2,8,525,5056,0,0), +(4206,1,4095,0,2,9,525,5056,0,0), +(4207,1,4095,0,2,10,525,5056,0,0), +(4208,1,4095,0,2,11,525,5056,0,0), +(4209,1,4095,0,2,12,525,5056,0,0), +(4210,1,4095,0,2,13,525,5056,0,0), +(4211,1,4095,0,2,14,525,5056,0,0), +(4212,1,4095,0,2,15,525,5056,0,0), +(4213,1,4095,0,2,16,525,5056,0,0), +(4214,1,4095,0,2,17,525,5056,0,0), +(4215,1,4095,0,2,18,525,5056,0,0), +(4216,1,4095,0,2,19,525,5056,0,0), +(4217,1,4095,0,2,20,525,5056,0,0), +(4218,1,4095,0,2,21,525,5056,0,0), +(4219,1,4095,0,2,22,525,5056,0,0), +(4220,1,4095,0,2,23,525,5056,0,0), +(4221,1,4095,1,2,0,526,5059,0,0), +(4222,1,4095,1,2,1,526,5059,0,0), +(4223,1,4095,1,2,2,526,5059,0,0), +(4224,1,4095,1,2,3,526,5059,0,0), +(4225,1,4095,1,2,4,526,5059,0,0), +(4226,1,4095,1,2,5,526,5059,0,0), +(4227,1,4095,1,2,6,526,5059,0,0), +(4228,1,4095,1,2,7,526,5059,0,0), +(4229,1,4095,1,2,8,526,5059,0,0), +(4230,1,4095,1,2,9,526,5059,0,0), +(4231,1,4095,1,2,10,526,5059,0,0), +(4232,1,4095,1,2,11,526,5059,0,0), +(4233,1,4095,1,2,12,526,5059,0,0), +(4234,1,4095,1,2,13,526,5059,0,0), +(4235,1,4095,1,2,14,526,5059,0,0), +(4236,1,4095,1,2,15,526,5059,0,0), +(4237,1,4095,1,2,16,526,5059,0,0), +(4238,1,4095,1,2,17,526,5059,0,0), +(4239,1,4095,1,2,18,526,5059,0,0), +(4240,1,4095,1,2,19,526,5059,0,0), +(4241,1,4095,1,2,20,526,5059,0,0), +(4242,1,4095,1,2,21,526,5059,0,0), +(4243,1,4095,1,2,22,526,5059,0,0), +(4244,1,4095,1,2,23,526,5059,0,0), +(4245,1,4095,1,2,24,526,5059,0,0), +(4246,1,4095,1,2,25,526,5059,0,0), +(4247,1,4095,1,2,26,526,5059,0,0), +(4248,1,4095,1,2,27,526,5059,0,0), +(4249,1,4095,1,2,28,526,5059,0,0), +(4250,1,4095,1,2,29,526,5059,0,0), +(4263,6291456,4095,1,3,27,16,4983,0,0), +(4264,6291456,4095,1,3,26,16,4982,0,0), +(4265,6291456,4095,1,3,25,16,4981,0,0), +(4266,6291456,4095,1,3,24,16,4980,0,0), +(4267,6291456,4095,1,3,23,16,155,0,0), +(4268,6291456,4095,1,3,22,16,154,0,0), +(4269,6291456,4095,1,3,21,16,153,0,0), +(4270,6291456,4095,1,3,20,16,152,0,0), +(4271,6291456,4095,1,3,19,16,151,0,0), +(4272,6291456,4095,1,3,18,16,150,0,0), +(4273,6291456,4095,1,3,17,16,149,0,0), +(4274,6291456,4095,1,3,16,16,148,0,0), +(4275,6291456,4095,1,3,15,16,147,0,0), +(4276,6291456,4095,1,3,14,16,146,0,0), +(4277,6291456,4095,1,3,13,16,145,0,0), +(4278,6291456,4095,1,3,12,16,144,0,0), +(4279,6291456,4095,1,3,11,16,143,0,0), +(4280,6291456,4095,1,3,10,16,142,0,0), +(4281,6291456,4095,1,3,9,16,141,0,0), +(4282,6291456,4095,1,3,8,16,140,0,0), +(4283,6291456,4095,1,3,7,16,139,0,0), +(4284,6291456,4095,1,3,6,16,138,0,0), +(4285,6291456,4095,1,3,5,16,137,0,0), +(4286,6291456,4095,1,3,4,16,136,0,0), +(4287,6291456,4095,1,3,3,16,135,0,0), +(4288,6291456,4095,1,3,2,16,134,0,0), +(4289,6291456,4095,1,3,1,16,133,0,0), +(4290,6291456,4095,1,3,0,16,132,0,0), +(4291,32,32,0,2,9,646,7281,0,0), +(4292,32,32,0,2,8,646,7281,0,0), +(4293,32,32,0,2,7,646,7281,0,0), +(4294,32,32,0,2,6,646,7281,0,0), +(4295,32,32,0,2,5,646,7281,0,0), +(4296,32,4063,0,2,4,646,7278,0,0), +(4297,32,4063,0,2,3,646,7275,0,0), +(4298,32,4063,0,2,2,646,7276,0,0), +(4299,32,4063,0,2,1,646,7280,0,0), +(4300,32,4063,0,2,0,646,7279,0,0), +(4308,32,32,1,2,7,647,7289,0,0), +(4309,32,32,1,2,6,647,7289,0,0), +(4310,32,32,1,2,5,647,7289,0,0), +(4311,32,32,1,2,4,647,7289,0,0), +(4312,32,4063,1,2,3,647,7285,0,0), +(4313,32,4063,1,2,2,647,7284,0,0), +(4314,32,4063,1,2,1,647,7283,0,0), +(4315,32,4063,1,2,0,647,7282,0,0), +(4323,32,4095,0,5,6,672,7425,0,0), +(4324,32,4095,0,5,5,672,7425,0,0), +(4325,32,4095,0,5,4,672,7425,0,0), +(4326,32,4095,0,5,3,672,7425,0,0), +(4327,32,4095,0,5,2,672,7425,0,0), +(4328,32,4095,0,5,1,672,7425,0,0), +(4329,32,4095,0,5,0,672,7425,0,0), +(4330,32,4095,0,5,6,671,7409,0,0), +(4331,32,4095,0,5,5,671,7412,0,0), +(4332,32,4095,0,5,4,671,7408,0,0), +(4333,32,4095,0,5,3,671,7411,0,0), +(4334,32,4095,0,5,2,671,7410,0,0), +(4335,32,4095,0,5,1,671,7409,0,0), +(4336,32,4095,0,5,0,671,7408,0,0), +(4337,32,4095,0,5,0,661,7343,0,0), +(4338,32,4095,0,5,1,661,7344,0,0), +(4339,32,4095,0,5,2,661,7345,0,0), +(4340,32,4095,0,5,3,661,7343,0,0), +(4341,32,4095,0,5,4,661,7343,0,0), +(4342,32,4095,0,5,5,661,7346,0,0), +(4343,32,4095,0,5,6,661,7345,0,0), +(4344,32,4095,1,5,4,673,7429,0,0), +(4345,32,4095,1,5,3,673,7429,0,0), +(4346,32,4095,1,5,2,673,7429,0,0), +(4347,32,4095,1,5,1,673,7429,0,0), +(4348,32,4095,1,5,0,673,7429,0,0), +(4349,2097152,4095,0,5,0,675,7444,0,0), +(4350,2097152,4095,0,5,1,675,7445,0,0), +(4351,2097152,4095,0,5,2,675,7446,0,0), +(4352,2097152,4095,0,5,3,675,7447,0,0), +(4353,2097152,4095,0,5,4,675,7448,0,0), +(4354,2097152,4095,0,5,5,675,7449,0,0), +(4355,2097152,4095,0,5,6,675,7450,0,0), +(4356,2097152,4095,0,5,7,675,7451,0,0), +(4357,2097152,4095,0,5,8,675,7452,0,0), +(4358,2097152,4095,0,5,9,675,7453,0,0), +(4359,2097152,4095,0,5,10,675,7454,0,0), +(4360,2097152,4095,0,5,11,675,7455,0,0), +(4361,2097152,4095,0,5,12,675,7455,0,0), +(4362,2097152,4095,0,5,13,675,7454,0,0), +(4363,2097152,4095,0,5,14,675,7453,0,0), +(4364,2097152,4095,0,5,15,675,7452,0,0), +(4365,2097152,4095,0,5,16,675,7445,0,0), +(4366,2097152,4095,0,5,17,675,7450,0,0), +(4367,2097152,4095,0,5,18,675,7449,0,0), +(4368,2097152,4095,0,5,19,675,7448,0,0), +(4369,2097152,4095,0,5,20,675,7447,0,0), +(4370,2097152,4095,0,5,21,675,7446,0,0), +(4371,2097152,4095,0,5,22,675,7445,0,0), +(4372,2097152,4095,0,5,23,675,7444,0,0), +(4417,8,2015,0,2,0,682,7610,1,0), +(4418,8,2015,0,2,1,682,7610,1,0), +(4419,8,2015,0,2,2,682,7610,1,0), +(4420,8,2015,0,2,3,682,7610,1,0), +(4421,8,2015,0,2,4,682,7610,1,0), +(4422,8,2015,0,2,5,682,7610,1,0), +(4423,8,2015,0,2,6,682,7610,1,0), +(4424,8,2015,0,2,7,682,7610,1,0), +(4425,8,2015,0,2,8,682,7610,1,0), +(4426,8,32,0,2,9,682,7618,0,0), +(4427,8,32,0,2,10,682,7618,0,0), +(4428,8,32,0,2,11,682,7618,0,0), +(4429,8,32,0,2,12,682,7618,0,0), +(4430,8,32,0,2,13,682,7618,0,0), +(4431,8,32,0,2,14,682,7618,0,0), +(4432,8,32,0,2,15,682,7618,0,0), +(4433,8,32,0,2,16,682,7618,0,0), +(4434,8,32,0,2,17,682,7618,0,0), +(4435,8,2015,1,2,0,683,7622,1,0), +(4436,8,2015,1,2,1,683,7622,1,0), +(4437,8,2015,1,2,2,683,7622,1,0), +(4438,8,2015,1,2,3,683,7622,1,0), +(4439,8,2015,1,2,4,683,7622,1,0), +(4440,8,2015,1,2,5,683,7622,1,0), +(4441,8,2015,1,2,6,683,7622,1,0), +(4442,8,2015,1,2,7,683,7622,1,0), +(4443,8,2015,1,2,8,683,7622,1,0), +(4444,8,32,1,2,9,683,7634,0,0), +(4445,8,32,1,2,10,683,7634,0,0), +(4446,8,32,1,2,11,683,7634,0,0), +(4447,8,32,1,2,12,683,7634,0,0), +(4448,8,32,1,2,13,683,7634,0,0), +(4449,8,32,1,2,14,683,7634,0,0), +(4450,8,32,1,2,15,683,7634,0,0), +(4451,8,32,1,2,16,683,7634,0,0), +(4452,8,32,1,2,17,683,7634,0,0), +(4463,2147483648,4063,0,2,0,686,7669,1,0), +(4464,2147483648,4063,0,2,1,686,7670,1,0), +(4465,2147483648,4063,0,2,2,686,7671,1,0), +(4466,2147483648,4063,0,2,3,686,7673,1,0), +(4467,2147483648,4063,0,2,4,686,7675,1,0), +(4468,2147483648,4063,0,2,5,686,7677,1,0), +(4469,2147483648,4063,0,2,6,686,7673,1,0), +(4470,2147483648,4063,1,2,0,687,7682,1,0), +(4471,2147483648,4063,1,2,1,687,7684,1,0), +(4472,2147483648,4063,1,2,2,687,7686,1,0), +(4473,2147483648,4063,1,2,3,687,7688,1,0), +(4474,2147483648,4063,1,2,4,687,7683,1,0), +(4475,2147483648,4063,1,2,5,687,7690,1,0), +(4476,2147483648,4063,1,2,6,687,7686,1,0), +(4477,1024,4095,0,1,0,691,7712,0,0), +(4478,1024,4095,0,1,1,691,7712,0,0), +(4479,1024,4095,0,1,2,691,7712,0,0), +(4480,1024,4095,0,1,3,691,7712,0,0), +(4481,1024,4095,0,1,4,691,7712,0,0), +(4482,1024,4095,0,1,5,691,7712,0,0), +(4483,1024,4095,0,1,6,691,7712,0,0), +(4484,1024,4095,0,1,7,691,7712,0,0), +(4485,1024,4095,0,1,8,691,7712,0,0), +(4486,1024,4095,0,1,9,691,7712,0,0), +(4487,1024,4095,0,1,10,691,7712,0,0), +(4488,1024,4095,0,1,11,691,7712,0,0), +(4489,1024,4095,0,1,12,691,7712,0,0), +(4490,1024,4095,0,1,13,691,7712,0,0), +(4491,1024,4095,0,1,14,691,7712,0,0), +(4492,1024,4095,0,1,15,691,7712,0,0), +(4493,1024,4095,0,1,16,691,7712,0,0), +(4494,1024,4095,0,1,17,691,7712,0,0), +(4495,1024,4095,0,1,18,691,7712,0,0), +(4496,1024,4095,0,1,19,691,7712,0,0), +(4497,1024,4095,0,1,20,691,7712,0,0), +(4498,1024,4095,1,1,0,689,7703,0,0), +(4499,1024,4095,1,1,1,689,7703,0,0), +(4500,1024,4095,1,1,2,689,7703,0,0), +(4501,1024,4095,1,1,3,689,7703,0,0), +(4502,1024,4095,1,1,4,689,7703,0,0), +(4503,1024,4095,1,1,5,689,7703,0,0), +(4504,1024,4095,1,1,6,689,7703,0,0), +(4505,1024,4095,1,1,7,689,7703,0,0), +(4506,1024,4095,1,1,8,689,7703,0,0), +(4507,1024,4095,1,1,9,689,7703,0,0), +(4508,1024,4095,1,1,10,689,7703,0,0), +(4509,1024,4095,1,1,11,689,7703,0,0), +(4510,1024,4095,1,1,12,689,7703,0,0), +(4511,1024,4095,1,1,13,689,7703,0,0), +(4512,1024,4095,1,1,14,689,7703,0,0), +(4513,1024,4095,1,1,15,689,7703,0,0), +(4514,1024,4095,1,1,16,689,7703,0,0), +(4515,1024,4095,1,1,17,689,7703,0,0), +(4516,1024,4095,1,1,18,689,7703,0,0), +(4517,1024,4095,0,5,0,695,7747,0,0), +(4518,1024,4095,0,5,1,695,7748,0,0), +(4519,1024,4095,0,5,2,695,7749,0,0), +(4520,1024,4095,0,5,3,695,7750,0,0), +(4521,1024,4095,0,5,4,695,7751,0,0), +(4522,1024,4095,0,5,5,695,7752,0,0), +(4523,1024,4095,0,5,6,695,7753,0,0), +(4524,1024,4095,0,5,7,695,7754,0,0), +(4525,2147483648,4095,0,5,0,706,7840,0,0), +(4526,2147483648,4095,0,5,1,302,3128,0,0), +(4527,2147483648,4095,0,5,3,302,3128,0,0), +(4528,2147483648,4095,0,5,2,706,7840,0,0), +(4529,2147483648,4095,0,5,4,706,7839,0,0), +(4530,2147483648,4095,0,5,5,706,7840,0,0), +(4531,2147483648,4095,0,5,6,706,7840,0,0), +(4532,2147483648,4095,0,5,7,706,7840,0,0), +(4533,2147483648,4095,0,5,8,706,7839,0,0), +(4534,2147483648,4095,0,5,9,706,3129,0,0), +(4535,2147483648,4095,0,5,10,706,3131,0,0), +(4536,2147483648,4095,0,5,11,706,3129,0,0), +(4537,2147483648,4095,0,5,8,302,3135,0,0), +(4538,2147483648,4095,0,5,9,302,3130,0,0), +(4539,2147483648,4095,0,5,10,302,3133,0,0), +(4540,2147483648,4095,0,5,11,302,3134,0,0), +(4541,2097152,4095,0,5,9,207,2286,0,0), +(4542,2097152,4095,0,5,10,207,2287,0,0), +(4543,2097152,4095,0,5,11,207,2279,0,0), +(4544,2097152,4095,0,5,12,207,2280,0,0), +(4545,2097152,4095,0,5,13,207,2281,0,0), +(4546,2097152,4095,0,5,14,207,2282,0,0), +(4547,2097152,4095,0,5,15,207,2283,0,0), +(4548,2097152,4095,0,5,16,207,2283,0,0), +(4549,2097152,4095,0,5,17,207,2284,0,0), +(4550,2097152,4095,0,5,18,207,2285,0,0), +(4551,2097152,4095,0,5,19,207,2279,0,0), +(4552,2097152,4095,0,5,20,207,2286,0,0), +(4553,2097152,4095,0,5,21,207,2287,0,0), +(4554,2097152,4095,0,5,22,207,2279,0,0), +(4555,2097152,4095,0,5,23,207,2288,0,0), +(4556,8,4095,0,1,23,734,8062,0,0), +(4557,8,4095,0,1,22,734,8062,0,0), +(4558,8,4095,0,1,21,734,8062,0,0), +(4559,8,4095,0,1,20,734,8062,0,0), +(4560,8,4095,0,1,19,734,8062,0,0), +(4561,8,4095,0,1,18,734,8062,0,0), +(4562,8,4095,0,1,17,734,8062,0,0), +(4563,8,4095,0,1,16,734,8062,0,0), +(4564,8,4095,0,1,15,734,8062,0,0), +(4565,8,4095,0,1,14,734,8062,0,0), +(4566,8,4095,0,1,13,734,8062,0,0), +(4567,8,4095,0,1,12,734,8062,0,0), +(4568,8,4095,0,1,11,734,8062,0,0), +(4569,8,4095,0,1,10,734,8062,0,0), +(4570,8,4095,0,1,9,734,8062,0,0), +(4571,8,4095,0,1,8,734,8062,0,0), +(4572,8,4095,0,1,7,734,8062,0,0), +(4573,8,4095,0,1,6,734,8062,0,0), +(4574,8,4095,0,1,5,734,8062,0,0), +(4575,8,4095,0,1,4,734,8062,0,0), +(4576,8,4095,0,1,3,734,8062,0,0), +(4577,8,4095,0,1,2,734,8062,0,0), +(4578,8,4095,0,1,1,734,8062,0,0), +(4579,8,4095,0,1,0,734,8062,0,0), +(4604,8,4095,1,1,23,732,8052,0,0), +(4605,8,4095,1,1,22,732,8052,0,0), +(4606,8,4095,1,1,21,732,8052,0,0), +(4607,8,4095,1,1,20,732,8052,0,0), +(4608,8,4095,1,1,19,732,8052,0,0), +(4609,8,4095,1,1,18,732,8052,0,0), +(4610,8,4095,1,1,17,732,8052,0,0), +(4611,8,4095,1,1,16,732,8052,0,0), +(4612,8,4095,1,1,15,732,8052,0,0), +(4613,8,4095,1,1,14,732,8052,0,0), +(4614,8,4095,1,1,13,732,8052,0,0), +(4615,8,4095,1,1,12,732,8052,0,0), +(4616,8,4095,1,1,11,732,8052,0,0), +(4617,8,4095,1,1,10,732,8052,0,0), +(4618,8,4095,1,1,9,732,8052,0,0), +(4619,8,4095,1,1,8,732,8052,0,0), +(4620,8,4095,1,1,7,732,8052,0,0), +(4621,8,4095,1,1,6,732,8052,0,0), +(4622,8,4095,1,1,5,732,8052,0,0), +(4623,8,4095,1,1,4,732,8052,0,0), +(4624,8,4095,1,1,3,732,8052,0,0), +(4625,8,4095,1,1,2,732,8052,0,0), +(4626,8,4095,1,1,1,732,8052,0,0), +(4627,8,4095,1,1,0,732,8052,0,0), +(4628,8,4095,1,1,23,736,8071,0,0), +(4629,8,4095,1,1,22,736,8071,0,0), +(4630,8,4095,1,1,21,736,8071,0,0), +(4631,8,4095,1,1,20,736,8071,0,0), +(4632,8,4095,1,1,19,736,8071,0,0), +(4633,8,4095,1,1,18,736,8071,0,0), +(4634,8,4095,1,1,17,736,8071,0,0), +(4635,8,4095,1,1,16,736,8071,0,0), +(4636,8,4095,1,1,15,736,8071,0,0), +(4637,8,4095,1,1,14,736,8071,0,0), +(4638,8,4095,1,1,13,736,8071,0,0), +(4639,8,4095,1,1,12,736,8071,0,0), +(4640,8,4095,1,1,11,736,8071,0,0), +(4641,8,4095,1,1,10,736,8071,0,0), +(4642,8,4095,1,1,9,736,8071,0,0), +(4643,8,4095,1,1,8,736,8071,0,0), +(4644,8,4095,1,1,7,736,8071,0,0), +(4645,8,4095,1,1,6,736,8071,0,0), +(4646,8,4095,1,1,5,736,8071,0,0), +(4647,8,4095,1,1,4,736,8071,0,0), +(4648,8,4095,1,1,3,736,8071,0,0), +(4649,8,4095,1,1,2,736,8071,0,0), +(4650,8,4095,1,1,1,736,8071,0,0), +(4651,8,4095,1,1,0,736,8071,0,0), +(4652,8,4095,0,5,5,738,8086,0,0), +(4653,8,4095,0,5,4,738,8085,0,0), +(4654,8,4095,0,5,3,738,8084,0,0), +(4655,8,4095,0,5,2,738,8083,0,0), +(4656,8,4095,0,5,1,738,8083,0,0), +(4657,8,4095,0,5,0,738,8091,0,0), +(4670,8,4095,0,5,0,740,8099,0,0), +(4671,8,4095,0,5,1,740,8102,0,0), +(4672,8,4095,0,5,2,740,8099,0,0), +(4673,8,4095,0,5,3,740,8107,0,0), +(4674,8,4095,0,5,4,740,8099,0,0), +(4675,8,4095,0,5,5,740,8099,0,0), +(4676,8,4095,0,5,0,739,8093,0,0), +(4677,8,4095,0,5,1,739,8108,0,0), +(4678,8,4095,0,5,2,739,8093,0,0), +(4679,8,4095,0,5,3,739,8094,0,0), +(4680,8,4095,0,5,4,739,8095,0,0), +(4681,8,4095,0,5,5,739,8108,0,0), +(4682,8,4095,1,4,0,745,8173,0,0), +(4683,8,4095,1,4,1,745,8174,0,0), +(4684,8,4095,1,4,2,745,8175,0,0), +(4685,8,4095,1,4,3,745,8175,0,0), +(4686,8,4095,1,4,4,745,8177,0,0), +(4687,8,4095,1,4,5,745,8175,0,0), +(4688,8,4095,1,4,6,745,8178,0,0), +(4689,8,4095,1,4,7,745,8179,0,0), +(4690,8,4095,1,4,8,745,8290,0,0), +(4691,8,4095,1,4,9,745,8290,0,0), +(4692,8,32,1,4,10,745,8181,0,0), +(4693,8,2080,1,4,11,745,8180,0,0), +(4694,8,2080,1,4,12,745,8180,0,0), +(4695,8,2080,1,4,13,745,8180,0,0), +(4696,8,4095,1,4,14,745,8290,0,0), +(4697,58720256,4063,0,2,0,747,8318,1,0), +(4698,58720256,4063,0,2,0,747,8323,1,1), +(4699,58720256,4063,0,2,0,747,8323,1,2), +(4700,58720256,4063,0,2,0,747,8323,1,3), +(4701,58720256,4063,0,2,0,747,8323,1,4), +(4702,58720256,4063,0,2,0,747,8321,1,5), +(4718,58720256,4095,1,1,0,751,8363,0,0), +(4719,58720256,4095,1,1,1,751,8364,0,0), +(4720,58720256,4095,1,1,2,751,8363,0,0), +(4721,58720256,4095,1,1,3,751,8363,0,0), +(4722,58720256,4095,1,1,4,751,8363,0,0), +(4723,58720256,4095,1,1,5,751,8364,0,0), +(4724,58720256,4095,1,1,6,751,8363,0,0), +(4725,58720256,4095,1,1,7,751,8363,0,0), +(4726,58720256,4095,1,1,8,751,8363,0,0), +(4727,58720256,4095,1,1,9,751,8364,0,0), +(4728,58720256,4095,1,1,10,751,8363,0,0), +(4729,58720256,4095,1,1,11,751,8363,0,0), +(4730,58720256,4095,1,1,12,751,8364,0,0), +(4731,58720256,4095,1,1,13,751,8364,0,0), +(4732,58720256,4095,1,1,14,751,8363,0,0), +(4733,58720256,4095,0,5,34,752,8389,0,0), +(4734,58720256,4095,0,5,33,752,8389,0,0), +(4735,58720256,4095,0,5,32,752,8389,0,0), +(4736,58720256,4095,0,5,31,752,8389,0,0), +(4737,58720256,4095,0,5,30,752,8389,0,0), +(4738,58720256,4095,0,5,29,752,8393,0,0), +(4739,58720256,4095,0,5,28,752,8390,0,0), +(4740,58720256,4095,0,5,27,752,8390,0,0), +(4741,58720256,4095,0,5,26,752,8389,0,0), +(4742,58720256,4095,0,5,25,752,8389,0,0), +(4743,58720256,4095,0,5,24,752,8389,0,0), +(4744,58720256,4095,0,5,23,752,8399,0,0), +(4745,58720256,4095,0,5,22,752,8393,0,0), +(4746,58720256,4095,0,5,21,752,8390,0,0), +(4747,58720256,4095,0,5,20,752,8399,0,0), +(4748,58720256,4095,0,5,19,752,8389,0,0), +(4749,58720256,4095,0,5,18,752,8389,0,0), +(4750,58720256,4095,0,5,17,752,9928,0,0), +(4751,58720256,4095,0,5,16,752,8391,0,0), +(4752,58720256,4095,0,5,15,752,8389,0,0), +(4753,58720256,4095,0,5,14,752,8392,0,0), +(4754,58720256,4095,0,5,13,752,8389,0,0), +(4755,58720256,4095,0,5,12,752,8390,0,0), +(4756,58720256,4095,0,5,11,752,8399,0,0), +(4757,58720256,4095,0,5,10,752,8389,0,0), +(4758,58720256,4095,0,5,9,752,8392,0,0), +(4759,58720256,4095,0,5,8,752,8393,0,0), +(4760,58720256,4095,0,5,7,752,8389,0,0), +(4761,58720256,4095,0,5,6,752,8390,0,0), +(4762,58720256,4095,0,5,5,752,8393,0,0), +(4763,58720256,4095,0,5,4,752,8399,0,0), +(4764,58720256,4095,0,5,3,752,8389,0,0), +(4765,58720256,4095,0,5,2,752,8390,0,0), +(4766,58720256,4095,0,5,1,752,8389,0,0), +(4767,58720256,4095,0,5,0,752,8389,0,0), +(4785,58720256,4095,0,5,17,753,8395,0,0), +(4786,58720256,4095,0,5,16,753,8397,0,0), +(4787,58720256,4095,0,5,15,753,8396,0,0), +(4788,58720256,4095,0,5,14,753,8394,0,0), +(4789,58720256,4095,0,5,13,753,8394,0,0), +(4790,58720256,4095,0,5,12,753,8395,0,0), +(4791,58720256,4095,0,5,11,753,8394,0,0), +(4792,58720256,4095,0,5,10,753,8396,0,0), +(4793,58720256,4095,0,5,9,753,8394,0,0), +(4794,58720256,4095,0,5,8,753,8394,0,0), +(4795,58720256,4095,0,5,7,753,8400,0,0), +(4796,58720256,4095,0,5,6,753,8397,0,0), +(4797,58720256,4095,0,5,5,753,8394,0,0), +(4798,58720256,4095,0,5,4,753,8395,0,0), +(4799,58720256,4095,0,5,3,753,8394,0,0), +(4800,58720256,4095,0,5,2,753,8394,0,0), +(4801,58720256,4095,0,5,1,753,8394,0,0), +(4802,58720256,4095,0,5,0,753,8394,0,0), +(4803,58720256,4095,0,5,34,753,8400,0,0), +(4804,58720256,4095,0,5,33,753,8397,0,0), +(4805,58720256,4095,0,5,32,753,8396,0,0), +(4806,58720256,4095,0,5,31,753,8395,0,0), +(4807,58720256,4095,0,5,30,753,8396,0,0), +(4808,58720256,4095,0,5,29,753,8396,0,0), +(4809,58720256,4095,0,5,28,753,8395,0,0), +(4810,58720256,4095,0,5,27,753,8395,0,0), +(4811,58720256,4095,0,5,26,753,8395,0,0), +(4812,58720256,4095,0,5,25,753,8395,0,0), +(4813,58720256,4095,0,5,24,753,8395,0,0), +(4814,58720256,4095,0,5,23,753,8396,0,0), +(4815,58720256,4095,0,5,22,753,8396,0,0), +(4816,58720256,4095,0,5,21,753,8397,0,0), +(4817,58720256,4095,0,5,20,753,8396,0,0), +(4818,58720256,4095,0,5,19,753,8396,0,0), +(4819,58720256,4095,0,5,18,753,8395,0,0), +(4820,128,32,0,2,9,756,8451,0,0), +(4821,128,32,0,2,8,756,8451,0,0), +(4822,128,32,0,2,7,756,8451,0,0), +(4823,128,32,0,2,6,756,8451,0,0), +(4824,128,32,0,2,5,756,8451,0,0), +(4825,128,4063,0,2,4,756,8438,0,0), +(4826,128,4063,0,2,3,756,8435,0,0), +(4827,128,4063,0,2,2,756,8435,0,0), +(4828,128,4063,0,2,1,756,8435,0,0), +(4829,128,4063,0,2,0,756,8435,0,0), +(4830,128,32,1,2,11,757,8468,0,0), +(4831,128,32,1,2,10,757,8468,0,0), +(4832,128,32,1,2,9,757,8468,0,0), +(4833,128,32,1,2,8,757,8468,0,0), +(4834,128,32,1,2,7,757,8468,0,0), +(4835,128,32,1,2,6,757,8468,0,0), +(4836,128,4063,1,2,5,757,8452,0,0), +(4837,128,4063,1,2,4,757,8454,0,0), +(4838,128,4063,1,2,3,757,8454,0,0), +(4839,128,4063,1,2,2,757,8454,0,0), +(4840,128,4063,1,2,1,757,8454,0,0), +(4841,128,4063,1,2,0,757,8454,0,0), +(4862,128,4095,1,1,18,766,8510,0,0), +(4863,128,4095,1,1,17,766,8510,0,0), +(4864,128,4095,1,1,16,766,8510,0,0), +(4865,128,4095,1,1,15,766,8510,0,0), +(4866,128,4095,1,1,14,766,8510,0,0), +(4867,128,4095,1,1,13,766,8510,0,0), +(4868,128,4095,1,1,12,766,8510,0,0), +(4869,128,4095,1,1,11,766,8510,0,0), +(4870,128,4095,1,1,10,766,8510,0,0), +(4871,128,4095,1,1,9,766,8510,0,0), +(4872,128,4095,1,1,8,766,8510,0,0), +(4873,128,4095,1,1,7,766,8510,0,0), +(4874,128,4095,1,1,6,766,8510,0,0), +(4875,128,4095,1,1,5,766,8510,0,0), +(4876,128,4095,1,1,4,766,8510,0,0), +(4877,128,4095,1,1,3,766,8510,0,0), +(4878,128,4095,1,1,2,766,8510,0,0), +(4879,128,4095,1,1,1,766,8510,0,0), +(4880,128,4095,1,1,0,766,8510,0,0), +(4881,128,4095,0,5,0,767,8538,0,0), +(4882,128,4095,0,5,1,767,8538,0,0), +(4883,128,4095,0,5,2,767,8538,0,0), +(4884,128,4095,0,5,3,767,8538,0,0), +(4885,128,4095,0,5,4,767,8538,0,0), +(4886,128,4095,0,5,5,767,8539,0,0), +(4887,128,4095,0,5,6,767,8540,0,0), +(4888,128,4095,0,5,7,767,8541,0,0), +(4889,128,4095,0,5,8,767,8542,0,0), +(4890,128,4095,0,5,9,767,8543,0,0), +(4891,128,4095,0,5,10,767,8544,0,0), +(4897,128,4095,0,4,9,768,8569,0,0), +(4898,128,4095,0,4,8,768,8568,0,0), +(4899,128,4095,0,4,7,768,8567,0,0), +(4900,128,4095,0,4,6,768,8566,0,0), +(4901,128,4095,0,4,5,768,8565,0,0), +(4902,128,4095,0,4,4,768,8564,0,0), +(4903,128,4095,0,4,3,768,8563,0,0), +(4904,128,4095,0,4,2,768,8562,0,0), +(4905,128,4095,0,4,1,768,8561,0,0), +(4906,128,4095,0,4,0,768,8560,0,0), +(4907,1024,4095,1,1,0,778,8637,0,0), +(4908,1024,4095,1,1,1,778,8638,0,0), +(4909,1024,4095,1,1,2,778,8639,0,0), +(4910,1024,4095,1,1,3,778,8639,0,0), +(4911,1024,4095,1,1,4,778,8640,0,0), +(4912,1024,4095,1,1,5,778,8639,0,0), +(4913,1024,4095,1,1,6,778,8639,0,0), +(4914,1024,4095,1,1,7,778,8641,0,0), +(4915,1024,4095,1,1,8,778,8642,0,0), +(4916,1024,4095,1,1,9,778,8639,0,0), +(4917,1024,4095,1,1,10,778,8639,0,0), +(4918,1024,4095,1,1,11,778,8639,0,0), +(4919,1024,4095,1,1,12,778,8639,0,0), +(4920,1024,4095,1,1,13,778,8639,0,0), +(4921,1024,4095,1,1,14,778,8642,0,0), +(4922,1024,4095,1,1,15,778,8650,0,0), +(4923,1024,4095,1,1,16,778,8651,0,0), +(4924,1024,4095,1,1,17,778,8652,0,0), +(4925,1024,4095,1,1,18,778,8649,0,0), +(4926,1024,4095,0,1,0,782,8707,0,0), +(4927,1024,4095,0,1,1,782,8707,0,0), +(4928,1024,4095,0,1,2,782,8707,0,0), +(4929,1024,4095,0,1,3,782,8707,0,0), +(4930,1024,4095,0,1,4,782,8707,0,0), +(4931,1024,4095,0,1,5,782,8707,0,0), +(4932,1024,4095,0,1,6,782,8707,0,0), +(4933,1024,4095,0,1,7,782,8707,0,0), +(4934,1024,4095,0,1,8,782,8707,0,0), +(4935,1024,4095,0,1,9,782,8707,0,0), +(4936,1024,4095,0,1,10,782,8707,0,0), +(4937,1024,4095,0,1,11,782,8707,0,0), +(4938,1024,4095,0,1,12,782,8707,0,0), +(4939,1024,4095,0,1,13,782,8707,0,0), +(4940,1024,4095,0,1,14,782,8707,0,0), +(4941,1024,4095,0,1,15,782,8707,0,0), +(4942,1024,4095,0,1,16,782,8707,0,0), +(4943,1024,4095,0,1,17,782,8707,0,0), +(4944,1024,4095,0,1,18,782,8707,0,0), +(4945,1024,4095,0,1,19,782,8707,0,0), +(4946,1024,4095,0,1,20,782,8713,0,0), +(4951,64,4095,0,5,0,783,8757,0,0), +(4952,64,4095,0,5,0,784,8765,0,0), +(4953,64,4095,0,5,1,783,8757,0,0), +(4954,64,4095,0,5,1,784,8766,0,0), +(4955,64,4095,0,5,2,783,8758,0,0), +(4956,64,4095,0,5,2,784,8767,0,0), +(4957,64,4095,0,5,3,783,8759,0,0), +(4958,64,4095,0,5,3,784,8768,0,0), +(4959,64,4095,0,5,4,783,8760,0,0), +(4960,64,4095,0,5,4,784,8769,0,0), +(4961,64,4095,0,5,5,783,8761,0,0), +(4962,64,4095,0,5,5,784,8770,0,0), +(4963,64,4095,0,5,6,783,8762,0,0), +(4964,64,4095,0,5,6,784,8766,0,0), +(4965,64,4095,0,5,7,783,8763,0,0), +(4966,64,4095,0,5,7,784,8767,0,0), +(4967,68719476736,4063,0,2,4,794,8903,0,0), +(4968,68719476736,4063,0,2,3,794,8902,0,0), +(4969,68719476736,4063,0,2,2,794,8909,0,0), +(4970,68719476736,4063,0,2,1,794,8900,0,0), +(4971,68719476736,4063,0,2,0,794,8912,0,0), +(4972,68719476736,4063,1,2,5,795,8924,0,0), +(4973,68719476736,4063,1,2,4,795,8922,0,0), +(4974,68719476736,4063,1,2,3,795,8919,0,0), +(4975,68719476736,4063,1,2,2,795,8920,0,0), +(4976,68719476736,4063,1,2,1,795,8922,0,0), +(4977,68719476736,4063,1,2,0,795,8921,0,0), +(4978,68719476736,4095,0,1,0,360,8938,0,0), +(4979,68719476736,4095,0,1,1,360,8939,0,0), +(4980,68719476736,4095,0,1,2,360,8940,0,0), +(4981,68719476736,4095,0,1,3,360,8941,0,0), +(4982,68719476736,4095,0,1,4,360,8942,0,0), +(4983,68719476736,4095,0,1,5,360,8938,0,0), +(4984,68719476736,4095,0,1,6,360,8939,0,0), +(4985,68719476736,4095,0,1,7,360,8940,0,0), +(4986,68719476736,4095,0,1,8,360,8941,0,0), +(4987,68719476736,4095,0,1,9,360,8942,0,0), +(4988,68719476736,4095,0,1,10,360,8938,0,0), +(4989,68719476736,4095,0,1,11,360,8939,0,0), +(4990,68719476736,4095,0,1,12,360,8940,0,0), +(4991,68719476736,4095,0,1,13,360,8941,0,0), +(4992,68719476736,4095,0,1,14,360,8942,0,0), +(4993,68719476736,4095,0,1,15,360,8948,0,0), +(4994,68719476736,4095,1,1,0,368,8952,0,0), +(4995,68719476736,4095,1,1,1,368,8953,0,0), +(4996,68719476736,4095,1,1,2,368,8954,0,0), +(4997,68719476736,4095,1,1,3,368,8955,0,0), +(4998,68719476736,4095,1,1,4,368,8956,0,0), +(4999,68719476736,4095,1,1,5,368,8952,0,0), +(5000,68719476736,4095,1,1,6,368,8953,0,0), +(5001,68719476736,4095,1,1,7,368,8954,0,0), +(5002,68719476736,4095,1,1,8,368,8955,0,0), +(5003,68719476736,4095,1,1,9,368,8956,0,0), +(5004,68719476736,4095,1,1,10,368,8952,0,0), +(5005,68719476736,4095,1,1,11,368,8953,0,0), +(5006,68719476736,4095,1,1,12,368,8954,0,0), +(5007,68719476736,4095,1,1,13,368,8955,0,0), +(5008,68719476736,4095,1,1,14,368,8956,0,0), +(5009,68719476736,4095,1,1,15,368,8962,0,0), +(5010,68719476736,4063,0,2,0,361,8966,0,0), +(5011,68719476736,4063,0,2,2,361,8968,0,0), +(5012,68719476736,4063,0,2,1,361,8967,0,0), +(5013,68719476736,4063,0,2,4,361,8970,0,0), +(5014,68719476736,4063,0,2,3,361,8969,0,0), +(5015,68719476736,4063,1,2,0,369,8980,0,0), +(5016,68719476736,4063,1,2,1,369,8981,0,0), +(5017,68719476736,4063,1,2,2,369,8982,0,0), +(5018,68719476736,4063,1,2,3,369,8983,0,0), +(5019,68719476736,4063,1,2,4,369,8984,0,0), +(5020,68719476736,4063,1,2,5,369,8985,0,0), +(5021,68719476736,4095,0,1,0,797,8997,0,0), +(5022,68719476736,4095,0,1,1,797,8997,0,0), +(5023,68719476736,4095,0,1,2,797,8997,0,0), +(5024,68719476736,4095,0,1,3,797,8997,0,0), +(5025,68719476736,4095,0,1,4,797,8997,0,0), +(5026,68719476736,4095,0,1,5,797,8999,0,0), +(5027,68719476736,4095,0,1,6,797,8999,0,0), +(5028,68719476736,4095,0,1,7,797,8999,0,0), +(5029,68719476736,4095,0,1,8,797,8999,0,0), +(5030,68719476736,4095,0,1,9,797,8999,0,0), +(5031,68719476736,4095,0,1,10,797,8998,0,0), +(5032,68719476736,4095,0,1,11,797,8998,0,0), +(5033,68719476736,4095,0,1,12,797,8998,0,0), +(5034,68719476736,4095,0,1,13,797,8998,0,0), +(5035,68719476736,4095,0,1,14,797,8998,0,0), +(5037,68719476736,4095,1,1,0,799,9003,0,0), +(5038,68719476736,4095,1,1,1,799,9003,0,0), +(5039,68719476736,4095,1,1,2,799,9003,0,0), +(5040,68719476736,4095,1,1,3,799,9003,0,0), +(5041,68719476736,4095,1,1,4,799,9003,0,0), +(5042,68719476736,4095,1,1,5,799,9005,0,0), +(5043,68719476736,4095,1,1,6,799,9005,0,0), +(5044,68719476736,4095,1,1,7,799,9005,0,0), +(5045,68719476736,4095,1,1,8,799,9005,0,0), +(5046,68719476736,4095,1,1,9,799,9005,0,0), +(5047,68719476736,4095,1,1,10,799,9004,0,0), +(5048,68719476736,4095,1,1,11,799,9004,0,0), +(5049,68719476736,4095,1,1,12,799,9004,0,0), +(5050,68719476736,4095,1,1,13,799,9004,0,0), +(5051,68719476736,4095,1,1,14,799,9004,0,0), +(5059,32,4095,0,5,0,803,9017,0,0), +(5060,32,4095,0,5,1,803,9017,0,0), +(5061,32,4095,0,5,2,803,9017,0,0), +(5062,32,4095,0,5,3,803,9017,0,0), +(5063,32,4095,0,5,4,803,9017,0,0), +(5064,32,4095,0,5,5,803,9017,0,0), +(5065,32,4095,0,5,6,803,9017,0,0), +(5066,32,4095,1,5,0,805,9019,0,0), +(5067,32,4095,1,5,2,805,9019,0,0), +(5068,32,4095,1,5,1,805,9019,0,0), +(5069,32,4095,1,5,3,805,9019,0,0), +(5070,32,4095,1,5,4,805,9019,0,0), +(5071,536870912,4095,0,5,0,848,9494,0,0), +(5072,536870912,4095,0,5,1,848,9494,0,0), +(5073,536870912,4095,0,5,2,848,9496,0,0), +(5074,536870912,4095,0,5,3,848,9497,0,0), +(5075,536870912,4095,0,5,4,848,9494,0,0), +(5076,536870912,4095,0,5,5,848,9498,0,0), +(5077,536870912,4095,0,5,6,848,9495,0,0), +(5078,536870912,4095,0,5,7,848,9500,0,0), +(5079,536870912,4095,0,5,8,848,9499,0,0), +(5080,536870912,4095,0,5,0,849,9502,0,0), +(5081,536870912,4095,0,5,1,849,9502,0,0), +(5082,536870912,4095,0,5,2,849,9502,0,0), +(5083,536870912,4095,0,5,3,849,9502,0,0), +(5084,536870912,4095,0,5,4,849,9502,0,0), +(5085,536870912,4095,0,5,5,849,9502,0,0), +(5086,536870912,4095,0,5,6,849,9502,0,0), +(5087,536870912,4095,0,5,7,849,9502,0,0), +(5088,536870912,4095,0,5,8,849,9502,0,0), +(5089,17179869184,4095,0,5,0,854,9582,0,0), +(5090,17179869184,4095,0,5,2,854,9582,0,0), +(5091,17179869184,4095,0,5,4,854,9582,0,0), +(5092,17179869184,4095,0,5,6,854,9582,0,0), +(5093,17179869184,4095,0,5,8,854,9582,0,0), +(5094,17179869184,4095,0,5,10,854,9582,0,0), +(5095,17179869184,4095,0,5,1,854,9581,0,0), +(5096,17179869184,4095,0,5,3,854,9581,0,0), +(5097,17179869184,4095,0,5,5,854,9581,0,0), +(5098,17179869184,4095,0,5,7,854,9581,0,0), +(5099,17179869184,4095,0,5,9,854,9581,0,0), +(5100,17179869184,4095,0,5,11,854,9581,0,0), +(5101,17179869184,4095,1,5,0,855,9584,0,0), +(5102,17179869184,4095,1,5,2,855,9584,0,0), +(5103,17179869184,4095,1,5,4,855,9584,0,0), +(5104,17179869184,4095,1,5,6,855,9584,0,0), +(5105,17179869184,4095,1,5,8,855,9584,0,0), +(5106,17179869184,4095,1,5,10,855,9584,0,0), +(5107,17179869184,4095,1,5,12,855,9584,0,0), +(5108,17179869184,4095,1,5,14,855,9584,0,0), +(5109,17179869184,4095,1,5,1,855,9583,0,0), +(5110,17179869184,4095,1,5,3,855,9583,0,0), +(5111,17179869184,4095,1,5,5,855,9583,0,0), +(5112,17179869184,4095,1,5,7,855,9583,0,0), +(5113,17179869184,4095,1,5,9,855,9583,0,0), +(5114,17179869184,4095,1,5,11,855,9583,0,0), +(5115,17179869184,4095,1,5,13,855,9583,0,0), +(5116,17179869184,4095,1,5,15,855,9583,0,0), +(5117,134217728,4063,0,2,0,862,9616,0,0), +(5118,134217728,4063,0,2,1,862,9616,0,0), +(5119,134217728,4063,0,2,2,862,9616,0,0), +(5120,134217728,4063,0,2,3,862,9616,0,0), +(5121,134217728,4063,0,2,4,862,9616,0,0), +(5122,134217728,4063,1,2,0,863,9624,0,0), +(5123,134217728,4063,1,2,1,863,9624,0,0), +(5124,134217728,4063,1,2,2,863,9624,0,0), +(5125,134217728,4063,1,2,3,863,9624,0,0), +(5126,134217728,4095,0,6,1,394,2783,0,0), +(5127,134217728,4095,0,6,2,394,2783,0,0), +(5128,134217728,4095,0,6,3,394,2783,0,0), +(5129,134217728,4095,0,6,4,394,2786,0,0), +(5130,134217728,4095,0,6,5,394,2786,0,0), +(5131,134217728,4095,0,6,6,394,2786,0,0), +(5132,134217728,4095,0,6,7,394,2788,0,0), +(5133,134217728,4095,0,6,8,394,2788,0,0), +(5134,134217728,4095,0,6,9,394,2788,0,0), +(5135,134217728,4095,1,6,1,397,2815,0,0), +(5136,134217728,4095,1,6,2,397,2815,0,0), +(5137,134217728,4095,1,6,3,397,2815,0,0), +(5138,134217728,4095,1,6,4,397,2818,0,0), +(5139,134217728,4095,1,6,5,397,2818,0,0), +(5140,134217728,4095,1,6,6,397,2818,0,0), +(5141,134217728,4095,1,6,7,397,2821,0,0), +(5142,134217728,4095,1,6,8,397,2821,0,0), +(5143,134217728,4095,1,6,9,397,2821,0,0), +(5144,1073741824,4063,0,2,0,869,9655,0,0), +(5145,1073741824,4063,0,2,1,869,9655,0,0), +(5146,1073741824,4063,0,2,2,869,9655,0,0), +(5147,1073741824,4063,0,2,3,869,9655,0,0), +(5148,1073741824,4063,0,2,4,869,9655,0,0), +(5149,1073741824,4063,0,2,5,869,9655,0,0), +(5150,1073741824,4063,1,2,0,870,9663,0,0), +(5151,1073741824,4063,1,2,1,870,9663,0,0), +(5152,1073741824,4063,1,2,2,870,9663,0,0), +(5153,1073741824,4063,1,2,3,870,9663,0,0), +(5154,1073741824,4063,1,2,4,870,9663,0,0), +(5155,1073741824,4063,1,2,5,870,9663,0,0), +(5156,1073741824,4095,1,5,0,871,9673,0,0), +(5157,1073741824,4095,1,5,1,871,3081,0,0), +(5158,1073741824,4095,1,5,2,871,9673,0,0), +(5159,1073741824,4095,1,5,3,871,9673,0,0), +(5160,1073741824,4095,1,5,4,871,9673,0,0), +(5161,1073741824,4095,1,5,5,871,9673,0,0), +(5162,1073741824,4095,1,5,0,872,9674,0,0), +(5163,1073741824,4095,1,5,1,872,9674,0,0), +(5164,1073741824,4095,1,5,2,872,3082,0,0), +(5165,1073741824,4095,1,5,3,872,3083,0,0), +(5166,1073741824,4095,1,5,4,872,3084,0,0), +(5167,1073741824,4095,1,5,5,872,9674,0,0), +(5168,1073741824,4095,0,8,0,873,9682,0,0), +(5169,1073741824,4095,0,8,1,873,9683,0,0), +(5170,1073741824,4095,0,8,2,873,9683,0,0), +(5171,1073741824,4095,0,8,3,873,9684,0,0), +(5172,1073741824,4095,0,8,4,873,9684,0,0), +(5173,1073741824,4095,0,8,5,873,9682,0,0), +(5174,2,4095,0,5,0,836,9428,0,0), +(5175,2,4095,0,5,1,836,9428,0,0), +(5176,2,4095,0,5,2,836,9428,0,0), +(5177,2,4095,0,5,3,836,9428,0,0), +(5178,2,4095,0,5,4,836,9428,0,0), +(5179,2,4095,0,5,5,836,9428,0,0), +(5180,2,4095,0,5,6,836,9428,0,0), +(5181,2,4095,0,5,7,836,9428,0,0), +(5182,2,4095,0,5,8,836,9428,0,0), +(5183,2,4095,0,5,9,836,9428,0,0), +(5184,2,4095,0,5,10,836,9428,0,0), +(5185,2,4095,0,5,0,874,9804,0,0), +(5186,2,4095,0,5,1,874,9804,0,0), +(5187,2,4095,0,5,2,874,9804,0,0), +(5188,2,4095,0,5,3,874,9804,0,0), +(5189,2,4095,0,5,4,874,9804,0,0), +(5190,2,4095,0,5,5,874,9804,0,0), +(5191,2,4095,0,5,6,874,9804,0,0), +(5192,2,4095,0,5,7,874,9804,0,0), +(5193,2,4095,0,5,8,874,9804,0,0), +(5194,2,4095,0,5,9,874,9804,0,0), +(5195,2,4095,0,5,10,874,9804,0,0), +(5214,2,4095,1,5,0,841,9471,0,0), +(5215,2,4095,1,5,1,841,9471,0,0), +(5216,2,4095,1,5,2,841,9471,0,0), +(5217,2,4095,1,5,3,841,9471,0,0), +(5218,2,4095,1,5,4,841,9471,0,0), +(5219,2,4095,1,5,5,841,9471,0,0), +(5220,2,4095,1,5,6,841,9471,0,0), +(5221,2,4095,0,5,0,876,9816,0,0), +(5222,2,4095,0,5,1,876,9816,0,0), +(5223,2,4095,0,5,2,876,9821,0,0), +(5224,2,4095,0,5,3,876,9817,0,0), +(5225,2,4095,0,5,4,876,9822,0,0), +(5226,2,4095,0,5,5,876,9816,0,0), +(5227,2,4095,0,5,6,876,9816,0,0), +(5228,2,4095,0,5,7,876,9823,0,0), +(5229,2,4095,0,5,8,876,9816,0,0), +(5230,2,4095,0,5,9,876,9820,0,0), +(5231,2,4095,0,5,10,876,9821,0,0), +(5232,34359738368,4063,0,1,0,880,9846,0,0), +(5233,34359738368,4063,0,1,1,880,9849,0,0), +(5234,34359738368,4063,0,1,2,880,9849,0,0), +(5235,34359738368,4063,0,1,3,880,9849,0,0), +(5236,34359738368,4063,0,1,4,880,9851,0,0), +(5237,34359738368,4063,0,1,5,880,9851,0,0), +(5238,34359738368,4063,0,1,6,880,9851,0,0), +(5239,34359738368,4063,0,1,7,880,9853,0,0), +(5240,34359738368,4063,0,1,8,880,9853,0,0), +(5241,34359738368,4063,0,1,9,880,9853,0,0), +(5242,34359738368,4095,0,1,10,880,9864,0,0), +(5243,34359738368,4063,1,1,0,881,9855,0,0), +(5244,34359738368,4063,1,1,1,881,9857,0,0), +(5245,34359738368,4063,1,1,2,881,9857,0,0), +(5246,34359738368,4063,1,1,3,881,9857,0,0), +(5247,34359738368,4063,1,1,4,881,9859,0,0), +(5248,34359738368,4063,1,1,5,881,9859,0,0), +(5249,34359738368,4063,1,1,6,881,9859,0,0), +(5250,34359738368,4063,1,1,7,881,9861,0,0), +(5251,34359738368,4063,1,1,8,881,9861,0,0), +(5252,34359738368,4063,1,1,9,881,9861,0,0), +(5253,34359738368,4095,1,1,10,881,9865,0,0), +(5254,34359738368,4095,1,1,11,881,9866,0,0), +(5255,2,4063,0,2,0,824,9269,0,0), +(5256,2,4063,0,2,1,824,9269,0,0), +(5257,2,4063,0,2,2,824,9266,0,0), +(5258,2,4063,0,2,3,824,9267,0,0), +(5259,2,4063,0,2,4,824,9271,0,0), +(5260,2,4063,0,2,5,824,9268,0,0), +(5261,2,4063,0,2,6,824,9269,0,0), +(5262,2,4063,0,2,7,824,9269,0,0), +(5263,2,4063,0,2,8,824,9266,0,0), +(5264,2,32,0,2,9,824,9289,0,0), +(5265,2,32,0,2,10,824,9289,0,0), +(5266,2,32,0,2,11,824,9289,0,0), +(5267,2,32,0,2,12,824,9289,0,0), +(5268,2,32,0,2,13,824,9289,0,0), +(5269,2,32,0,2,14,824,9289,0,0), +(5270,2,32,0,2,15,824,9289,0,0), +(5271,2,32,0,2,16,824,9289,0,0), +(5272,2,32,0,2,17,824,9289,0,0), +(5273,2,32,1,2,17,825,9313,0,0), +(5274,2,32,1,2,16,825,9313,0,0), +(5275,2,32,1,2,15,825,9313,0,0), +(5276,2,32,1,2,14,825,9313,0,0), +(5277,2,32,1,2,13,825,9313,0,0), +(5278,2,32,1,2,12,825,9313,0,0), +(5279,2,32,1,2,11,825,9313,0,0), +(5280,2,32,1,2,10,825,9313,0,0), +(5281,2,32,1,2,9,825,9313,0,0), +(5282,2,4063,1,2,8,825,9298,0,0), +(5283,2,4063,1,2,7,825,15781,0,0), +(5284,2,4063,1,2,6,825,15780,0,0), +(5285,2,4063,1,2,5,825,9300,0,0), +(5286,2,4063,1,2,4,825,9298,0,0), +(5287,2,4063,1,2,3,825,9300,0,0), +(5288,2,4063,1,2,2,825,15779,0,0), +(5289,2,4063,1,2,1,825,15778,0,0), +(5290,2,4063,1,2,0,825,9297,0,0), +(5291,34359738368,4095,0,5,0,882,9867,0,0), +(5292,34359738368,4095,0,5,1,882,9870,0,0), +(5293,34359738368,4095,0,5,2,882,9871,0,0), +(5294,34359738368,4095,0,5,3,882,9868,0,0), +(5295,34359738368,4095,0,5,4,882,9867,0,0), +(5296,34359738368,4095,0,5,5,882,9869,0,0), +(5297,34359738368,4095,0,5,6,882,9867,0,0), +(5298,34359738368,4095,0,2,0,883,9872,0,0), +(5299,34359738368,4095,0,2,1,883,9872,0,0), +(5300,34359738368,4095,0,2,2,883,9872,0,0), +(5301,34359738368,4095,0,2,3,883,9872,0,0), +(5302,34359738368,4095,0,2,4,883,9872,0,0), +(5303,34359738368,4095,0,2,5,883,9872,0,0), +(5304,34359738368,4095,0,2,6,883,9872,0,0), +(5305,34359738368,4095,0,2,7,883,9872,0,0), +(5306,34359738368,4095,0,2,8,883,9872,0,0), +(5307,34359738368,4095,0,5,0,884,9876,0,0), +(5308,34359738368,4095,0,5,1,884,9876,0,0), +(5309,34359738368,4095,0,5,2,884,9876,0,0), +(5310,34359738368,4095,0,5,3,884,9876,0,0), +(5311,34359738368,4095,0,5,4,884,9876,0,0), +(5312,34359738368,4095,0,5,5,884,9876,0,0), +(5313,34359738368,4095,0,5,6,884,9876,0,0), +(5314,34359738368,4095,0,5,0,885,9882,0,0), +(5315,34359738368,4095,0,5,1,885,9882,0,0), +(5316,34359738368,4095,0,5,2,885,9882,0,0), +(5317,34359738368,4095,0,5,3,885,9882,0,0), +(5318,34359738368,4095,0,5,4,885,9882,0,0), +(5319,34359738368,4095,0,5,5,885,9882,0,0), +(5320,34359738368,4095,0,5,6,885,9882,0,0), +(5321,34359738368,4095,1,5,4,414,3466,0,0), +(5322,34359738368,4095,1,5,5,414,3466,0,0), +(5323,34359738368,4095,1,5,0,887,9902,0,0), +(5324,34359738368,4095,1,5,1,887,9902,0,0), +(5325,34359738368,4095,1,5,2,887,9902,0,0), +(5326,34359738368,4095,1,5,3,887,9902,0,0), +(5327,34359738368,4095,1,5,4,887,9902,0,0), +(5328,34359738368,4095,1,5,0,886,9905,0,0), +(5329,34359738368,4095,1,5,1,886,9905,0,0), +(5330,34359738368,4095,1,5,2,886,9905,0,0), +(5331,34359738368,4095,1,5,3,886,9905,0,0), +(5332,34359738368,4095,1,5,5,886,9905,0,0), +(5333,256,4095,0,5,0,806,9071,0,0), +(5334,256,4095,0,5,1,806,9067,0,0), +(5335,256,4095,0,5,2,806,9068,0,0), +(5336,256,4095,0,5,3,806,9073,0,0), +(5337,256,4095,0,5,4,806,9072,0,0), +(5338,256,4095,0,5,5,806,9071,0,0), +(5339,256,4095,0,5,6,806,9070,0,0), +(5340,256,4095,0,5,7,806,9069,0,0), +(5341,256,4095,0,5,8,806,9068,0,0), +(5342,256,4095,0,5,9,806,9067,0,0), +(5343,256,4095,0,5,10,806,9071,0,0), +(5344,256,4095,0,5,11,806,9067,0,0), +(5345,256,4095,0,5,12,806,9068,0,0), +(5346,256,4095,0,5,13,806,9073,0,0), +(5347,256,4095,0,5,14,806,9072,0,0), +(5348,256,4095,0,5,15,806,9071,0,0), +(5349,256,4095,0,5,16,806,9070,0,0), +(5350,256,4095,0,5,17,806,9069,0,0), +(5351,256,4095,0,5,18,806,9068,0,0), +(5352,256,4095,0,5,19,806,9067,0,0), +(5353,256,4095,0,5,20,806,9071,0,0), +(5354,256,4095,0,5,21,806,9067,0,0), +(5355,256,4095,0,5,22,806,9068,0,0), +(5356,256,4095,0,5,23,806,9073,0,0), +(5357,256,4095,0,5,24,806,9072,0,0), +(5358,256,4095,0,5,0,807,9083,0,0), +(5359,256,4095,0,5,1,807,9082,0,0), +(5360,256,4095,0,5,2,807,9079,0,0), +(5361,256,4095,0,5,3,807,9080,0,0), +(5362,256,4095,0,5,4,807,9079,0,0), +(5363,256,4095,0,5,5,807,9082,0,0), +(5364,256,4095,0,5,6,807,9081,0,0), +(5365,256,4095,0,5,7,807,9080,0,0), +(5366,256,4095,0,5,8,807,9079,0,0), +(5367,256,4095,0,5,9,807,9082,0,0), +(5368,256,4095,0,5,10,807,9081,0,0), +(5369,256,4095,0,5,11,807,9080,0,0), +(5370,256,4095,0,5,12,807,9082,0,0), +(5371,256,4095,0,5,13,807,9083,0,0), +(5372,256,4095,0,5,14,807,9082,0,0), +(5373,256,4095,0,5,15,807,9081,0,0), +(5374,256,4095,0,5,16,807,9080,0,0), +(5375,256,4095,0,5,17,807,9081,0,0), +(5376,256,4095,0,5,18,807,9083,0,0), +(5377,256,4095,0,5,19,807,9082,0,0), +(5378,256,4095,0,5,20,807,9081,0,0), +(5379,256,4095,0,5,21,807,9079,0,0), +(5380,256,4095,0,5,22,807,9080,0,0), +(5381,256,4095,0,5,23,807,9082,0,0), +(5382,256,4095,0,5,24,807,9079,0,0), +(5383,256,4095,0,5,0,815,9153,0,0), +(5384,256,4095,0,5,1,815,9153,0,0), +(5385,256,4095,0,5,2,815,9153,0,0), +(5386,256,4095,0,5,3,815,9153,0,0), +(5387,256,4095,0,5,4,815,9153,0,0), +(5388,256,4095,0,5,5,815,9153,0,0), +(5389,256,4095,0,5,6,815,9153,0,0), +(5390,256,4095,0,5,7,815,9154,0,0), +(5391,256,4095,0,5,8,815,9155,0,0), +(5392,256,4095,0,5,9,815,9156,0,0), +(5393,256,4095,0,5,10,815,9157,0,0), +(5394,256,4095,0,5,11,815,9158,0,0), +(5395,256,4095,0,5,12,815,9153,0,0), +(5396,256,4095,0,5,13,815,9153,0,0), +(5397,256,4095,0,5,14,815,9153,0,0), +(5398,256,4095,0,5,15,815,9153,0,0), +(5399,256,4095,0,5,16,815,9153,0,0), +(5400,256,4095,0,5,17,815,9153,0,0), +(5401,256,4095,0,5,18,815,9153,0,0), +(5402,256,4095,0,5,19,815,9154,0,0), +(5403,256,4095,0,5,20,815,9155,0,0), +(5404,256,4095,0,5,21,815,9156,0,0), +(5405,256,4095,0,5,22,815,9157,0,0), +(5406,256,4095,0,5,23,815,9158,0,0), +(5407,256,4095,0,5,24,815,9158,0,0), +(5408,256,4095,0,5,0,817,9169,0,0), +(5409,256,4095,0,5,1,817,9168,0,0), +(5410,256,4095,0,5,2,817,9167,0,0), +(5411,256,4095,0,5,3,817,9166,0,0), +(5412,256,4095,0,5,4,817,9166,0,0), +(5413,256,4095,0,5,5,817,9166,0,0), +(5414,256,4095,0,5,6,817,9166,0,0), +(5415,256,4095,0,5,7,817,9166,0,0), +(5416,256,4095,0,5,8,817,9166,0,0), +(5417,256,4095,0,5,9,817,9166,0,0), +(5418,256,4095,0,5,10,817,9169,0,0), +(5419,256,4095,0,5,11,817,9168,0,0), +(5420,256,4095,0,5,12,817,9167,0,0), +(5421,256,4095,0,5,13,817,9166,0,0), +(5422,256,4095,0,5,14,817,9166,0,0), +(5423,256,4095,0,5,15,817,9166,0,0), +(5424,256,4095,0,5,16,817,9166,0,0), +(5425,256,4095,0,5,17,817,9166,0,0), +(5426,256,4095,0,5,18,817,9166,0,0), +(5427,256,4095,0,5,19,817,9166,0,0), +(5428,256,4095,0,5,20,817,9169,0,0), +(5429,256,4095,0,5,21,817,9168,0,0), +(5430,256,4095,0,5,22,817,9167,0,0), +(5431,256,4095,0,5,23,817,9166,0,0), +(5432,256,4095,0,5,24,817,9166,0,0), +(5458,256,4095,1,5,0,808,9093,0,0), +(5459,256,4095,1,5,1,808,9093,0,0), +(5460,256,4095,1,5,2,808,9093,0,0), +(5461,256,4095,1,5,3,808,9092,0,0), +(5462,256,4095,1,5,4,808,9091,0,0), +(5463,256,4095,1,5,5,808,9095,0,0), +(5464,256,4095,1,5,6,808,9094,0,0), +(5465,256,4095,1,5,7,808,9093,0,0), +(5466,256,4095,1,5,8,808,9092,0,0), +(5467,256,4095,1,5,9,808,9091,0,0), +(5468,256,4095,1,5,10,808,9093,0,0), +(5469,256,4095,1,5,11,808,9093,0,0), +(5470,256,4095,1,5,12,808,9093,0,0), +(5471,256,4095,1,5,13,808,9092,0,0), +(5472,256,4095,1,5,14,808,9091,0,0), +(5473,256,4095,1,5,15,808,9095,0,0), +(5474,256,4095,1,5,16,808,9094,0,0), +(5475,256,4095,1,5,17,808,9093,0,0), +(5476,256,4095,1,5,18,808,9092,0,0), +(5477,256,4095,1,5,19,808,9091,0,0), +(5478,256,4095,1,5,20,808,9093,0,0), +(5479,256,4095,1,5,21,808,9093,0,0), +(5480,256,4095,1,5,22,808,9093,0,0), +(5481,256,4095,1,5,23,808,9092,0,0), +(5482,256,4095,1,5,24,808,9095,0,0), +(5483,256,4095,1,5,0,809,9104,0,0), +(5484,256,4095,1,5,1,809,9103,0,0), +(5485,256,4095,1,5,2,809,9100,0,0), +(5486,256,4095,1,5,3,809,9101,0,0), +(5487,256,4095,1,5,4,809,9100,0,0), +(5488,256,4095,1,5,5,809,9103,0,0), +(5489,256,4095,1,5,6,809,9102,0,0), +(5490,256,4095,1,5,7,809,9101,0,0), +(5491,256,4095,1,5,8,809,9100,0,0), +(5492,256,4095,1,5,9,809,9103,0,0), +(5493,256,4095,1,5,10,809,9102,0,0), +(5494,256,4095,1,5,11,809,9101,0,0), +(5495,256,4095,1,5,12,809,9103,0,0), +(5496,256,4095,1,5,13,809,9104,0,0), +(5497,256,4095,1,5,14,809,9103,0,0), +(5498,256,4095,1,5,15,809,9102,0,0), +(5499,256,4095,1,5,16,809,9101,0,0), +(5500,256,4095,1,5,17,809,9102,0,0), +(5501,256,4095,1,5,18,809,9104,0,0), +(5502,256,4095,1,5,19,809,9103,0,0), +(5503,256,4095,1,5,20,809,9102,0,0), +(5504,256,4095,1,5,21,809,9100,0,0), +(5505,256,4095,1,5,22,809,9101,0,0), +(5506,256,4095,1,5,23,809,9103,0,0), +(5507,256,4095,1,5,24,809,9104,0,0), +(5508,256,4095,1,5,0,813,9144,0,0), +(5509,256,4095,1,5,1,813,9143,0,0), +(5510,256,4095,1,5,2,813,9142,0,0), +(5511,256,4095,1,5,3,813,9141,0,0), +(5512,256,4095,1,5,4,813,9140,0,0), +(5513,256,4095,1,5,5,813,9139,0,0), +(5514,256,4095,1,5,6,813,9138,0,0), +(5515,256,4095,1,5,7,813,9138,0,0), +(5516,256,4095,1,5,8,813,9138,0,0), +(5517,256,4095,1,5,9,813,9138,0,0), +(5518,256,4095,1,5,10,813,9144,0,0), +(5519,256,4095,1,5,11,813,9143,0,0), +(5520,256,4095,1,5,12,813,9142,0,0), +(5521,256,4095,1,5,13,813,9141,0,0), +(5522,256,4095,1,5,14,813,9140,0,0), +(5523,256,4095,1,5,15,813,9139,0,0), +(5524,256,4095,1,5,16,813,9138,0,0), +(5525,256,4095,1,5,17,813,9138,0,0), +(5526,256,4095,1,5,18,813,9138,0,0), +(5527,256,4095,1,5,19,813,9138,0,0), +(5528,256,4095,1,5,20,813,9144,0,0), +(5529,256,4095,1,5,21,813,9143,0,0), +(5530,256,4095,1,5,22,813,9142,0,0), +(5531,256,4095,1,5,23,813,9141,0,0), +(5532,256,4095,1,5,24,813,9139,0,0), +(5533,256,4095,1,4,0,821,9195,0,0), +(5534,256,4095,1,4,1,821,9195,0,0), +(5535,256,4095,1,4,2,821,9195,0,0), +(5536,256,4095,1,4,3,821,9198,0,0), +(5537,256,4095,1,4,4,821,9199,0,0), +(5538,256,4095,1,4,5,821,9200,0,0), +(5539,256,4095,1,4,6,821,9201,0,0), +(5540,256,4095,1,4,7,821,9201,0,0), +(5541,256,4095,1,4,8,821,9196,0,0), +(5542,256,4095,1,4,9,821,9200,0,0), +(5543,256,4095,1,4,10,821,9197,0,0), +(5544,256,4095,1,4,11,821,9198,0,0), +(5545,256,4095,1,4,12,821,9199,0,0), +(5558,16,4095,0,1,0,567,6527,0,0), +(5559,16,4095,0,1,1,567,6527,0,0), +(5560,16,4095,0,1,2,567,6527,0,0), +(5561,16,4095,0,1,3,567,6527,0,0), +(5562,16,4095,0,1,4,567,6527,0,0), +(5563,16,4095,0,1,5,567,6527,0,0), +(5564,16,4095,0,1,6,567,6527,0,0), +(5565,16,4095,1,1,0,568,6524,0,0), +(5566,16,4095,1,1,1,568,6524,0,0), +(5567,16,4095,1,1,2,568,6524,0,0), +(5568,16,4095,1,1,3,568,6524,0,0), +(5569,16,4095,1,1,4,568,6524,0,0), +(5570,16,4095,1,1,5,568,6524,0,0), +(5571,16,4095,1,1,6,568,6524,0,0), +(5573,64,4095,1,5,1,786,8796,0,0), +(5574,64,4095,1,5,2,786,8796,0,0), +(5575,64,4095,1,5,3,786,8796,0,0), +(5576,64,4095,1,5,4,786,8796,0,0), +(5577,64,4095,1,5,5,786,8796,0,0), +(5578,64,4095,1,5,6,786,8796,0,0), +(5579,1024,4095,1,5,0,697,7764,0,0), +(5580,1024,4095,1,5,1,697,7764,0,0), +(5581,1024,4095,1,5,2,697,7764,0,0), +(5582,1024,4095,1,5,3,697,7764,0,0), +(5583,1024,4095,1,5,4,697,7764,0,0), +(5584,1024,4095,1,5,5,697,7764,0,0), +(5585,1024,4095,1,5,6,697,7764,0,0), +(5586,1024,4095,1,5,7,697,7764,0,0), +(5605,6291456,4095,0,5,8,890,9925,0,0), +(5606,6291456,4095,0,5,7,890,9925,0,0), +(5607,6291456,4095,0,5,6,890,9925,0,0), +(5608,6291456,4095,0,5,5,890,9925,0,0), +(5609,6291456,4095,0,5,4,890,9925,0,0), +(5610,6291456,4095,0,5,3,890,9925,0,0), +(5611,6291456,4095,0,5,2,890,9925,0,0), +(5612,6291456,4095,0,5,1,890,9925,0,0), +(5613,6291456,4095,0,5,0,890,9925,0,0), +(5614,1,4095,0,5,8,890,9925,0,0), +(5615,1,4095,0,5,7,890,9925,0,0), +(5616,1,4095,0,5,6,890,9925,0,0), +(5617,1,4095,0,5,5,890,9925,0,0), +(5618,1,4095,0,5,4,890,9925,0,0), +(5619,1,4095,0,5,3,890,9925,0,0), +(5620,1,4095,0,5,2,890,9925,0,0), +(5621,1,4095,0,5,1,890,9925,0,0), +(5622,1,4095,0,5,0,890,9925,0,0), +(5623,1,4095,0,5,0,888,9912,0,0), +(5624,1,4095,0,5,0,889,9914,0,0), +(5625,1,4095,0,5,1,888,9907,0,0), +(5626,1,4095,0,5,1,889,9913,0,0), +(5627,1,4095,0,5,2,888,9912,0,0), +(5628,1,4095,0,5,2,889,9913,0,0), +(5629,1,4095,0,5,3,888,9906,0,0), +(5630,1,4095,0,5,3,889,9914,0,0), +(5631,1,4095,0,5,4,888,9912,0,0), +(5632,1,4095,0,5,4,889,9929,0,0), +(5633,1,4095,0,5,5,888,9911,0,0), +(5634,1,4095,0,5,5,889,9929,0,0), +(5635,1,4095,0,5,6,888,9912,0,0), +(5636,1,4095,0,5,6,889,9913,0,0), +(5637,1,4095,0,5,7,888,9907,0,0), +(5638,1,4095,0,5,7,889,9913,0,0), +(5639,1,4095,0,5,8,888,9906,0,0), +(5640,1,4095,0,5,8,889,9913,0,0), +(5641,6291456,4095,0,5,0,888,9912,0,0), +(5642,6291456,4095,0,5,1,888,9907,0,0), +(5643,6291456,4095,0,5,2,888,9912,0,0), +(5644,6291456,4095,0,5,3,888,9906,0,0), +(5645,6291456,4095,0,5,4,888,9912,0,0), +(5646,6291456,4095,0,5,5,888,9911,0,0), +(5647,6291456,4095,0,5,6,888,9912,0,0), +(5648,6291456,4095,0,5,7,888,9907,0,0), +(5649,6291456,4095,0,5,8,888,9906,0,0), +(5650,6291456,4095,0,5,0,889,9914,0,0), +(5651,6291456,4095,0,5,1,889,9913,0,0), +(5652,6291456,4095,0,5,2,889,9913,0,0), +(5653,6291456,4095,0,5,3,889,9914,0,0), +(5654,6291456,4095,0,5,4,889,9914,0,0), +(5655,6291456,4095,0,5,5,889,9914,0,0), +(5656,6291456,4095,0,5,6,889,9913,0,0), +(5657,6291456,4095,0,5,7,889,9913,0,0), +(5658,6291456,4095,0,5,8,889,9913,0,0), +(5659,512,4095,1,5,21,891,9932,0,0), +(5660,512,4095,1,5,20,891,9932,0,0), +(5661,512,4095,1,5,19,891,9932,0,0), +(5662,512,4095,1,5,18,891,9932,0,0), +(5663,512,4095,1,5,17,891,9932,0,0), +(5664,512,4095,1,5,16,891,9932,0,0), +(5665,512,4095,1,5,15,891,9932,0,0), +(5666,512,4095,1,5,14,891,9932,0,0), +(5667,512,4095,1,5,13,891,9932,0,0), +(5668,512,4095,1,5,12,891,9932,0,0), +(5669,512,4095,1,5,11,891,9932,0,0), +(5670,512,4095,1,5,10,891,9932,0,0), +(5671,512,4095,1,5,9,891,9932,0,0), +(5672,512,4095,1,5,8,891,9932,0,0), +(5673,512,4095,1,5,7,891,9932,0,0), +(5674,512,4095,1,5,6,891,9932,0,0), +(5675,512,4095,1,5,5,891,9932,0,0), +(5676,512,4095,1,5,4,891,9932,0,0), +(5677,512,4095,1,5,3,891,9932,0,0), +(5678,512,4095,1,5,2,891,9932,0,0), +(5679,512,4095,1,5,1,891,9932,0,0), +(5680,512,4095,1,5,0,891,9932,0,0), +(5681,512,4095,1,5,21,575,6619,0,0), +(5682,512,4095,1,5,20,575,6619,0,0), +(5683,512,4095,1,5,19,575,6619,0,0), +(5684,512,4095,1,5,18,575,6619,0,0), +(5685,512,4095,1,5,17,575,6619,0,0), +(5686,512,4095,1,5,16,575,6619,0,0), +(5687,512,4095,1,5,15,575,6619,0,0), +(5688,512,4095,1,5,14,575,6619,0,0), +(5689,512,4095,1,5,13,575,6619,0,0), +(5690,512,4095,1,5,12,575,6619,0,0), +(5691,512,4095,1,5,11,575,6619,0,0), +(5692,512,4095,1,5,10,575,6619,0,0), +(5693,512,4095,1,5,9,575,6619,0,0), +(5694,512,4095,1,5,8,575,6619,0,0), +(5695,512,4095,1,5,7,575,6619,0,0), +(5696,512,4095,1,5,6,575,6619,0,0), +(5697,512,4095,1,5,5,575,6619,0,0), +(5698,512,4095,1,5,4,575,6619,0,0), +(5699,512,4095,1,5,3,575,6619,0,0), +(5700,512,4095,1,5,2,575,6619,0,0), +(5701,512,4095,1,5,1,575,6619,0,0), +(5702,512,4095,1,5,0,575,6619,0,0), +(5703,512,4095,1,5,21,776,8619,0,0), +(5704,512,4095,1,5,20,776,8619,0,0), +(5705,512,4095,1,5,19,776,8619,0,0), +(5706,512,4095,1,5,18,776,8619,0,0), +(5707,512,4095,1,5,17,776,8619,0,0), +(5708,512,4095,1,5,16,776,8619,0,0), +(5709,512,4095,1,5,15,776,8619,0,0), +(5710,512,4095,1,5,14,776,8619,0,0), +(5711,512,4095,1,5,13,776,8619,0,0), +(5712,512,4095,1,5,12,776,8619,0,0), +(5713,512,4095,1,5,11,776,8619,0,0), +(5714,512,4095,1,5,10,776,8619,0,0), +(5715,512,4095,1,5,9,776,8619,0,0), +(5716,512,4095,1,5,8,776,8619,0,0), +(5717,512,4095,1,5,7,776,8619,0,0), +(5718,512,4095,1,5,6,776,8619,0,0), +(5719,512,4095,1,5,5,776,8619,0,0), +(5720,512,4095,1,5,4,776,8619,0,0), +(5721,512,4095,1,5,3,776,8619,0,0), +(5722,512,4095,1,5,2,776,8619,0,0), +(5723,512,4095,1,5,1,776,8619,0,0), +(5724,512,4095,1,5,0,776,8619,0,0), +(5725,512,4095,1,5,21,631,7192,0,0), +(5726,512,4095,1,5,20,631,7192,0,0), +(5727,512,4095,1,5,19,631,7192,0,0), +(5728,512,4095,1,5,18,631,7192,0,0), +(5729,512,4095,1,5,17,631,7192,0,0), +(5730,512,4095,1,5,16,631,7192,0,0), +(5731,512,4095,1,5,15,631,7192,0,0), +(5732,512,4095,1,5,14,631,7192,0,0), +(5733,512,4095,1,5,13,631,7192,0,0), +(5734,512,4095,1,5,12,631,7192,0,0), +(5735,512,4095,1,5,11,631,7192,0,0), +(5736,512,4095,1,5,10,631,7192,0,0), +(5737,512,4095,1,5,9,631,7192,0,0), +(5738,512,4095,1,5,8,631,7192,0,0), +(5739,512,4095,1,5,7,631,7192,0,0), +(5740,512,4095,1,5,6,631,7192,0,0), +(5741,512,4095,1,5,5,631,7192,0,0), +(5742,512,4095,1,5,4,631,7192,0,0), +(5743,512,4095,1,5,3,631,7192,0,0), +(5744,512,4095,1,5,2,631,7192,0,0), +(5745,512,4095,1,5,1,631,7192,0,0), +(5746,512,4095,1,5,0,631,7192,0,0), +(5747,32,4095,0,5,0,801,9014,0,0), +(5748,32,4095,0,5,1,801,9014,0,0), +(5749,32,4095,0,5,2,801,9014,0,0), +(5750,32,4095,0,5,3,801,9014,0,0), +(5751,32,4095,0,5,4,801,9014,0,0), +(5752,32,4095,0,5,5,801,9014,0,0), +(5753,32,4095,0,5,6,801,9014,0,0), +(5754,32,4095,1,5,0,842,9477,0,0), +(5755,32,4095,1,5,1,842,9477,0,0), +(5756,32,4095,1,5,2,842,9477,0,0), +(5757,32,4095,1,5,3,842,9477,0,0), +(5758,32,4095,1,5,4,842,9477,0,0), +(5759,32,4095,1,5,0,655,7322,0,0), +(5760,32,4095,1,5,1,655,7322,0,0), +(5761,32,4095,1,5,2,655,7322,0,0), +(5762,32,4095,1,5,3,655,7322,0,0), +(5763,32,4095,1,5,4,655,7322,0,0), +(5764,32,4095,0,5,0,657,7328,0,0), +(5765,32,4095,0,5,1,657,7328,0,0), +(5766,32,4095,0,5,2,657,7328,0,0), +(5767,32,4095,0,5,3,657,7328,0,0), +(5768,32,4095,0,5,4,657,7328,0,0), +(5769,32,4095,0,5,5,657,7328,0,0), +(5770,32,4095,0,5,6,657,7328,0,0), +(5771,32,4095,0,5,0,653,7316,0,0), +(5772,32,4095,0,5,1,653,7316,0,0), +(5773,32,4095,0,5,2,653,7316,0,0), +(5774,32,4095,0,5,3,653,7316,0,0), +(5775,32,4095,0,5,4,653,7316,0,0), +(5776,32,4095,0,5,5,653,7316,0,0), +(5777,32,4095,0,5,6,653,7316,0,0), +(5785,32,4095,1,5,0,651,7309,0,0), +(5786,32,4095,1,5,1,651,7309,0,0), +(5787,32,4095,1,5,2,651,7309,0,0), +(5788,32,4095,1,5,3,651,7309,0,0), +(5789,32,4095,1,5,4,651,7309,0,0), +(5790,32,4095,1,5,0,659,7334,0,0), +(5791,32,4095,1,5,1,659,7334,0,0), +(5792,32,4095,1,5,2,659,7334,0,0), +(5793,32,4095,1,5,3,659,7334,0,0), +(5794,32,4095,1,5,4,659,7334,0,0), +(5795,32,4095,1,5,0,649,7300,0,0), +(5796,32,4095,1,5,1,649,7300,0,0), +(5797,32,4095,1,5,2,649,7300,0,0), +(5798,32,4095,1,5,3,649,7300,0,0), +(5799,32,4095,1,5,4,649,7300,0,0), +(5825,536870912,4063,1,2,0,846,9487,0,0), +(5826,536870912,4063,1,2,1,846,9487,0,0), +(5827,536870912,4063,1,2,2,846,9487,0,0), +(5828,536870912,4063,1,2,3,846,9487,0,0), +(5829,536870912,4063,1,2,4,846,9487,0,0), +(5830,536870912,4063,1,2,5,846,9487,0,0), +(5831,536870912,4063,1,2,6,846,9487,0,0), +(5832,536870912,4063,1,2,7,846,9487,0,0), +(5833,536870912,4063,1,2,8,846,9487,0,0), +(5834,536870912,4063,1,2,9,846,9487,0,0), +(5835,536870912,4063,0,2,0,845,9485,0,0), +(5836,536870912,4063,0,2,1,845,9485,0,0), +(5837,536870912,4063,0,2,2,845,9485,0,0), +(5838,536870912,4063,0,2,3,845,9485,0,0), +(5839,536870912,4063,0,2,4,845,9485,0,0), +(5840,536870912,4063,0,2,5,845,9485,0,0), +(5841,536870912,4063,0,2,6,845,9485,0,0), +(5842,536870912,4063,0,2,7,845,9485,0,0), +(5843,536870912,4063,0,2,8,845,9485,0,0), +(5844,536870912,4063,0,2,9,845,9485,0,0), +(5845,1,4095,1,5,0,510,4908,0,0), +(5846,1,4095,1,5,1,510,4908,0,0), +(5847,1,4095,1,5,2,510,4908,0,0), +(5848,1,4095,1,5,3,510,4908,0,0), +(5849,1,4095,1,5,4,510,4908,0,0), +(5850,1,4095,1,5,5,510,4908,0,0), +(5851,1,4095,1,5,6,510,4908,0,0), +(5852,1,4095,1,2,0,516,4963,0,0), +(5853,1,4095,1,2,1,516,4963,0,0), +(5854,1,4095,1,2,2,516,4963,0,0), +(5855,1,4095,1,2,3,516,4963,0,0), +(5856,1,4095,1,2,4,516,4963,0,0), +(5857,1,4095,1,2,5,516,4963,0,0), +(5858,1,4095,1,2,6,516,4963,0,0), +(5859,1,4095,1,2,7,516,4963,0,0), +(5860,1,4095,1,2,8,516,4963,0,0), +(5861,1,4095,1,2,9,516,4963,0,0), +(5862,1,4095,1,2,10,516,4963,0,0), +(5863,1,4095,1,2,11,516,4963,0,0), +(5864,1,4095,1,2,12,516,4963,0,0), +(5865,1,4095,1,2,13,516,4963,0,0), +(5866,1,4095,1,2,14,516,4963,0,0), +(5867,1,4095,1,2,15,516,4963,0,0), +(5868,1,4095,1,2,16,516,4963,0,0), +(5869,1,4095,1,2,17,516,4963,0,0), +(5870,1,4095,1,2,18,516,4963,0,0), +(5871,1,4095,1,2,19,516,4963,0,0), +(5872,1,4095,1,2,20,516,4963,0,0), +(5873,1,4095,1,2,21,516,4963,0,0), +(5874,1,4095,1,2,22,516,4963,0,0), +(5875,1,4095,1,2,23,516,4963,0,0), +(5876,1,4095,1,2,24,516,4963,0,0), +(5877,1,4095,1,2,25,516,4963,0,0), +(5878,1,4095,1,2,26,516,4963,0,0), +(5879,1,4095,1,2,27,516,4963,0,0), +(5880,1,4095,1,2,28,516,4963,0,0), +(5881,1,4095,1,2,29,516,4963,0,0), +(5882,4,4095,0,5,0,604,6817,0,0), +(5883,4,4095,0,5,1,604,6817,0,0), +(5884,4,4095,0,5,2,604,6817,0,0), +(5885,4,4095,0,5,3,604,6817,0,0), +(5886,4,4095,0,5,4,604,6817,0,0), +(5887,4,4095,0,5,5,604,6817,0,0), +(5888,4,4095,0,5,6,604,6817,0,0), +(5889,4,4095,0,5,7,604,6817,0,0), +(5890,4,4095,0,5,8,604,6817,0,0), +(5891,4,4095,0,5,9,604,6817,0,0), +(5892,4,4095,0,5,10,604,6817,0,0), +(5893,4,4095,0,5,0,600,6789,0,0), +(5894,4,4095,0,5,1,600,6789,0,0), +(5895,4,4095,0,5,2,600,6789,0,0), +(5896,4,4095,0,5,3,600,6789,0,0), +(5897,4,4095,0,5,4,600,6789,0,0), +(5898,4,4095,0,5,5,600,6789,0,0), +(5899,4,4095,0,5,6,600,6789,0,0), +(5900,4,4095,0,5,7,600,6789,0,0), +(5901,4,4095,0,5,8,600,6789,0,0), +(5902,4,4095,0,5,9,600,6789,0,0), +(5903,4,4095,0,5,10,600,6789,0,0), +(5904,4,4095,1,5,4,601,6797,0,0), +(5905,4,4095,1,5,0,605,6823,0,0), +(5906,4,4095,1,5,1,605,6823,0,0), +(5907,4,4095,1,5,2,605,6823,0,0), +(5908,4,4095,1,5,3,605,6823,0,0), +(5909,4,4095,1,5,5,605,6823,0,0), +(5910,8,4095,1,1,0,744,8130,0,0), +(5911,8,4095,1,1,1,744,8130,0,0), +(5912,8,4095,1,1,2,744,8130,0,0), +(5913,8,4095,1,1,3,744,8130,0,0), +(5914,8,4095,1,1,4,744,8130,0,0), +(5915,8,4095,1,1,5,744,8130,0,0), +(5916,8,4095,1,1,6,744,8130,0,0), +(5917,8,4095,1,1,7,744,8130,0,0), +(5918,8,4095,1,1,8,744,8130,0,0), +(5919,8,4095,1,1,9,744,8130,0,0), +(5920,8,4095,1,1,10,744,8130,0,0), +(5921,8,4095,1,1,11,744,8130,0,0), +(5922,8,4095,1,1,12,744,8130,0,0), +(5923,8,4095,1,1,13,744,8130,0,0), +(5924,8,4095,1,1,14,744,8130,0,0), +(5925,8,4095,1,1,15,744,8130,0,0), +(5926,8,4095,1,1,16,744,8130,0,0), +(5927,8,4095,1,1,17,744,8130,0,0), +(5928,8,4095,1,1,18,744,8130,0,0), +(5929,8,4095,1,1,19,744,8130,0,0), +(5930,8,4095,1,1,20,744,8130,0,0), +(5931,8,4095,1,1,21,744,8130,0,0), +(5932,8,4095,1,1,22,744,8130,0,0), +(5933,8,4095,1,1,23,744,8130,0,0), +(5934,8,4095,1,5,0,708,7845,0,0), +(5935,8,4095,1,5,1,708,7845,0,0), +(5936,8,4095,1,5,2,708,7845,0,0), +(5937,8,4095,1,5,3,708,7845,0,0), +(5938,8,4095,1,5,4,708,7845,0,0), +(5939,8,4095,1,5,5,708,7845,0,0), +(5940,8,4095,1,5,6,708,7845,0,0), +(5941,8,4095,1,5,7,708,7845,0,0), +(5942,8,4095,1,5,8,708,7845,0,0), +(5943,8,4095,1,5,9,708,7845,0,0), +(5944,8,4095,1,5,0,712,7861,0,0), +(5945,8,4095,1,5,1,712,7861,0,0), +(5946,8,4095,1,5,2,712,7861,0,0), +(5947,8,4095,1,5,3,712,7861,0,0), +(5948,8,4095,1,5,4,712,7861,0,0), +(5949,8,4095,1,5,5,712,7861,0,0), +(5950,8,4095,1,5,6,712,7861,0,0), +(5951,8,4095,1,5,7,712,7861,0,0), +(5952,8,4095,1,5,8,712,7861,0,0), +(5953,8,4095,1,5,9,712,7861,0,0), +(5954,8,4095,1,5,0,710,7853,0,0), +(5955,8,4095,1,5,1,710,7853,0,0), +(5956,8,4095,1,5,2,710,7853,0,0), +(5957,8,4095,1,5,3,710,7853,0,0), +(5958,8,4095,1,5,4,710,7853,0,0), +(5959,8,4095,1,5,5,710,7853,0,0), +(5960,8,4095,1,5,6,710,7853,0,0), +(5961,8,4095,1,5,7,710,7853,0,0), +(5962,8,4095,1,5,8,710,7853,0,0), +(5963,8,4095,1,5,9,710,7853,0,0), +(5964,8,4095,1,5,0,714,7868,0,0), +(5965,8,4095,1,5,1,714,7868,0,0), +(5966,8,4095,1,5,2,714,7868,0,0), +(5967,8,4095,1,5,3,714,7868,0,0), +(5968,8,4095,1,5,4,714,7868,0,0), +(5969,8,4095,1,5,5,714,7868,0,0), +(5970,8,4095,1,5,6,714,7868,0,0), +(5971,8,4095,1,5,7,714,7868,0,0), +(5972,8,4095,1,5,8,714,7868,0,0), +(5973,8,4095,1,5,9,714,7868,0,0), +(5974,8,4095,1,5,0,724,7963,0,0), +(5975,8,4095,1,5,1,724,7963,0,0), +(5976,8,4095,1,5,2,724,7963,0,0), +(5977,8,4095,1,5,3,724,7963,0,0), +(5978,8,4095,1,5,4,724,7963,0,0), +(5979,8,4095,1,5,5,724,7963,0,0), +(5980,8,4095,1,5,6,724,7963,0,0), +(5981,8,4095,1,5,7,724,7963,0,0), +(5982,8,4095,1,5,8,724,7963,0,0), +(5983,8,4095,1,5,9,724,7963,0,0), +(5984,8,4095,0,1,0,742,8129,0,0), +(5985,8,4095,0,1,1,742,8129,0,0), +(5986,8,4095,0,1,2,742,8129,0,0), +(5987,8,4095,0,1,3,742,8129,0,0), +(5988,8,4095,0,1,4,742,8129,0,0), +(5989,8,4095,0,1,5,742,8129,0,0), +(5990,8,4095,0,1,6,742,8129,0,0), +(5991,8,4095,0,1,7,742,8129,0,0), +(5992,8,4095,0,1,8,742,8129,0,0), +(5993,8,4095,0,1,9,742,8129,0,0), +(5994,8,4095,0,1,10,742,8129,0,0), +(5995,8,4095,0,1,11,742,8129,0,0), +(5996,8,4095,0,1,12,742,8129,0,0), +(5997,8,4095,0,1,13,742,8129,0,0), +(5998,8,4095,0,1,14,742,8129,0,0), +(5999,8,4095,0,1,15,742,8129,0,0), +(6000,8,4095,0,1,16,742,8129,0,0), +(6001,8,4095,0,1,17,742,8129,0,0), +(6002,8,4095,0,1,18,742,8129,0,0), +(6003,8,4095,0,1,19,742,8129,0,0), +(6004,8,4095,0,1,20,742,8129,0,0), +(6005,8,4095,0,1,21,742,8129,0,0), +(6006,8,4095,0,1,22,742,8129,0,0), +(6007,8,4095,0,1,23,742,8129,0,0), +(6008,8,4095,0,5,0,728,8018,0,0), +(6009,8,4095,0,5,1,728,8018,0,0), +(6010,8,4095,0,5,2,728,8018,0,0), +(6011,8,4095,0,5,3,728,8018,0,0), +(6012,8,4095,0,5,4,728,8018,0,0), +(6013,8,4095,0,5,5,728,8018,0,0), +(6014,2,4095,0,5,0,875,9808,0,0), +(6015,2,4095,0,5,1,875,9808,0,0), +(6016,2,4095,0,5,2,875,9808,0,0), +(6017,2,4095,0,5,3,875,9808,0,0), +(6018,2,4095,0,5,4,875,9808,0,0), +(6019,2,4095,0,5,5,875,9808,0,0), +(6020,2,4095,0,5,6,875,9808,0,0), +(6021,2,4095,0,5,7,875,9808,0,0), +(6022,2,4095,0,5,8,875,9808,0,0), +(6023,2,4095,0,5,9,875,9808,0,0), +(6024,2,4095,0,5,10,875,9808,0,0), +(6025,2,4095,0,1,0,826,9359,0,0), +(6026,2,4095,0,1,1,826,9359,0,0), +(6027,2,4095,0,1,2,826,9359,0,0), +(6028,2,4095,0,1,3,826,9359,0,0), +(6029,2,4095,0,1,4,826,9359,0,0), +(6030,2,4095,0,1,5,826,9359,0,0), +(6031,2,4095,0,1,6,826,9359,0,0), +(6032,2,4095,0,1,7,826,9359,0,0), +(6033,2,4095,0,1,8,826,9359,0,0), +(6034,2,4095,0,1,9,826,9359,0,0), +(6035,2,4095,0,1,10,826,9359,0,0), +(6036,2,4095,0,1,11,826,9359,0,0), +(6037,2,4095,0,1,12,826,9359,0,0), +(6038,2,4095,0,1,13,826,9359,0,0), +(6039,2,4095,0,1,14,826,9359,0,0), +(6040,2,4095,0,1,15,826,9359,0,0), +(6041,2,4095,0,1,16,826,9359,0,0), +(6042,2,4095,0,1,17,826,9359,0,0), +(6043,2,4095,0,1,18,826,9359,0,0), +(6044,2,4095,0,1,19,826,9359,0,0), +(6045,2,4095,0,1,20,826,9359,0,0), +(6046,2,4095,0,1,21,826,9359,0,0), +(6047,2,4095,0,1,22,826,9359,0,0), +(6048,2,4095,0,1,23,826,9359,0,0), +(6049,2,4095,0,1,24,826,9359,0,0), +(6050,2,4095,0,1,25,826,9359,0,0), +(6051,2,4095,0,1,26,826,9359,0,0), +(6052,2,4095,0,1,27,826,9359,0,0), +(6053,2,4095,0,1,28,826,9359,0,0), +(6054,2,4095,0,1,29,826,9359,0,0), +(6055,2,4095,0,1,30,826,9359,0,0), +(6056,2,4095,0,5,0,877,9825,0,0), +(6057,2,4095,0,5,1,877,9825,0,0), +(6058,2,4095,0,5,2,877,9825,0,0), +(6059,2,4095,0,5,3,877,9825,0,0), +(6060,2,4095,0,5,4,877,9825,0,0), +(6061,2,4095,0,5,5,877,9825,0,0), +(6062,2,4095,0,5,6,877,9825,0,0), +(6063,2,4095,0,5,7,877,9825,0,0), +(6064,2,4095,0,5,8,877,9825,0,0), +(6065,2,4095,0,5,9,877,9825,0,0), +(6066,2,4095,0,5,10,877,9825,0,0), +(6067,2,4095,0,1,0,827,9365,0,0), +(6068,2,4095,0,1,1,827,9365,0,0), +(6069,2,4095,0,1,2,827,9365,0,0), +(6070,2,4095,0,1,3,827,9365,0,0), +(6071,2,4095,0,1,4,827,9365,0,0), +(6072,2,4095,0,1,5,827,9365,0,0), +(6073,2,4095,0,1,6,827,9365,0,0), +(6074,2,4095,0,1,7,827,9365,0,0), +(6075,2,4095,0,1,8,827,9365,0,0), +(6076,2,4095,0,1,9,827,9365,0,0), +(6077,2,4095,0,1,10,827,9365,0,0), +(6078,2,4095,0,1,11,827,9365,0,0), +(6079,2,4095,0,1,12,827,9365,0,0), +(6080,2,4095,0,1,13,827,9365,0,0), +(6081,2,4095,0,1,14,827,9365,0,0), +(6082,2,4095,0,1,15,827,9365,0,0), +(6083,2,4095,0,1,16,827,9365,0,0), +(6084,2,4095,0,1,17,827,9365,0,0), +(6085,2,4095,0,1,18,827,9365,0,0), +(6086,2,4095,0,1,19,827,9365,0,0), +(6087,2,4095,0,1,20,827,9365,0,0), +(6088,2,4095,0,1,21,827,9365,0,0), +(6089,2,4095,0,1,22,827,9365,0,0), +(6090,2,4095,0,1,23,827,9365,0,0), +(6091,2,4095,0,1,24,827,9365,0,0), +(6092,2,4095,0,1,25,827,9365,0,0), +(6093,2,4095,0,1,26,827,9365,0,0), +(6094,2,4095,0,1,27,827,9365,0,0), +(6095,2,4095,0,1,28,827,9365,0,0), +(6096,2,4095,0,1,29,827,9365,0,0), +(6097,2,4095,0,1,30,827,9365,0,0), +(6098,2,4095,0,1,0,828,9369,0,0), +(6099,2,4095,0,1,1,828,9369,0,0), +(6100,2,4095,0,1,2,828,9369,0,0), +(6101,2,4095,0,1,3,828,9369,0,0), +(6102,2,4095,0,1,4,828,9369,0,0), +(6103,2,4095,0,1,5,828,9369,0,0), +(6104,2,4095,0,1,6,828,9369,0,0), +(6105,2,4095,0,1,7,828,9369,0,0), +(6106,2,4095,0,1,8,828,9369,0,0), +(6107,2,4095,0,1,9,828,9369,0,0), +(6108,2,4095,0,1,10,828,9369,0,0), +(6109,2,4095,0,1,11,828,9369,0,0), +(6110,2,4095,0,1,12,828,9369,0,0), +(6111,2,4095,0,1,13,828,9369,0,0), +(6112,2,4095,0,1,14,828,9369,0,0), +(6113,2,4095,0,1,15,828,9369,0,0), +(6114,2,4095,0,1,16,828,9369,0,0), +(6115,2,4095,0,1,17,828,9369,0,0), +(6116,2,4095,0,1,18,828,9369,0,0), +(6117,2,4095,0,1,19,828,9369,0,0), +(6118,2,4095,0,1,20,828,9369,0,0), +(6119,2,4095,0,1,21,828,9369,0,0), +(6120,2,4095,0,1,22,828,9369,0,0), +(6121,2,4095,0,1,23,828,9369,0,0), +(6122,2,4095,0,1,24,828,9369,0,0), +(6123,2,4095,0,1,25,828,9369,0,0), +(6124,2,4095,0,1,26,828,9369,0,0), +(6125,2,4095,0,1,27,828,9369,0,0), +(6126,2,4095,0,1,28,828,9369,0,0), +(6127,2,4095,0,1,29,828,9369,0,0), +(6128,2,4095,0,1,30,828,9369,0,0), +(6129,2,4095,1,1,0,830,9377,0,0), +(6130,2,4095,1,1,1,830,9377,0,0), +(6131,2,4095,1,1,2,830,9377,0,0), +(6132,2,4095,1,1,3,830,9377,0,0), +(6133,2,4095,1,1,4,830,9377,0,0), +(6134,2,4095,1,1,5,830,9377,0,0), +(6135,2,4095,1,1,6,830,9377,0,0), +(6136,2,4095,1,1,7,830,9377,0,0), +(6137,2,4095,1,1,8,830,9377,0,0), +(6138,2,4095,1,1,9,830,9377,0,0), +(6139,2,4095,1,1,10,830,9377,0,0), +(6140,2,4095,1,1,11,830,9377,0,0), +(6141,2,4095,1,1,12,830,9377,0,0), +(6142,2,4095,1,1,13,830,9377,0,0), +(6143,2,4095,1,1,14,830,9377,0,0), +(6144,2,4095,1,1,15,830,9377,0,0), +(6145,2,4095,1,1,16,830,9377,0,0), +(6146,2,4095,1,1,17,830,9377,0,0), +(6147,2,4095,1,1,18,830,9377,0,0), +(6148,2,4095,1,1,19,830,9377,0,0), +(6149,2,4095,1,1,20,830,9377,0,0), +(6150,2,4095,1,1,21,830,9377,0,0), +(6151,2,4095,1,1,22,830,9377,0,0), +(6152,2,4095,1,1,23,830,9377,0,0), +(6153,2,4095,1,1,24,830,9377,0,0), +(6154,2,4095,1,1,25,830,9377,0,0), +(6155,2,4095,1,1,26,830,9377,0,0), +(6156,2,4095,1,1,27,830,9377,0,0), +(6157,2,4095,1,1,28,830,9377,0,0), +(6158,2,4095,1,1,29,830,9377,0,0), +(6159,2,4095,1,1,30,830,9377,0,0), +(6160,2,4095,1,1,31,830,9377,0,0), +(6161,2,4095,1,1,0,831,9382,0,0), +(6162,2,4095,1,1,1,831,9382,0,0), +(6163,2,4095,1,1,2,831,9382,0,0), +(6164,2,4095,1,1,3,831,9382,0,0), +(6165,2,4095,1,1,4,831,9382,0,0), +(6166,2,4095,1,1,5,831,9382,0,0), +(6167,2,4095,1,1,6,831,9382,0,0), +(6168,2,4095,1,1,7,831,9382,0,0), +(6169,2,4095,1,1,8,831,9382,0,0), +(6170,2,4095,1,1,9,831,9382,0,0), +(6171,2,4095,1,1,10,831,9382,0,0), +(6172,2,4095,1,1,11,831,9382,0,0), +(6173,2,4095,1,1,12,831,9382,0,0), +(6174,2,4095,1,1,13,831,9382,0,0), +(6175,2,4095,1,1,14,831,9382,0,0), +(6176,2,4095,1,1,15,831,9382,0,0), +(6177,2,4095,1,1,16,831,9382,0,0), +(6178,2,4095,1,1,17,831,9382,0,0), +(6179,2,4095,1,1,18,831,9382,0,0), +(6180,2,4095,1,1,19,831,9382,0,0), +(6181,2,4095,1,1,20,831,9382,0,0), +(6182,2,4095,1,1,21,831,9382,0,0), +(6183,2,4095,1,1,22,831,9382,0,0), +(6184,2,4095,1,1,23,831,9382,0,0), +(6185,2,4095,1,1,24,831,9382,0,0), +(6186,2,4095,1,1,25,831,9382,0,0), +(6187,2,4095,1,1,26,831,9382,0,0), +(6188,2,4095,1,1,27,831,9382,0,0), +(6189,2,4095,1,1,28,831,9382,0,0), +(6190,2,4095,1,1,29,831,9382,0,0), +(6191,2,4095,1,1,30,831,9382,0,0), +(6192,2,4095,1,1,31,831,9382,0,0), +(6193,2,4095,1,1,0,832,9390,0,0), +(6194,2,4095,1,1,1,832,9390,0,0), +(6195,2,4095,1,1,2,832,9390,0,0), +(6196,2,4095,1,1,3,832,9390,0,0), +(6197,2,4095,1,1,4,832,9390,0,0), +(6198,2,4095,1,1,5,832,9390,0,0), +(6199,2,4095,1,1,6,832,9390,0,0), +(6200,2,4095,1,1,7,832,9390,0,0), +(6201,2,4095,1,1,8,832,9390,0,0), +(6202,2,4095,1,1,9,832,9390,0,0), +(6203,2,4095,1,1,10,832,9390,0,0), +(6204,2,4095,1,1,11,832,9390,0,0), +(6205,2,4095,1,1,12,832,9390,0,0), +(6206,2,4095,1,1,13,832,9390,0,0), +(6207,2,4095,1,1,14,832,9390,0,0), +(6208,2,4095,1,1,15,832,9390,0,0), +(6209,2,4095,1,1,16,832,9390,0,0), +(6210,2,4095,1,1,17,832,9390,0,0), +(6211,2,4095,1,1,18,832,9390,0,0), +(6212,2,4095,1,1,19,832,9390,0,0), +(6213,2,4095,1,1,20,832,9390,0,0), +(6214,2,4095,1,1,21,832,9390,0,0), +(6215,2,4095,1,1,22,832,9390,0,0), +(6216,2,4095,1,1,23,832,9390,0,0), +(6217,2,4095,1,1,24,832,9390,0,0), +(6218,2,4095,1,1,25,832,9390,0,0), +(6219,2,4095,1,1,26,832,9390,0,0), +(6220,2,4095,1,1,27,832,9390,0,0), +(6221,2,4095,1,1,28,832,9390,0,0), +(6222,2,4095,1,1,29,832,9390,0,0), +(6223,2,4095,1,1,30,832,9390,0,0), +(6224,2,4095,1,1,31,832,9390,0,0), +(6225,2,4095,1,5,0,847,9491,0,0), +(6226,2,4095,1,5,1,847,9491,0,0), +(6227,2,4095,1,5,2,847,9491,0,0), +(6228,2,4095,1,5,3,847,9491,0,0), +(6229,2,4095,1,5,4,847,9491,0,0), +(6230,2,4095,1,5,5,847,9491,0,0), +(6231,2,4095,1,5,6,847,9491,0,0), +(6232,16,4095,1,5,0,559,6275,0,0), +(6233,16,4095,1,5,1,559,6275,0,0), +(6234,16,4095,1,5,4,559,6275,0,0), +(6235,16,4095,1,5,5,559,6275,0,0), +(6236,16,4095,1,5,6,559,6275,0,0), +(6237,16,4095,0,5,0,563,6287,0,0), +(6238,16,4095,0,5,1,563,6287,0,0), +(6239,16,4095,0,5,8,563,6287,0,0), +(6240,16,4095,0,5,9,563,6287,0,0), +(6241,16,4095,0,5,10,563,6287,0,0), +(6242,16,4095,0,5,11,563,6287,0,0), +(6243,16,4095,0,5,12,563,6287,0,0), +(6244,16,4095,0,5,13,563,6287,0,0), +(6245,16,4095,0,5,16,563,6287,0,0), +(6246,32,4095,0,1,0,663,7349,0,0), +(6247,32,4095,0,1,1,663,7349,0,0), +(6248,32,4095,0,1,2,663,7349,0,0), +(6249,32,4095,0,1,3,663,7349,0,0), +(6250,32,4095,0,1,4,663,7349,0,0), +(6251,32,4095,0,1,5,663,7349,0,0), +(6252,32,4095,0,1,6,663,7349,0,0), +(6253,32,4095,0,1,7,663,7349,0,0), +(6254,32,4095,0,1,8,663,7349,0,0), +(6255,32,4095,0,1,9,663,7349,0,0), +(6256,32,4095,0,1,10,663,7349,0,0), +(6257,32,4095,0,1,11,663,7349,0,0), +(6258,32,4095,0,1,12,663,7349,0,0), +(6259,32,4095,0,1,13,663,7349,0,0), +(6260,32,4095,0,1,14,663,7349,0,0), +(6261,32,4095,0,1,15,663,7349,0,0), +(6262,32,4095,0,1,16,663,7349,0,0), +(6263,32,4095,0,1,17,663,7349,0,0), +(6264,32,4095,0,1,18,663,7349,0,0), +(6265,32,4095,0,1,19,663,7349,0,0), +(6266,32,4095,0,1,20,663,7349,0,0), +(6267,32,4095,0,1,21,663,7349,0,0), +(6268,32,4095,0,1,22,663,7349,0,0), +(6269,32,4095,0,1,23,663,7349,0,0), +(6270,32,4095,0,1,24,663,7349,0,0), +(6271,32,4095,0,1,25,663,7349,0,0), +(6272,32,4095,0,1,26,663,7349,0,0), +(6273,32,4095,0,1,27,663,7349,0,0), +(6274,32,4095,0,1,28,663,7349,0,0), +(6275,32,4095,0,1,0,667,7373,0,0), +(6276,32,4095,0,1,1,667,7373,0,0), +(6277,32,4095,0,1,2,667,7373,0,0), +(6278,32,4095,0,1,3,667,7373,0,0), +(6279,32,4095,0,1,4,667,7373,0,0), +(6280,32,4095,0,1,5,667,7373,0,0), +(6281,32,4095,0,1,6,667,7373,0,0), +(6282,32,4095,0,1,7,667,7373,0,0), +(6283,32,4095,0,1,8,667,7373,0,0), +(6284,32,4095,0,1,9,667,7373,0,0), +(6285,32,4095,0,1,10,667,7373,0,0), +(6286,32,4095,0,1,11,667,7373,0,0), +(6287,32,4095,0,1,12,667,7373,0,0), +(6288,32,4095,0,1,13,667,7373,0,0), +(6289,32,4095,0,1,14,667,7373,0,0), +(6290,32,4095,0,1,15,667,7373,0,0), +(6291,32,4095,0,1,16,667,7373,0,0), +(6292,32,4095,0,1,17,667,7373,0,0), +(6293,32,4095,0,1,18,667,7373,0,0), +(6294,32,4095,0,1,19,667,7373,0,0), +(6295,32,4095,0,1,20,667,7373,0,0), +(6296,32,4095,0,1,21,667,7373,0,0), +(6297,32,4095,0,1,22,667,7373,0,0), +(6298,32,4095,0,1,23,667,7373,0,0), +(6299,32,4095,0,1,24,667,7373,0,0), +(6300,32,4095,0,1,25,667,7373,0,0), +(6301,32,4095,0,1,26,667,7373,0,0), +(6302,32,4095,0,1,27,667,7373,0,0), +(6303,32,4095,0,1,28,667,7373,0,0), +(6304,32,4095,1,1,0,666,7369,0,0), +(6305,32,4095,1,1,1,666,7369,0,0), +(6306,32,4095,1,1,2,666,7369,0,0), +(6307,32,4095,1,1,3,666,7369,0,0), +(6308,32,4095,1,1,4,666,7369,0,0), +(6309,32,4095,1,1,5,666,7369,0,0), +(6310,32,4095,1,1,6,666,7369,0,0), +(6311,32,4095,1,1,7,666,7369,0,0), +(6312,32,4095,1,1,8,666,7369,0,0), +(6313,32,4095,1,1,9,666,7369,0,0), +(6314,32,4095,1,1,10,666,7369,0,0), +(6315,32,4095,1,1,11,666,7369,0,0), +(6316,32,4095,1,1,12,666,7369,0,0), +(6317,32,4095,1,1,13,666,7369,0,0), +(6318,32,4095,1,1,0,662,7353,0,0), +(6319,32,4095,1,1,1,662,7353,0,0), +(6320,32,4095,1,1,2,662,7353,0,0), +(6321,32,4095,1,1,3,662,7353,0,0), +(6322,32,4095,1,1,4,662,7353,0,0), +(6323,32,4095,1,1,5,662,7353,0,0), +(6324,32,4095,1,1,6,662,7353,0,0), +(6325,32,4095,1,1,7,662,7353,0,0), +(6326,32,4095,1,1,8,662,7353,0,0), +(6327,32,4095,1,1,9,662,7353,0,0), +(6328,32,4095,1,1,10,662,7353,0,0), +(6329,32,4095,1,1,11,662,7353,0,0), +(6330,32,4095,1,1,12,662,7353,0,0), +(6331,32,4095,1,1,13,662,7353,0,0), +(6332,128,4095,0,5,0,769,8548,0,0), +(6333,128,4095,0,5,1,769,8548,0,0), +(6334,128,4095,0,5,2,769,8548,0,0), +(6335,128,4095,0,5,3,769,8548,0,0), +(6336,128,4095,0,5,4,769,8548,0,0), +(6337,128,4095,0,5,5,769,8548,0,0), +(6338,128,4095,0,5,6,769,8548,0,0), +(6339,128,4095,0,5,7,769,8548,0,0), +(6340,128,4095,0,5,8,769,8548,0,0), +(6341,128,4095,0,5,9,769,8548,0,0), +(6342,128,4095,0,5,10,769,8548,0,0), +(6343,128,4095,0,5,0,761,8480,0,0), +(6344,128,4095,0,5,1,761,8480,0,0), +(6345,128,4095,0,5,2,761,8480,0,0), +(6346,128,4095,0,5,3,761,8480,0,0), +(6347,128,4095,0,5,4,761,8480,0,0), +(6348,128,4095,0,5,5,761,8480,0,0), +(6349,128,4095,0,5,6,761,8480,0,0), +(6350,128,4095,0,5,7,761,8480,0,0), +(6351,128,4095,0,5,8,761,8480,0,0), +(6352,128,4095,0,5,9,761,8480,0,0), +(6353,128,4095,0,5,10,761,8480,0,0), +(6354,128,4095,0,5,0,764,8495,0,0), +(6355,128,4095,0,5,1,764,8495,0,0), +(6356,128,4095,0,5,2,764,8495,0,0), +(6357,128,4095,0,5,3,764,8495,0,0), +(6358,128,4095,0,5,4,764,8495,0,0), +(6359,128,4095,0,5,5,764,8495,0,0), +(6360,128,4095,0,5,6,764,8495,0,0), +(6361,128,4095,0,5,7,764,8495,0,0), +(6362,128,4095,0,5,8,764,8495,0,0), +(6363,128,4095,0,5,9,764,8495,0,0), +(6364,128,4095,0,5,10,764,8495,0,0), +(6365,128,4095,1,5,0,771,8556,0,0), +(6366,128,4095,1,5,1,771,8556,0,0), +(6367,128,4095,1,5,2,771,8556,0,0), +(6368,128,4095,1,5,3,771,8556,0,0), +(6369,128,4095,1,5,4,771,8556,0,0), +(6370,128,4095,1,5,5,771,8556,0,0), +(6371,128,4095,1,5,0,773,8552,0,0), +(6372,128,4095,1,5,1,773,8552,0,0), +(6373,128,4095,1,5,2,773,8552,0,0), +(6374,128,4095,1,5,3,773,8552,0,0), +(6375,128,4095,1,5,4,773,8552,0,0), +(6376,128,4095,1,5,5,773,8552,0,0), +(6377,1024,4095,0,5,0,703,7801,0,0), +(6378,1024,4095,0,5,1,703,7801,0,0), +(6379,1024,4095,0,5,2,703,7801,0,0), +(6380,1024,4095,0,5,3,703,7801,0,0), +(6381,1024,4095,0,5,4,703,7801,0,0), +(6382,1024,4095,0,5,5,703,7801,0,0), +(6383,1024,4095,0,5,6,703,7801,0,0), +(6384,1024,4095,0,5,7,703,7801,0,0), +(6385,1024,4095,0,5,0,705,7806,0,0), +(6386,1024,4095,0,5,1,705,7806,0,0), +(6387,1024,4095,0,5,2,705,7806,0,0), +(6388,1024,4095,0,5,3,705,7806,0,0), +(6389,1024,4095,0,5,4,705,7806,0,0), +(6390,1024,4095,0,5,5,705,7806,0,0), +(6391,1024,4095,0,5,6,705,7806,0,0), +(6392,1024,4095,0,5,7,705,7806,0,0), +(6393,1024,4095,1,5,0,699,7791,0,0), +(6394,1024,4095,1,5,1,699,7791,0,0), +(6395,1024,4095,1,5,2,699,7791,0,0), +(6396,1024,4095,1,5,3,699,7791,0,0), +(6397,1024,4095,1,5,4,699,7791,0,0), +(6398,1024,4095,1,5,5,699,7791,0,0), +(6399,1024,4095,1,5,6,699,7791,0,0), +(6400,1024,4095,1,5,7,699,7791,0,0), +(6401,1024,4095,1,5,0,701,7796,0,0), +(6402,1024,4095,1,5,1,701,7796,0,0), +(6403,1024,4095,1,5,2,701,7796,0,0), +(6404,1024,4095,1,5,3,701,7796,0,0), +(6405,1024,4095,1,5,4,701,7796,0,0), +(6406,1024,4095,1,5,5,701,7796,0,0), +(6407,1024,4095,1,5,6,701,7796,0,0), +(6408,1024,4095,1,5,7,701,7796,0,0), +(6409,134217728,4095,1,5,0,864,9629,0,0), +(6410,134217728,4095,1,5,1,864,9629,0,0), +(6411,134217728,4095,1,5,2,864,9629,0,0), +(6412,134217728,4095,1,5,3,864,9629,0,0), +(6413,134217728,4095,1,5,4,864,9629,0,0), +(6414,17179869184,4063,0,2,0,852,9542,0,0), +(6415,17179869184,4063,0,2,1,852,9550,0,0), +(6416,17179869184,4063,0,2,2,852,9552,0,0), +(6417,17179869184,4063,0,2,3,852,9546,0,0), +(6418,17179869184,4063,0,2,4,852,9548,0,0), +(6419,17179869184,4063,0,2,5,852,9553,0,0), +(6420,17179869184,4063,1,2,0,853,9560,0,0), +(6421,17179869184,4063,1,2,1,853,9562,0,0), +(6422,17179869184,4063,1,2,2,853,9564,0,0), +(6423,17179869184,4063,1,2,3,853,9566,0,0), +(6424,17179869184,4063,1,2,4,853,9568,0,0), +(6425,17179869184,4063,1,2,5,853,9571,0,0), +(6426,67108864,4063,0,2,0,858,9589,0,0), +(6427,67108864,4063,0,2,1,858,9589,0,0), +(6428,67108864,4063,0,2,2,858,9589,0,0), +(6429,67108864,4063,0,2,3,858,9589,0,0), +(6430,67108864,4063,0,2,4,858,9589,0,0), +(6431,67108864,4063,0,2,5,858,9589,0,0), +(6432,67108864,4063,1,2,0,859,9591,0,0), +(6433,67108864,4063,1,2,1,859,9591,0,0), +(6434,67108864,4063,1,2,2,859,9591,0,0), +(6435,67108864,4063,1,2,3,859,9591,0,0), +(6436,67108864,4063,1,2,4,859,9591,0,0), +(6437,67108864,4063,1,2,5,859,9591,0,0), +(6440,8,1024,0,4,0,565,6623,0,0), +(6441,8,1024,0,4,1,565,6623,0,0), +(6442,8,1024,0,4,2,565,6623,0,0), +(6443,8,1024,0,4,3,565,6515,0,0), +(6444,8,1024,0,4,4,565,6516,0,0), +(6445,8,1024,0,4,5,565,6515,0,0), +(6446,8,1024,0,4,6,565,6514,0,0), +(6447,8,1024,0,4,7,565,6517,0,0), +(6448,8,1024,1,4,0,566,6624,0,0), +(6449,8,1024,1,4,1,566,6624,0,0), +(6450,8,1024,1,4,2,566,6624,0,0), +(6451,8,1024,1,4,3,566,6520,0,0), +(6452,8,1024,1,4,4,566,6521,0,0), +(6453,8,1024,1,4,5,566,6520,0,0), +(6454,8,1024,1,4,6,566,6519,0,0), +(6455,8,1024,1,4,7,566,6522,0,0), +(6456,32,1024,0,1,0,893,9944,0,0), +(6457,32,1024,0,1,1,893,9944,0,0), +(6458,32,1024,0,1,2,893,9944,0,0), +(6459,32,1024,0,1,3,893,9945,0,0), +(6460,32,1024,0,1,4,893,9945,0,0), +(6461,32,1024,0,1,5,893,9945,0,0), +(6462,32,1024,0,1,6,893,9947,0,0), +(6463,32,1024,0,1,7,893,9947,0,0), +(6464,32,1024,0,1,8,893,9947,0,0), +(6465,32,1024,0,1,9,893,9946,0,0), +(6466,32,1024,0,1,10,893,9946,0,0), +(6467,32,1024,0,1,11,893,9946,0,0), +(6468,32,1024,0,1,12,893,9945,0,0), +(6469,32,1024,0,1,13,893,9945,0,0), +(6470,32,1024,0,1,14,893,9945,0,0), +(6471,32,1024,0,1,15,893,9946,0,0), +(6472,32,1024,0,1,16,893,9946,0,0), +(6473,32,1024,0,1,17,893,9946,0,0), +(6474,32,1024,0,1,18,893,9948,0,0), +(6475,32,1024,1,1,0,894,9950,0,0), +(6476,32,1024,1,1,1,894,9950,0,0), +(6477,32,1024,1,1,2,894,9951,0,0), +(6478,32,1024,1,1,3,894,9951,0,0), +(6479,32,1024,1,1,4,894,9953,0,0), +(6480,32,1024,1,1,5,894,9953,0,0), +(6481,32,1024,1,1,6,894,9952,0,0), +(6482,32,1024,1,1,7,894,9952,0,0), +(6483,32,1024,1,1,8,894,9952,0,0), +(6484,32,1024,1,1,9,894,9952,0,0), +(6485,32,1024,1,1,10,894,9954,0,0), +(6486,128,1024,0,4,0,895,9956,0,0), +(6487,128,1024,0,4,1,895,9959,0,0), +(6488,128,1024,0,4,2,895,9959,0,0), +(6489,128,1024,0,4,3,895,9958,0,0), +(6490,128,1024,0,4,4,895,9957,0,0), +(6491,128,1024,0,4,5,895,9957,0,0), +(6492,128,1024,0,4,6,895,9957,0,0), +(6493,128,1024,0,4,7,895,9957,0,0), +(6494,128,1024,0,4,8,895,9960,0,0), +(6495,128,1024,0,4,9,895,9960,0,0), +(6496,128,1024,0,4,10,895,9960,0,0), +(6497,128,1024,0,4,11,895,9959,0,0), +(6498,128,1024,1,4,0,896,9962,0,0), +(6499,128,1024,1,4,1,896,9965,0,0), +(6500,128,1024,1,4,2,896,9965,0,0), +(6501,128,1024,1,4,3,896,9964,0,0), +(6502,128,1024,1,4,4,896,9963,0,0), +(6503,128,1024,1,4,5,896,9963,0,0), +(6504,128,1024,1,4,6,896,9963,0,0), +(6505,128,1024,1,4,7,896,9963,0,0), +(6506,128,1024,1,4,8,896,9966,0,0), +(6507,128,1024,1,4,9,896,9966,0,0), +(6508,128,1024,1,4,10,896,9966,0,0), +(6509,128,1024,1,4,11,896,9965,0,0), +(6510,2097152,1024,0,4,0,626,7158,0,0), +(6511,2097152,1024,0,4,1,626,7159,0,0), +(6512,2097152,1024,0,4,2,626,7160,0,0), +(6513,2097152,1024,0,4,3,626,7161,0,0), +(6514,2097152,1024,0,4,4,626,7157,0,0), +(6515,2097152,1024,1,4,0,627,7164,0,0), +(6516,2097152,1024,1,4,1,627,7165,0,0), +(6517,2097152,1024,1,4,2,627,7166,0,0), +(6518,2097152,1024,1,4,3,627,7167,0,0), +(6519,2097152,1024,1,4,4,627,7163,0,0), +(6520,134217728,1024,0,1,0,897,9968,0,0), +(6521,134217728,1024,0,1,1,897,9969,0,0), +(6522,134217728,1024,0,1,2,897,9970,0,0), +(6523,134217728,1024,0,1,3,897,9971,0,0), +(6524,134217728,1024,1,1,0,898,9973,0,0), +(6525,134217728,1024,1,1,1,898,9974,0,0), +(6526,134217728,1024,1,1,2,898,9975,0,0), +(6527,134217728,1024,1,1,3,898,9976,0,0), +(6528,1073741824,1024,0,4,0,899,9980,0,0), +(6529,1073741824,1024,0,4,1,899,9979,0,0), +(6530,1073741824,1024,0,4,2,899,9979,0,0), +(6531,1073741824,1024,0,4,3,899,9978,0,0), +(6532,1073741824,1024,0,4,4,899,9981,0,0), +(6533,1073741824,1024,0,4,5,899,9979,0,0), +(6534,1073741824,1024,1,4,0,900,9984,0,0), +(6535,1073741824,1024,1,4,1,900,9985,0,0), +(6536,1073741824,1024,1,4,2,900,9984,0,0), +(6537,1073741824,1024,1,4,3,900,9983,0,0), +(6538,1073741824,1024,1,4,4,900,9983,0,0), +(6539,1073741824,1024,1,4,5,900,9986,0,0), +(6540,2147483648,1024,0,4,0,901,9990,0,0), +(6541,2147483648,1024,0,4,1,901,9988,0,0), +(6542,2147483648,1024,0,4,2,901,9991,0,0), +(6543,2147483648,1024,0,4,3,901,9989,0,0), +(6544,2147483648,1024,0,4,4,901,9988,0,0), +(6545,2147483648,1024,0,4,5,901,9988,0,0), +(6546,2147483648,1024,0,4,6,901,9989,0,0), +(6547,2147483648,1024,1,4,0,902,9995,0,0), +(6548,2147483648,1024,1,4,1,902,9993,0,0), +(6549,2147483648,1024,1,4,2,902,9996,0,0), +(6550,2147483648,1024,1,4,3,902,9994,0,0), +(6551,2147483648,1024,1,4,4,902,9993,0,0), +(6552,2147483648,1024,1,4,5,902,9993,0,0), +(6553,2147483648,1024,1,4,6,902,9994,0,0), +(6554,8,1024,0,4,0,625,7154,0,0), +(6555,8,1024,0,4,1,625,7154,0,0), +(6556,8,1024,0,4,2,625,7154,0,0), +(6557,8,1024,0,4,3,625,7153,0,0), +(6558,8,1024,0,4,4,625,7155,0,0), +(6559,8,1024,0,4,5,625,7153,0,0), +(6560,8,1024,0,4,6,625,7151,0,0), +(6561,8,1024,0,4,7,625,7152,0,0), +(6562,8,1024,1,4,0,624,7148,0,0), +(6563,8,1024,1,4,1,624,7148,0,0), +(6564,8,1024,1,4,2,624,7148,0,0), +(6565,8,1024,1,4,3,624,7147,0,0), +(6566,8,1024,1,4,4,624,7149,0,0), +(6567,8,1024,1,4,5,624,7147,0,0), +(6568,8,1024,1,4,6,624,7145,0,0), +(6569,8,1024,1,4,7,624,7146,0,0), +(6570,32,1024,0,1,0,903,9998,0,0), +(6571,32,1024,0,1,1,903,9998,0,0), +(6572,32,1024,0,1,2,903,9998,0,0), +(6573,32,1024,0,1,3,903,9998,0,0), +(6574,32,1024,0,1,4,903,9998,0,0), +(6575,32,1024,0,1,5,903,9998,0,0), +(6576,32,1024,0,1,6,903,10001,0,0), +(6577,32,1024,0,1,7,903,10001,0,0), +(6578,32,1024,0,1,8,903,10001,0,0), +(6579,32,1024,0,1,9,903,10002,0,0), +(6580,32,1024,0,1,10,903,10002,0,0), +(6581,32,1024,0,1,11,903,10002,0,0), +(6582,32,1024,0,1,12,903,9999,0,0), +(6583,32,1024,0,1,13,903,9999,0,0), +(6584,32,1024,0,1,14,903,9999,0,0), +(6585,32,1024,0,1,15,903,10000,0,0), +(6586,32,1024,0,1,16,903,10000,0,0), +(6587,32,1024,0,1,17,903,10000,0,0), +(6588,32,1024,0,1,18,903,9999,0,0), +(6589,32,1024,1,1,0,904,10004,0,0), +(6590,32,1024,1,1,1,904,10004,0,0), +(6591,32,1024,1,1,2,904,10004,0,0), +(6592,32,1024,1,1,3,904,10004,0,0), +(6593,32,1024,1,1,4,904,10007,0,0), +(6594,32,1024,1,1,5,904,10007,0,0), +(6595,32,1024,1,1,6,904,10008,0,0), +(6596,32,1024,1,1,7,904,10008,0,0), +(6597,32,1024,1,1,8,904,10006,0,0), +(6598,32,1024,1,1,9,904,10006,0,0), +(6599,32,1024,1,1,10,904,10005,0,0), +(6600,128,1024,0,4,0,905,10010,0,0), +(6601,128,1024,0,4,1,905,10013,0,0), +(6602,128,1024,0,4,2,905,10013,0,0), +(6603,128,1024,0,4,3,905,10012,0,0), +(6604,128,1024,0,4,4,905,10011,0,0), +(6605,128,1024,0,4,5,905,10011,0,0), +(6606,128,1024,0,4,6,905,10011,0,0), +(6607,128,1024,0,4,7,905,10011,0,0), +(6608,128,1024,0,4,8,905,10014,0,0), +(6609,128,1024,0,4,9,905,10014,0,0), +(6610,128,1024,0,4,10,905,10014,0,0), +(6611,128,1024,0,4,11,905,10013,0,0), +(6612,128,1024,1,4,0,906,10016,0,0), +(6613,128,1024,1,4,1,906,10019,0,0), +(6614,128,1024,1,4,2,906,10019,0,0), +(6615,128,1024,1,4,3,906,10018,0,0), +(6616,128,1024,1,4,4,906,10017,0,0), +(6617,128,1024,1,4,5,906,10017,0,0), +(6618,128,1024,1,4,6,906,10017,0,0), +(6619,128,1024,1,4,7,906,10017,0,0), +(6620,128,1024,1,4,8,906,10020,0,0), +(6621,128,1024,1,4,9,906,10020,0,0), +(6622,128,1024,1,4,10,906,10020,0,0), +(6623,128,1024,1,4,11,906,10019,0,0), +(6624,2097152,1024,0,4,0,628,7176,0,0), +(6625,2097152,1024,0,4,1,628,7177,0,0), +(6626,2097152,1024,0,4,2,628,7179,0,0), +(6627,2097152,1024,0,4,3,628,7178,0,0), +(6628,2097152,1024,0,4,4,628,7175,0,0), +(6629,2097152,1024,1,4,0,629,7170,0,0), +(6630,2097152,1024,1,4,1,629,7171,0,0), +(6631,2097152,1024,1,4,2,629,7173,0,0), +(6632,2097152,1024,1,4,3,629,7172,0,0), +(6633,2097152,1024,1,4,4,629,7169,0,0), +(6634,134217728,1024,0,1,0,907,10024,0,0), +(6635,134217728,1024,0,1,1,907,10023,0,0), +(6636,134217728,1024,0,1,2,907,10025,0,0), +(6637,134217728,1024,0,1,3,907,10022,0,0), +(6638,134217728,1024,1,1,0,908,10029,0,0), +(6639,134217728,1024,1,1,1,908,10028,0,0), +(6640,134217728,1024,1,1,2,908,10030,0,0), +(6641,134217728,1024,1,1,3,908,10027,0,0), +(6642,1073741824,1024,0,4,0,909,10032,0,0), +(6643,1073741824,1024,0,4,1,909,10034,0,0), +(6644,1073741824,1024,0,4,2,909,10034,0,0), +(6645,1073741824,1024,0,4,3,909,10035,0,0), +(6646,1073741824,1024,0,4,4,909,10033,0,0), +(6647,1073741824,1024,0,4,5,909,10034,0,0), +(6648,1073741824,1024,1,4,0,910,10039,0,0), +(6649,1073741824,1024,1,4,1,910,10037,0,0), +(6650,1073741824,1024,1,4,2,910,10039,0,0), +(6651,1073741824,1024,1,4,3,910,10040,0,0), +(6652,1073741824,1024,1,4,4,910,10040,0,0), +(6653,1073741824,1024,1,4,5,910,10038,0,0), +(6654,2147483648,1024,0,4,0,911,10043,0,0), +(6655,2147483648,1024,0,4,1,911,10045,0,0), +(6656,2147483648,1024,0,4,2,911,10042,0,0), +(6657,2147483648,1024,0,4,3,911,10044,0,0), +(6658,2147483648,1024,0,4,4,911,10045,0,0), +(6659,2147483648,1024,0,4,5,911,10045,0,0), +(6660,2147483648,1024,0,4,6,911,10044,0,0), +(6661,2147483648,1024,1,4,0,912,10048,0,0), +(6662,2147483648,1024,1,4,1,912,10050,0,0), +(6663,2147483648,1024,1,4,2,912,10047,0,0), +(6664,2147483648,1024,1,4,3,912,10049,0,0), +(6665,2147483648,1024,1,4,4,912,10050,0,0), +(6666,2147483648,1024,1,4,5,912,10050,0,0), +(6667,2147483648,1024,1,4,6,912,10049,0,0), +(6668,4,4095,0,5,10,936,15450,0,0), +(6669,4,4095,0,5,9,936,15450,0,0), +(6670,4,4095,0,5,8,936,15449,0,0), +(6671,4,4095,0,5,7,936,15448,0,0), +(6672,4,4095,0,5,6,936,15447,0,0), +(6673,4,4095,0,5,5,936,15446,0,0), +(6674,4,4095,0,5,4,936,15445,0,0), +(6675,4,4095,0,5,3,936,15444,0,0), +(6676,4,4095,0,5,2,936,15443,0,0), +(6677,4,4095,0,5,1,936,15442,0,0), +(6678,4,4095,0,5,0,936,15441,0,0), +(6679,4,4095,0,5,10,937,15451,0,0), +(6680,4,4095,0,5,9,937,15451,0,0), +(6681,4,4095,0,5,8,937,15451,0,0), +(6682,4,4095,0,5,7,937,15451,0,0), +(6683,4,4095,0,5,6,937,15451,0,0), +(6684,4,4095,0,5,5,937,15451,0,0), +(6685,4,4095,0,5,4,937,15451,0,0), +(6686,4,4095,0,5,3,937,15451,0,0), +(6687,4,4095,0,5,2,937,15451,0,0), +(6688,4,4095,0,5,1,937,15451,0,0), +(6689,4,4095,0,5,0,937,15451,0,0), +(6690,1073741824,1024,0,4,0,944,15505,0,0), +(6691,1073741824,1024,0,4,1,944,15504,0,0), +(6692,1073741824,1024,0,4,2,944,15504,0,0), +(6693,1073741824,1024,0,4,3,944,15485,0,0), +(6694,1073741824,1024,0,4,4,944,15506,0,0), +(6695,1073741824,1024,0,4,5,944,15504,0,0), +(6696,1073741824,1024,1,4,0,945,15507,0,0), +(6697,1073741824,1024,1,4,1,945,15508,0,0), +(6698,1073741824,1024,1,4,2,945,15507,0,0), +(6699,1073741824,1024,1,4,3,945,15490,0,0), +(6700,1073741824,1024,1,4,4,945,15490,0,0), +(6701,1073741824,1024,1,4,5,945,15509,0,0), +(6702,2147483648,1024,0,4,0,946,15511,0,0), +(6703,2147483648,1024,0,4,1,946,15495,0,0), +(6704,2147483648,1024,0,4,2,946,15512,0,0), +(6705,2147483648,1024,0,4,3,946,15496,0,0), +(6706,2147483648,1024,0,4,4,946,15495,0,0), +(6707,2147483648,1024,0,4,5,946,15495,0,0), +(6708,2147483648,1024,0,4,6,946,15496,0,0), +(6709,2147483648,1024,1,4,0,947,15514,0,0), +(6710,2147483648,1024,1,4,1,947,15500,0,0), +(6711,2147483648,1024,1,4,2,947,15515,0,0), +(6712,2147483648,1024,1,4,3,947,15513,0,0), +(6713,2147483648,1024,1,4,4,947,15500,0,0), +(6714,2147483648,1024,1,4,5,947,15500,0,0), +(6715,2147483648,1024,1,4,6,947,15513,0,0), +(6716,2147483648,1024,0,4,0,956,15551,0,0), +(6717,2147483648,1024,0,4,1,956,15549,0,0), +(6718,2147483648,1024,0,4,2,956,15552,0,0), +(6719,2147483648,1024,0,4,3,956,15550,0,0), +(6720,2147483648,1024,0,4,4,956,15549,0,0), +(6721,2147483648,1024,0,4,5,956,15549,0,0), +(6722,2147483648,1024,0,4,6,956,15550,0,0), +(6723,2147483648,1024,1,4,0,957,15558,0,0), +(6724,2147483648,1024,1,4,1,957,15556,0,0), +(6725,2147483648,1024,1,4,2,957,15559,0,0), +(6726,2147483648,1024,1,4,3,957,15557,0,0), +(6727,2147483648,1024,1,4,4,957,15556,0,0), +(6728,2147483648,1024,1,4,5,957,15556,0,0), +(6729,2147483648,1024,1,4,6,957,15557,0,0), +(6730,64,4095,1,5,0,786,15671,0,0), +(6732,4,4095,1,1,0,608,6894,0,0), +(6733,4,4095,1,1,1,608,6894,0,0), +(6734,4,4095,1,1,2,608,6894,0,0), +(6735,4,4095,1,1,3,608,6894,0,0), +(6736,4,4095,1,1,4,608,6894,0,0), +(6737,4,4095,1,1,5,608,6894,0,0), +(6738,4,4095,1,1,6,608,6894,0,0), +(6739,4,4095,1,1,7,608,6894,0,0), +(6740,4,4095,1,1,8,608,6894,0,0), +(6741,4,4095,1,1,9,608,6894,0,0), +(6742,4,4095,1,1,10,608,6894,0,0), +(6743,4,4095,1,1,11,608,6894,0,0), +(6744,4,4095,1,1,12,608,6894,0,0), +(6745,4,4095,1,1,13,608,6894,0,0), +(6746,4,4095,1,1,14,608,6894,0,0), +(6747,4,4095,1,1,15,608,6894,0,0), +(6748,4,4095,1,1,16,608,6894,0,0), +(6749,4,4095,1,1,17,608,6894,0,0), +(6750,4,4095,1,1,18,608,6894,0,0), +(6751,1,4095,1,2,0,970,15672,0,0), +(6752,1,4095,1,2,1,970,15673,0,0), +(6753,1,4095,1,2,2,970,15674,0,0), +(6754,1,4095,1,2,3,970,15675,0,0), +(6755,1,4095,1,2,4,970,15676,0,0), +(6756,1,4095,1,2,5,970,15677,0,0), +(6757,1,4095,1,2,6,970,15678,0,0), +(6758,1,4095,1,2,7,970,15679,0,0), +(6759,1,4095,1,2,8,970,15680,0,0), +(6760,1,4095,1,2,9,970,15681,0,0), +(6761,1,4095,1,2,10,970,15682,0,0), +(6762,1,4095,1,2,11,970,15683,0,0), +(6763,1,4095,1,2,12,970,15684,0,0), +(6764,1,4095,1,2,13,970,15685,0,0), +(6765,1,4095,1,2,14,970,15686,0,0), +(6766,1,4095,1,2,15,970,15672,0,0), +(6767,1,4095,1,2,16,970,15673,0,0), +(6768,1,4095,1,2,17,970,15674,0,0), +(6769,1,4095,1,2,18,970,15675,0,0), +(6770,1,4095,1,2,19,970,15676,0,0), +(6771,1,4095,1,2,20,970,15677,0,0), +(6772,1,4095,1,2,21,970,15678,0,0), +(6773,1,4095,1,2,22,970,15679,0,0), +(6774,1,4095,1,2,23,970,15680,0,0), +(6775,1,4095,1,2,24,970,15681,0,0), +(6776,1,4095,1,2,25,970,15682,0,0), +(6777,1,4095,1,2,26,970,15683,0,0), +(6778,1,4095,1,2,27,970,15684,0,0), +(6779,1,4095,1,2,28,970,15685,0,0), +(6780,1,4095,1,2,29,970,15686,0,0), +(6781,128,32,0,4,10,768,8570,0,0), +(6782,128,32,0,4,11,768,8571,0,0), +(6783,128,32,0,4,12,768,8572,0,0), +(6784,256,4095,0,4,0,819,9179,0,0), +(6785,256,4095,0,4,1,819,9180,0,0), +(6786,256,4095,0,4,2,819,9181,0,0), +(6787,256,4095,0,4,3,819,9182,0,0), +(6788,256,4095,0,4,4,819,9183,0,0), +(6789,256,4095,0,4,5,819,9184,0,0), +(6790,256,4095,0,4,6,819,9182,0,0), +(6791,256,4095,0,4,7,819,9182,0,0), +(6792,256,4095,0,4,8,819,9179,0,0), +(6793,256,4095,0,4,9,819,9180,0,0), +(6794,256,4095,0,4,10,819,9181,0,0), +(6795,256,4095,0,4,11,819,9179,0,0), +(6796,256,4095,0,4,12,819,9182,0,0), +(6797,58720256,4063,1,2,0,750,8356,1,0), +(6798,58720256,4063,1,2,1,750,8354,1,0), +(6799,58720256,4063,1,2,2,750,8355,1,0), +(6800,58720256,4063,1,2,3,750,8350,1,0), +(6801,58720256,4063,1,2,4,750,8351,1,0), +(6802,58720256,4063,1,2,5,750,8356,1,0), +(6803,58720256,4063,1,2,6,750,8355,1,0), +(6804,58720256,4063,1,2,7,750,8351,1,0), +(6805,58720256,4063,1,2,8,750,8356,1,0), +(6806,58720256,4063,1,2,9,750,8354,1,0), +(6807,58720256,4063,1,2,10,750,8355,1,0), +(6808,58720256,4063,1,2,11,750,8351,1,0), +(6809,58720256,4063,1,2,12,750,8356,1,0), +(6810,58720256,4063,1,2,13,750,8354,1,0), +(6811,58720256,4063,1,2,14,750,8355,1,0), +(6812,58720256,4063,1,2,15,750,8351,1,0), +(6813,58720256,4063,1,2,16,750,8354,1,0), +(6814,58720256,4063,1,2,17,750,8355,1,0), +(6815,58720256,4063,1,2,18,750,8356,1,0), +(6816,58720256,4063,1,2,19,750,8351,1,0), +(6817,58720256,4063,1,2,19,750,8354,1,1), +(6818,58720256,4063,1,2,18,750,8356,1,1), +(6819,58720256,4063,1,2,17,750,8351,1,1), +(6820,58720256,4063,1,2,16,750,8355,1,1), +(6821,58720256,4063,1,2,15,750,8354,1,1), +(6822,58720256,4063,1,2,14,750,8356,1,1), +(6823,58720256,4063,1,2,13,750,8351,1,1), +(6824,58720256,4063,1,2,12,750,8355,1,1), +(6825,58720256,4063,1,2,11,750,8354,1,1), +(6826,58720256,4063,1,2,10,750,8356,1,1), +(6827,58720256,4063,1,2,9,750,8351,1,1), +(6828,58720256,4063,1,2,8,750,8355,1,1), +(6829,58720256,4063,1,2,7,750,8354,1,1), +(6830,58720256,4063,1,2,6,750,8351,1,1), +(6831,58720256,4063,1,2,5,750,8356,1,1), +(6832,58720256,4063,1,2,4,750,8354,1,1), +(6833,58720256,4063,1,2,3,750,8355,1,1), +(6834,58720256,4063,1,2,2,750,8351,1,1), +(6835,58720256,4063,1,2,1,750,8356,1,1), +(6836,58720256,4063,1,2,0,750,8354,1,1), +(6837,58720256,4063,1,2,0,750,8351,1,2), +(6838,58720256,4063,1,2,1,750,8354,1,2), +(6839,58720256,4063,1,2,2,750,8356,1,2), +(6840,58720256,4063,1,2,3,750,8355,1,2), +(6841,58720256,4063,1,2,4,750,8355,1,2), +(6842,58720256,4063,1,2,5,750,8354,1,2), +(6843,58720256,4063,1,2,6,750,8351,1,2), +(6844,58720256,4063,1,2,7,750,8356,1,2), +(6845,58720256,4063,1,2,8,750,8356,1,2), +(6846,58720256,4063,1,2,9,750,8355,1,2), +(6847,58720256,4063,1,2,10,750,8354,1,2), +(6848,58720256,4063,1,2,11,750,8356,1,2), +(6849,58720256,4063,1,2,12,750,8351,1,2), +(6850,58720256,4063,1,2,13,750,8351,1,2), +(6851,58720256,4063,1,2,14,750,8355,1,2), +(6852,58720256,4063,1,2,15,750,8354,1,2), +(6853,58720256,4063,1,2,16,750,8351,1,2), +(6854,58720256,4063,1,2,17,750,8354,1,2), +(6855,58720256,4063,1,2,18,750,8356,1,2), +(6856,58720256,4063,1,2,19,750,8355,1,2), +(6857,58720256,4063,1,2,0,750,8351,1,3), +(6858,58720256,4063,1,2,1,750,8354,1,3), +(6859,58720256,4063,1,2,2,750,8354,1,3), +(6860,58720256,4063,1,2,3,750,8356,1,3), +(6861,58720256,4063,1,2,4,750,8356,1,3), +(6862,58720256,4063,1,2,5,750,8351,1,3), +(6863,58720256,4063,1,2,6,750,8351,1,3), +(6864,58720256,4063,1,2,7,750,8355,1,3), +(6865,58720256,4063,1,2,8,750,8354,1,3), +(6866,58720256,4063,1,2,9,750,8351,1,3), +(6867,58720256,4063,1,2,10,750,8356,1,3), +(6868,58720256,4063,1,2,11,750,8354,1,3), +(6869,58720256,4063,1,2,12,750,8355,1,3), +(6870,58720256,4063,1,2,13,750,8351,1,3), +(6871,58720256,4063,1,2,14,750,8356,1,3), +(6872,58720256,4063,1,2,15,750,8351,1,3), +(6873,58720256,4063,1,2,16,750,8355,1,3), +(6874,58720256,4063,1,2,17,750,8355,1,3), +(6875,58720256,4063,1,2,18,750,8354,1,3), +(6876,58720256,4063,1,2,19,750,8356,1,3), +(6877,58720256,4063,1,2,0,750,8356,1,4), +(6878,58720256,4063,1,2,1,750,8354,1,4), +(6879,58720256,4063,1,2,2,750,8355,1,4), +(6880,58720256,4063,1,2,3,750,8350,1,4), +(6881,58720256,4063,1,2,4,750,8351,1,4), +(6882,58720256,4063,1,2,5,750,8356,1,4), +(6883,58720256,4063,1,2,6,750,8355,1,4), +(6884,58720256,4063,1,2,7,750,8351,1,4), +(6885,58720256,4063,1,2,8,750,8356,1,4), +(6886,58720256,4063,1,2,9,750,8354,1,4), +(6887,58720256,4063,1,2,10,750,8355,1,4), +(6888,58720256,4063,1,2,11,750,8351,1,4), +(6889,58720256,4063,1,2,12,750,8356,1,4), +(6890,58720256,4063,1,2,13,750,8354,1,4), +(6891,58720256,4063,1,2,14,750,8355,1,4), +(6892,58720256,4063,1,2,15,750,8351,1,4), +(6893,58720256,4063,1,2,16,750,8354,1,4), +(6894,58720256,4063,1,2,17,750,8355,1,4), +(6895,58720256,4063,1,2,18,750,8356,1,4), +(6896,58720256,4063,1,2,19,750,8351,1,4), +(6897,58720256,4063,1,2,0,750,8354,1,5), +(6898,58720256,4063,1,2,1,750,8356,1,5), +(6899,58720256,4063,1,2,2,750,8351,1,5), +(6900,58720256,4063,1,2,3,750,8355,1,5), +(6901,58720256,4063,1,2,4,750,8354,1,5), +(6902,58720256,4063,1,2,5,750,8356,1,5), +(6903,58720256,4063,1,2,6,750,8351,1,5), +(6904,58720256,4063,1,2,7,750,8354,1,5), +(6905,58720256,4063,1,2,8,750,8355,1,5), +(6906,58720256,4063,1,2,9,750,8351,1,5), +(6907,58720256,4063,1,2,10,750,8356,1,5), +(6908,58720256,4063,1,2,11,750,8354,1,5), +(6909,58720256,4063,1,2,12,750,8355,1,5), +(6910,58720256,4063,1,2,13,750,8351,1,5), +(6911,58720256,4063,1,2,14,750,8356,1,5), +(6912,58720256,4063,1,2,15,750,8354,1,5), +(6913,58720256,4063,1,2,16,750,8355,1,5), +(6914,58720256,4063,1,2,17,750,8351,1,5), +(6915,58720256,4063,1,2,18,750,8356,1,5), +(6916,58720256,4063,1,2,19,750,8354,1,5), +(6917,58720256,4063,1,2,0,750,8351,1,6), +(6918,58720256,4063,1,2,1,750,8354,1,6), +(6919,58720256,4063,1,2,2,750,8356,1,6), +(6920,58720256,4063,1,2,3,750,8355,1,6), +(6921,58720256,4063,1,2,4,750,8355,1,6), +(6922,58720256,4063,1,2,5,750,8354,1,6), +(6923,58720256,4063,1,2,6,750,8351,1,6), +(6924,58720256,4063,1,2,7,750,8356,1,6), +(6925,58720256,4063,1,2,8,750,8356,1,6), +(6926,58720256,4063,1,2,9,750,8355,1,6), +(6927,58720256,4063,1,2,10,750,8354,1,6), +(6928,58720256,4063,1,2,11,750,8356,1,6), +(6929,58720256,4063,1,2,12,750,8351,1,6), +(6930,58720256,4063,1,2,13,750,8351,1,6), +(6931,58720256,4063,1,2,14,750,8355,1,6), +(6932,58720256,4063,1,2,15,750,8354,1,6), +(6933,58720256,4063,1,2,16,750,8351,1,6), +(6934,58720256,4063,1,2,17,750,8354,1,6), +(6935,58720256,4063,1,2,18,750,8356,1,6), +(6936,58720256,4063,1,2,19,750,8355,1,6), +(6937,58720256,4063,1,2,0,750,8351,1,7), +(6938,58720256,4063,1,2,1,750,8354,1,7), +(6939,58720256,4063,1,2,2,750,8354,1,7), +(6940,58720256,4063,1,2,3,750,8356,1,7), +(6941,58720256,4063,1,2,4,750,8356,1,7), +(6942,58720256,4063,1,2,5,750,8351,1,7), +(6943,58720256,4063,1,2,6,750,8351,1,7), +(6944,58720256,4063,1,2,7,750,8355,1,7), +(6945,58720256,4063,1,2,8,750,8354,1,7), +(6946,58720256,4063,1,2,9,750,8351,1,7), +(6947,58720256,4063,1,2,10,750,8356,1,7), +(6948,58720256,4063,1,2,11,750,8354,1,7), +(6949,58720256,4063,1,2,12,750,8355,1,7), +(6950,58720256,4063,1,2,13,750,8351,1,7), +(6951,58720256,4063,1,2,14,750,8356,1,7), +(6952,58720256,4063,1,2,15,750,8351,1,7), +(6953,58720256,4063,1,2,16,750,8355,1,7), +(6954,58720256,4063,1,2,17,750,8355,1,7), +(6955,58720256,4063,1,2,18,750,8354,1,7), +(6956,58720256,4063,1,2,19,750,8356,1,7), +(6957,58720256,4063,1,2,0,750,8356,1,8), +(6958,58720256,4063,1,2,1,750,8354,1,8), +(6959,58720256,4063,1,2,2,750,8355,1,8), +(6960,58720256,4063,1,2,3,750,8350,1,8), +(6961,58720256,4063,1,2,4,750,8351,1,8), +(6962,58720256,4063,1,2,5,750,8356,1,8), +(6963,58720256,4063,1,2,6,750,8355,1,8), +(6964,58720256,4063,1,2,7,750,8351,1,8), +(6965,58720256,4063,1,2,8,750,8356,1,8), +(6966,58720256,4063,1,2,9,750,8354,1,8), +(6967,58720256,4063,1,2,10,750,8355,1,8), +(6968,58720256,4063,1,2,11,750,8351,1,8), +(6969,58720256,4063,1,2,12,750,8356,1,8), +(6970,58720256,4063,1,2,13,750,8354,1,8), +(6971,58720256,4063,1,2,14,750,8355,1,8), +(6972,58720256,4063,1,2,15,750,8351,1,8), +(6973,58720256,4063,1,2,16,750,8354,1,8), +(6974,58720256,4063,1,2,17,750,8355,1,8), +(6975,58720256,4063,1,2,18,750,8356,1,8), +(6976,58720256,4063,1,2,19,750,8351,1,8), +(6977,58720256,4063,1,2,0,750,8354,1,9), +(6978,58720256,4063,1,2,1,750,8356,1,9), +(6979,58720256,4063,1,2,2,750,8351,1,9), +(6980,58720256,4063,1,2,3,750,8355,1,9), +(6981,58720256,4063,1,2,4,750,8354,1,9), +(6982,58720256,4063,1,2,5,750,8356,1,9), +(6983,58720256,4063,1,2,6,750,8351,1,9), +(6984,58720256,4063,1,2,7,750,8354,1,9), +(6985,58720256,4063,1,2,8,750,8355,1,9), +(6986,58720256,4063,1,2,9,750,8351,1,9), +(6987,58720256,4063,1,2,10,750,8356,1,9), +(6988,58720256,4063,1,2,11,750,8354,1,9), +(6989,58720256,4063,1,2,12,750,8355,1,9), +(6990,58720256,4063,1,2,13,750,8351,1,9), +(6991,58720256,4063,1,2,14,750,8356,1,9), +(6992,58720256,4063,1,2,15,750,8354,1,9), +(6993,58720256,4063,1,2,16,750,8355,1,9), +(6994,58720256,4063,1,2,17,750,8351,1,9), +(6995,58720256,4063,1,2,18,750,8356,1,9), +(6996,58720256,4063,1,2,19,750,8354,1,9), +(6997,58720256,4063,1,2,0,750,8351,1,10), +(6998,58720256,4063,1,2,1,750,8354,1,10), +(6999,58720256,4063,1,2,2,750,8356,1,10), +(7000,58720256,4063,1,2,3,750,8355,1,10), +(7001,58720256,4063,1,2,4,750,8355,1,10), +(7002,58720256,4063,1,2,5,750,8354,1,10), +(7003,58720256,4063,1,2,6,750,8351,1,10), +(7004,58720256,4063,1,2,7,750,8356,1,10), +(7005,58720256,4063,1,2,8,750,8356,1,10), +(7006,58720256,4063,1,2,9,750,8355,1,10), +(7007,58720256,4063,1,2,10,750,8354,1,10), +(7008,58720256,4063,1,2,11,750,8356,1,10), +(7009,58720256,4063,1,2,12,750,8351,1,10), +(7010,58720256,4063,1,2,13,750,8351,1,10), +(7011,58720256,4063,1,2,14,750,8355,1,10), +(7012,58720256,4063,1,2,15,750,8354,1,10), +(7013,58720256,4063,1,2,16,750,8351,1,10), +(7014,58720256,4063,1,2,17,750,8354,1,10), +(7015,58720256,4063,1,2,18,750,8356,1,10), +(7016,58720256,4063,1,2,19,750,8355,1,10), +(7017,58720256,4063,1,2,0,750,8351,1,11), +(7018,58720256,4063,1,2,1,750,8354,1,11), +(7019,58720256,4063,1,2,2,750,8354,1,11), +(7020,58720256,4063,1,2,3,750,8356,1,11), +(7021,58720256,4063,1,2,4,750,8356,1,11), +(7022,58720256,4063,1,2,5,750,8351,1,11), +(7023,58720256,4063,1,2,6,750,8351,1,11), +(7024,58720256,4063,1,2,7,750,8355,1,11), +(7025,58720256,4063,1,2,8,750,8354,1,11), +(7026,58720256,4063,1,2,9,750,8351,1,11), +(7027,58720256,4063,1,2,10,750,8356,1,11), +(7028,58720256,4063,1,2,11,750,8354,1,11), +(7029,58720256,4063,1,2,12,750,8355,1,11), +(7030,58720256,4063,1,2,13,750,8351,1,11), +(7031,58720256,4063,1,2,14,750,8356,1,11), +(7032,58720256,4063,1,2,15,750,8351,1,11), +(7033,58720256,4063,1,2,16,750,8355,1,11), +(7034,58720256,4063,1,2,17,750,8355,1,11), +(7035,58720256,4063,1,2,18,750,8354,1,11), +(7036,58720256,4063,1,2,19,750,8356,1,11), +(7037,58720256,4063,1,2,0,750,8354,1,12), +(7038,58720256,4063,1,2,1,750,8356,1,12), +(7039,58720256,4063,1,2,2,750,8351,1,12), +(7040,58720256,4063,1,2,3,750,8355,1,12), +(7041,58720256,4063,1,2,4,750,8354,1,12), +(7042,58720256,4063,1,2,5,750,8356,1,12), +(7043,58720256,4063,1,2,6,750,8351,1,12), +(7044,58720256,4063,1,2,7,750,8354,1,12), +(7045,58720256,4063,1,2,8,750,8355,1,12), +(7046,58720256,4063,1,2,9,750,8351,1,12), +(7047,58720256,4063,1,2,10,750,8356,1,12), +(7048,58720256,4063,1,2,11,750,8354,1,12), +(7049,58720256,4063,1,2,12,750,8355,1,12), +(7050,58720256,4063,1,2,13,750,8351,1,12), +(7051,58720256,4063,1,2,14,750,8356,1,12), +(7052,58720256,4063,1,2,15,750,8354,1,12), +(7053,58720256,4063,1,2,16,750,8355,1,12), +(7054,58720256,4063,1,2,17,750,8351,1,12), +(7055,58720256,4063,1,2,18,750,8356,1,12), +(7056,58720256,4063,1,2,19,750,8354,1,12), +(7057,58720256,4063,1,2,0,750,8354,1,13), +(7058,58720256,4063,1,2,1,750,8356,1,13), +(7059,58720256,4063,1,2,2,750,8351,1,13), +(7060,58720256,4063,1,2,3,750,8355,1,13), +(7061,58720256,4063,1,2,4,750,8354,1,13), +(7062,58720256,4063,1,2,5,750,8356,1,13), +(7063,58720256,4063,1,2,6,750,8351,1,13), +(7064,58720256,4063,1,2,7,750,8354,1,13), +(7065,58720256,4063,1,2,8,750,8355,1,13), +(7066,58720256,4063,1,2,9,750,8351,1,13), +(7067,58720256,4063,1,2,10,750,8356,1,13), +(7068,58720256,4063,1,2,11,750,8354,1,13), +(7069,58720256,4063,1,2,12,750,8355,1,13), +(7070,58720256,4063,1,2,13,750,8351,1,13), +(7071,58720256,4063,1,2,14,750,8356,1,13), +(7072,58720256,4063,1,2,15,750,8354,1,13), +(7073,58720256,4063,1,2,16,750,8355,1,13), +(7074,58720256,4063,1,2,17,750,8351,1,13), +(7075,58720256,4063,1,2,18,750,8356,1,13), +(7076,58720256,4063,1,2,19,750,8354,1,13), +(7077,58720256,4095,1,2,0,750,8362,1,14), +(7078,58720256,4063,0,2,1,747,8321,1,0), +(7079,58720256,4063,0,2,1,747,8321,1,1), +(7080,58720256,4063,0,2,1,747,8321,1,2), +(7081,58720256,4063,0,2,1,747,8321,1,3), +(7082,58720256,4063,0,2,1,747,8321,1,4), +(7083,58720256,4063,0,2,1,747,8321,1,5), +(7084,58720256,4063,0,2,2,747,8325,1,0), +(7085,58720256,4063,0,2,2,747,8325,1,1), +(7086,58720256,4063,0,2,2,747,8325,1,2), +(7087,58720256,4063,0,2,2,747,8325,1,3), +(7088,58720256,4063,0,2,2,747,8325,1,4), +(7089,58720256,4063,0,2,2,747,8325,1,5), +(7090,58720256,4063,0,2,3,747,8325,1,0), +(7091,58720256,4063,0,2,3,747,8325,1,1), +(7092,58720256,4063,0,2,3,747,8325,1,2), +(7093,58720256,4063,0,2,3,747,8325,1,3), +(7094,58720256,4063,0,2,3,747,8325,1,4), +(7095,58720256,4063,0,2,3,747,8325,1,5), +(7096,58720256,4063,0,2,4,747,8321,1,0), +(7097,58720256,4063,0,2,4,747,8321,1,1), +(7098,58720256,4063,0,2,4,747,8324,1,2), +(7099,58720256,4063,0,2,4,747,8321,1,3), +(7100,58720256,4063,0,2,4,747,8321,1,4), +(7101,58720256,4063,0,2,4,747,8321,1,5), +(7102,58720256,4063,0,2,5,747,8322,1,0), +(7103,58720256,4063,0,2,5,747,8322,1,1), +(7104,58720256,4063,0,2,5,747,8322,1,2), +(7105,58720256,4063,0,2,5,747,8322,1,3), +(7106,58720256,4063,0,2,5,747,8322,1,4), +(7107,58720256,4063,0,2,5,747,8322,1,5), +(7108,58720256,4063,0,2,6,747,8318,1,0), +(7109,58720256,4063,0,2,6,747,8318,1,1), +(7110,58720256,4063,0,2,6,747,8318,1,2), +(7111,58720256,4063,0,2,6,747,8318,1,3), +(7112,58720256,4063,0,2,6,747,8318,1,4), +(7113,58720256,4063,0,2,6,747,8318,1,5), +(7114,58720256,4063,0,2,7,747,8322,1,0), +(7115,58720256,4063,0,2,7,747,8322,1,1), +(7116,58720256,4063,0,2,7,747,8322,1,2), +(7117,58720256,4063,0,2,7,747,8322,1,3), +(7118,58720256,4063,0,2,7,747,8322,1,4), +(7119,58720256,4063,0,2,7,747,8322,1,5), +(7120,58720256,4063,0,2,8,747,8321,1,0), +(7121,58720256,4063,0,2,8,747,8321,1,1), +(7122,58720256,4063,0,2,8,747,8321,1,2), +(7123,58720256,4063,0,2,8,747,8321,1,3), +(7124,58720256,4063,0,2,8,747,8321,1,4), +(7125,58720256,4063,0,2,8,747,8321,1,5), +(7126,58720256,4063,0,2,9,747,8325,1,0), +(7127,58720256,4063,0,2,9,747,8325,1,1), +(7128,58720256,4063,0,2,9,747,8325,1,2), +(7129,58720256,4063,0,2,9,747,8325,1,3), +(7130,58720256,4063,0,2,9,747,8325,1,4), +(7131,58720256,4063,0,2,9,747,8325,1,5), +(7132,58720256,4063,0,2,10,747,8325,1,0), +(7133,58720256,4063,0,2,10,747,8325,1,1), +(7134,58720256,4063,0,2,10,747,8325,1,2), +(7135,58720256,4063,0,2,10,747,8325,1,3), +(7136,58720256,4063,0,2,10,747,8325,1,4), +(7137,58720256,4063,0,2,10,747,8325,1,5), +(7138,58720256,4063,0,2,11,747,8321,1,0), +(7139,58720256,4063,0,2,11,747,8321,1,1), +(7140,58720256,4063,0,2,11,747,8321,1,2), +(7141,58720256,4063,0,2,11,747,8321,1,3), +(7142,58720256,4063,0,2,11,747,8321,1,4), +(7143,58720256,4063,0,2,11,747,8321,1,5), +(7144,58720256,4063,0,2,12,747,8322,1,0), +(7145,58720256,4063,0,2,12,747,8322,1,1), +(7146,58720256,4063,0,2,12,747,8322,1,2), +(7147,58720256,4063,0,2,12,747,8322,1,3), +(7148,58720256,4063,0,2,12,747,8322,1,4), +(7149,58720256,4063,0,2,12,747,8322,1,5), +(7150,58720256,4063,0,2,13,747,8318,1,0), +(7151,58720256,4063,0,2,13,747,8318,1,1), +(7152,58720256,4063,0,2,13,747,8318,1,2), +(7153,58720256,4063,0,2,13,747,8318,1,3), +(7154,58720256,4063,0,2,13,747,8318,1,4), +(7155,58720256,4063,0,2,13,747,8318,1,5), +(7156,58720256,4063,0,2,14,747,8322,1,0), +(7157,58720256,4063,0,2,14,747,8322,1,1), +(7158,58720256,4063,0,2,14,747,8322,1,2), +(7159,58720256,4063,0,2,14,747,8322,1,3), +(7160,58720256,4063,0,2,14,747,8322,1,4), +(7161,58720256,4063,0,2,14,747,8322,1,5), +(7162,58720256,4063,0,2,15,747,8324,1,0), +(7163,58720256,4063,0,2,15,747,8324,1,1), +(7164,58720256,4063,0,2,15,747,8324,1,2), +(7165,58720256,4063,0,2,15,747,8324,1,3), +(7166,58720256,4063,0,2,15,747,8324,1,4), +(7167,58720256,4063,0,2,15,747,8324,1,5), +(7168,58720256,4063,0,2,16,747,8324,1,0), +(7169,58720256,4063,0,2,16,747,8325,1,1), +(7170,58720256,4063,0,2,16,747,8325,1,2), +(7171,58720256,4063,0,2,16,747,8325,1,3), +(7172,58720256,4063,0,2,16,747,8325,1,4), +(7173,58720256,4063,0,2,16,747,8325,1,5), +(7174,58720256,4063,0,2,17,747,8325,1,0), +(7175,58720256,4063,0,2,17,747,8325,1,1), +(7176,58720256,4063,0,2,17,747,8325,1,2), +(7177,58720256,4063,0,2,17,747,8325,1,3), +(7178,58720256,4063,0,2,17,747,8325,1,4), +(7179,58720256,4063,0,2,17,747,8325,1,5), +(7180,58720256,4063,0,2,18,747,8321,1,0), +(7181,58720256,4063,0,2,18,747,8321,1,1), +(7182,58720256,4063,0,2,18,747,8321,1,2), +(7183,58720256,4063,0,2,18,747,8321,1,3), +(7184,58720256,4063,0,2,18,747,8321,1,4), +(7185,58720256,4063,0,2,18,747,8321,1,5), +(7186,58720256,4063,0,2,19,747,8322,1,0), +(7187,58720256,4063,0,2,19,747,8322,1,1), +(7188,58720256,4063,0,2,19,747,8322,1,2), +(7189,58720256,4063,0,2,19,747,8322,1,3), +(7190,58720256,4063,0,2,19,747,8322,1,4), +(7191,58720256,4063,0,2,19,747,8322,1,5), +(7192,58720256,4063,0,2,20,747,8318,1,0), +(7193,58720256,4063,0,2,20,747,8318,1,1), +(7194,58720256,4063,0,2,20,747,8318,1,2), +(7195,58720256,4063,0,2,20,747,8318,1,3), +(7196,58720256,4063,0,2,20,747,8318,1,4), +(7197,58720256,4063,0,2,20,747,8322,1,5), +(7198,58720256,4063,0,2,20,747,8318,1,10), +(7199,58720256,4063,0,2,19,747,8322,1,10), +(7200,58720256,4063,0,2,18,747,8321,1,10), +(7201,58720256,4063,0,2,17,747,8325,1,10), +(7202,58720256,4063,0,2,16,747,8325,1,10), +(7203,58720256,4063,0,2,15,747,8324,1,10), +(7204,58720256,4063,0,2,14,747,8322,1,10), +(7205,58720256,4063,0,2,13,747,8318,1,10), +(7206,58720256,4063,0,2,12,747,8322,1,10), +(7207,58720256,4063,0,2,11,747,8321,1,10), +(7208,58720256,4063,0,2,10,747,8325,1,10), +(7209,58720256,4063,0,2,9,747,8325,1,10), +(7210,58720256,4063,0,2,8,747,8321,1,10), +(7211,58720256,4063,0,2,7,747,8322,1,10), +(7212,58720256,4063,0,2,6,747,8318,1,10), +(7213,58720256,4063,0,2,5,747,8322,1,10), +(7214,58720256,4063,0,2,4,747,8321,1,10), +(7215,58720256,4063,0,2,3,747,8325,1,10), +(7216,58720256,4063,0,2,2,747,8325,1,10), +(7217,58720256,4063,0,2,1,747,8321,1,10), +(7218,58720256,4063,0,2,0,747,8323,1,10), +(7219,58720256,4063,0,2,20,747,8318,1,9), +(7220,58720256,4063,0,2,19,747,8322,1,9), +(7221,58720256,4063,0,2,18,747,8321,1,9), +(7222,58720256,4063,0,2,17,747,8325,1,9), +(7223,58720256,4063,0,2,16,747,8325,1,9), +(7224,58720256,4063,0,2,15,747,8324,1,9), +(7225,58720256,4063,0,2,14,747,8322,1,9), +(7226,58720256,4063,0,2,13,747,8318,1,9), +(7227,58720256,4063,0,2,12,747,8322,1,9), +(7228,58720256,4063,0,2,11,747,8321,1,9), +(7229,58720256,4063,0,2,10,747,8325,1,9), +(7230,58720256,4063,0,2,9,747,8325,1,9), +(7231,58720256,4063,0,2,8,747,8321,1,9), +(7232,58720256,4063,0,2,7,747,8322,1,9), +(7233,58720256,4063,0,2,6,747,8318,1,9), +(7234,58720256,4063,0,2,5,747,8322,1,9), +(7235,58720256,4063,0,2,4,747,8321,1,9), +(7236,58720256,4063,0,2,3,747,8325,1,9), +(7237,58720256,4063,0,2,2,747,8325,1,9), +(7238,58720256,4063,0,2,3,747,8325,1,7), +(7239,58720256,4063,0,2,1,747,8321,1,9), +(7240,58720256,4063,0,2,0,747,8323,1,9), +(7241,58720256,4063,0,2,20,747,8318,1,8), +(7242,58720256,4063,0,2,19,747,8322,1,8), +(7243,58720256,4063,0,2,18,747,8321,1,8), +(7244,58720256,4063,0,2,17,747,8325,1,8), +(7245,58720256,4063,0,2,16,747,8325,1,8), +(7246,58720256,4063,0,2,15,747,8324,1,8), +(7247,58720256,4063,0,2,14,747,8322,1,8), +(7248,58720256,4063,0,2,13,747,8318,1,8), +(7249,58720256,4063,0,2,12,747,8322,1,8), +(7250,58720256,4063,0,2,11,747,8321,1,8), +(7251,58720256,4063,0,2,10,747,8325,1,8), +(7252,58720256,4063,0,2,9,747,8325,1,8), +(7253,58720256,4063,0,2,8,747,8321,1,8), +(7254,58720256,4063,0,2,7,747,8322,1,8), +(7255,58720256,4063,0,2,6,747,8318,1,8), +(7256,58720256,4063,0,2,5,747,8322,1,8), +(7257,58720256,4063,0,2,4,747,8324,1,8), +(7258,58720256,4063,0,2,3,747,8325,1,8), +(7259,58720256,4063,0,2,2,747,8325,1,8), +(7260,58720256,4063,0,2,1,747,8321,1,8), +(7261,58720256,4063,0,2,0,747,8323,1,8), +(7262,58720256,4063,0,2,20,747,8318,1,7), +(7263,58720256,4063,0,2,19,747,8322,1,7), +(7264,58720256,4063,0,2,18,747,8321,1,7), +(7265,58720256,4063,0,2,17,747,8325,1,7), +(7266,58720256,4063,0,2,16,747,8325,1,7), +(7267,58720256,4063,0,2,15,747,8324,1,7), +(7268,58720256,4063,0,2,14,747,8322,1,7), +(7269,58720256,4063,0,2,13,747,8318,1,7), +(7270,58720256,4063,0,2,12,747,8322,1,7), +(7271,58720256,4063,0,2,11,747,8321,1,7), +(7272,58720256,4063,0,2,10,747,8325,1,7), +(7273,58720256,4063,0,2,9,747,8325,1,7), +(7274,58720256,4063,0,2,8,747,8321,1,7), +(7275,58720256,4063,0,2,7,747,8322,1,7), +(7276,58720256,4063,0,2,6,747,8318,1,7), +(7277,58720256,4063,0,2,5,747,8322,1,7), +(7278,58720256,4063,0,2,4,747,8321,1,7), +(7279,58720256,4063,0,2,2,747,8325,1,7), +(7280,58720256,4063,0,2,1,747,8321,1,7), +(7281,58720256,4063,0,2,0,747,8323,1,7), +(7282,58720256,4063,0,2,20,747,8318,1,6), +(7283,58720256,4063,0,2,19,747,8322,1,6), +(7284,58720256,4063,0,2,18,747,8321,1,6), +(7285,58720256,4063,0,2,17,747,8325,1,6), +(7286,58720256,4063,0,2,16,747,8324,1,6), +(7287,58720256,4063,0,2,15,747,8324,1,6), +(7288,58720256,4063,0,2,14,747,8322,1,6), +(7289,58720256,4063,0,2,13,747,8318,1,6), +(7290,58720256,4063,0,2,12,747,8322,1,6), +(7291,58720256,4063,0,2,11,747,8321,1,6), +(7292,58720256,4063,0,2,10,747,8325,1,6), +(7293,58720256,4063,0,2,9,747,8325,1,6), +(7294,58720256,4063,0,2,8,747,8321,1,6), +(7295,58720256,4063,0,2,7,747,8322,1,6), +(7296,58720256,4063,0,2,6,747,8318,1,6), +(7297,58720256,4063,0,2,5,747,8322,1,6), +(7298,58720256,4063,0,2,4,747,8321,1,6), +(7299,58720256,4063,0,2,3,747,8325,1,6), +(7300,58720256,4063,0,2,2,747,8325,1,6), +(7301,58720256,4063,0,2,1,747,8321,1,6), +(7302,58720256,4063,0,2,0,747,8318,1,6), +(7303,58720256,4063,0,2,0,747,8323,1,13), +(7304,58720256,4063,0,2,1,747,8321,1,13), +(7305,58720256,4063,0,2,2,747,8325,1,13), +(7306,58720256,4063,0,2,3,747,8325,1,13), +(7307,58720256,4063,0,2,4,747,8321,1,13), +(7308,58720256,4063,0,2,5,747,8322,1,13), +(7309,58720256,4063,0,2,6,747,8318,1,13), +(7310,58720256,4063,0,2,7,747,8322,1,13), +(7311,58720256,4063,0,2,8,747,8321,1,13), +(7312,58720256,4063,0,2,9,747,8325,1,13), +(7313,58720256,4063,0,2,10,747,8325,1,13), +(7314,58720256,4063,0,2,11,747,8321,1,13), +(7315,58720256,4063,0,2,12,747,8322,1,13), +(7316,58720256,4063,0,2,13,747,8318,1,13), +(7317,58720256,4063,0,2,14,747,8322,1,13), +(7318,58720256,4063,0,2,15,747,8324,1,13), +(7319,58720256,4063,0,2,16,747,8325,1,13), +(7320,58720256,4063,0,2,17,747,8325,1,13), +(7321,58720256,4063,0,2,18,747,8321,1,13), +(7322,58720256,4063,0,2,19,747,8322,1,13), +(7323,58720256,4063,0,2,20,747,8318,1,13), +(7324,58720256,4063,0,2,0,747,8323,1,12), +(7325,58720256,4063,0,2,1,747,8321,1,12), +(7326,58720256,4063,0,2,2,747,8325,1,12), +(7327,58720256,4063,0,2,3,747,8325,1,12), +(7328,58720256,4063,0,2,4,747,8324,1,12), +(7329,58720256,4063,0,2,5,747,8322,1,12), +(7330,58720256,4063,0,2,6,747,8318,1,12), +(7331,58720256,4063,0,2,7,747,8322,1,12), +(7332,58720256,4063,0,2,8,747,8321,1,12), +(7333,58720256,4063,0,2,9,747,8325,1,12), +(7334,58720256,4063,0,2,10,747,8325,1,12), +(7335,58720256,4063,0,2,11,747,8321,1,12), +(7336,58720256,4063,0,2,12,747,8322,1,12), +(7337,58720256,4063,0,2,13,747,8318,1,12), +(7338,58720256,4063,0,2,14,747,8322,1,12), +(7339,58720256,4063,0,2,15,747,8324,1,12), +(7340,58720256,4063,0,2,16,747,8325,1,12), +(7341,58720256,4063,0,2,17,747,8325,1,12), +(7342,58720256,4063,0,2,18,747,8321,1,12), +(7343,58720256,4063,0,2,19,747,8322,1,12), +(7344,58720256,4063,0,2,20,747,8318,1,12), +(7345,58720256,4063,0,2,0,747,8323,1,11), +(7346,58720256,4063,0,2,1,747,8321,1,11), +(7347,58720256,4063,0,2,2,747,8325,1,11), +(7348,58720256,4063,0,2,3,747,8325,1,11), +(7349,58720256,4063,0,2,4,747,8321,1,11), +(7350,58720256,4063,0,2,5,747,8322,1,11), +(7351,58720256,4063,0,2,6,747,8318,1,11), +(7352,58720256,4063,0,2,7,747,8322,1,11), +(7353,58720256,4063,0,2,8,747,8321,1,11), +(7354,58720256,4063,0,2,9,747,8325,1,11), +(7355,58720256,4063,0,2,10,747,8325,1,11), +(7356,58720256,4063,0,2,11,747,8321,1,11), +(7357,58720256,4063,0,2,12,747,8322,1,11), +(7358,58720256,4063,0,2,13,747,8318,1,11), +(7359,58720256,4063,0,2,14,747,8322,1,11), +(7360,58720256,4063,0,2,15,747,8324,1,11), +(7361,58720256,4063,0,2,16,747,8325,1,11), +(7362,58720256,4063,0,2,17,747,8325,1,11), +(7363,58720256,4063,0,2,18,747,8321,1,11), +(7364,58720256,4063,0,2,19,747,8322,1,11), +(7365,58720256,4063,0,2,20,747,8318,1,11), +(7366,58720256,4095,0,2,0,747,8361,1,14), +(7367,2147483648,4063,1,2,0,687,7682,1,1), +(7368,2147483648,4063,1,2,1,687,7684,1,1), +(7369,2147483648,4063,1,2,2,687,7686,1,1), +(7370,2147483648,4063,1,2,3,687,7688,1,1), +(7371,2147483648,4063,1,2,4,687,7683,1,1), +(7372,2147483648,4063,1,2,5,687,7690,1,1), +(7373,2147483648,4063,1,2,6,687,7686,1,1), +(7374,2147483648,4063,1,2,0,687,7682,1,2), +(7375,2147483648,4063,1,2,1,687,7684,1,2), +(7376,2147483648,4063,1,2,2,687,7686,1,2), +(7377,2147483648,4063,1,2,3,687,7688,1,2), +(7378,2147483648,4063,1,2,4,687,7683,1,2), +(7379,2147483648,4063,1,2,5,687,7690,1,2), +(7380,2147483648,4063,1,2,6,687,7686,1,2), +(7381,2147483648,4063,1,2,0,687,7692,1,3), +(7382,2147483648,4063,1,2,1,687,7688,1,3), +(7383,2147483648,4063,1,2,2,687,7690,1,3), +(7384,2147483648,4063,1,2,3,687,7692,1,3), +(7385,2147483648,4063,1,2,4,687,7693,1,3), +(7386,2147483648,4063,1,2,5,687,7688,1,3), +(7387,2147483648,4063,1,2,6,687,7690,1,3), +(7390,2147483648,4063,1,2,0,687,7692,1,4), +(7391,2147483648,4063,1,2,1,687,7688,1,4), +(7392,2147483648,4063,1,2,2,687,7690,1,4), +(7393,2147483648,4063,1,2,3,687,7690,1,4), +(7394,2147483648,4063,1,2,4,687,7693,1,4), +(7395,2147483648,4063,1,2,5,687,7688,1,4), +(7396,2147483648,4063,1,2,6,687,7688,1,4), +(7397,2147483648,4063,1,2,0,687,7692,1,5), +(7398,2147483648,4063,1,2,1,687,7690,1,5), +(7399,2147483648,4063,1,2,2,687,7690,1,5), +(7400,2147483648,4063,1,2,3,687,7692,1,5), +(7401,2147483648,4063,1,2,4,687,7693,1,5), +(7402,2147483648,4063,1,2,5,687,7690,1,5), +(7403,2147483648,4063,1,2,6,687,7690,1,5), +(7404,2147483648,4095,1,2,0,687,7696,1,6), +(7405,2147483648,4063,0,2,0,686,7669,1,1), +(7406,2147483648,4063,0,2,1,686,7670,1,1), +(7407,2147483648,4063,0,2,2,686,7671,1,1), +(7408,2147483648,4063,0,2,3,686,7673,1,1), +(7409,2147483648,4063,0,2,4,686,7675,1,1), +(7410,2147483648,4063,0,2,5,686,7677,1,1), +(7411,2147483648,4063,0,2,6,686,7673,1,1), +(7412,2147483648,4063,0,2,0,686,7669,1,2), +(7413,2147483648,4063,0,2,1,686,7670,1,2), +(7414,2147483648,4063,0,2,2,686,7671,1,2), +(7415,2147483648,4063,0,2,3,686,7673,1,2), +(7416,2147483648,4063,0,2,4,686,7675,1,2), +(7417,2147483648,4063,0,2,5,686,7677,1,2), +(7418,2147483648,4063,0,2,6,686,7673,1,2), +(7419,2147483648,4063,0,2,0,686,7679,1,3), +(7420,2147483648,4063,0,2,1,686,7680,1,3), +(7421,2147483648,4063,0,2,2,686,7675,1,3), +(7422,2147483648,4063,0,2,3,686,7679,1,3), +(7423,2147483648,4063,0,2,4,686,7679,1,3), +(7424,2147483648,4063,0,2,5,686,7679,1,3), +(7425,2147483648,4063,0,2,6,686,7679,1,3), +(7426,2147483648,4063,0,2,0,686,7679,1,4), +(7427,2147483648,4063,0,2,1,686,7680,1,4), +(7428,2147483648,4063,0,2,2,686,7675,1,4), +(7429,2147483648,4063,0,2,3,686,7679,1,4), +(7430,2147483648,4063,0,2,4,686,7679,1,4), +(7431,2147483648,4063,0,2,5,686,7679,1,4), +(7432,2147483648,4063,0,2,6,686,7679,1,4), +(7433,2147483648,4063,0,2,0,686,7679,1,5), +(7434,2147483648,4063,0,2,1,686,7680,1,5), +(7435,2147483648,4063,0,2,2,686,7675,1,5), +(7436,2147483648,4063,0,2,3,686,7679,1,5), +(7437,2147483648,4063,0,2,4,686,7679,1,5), +(7438,2147483648,4063,0,2,5,686,7679,1,5), +(7439,2147483648,4063,0,2,6,686,7679,1,5), +(7440,2147483648,4095,0,2,0,686,7695,1,6), +(7441,256,4095,1,5,0,811,9118,0,0), +(7442,256,4095,1,5,1,811,9118,0,0), +(7443,256,4095,1,5,2,811,9118,0,0), +(7444,256,4095,1,5,3,811,9119,0,0), +(7445,256,4095,1,5,4,811,9120,0,0), +(7446,256,4095,1,5,5,811,9121,0,0), +(7447,256,4095,1,5,6,811,9122,0,0), +(7448,256,4095,1,5,7,811,9123,0,0), +(7449,256,4095,1,5,8,811,9124,0,0), +(7450,256,4095,1,5,9,811,9125,0,0), +(7451,256,4095,1,5,10,811,9126,0,0), +(7452,256,4095,1,5,11,811,9127,0,0), +(7453,256,4095,1,5,12,811,9118,0,0), +(7454,256,4095,1,5,13,811,9118,0,0), +(7455,256,4095,1,5,14,811,9118,0,0), +(7456,256,4095,1,5,15,811,9119,0,0), +(7457,256,4095,1,5,16,811,9120,0,0), +(7458,256,4095,1,5,17,811,9121,0,0), +(7459,256,4095,1,5,18,811,9122,0,0), +(7460,256,4095,1,5,19,811,9123,0,0), +(7461,256,4095,1,5,20,811,9124,0,0), +(7462,256,4095,1,5,21,811,9125,0,0), +(7463,256,4095,1,5,22,811,9126,0,0), +(7464,256,4095,1,5,23,811,9127,0,0), +(7465,256,4095,1,5,24,811,9120,0,0), +(7466,4,4063,0,2,0,544,5533,1,1), +(7467,4,4063,0,2,1,544,5534,1,1), +(7468,4,4063,0,2,2,544,5535,1,1), +(7469,4,4063,0,2,3,544,5536,1,1), +(7470,4,4063,0,2,4,544,5537,1,1), +(7471,4,4063,0,2,5,544,5538,1,1), +(7472,4,4063,0,2,6,544,5539,1,1), +(7473,4,4063,0,2,7,544,5540,1,1), +(7474,4,4063,0,2,8,544,5541,1,1), +(7475,4,4063,0,2,9,544,5540,1,1), +(7476,4,4063,0,2,0,544,5533,1,2), +(7477,4,4063,0,2,1,544,5534,1,2), +(7478,4,4063,0,2,2,544,5535,1,2), +(7479,4,4063,0,2,3,544,5536,1,2), +(7480,4,4063,0,2,4,544,5537,1,2), +(7481,4,4063,0,2,5,544,5538,1,2), +(7482,4,4063,0,2,6,544,5539,1,2), +(7483,4,4063,0,2,7,544,5540,1,2), +(7484,4,4063,0,2,8,544,5541,1,2), +(7485,4,4063,0,2,9,544,5540,1,2), +(7486,4,4063,0,2,0,544,5533,1,3), +(7487,4,4063,0,2,1,544,5534,1,3), +(7488,4,4063,0,2,2,544,5535,1,3), +(7489,4,4063,0,2,3,544,5536,1,3), +(7490,4,4063,0,2,4,544,5537,1,3), +(7491,4,4063,0,2,5,544,5538,1,3), +(7492,4,4063,0,2,6,544,5539,1,3), +(7493,4,4063,0,2,7,544,5540,1,3), +(7494,4,4063,0,2,8,544,5541,1,3), +(7495,4,4063,0,2,9,544,5540,1,3), +(7496,4,4063,0,2,0,544,5534,1,4), +(7497,4,4063,0,2,1,544,5534,1,4), +(7498,4,4063,0,2,2,544,5535,1,4), +(7499,4,4063,0,2,3,544,5536,1,4), +(7500,4,4063,0,2,4,544,5537,1,4), +(7501,4,4063,0,2,5,544,5538,1,4), +(7502,4,4063,0,2,6,544,5539,1,4), +(7503,4,4063,0,2,7,544,5540,1,4), +(7504,4,4063,0,2,8,544,5541,1,4), +(7505,4,4063,0,2,9,544,5540,1,4), +(7506,4,4063,0,2,0,544,5533,1,5), +(7507,4,4063,0,2,1,544,5534,1,5), +(7508,4,4063,0,2,2,544,5535,1,5), +(7509,4,4063,0,2,3,544,5542,1,5), +(7510,4,4063,0,2,4,544,5537,1,5), +(7511,4,4063,0,2,5,544,5538,1,5), +(7512,4,4063,0,2,6,544,5539,1,5), +(7513,4,4063,0,2,7,544,5540,1,5), +(7514,4,4063,0,2,8,544,5541,1,5), +(7515,4,4063,0,2,9,544,5540,1,5), +(7516,4,4063,0,2,0,544,5539,1,6), +(7517,4,4063,0,2,1,544,5542,1,6), +(7518,4,4063,0,2,2,544,5544,1,6), +(7519,4,4063,0,2,3,544,5544,1,6), +(7520,4,4063,0,2,4,544,5537,1,6), +(7521,4,4063,0,2,5,544,5538,1,6), +(7522,4,4063,0,2,6,544,5539,1,6), +(7523,4,4063,0,2,7,544,5534,1,6), +(7524,4,4063,0,2,8,544,5542,1,6), +(7525,4,4063,0,2,9,544,5544,1,6), +(7526,4,4063,0,2,0,544,5540,1,7), +(7527,4,4063,0,2,1,544,5540,1,7), +(7528,4,4063,0,2,2,544,5540,1,7), +(7529,4,4063,0,2,3,544,5540,1,7), +(7530,4,4063,0,2,4,544,5540,1,7), +(7531,4,4063,0,2,5,544,5540,1,7), +(7532,4,4063,0,2,6,544,5533,1,7), +(7533,4,4063,0,2,7,544,5538,1,7), +(7534,4,4063,0,2,8,544,5540,1,7), +(7535,4,4063,0,2,9,544,5544,1,7), +(7536,4,4063,0,2,0,544,5542,1,8), +(7537,4,4063,0,2,1,544,5543,1,8), +(7538,4,4063,0,2,2,544,5542,1,8), +(7539,4,4063,0,2,3,544,5542,1,8), +(7540,4,4063,0,2,4,544,5541,1,8), +(7541,4,4063,0,2,5,544,5542,1,8), +(7542,4,4063,0,2,6,544,5542,1,8), +(7543,4,4063,0,2,7,544,5539,1,8), +(7544,4,4063,0,2,8,544,5541,1,8), +(7545,4,4063,0,2,9,544,5544,1,8), +(7546,4,4095,0,2,0,544,15731,1,26), +(7547,68719476736,4095,0,1,15,797,15733,0,0), +(7548,68719476736,4095,1,1,15,799,15734,0,0), +(7549,8,2047,0,8,0,48,789,2,1), +(7550,8,2047,0,8,0,48,789,2,2), +(7551,8,2047,0,8,0,48,789,2,3), +(7552,8,2047,0,8,0,48,789,2,4), +(7553,8,4095,0,8,0,48,795,2,5), +(7554,8,2047,0,8,0,48,789,2,6), +(7555,8,2047,0,8,0,48,789,2,7), +(7556,8,2047,0,8,0,48,789,2,8), +(7557,8,2047,0,8,0,48,789,2,9), +(7558,8,2047,0,8,0,48,789,2,10), +(7559,8,2047,0,8,0,48,789,2,11), +(7560,8,2047,0,8,0,48,789,2,12), +(7561,8,2047,0,8,0,48,789,2,13), +(7562,8,4095,0,8,0,48,795,2,14), +(7563,8,2047,0,8,0,48,789,2,15), +(7564,8,2047,0,8,0,48,789,2,16), +(7565,8,2047,0,8,0,48,789,2,17), +(7566,6291456,4063,1,2,0,464,4162,0,0), +(7567,6291456,4063,1,2,1,464,4153,0,0), +(7568,6291456,4063,1,2,2,464,4161,0,0), +(7569,6291456,4063,1,2,3,464,4163,0,0), +(7570,6291456,4063,1,2,4,464,4154,0,0), +(7571,6291456,4063,1,2,5,464,4160,0,0), +(7572,6291456,4063,1,2,6,464,4160,0,0), +(7573,6291456,4063,1,2,7,464,4156,0,0), +(7574,6291456,4063,1,2,8,464,4152,0,0), +(7575,6291456,4063,1,2,9,464,4154,0,0), +(7576,6291456,4063,1,2,10,464,4155,0,0), +(7577,6291456,4063,1,2,11,464,4165,0,0), +(7578,6291456,4063,1,2,12,464,4165,0,0), +(7579,6291456,4063,1,2,13,464,4155,0,0), +(7580,6291456,32,1,2,14,464,4535,0,0), +(7581,6291456,32,1,2,15,464,4535,0,0), +(7582,6291456,32,1,2,16,464,4535,0,0), +(7583,6291456,32,1,2,17,464,4535,0,0), +(7584,6291456,32,1,2,18,464,4535,0,0), +(7585,6291456,32,1,2,19,464,4535,0,0), +(7586,6291456,32,1,2,20,464,4535,0,0), +(7587,6291456,32,1,2,21,464,4535,0,0), +(7588,6291456,32,1,2,22,464,4535,0,0), +(7589,6291456,32,1,2,23,464,4535,0,0), +(7590,6291456,32,1,2,24,464,4535,0,0), +(7591,6291456,32,1,2,25,464,4535,0,0), +(7592,6291456,32,1,2,26,464,4535,0,0), +(7593,6291456,32,1,2,27,464,4535,0,0), +(7594,6291456,4063,1,2,28,464,4155,0,0), +(7595,6291456,32,1,2,29,464,4535,0,0), +(7596,6291456,4063,1,2,30,464,4165,0,0), +(7597,6291456,32,1,2,31,464,4535,0,0), +(7598,6291456,4063,0,2,0,463,4138,1,0), +(7599,6291456,4063,0,2,1,463,4140,1,0), +(7600,6291456,4063,0,2,2,463,4133,0,0), +(7601,6291456,4063,0,2,3,463,4135,1,0), +(7602,6291456,4063,0,2,4,463,4141,1,0), +(7603,6291456,32,0,2,5,463,4534,0,0), +(7604,6291456,32,0,2,6,463,4534,0,0), +(7605,6291456,32,0,2,7,463,4534,0,0), +(7606,6291456,32,0,2,8,463,4534,0,0), +(7607,6291456,32,0,2,9,463,4534,0,0), +(7608,6291456,32,0,2,10,463,4534,0,0), +(7609,6291456,32,0,2,11,463,4534,0,0), +(7610,6291456,32,0,2,12,463,4534,0,0), +(7611,6291456,32,0,2,13,463,4534,0,0), +(7612,6291456,32,0,2,14,463,4534,0,0), +(7613,6291456,32,0,2,17,463,4534,0,0), +(7614,6291456,32,0,2,18,463,4534,0,0), +(7615,6291456,4063,0,2,15,463,4140,1,0), +(7616,6291456,4063,0,2,16,463,4133,0,0), +(7617,32,4095,0,5,7,801,9014,0,0), +(7618,32,4095,0,5,7,73,1107,0,0), +(7619,32,4095,0,5,7,672,7425,0,0), +(7620,32,4095,0,5,7,671,7408,0,0), +(7621,32,4095,0,5,7,657,7328,0,0), +(7622,32,4095,0,5,7,803,9017,0,0), +(7623,32,4095,0,5,7,653,7316,0,0), +(7624,32,4095,0,5,7,661,7343,0,0), +(7625,32,4095,1,1,14,74,1128,0,0), +(7626,32,4095,1,1,15,74,1129,0,0), +(7627,32,4095,1,1,16,74,1130,0,0), +(7628,32,4095,1,1,17,74,1131,0,0), +(7629,32,4095,1,1,18,74,1132,0,0), +(7630,32,4095,1,1,19,74,1133,0,0), +(7631,32,4095,1,1,20,74,1134,0,0), +(7632,6291456,4095,0,2,0,10,20,1,1), +(7633,6291456,4095,0,2,0,10,20,1,2), +(7634,6291456,4095,0,2,0,10,20,1,3), +(7635,6291456,4095,0,2,0,10,20,1,4), +(7636,6291456,4095,0,2,0,10,20,1,5), +(7637,6291456,4095,0,2,0,10,22,1,6), +(7638,6291456,4095,0,2,0,10,31,1,7), +(7639,6291456,4095,0,2,0,10,20,1,8), +(7641,6291456,4095,0,2,10,10,22,1,7), +(7642,6291456,4095,0,2,10,10,31,1,6), +(7644,6291456,4095,0,2,11,10,31,1,6), +(7645,6291456,4095,0,2,11,10,22,1,7), +(7646,6291456,4095,0,2,12,10,20,1,6), +(7647,6291456,4095,0,2,12,10,20,1,7), +(7648,6291456,4095,0,2,13,10,22,1,6), +(7649,6291456,4095,0,2,13,10,22,1,7), +(7650,6291456,4095,0,2,14,10,31,1,6), +(7651,6291456,4095,0,2,14,10,31,1,7), +(7652,6291456,4095,1,2,7,15,109,1,0), +(7653,6291456,4095,1,2,7,15,109,1,1), +(7654,6291456,4095,1,2,7,15,109,1,2), +(7655,6291456,4095,1,2,7,15,109,1,3), +(7656,6291456,4095,1,2,7,15,109,1,4), +(7657,6291456,4095,1,2,7,15,109,1,5), +(7658,6291456,4095,1,2,7,15,109,1,6), +(7659,6291456,4095,1,2,7,15,109,1,7), +(7660,6291456,4095,1,2,7,15,109,1,8), +(7661,6291456,4095,1,2,7,15,102,1,9), +(7662,6291456,4095,1,2,7,15,102,1,10), +(7663,6291456,4095,1,2,7,15,102,1,11), +(7664,6291456,4095,1,2,9,15,111,1,0), +(7665,6291456,4095,1,2,9,15,111,1,1), +(7666,6291456,4095,1,2,9,15,111,1,2), +(7667,6291456,4095,1,2,9,15,111,1,3), +(7668,6291456,4095,1,2,9,15,111,1,4), +(7669,6291456,4095,1,2,9,15,111,1,5), +(7670,6291456,4095,1,2,9,15,111,1,6), +(7671,6291456,4095,1,2,9,15,111,1,7), +(7672,6291456,4095,1,2,9,15,111,1,8), +(7673,6291456,4095,1,2,9,15,103,1,9), +(7674,6291456,4095,1,2,9,15,103,1,10), +(7675,6291456,4095,1,2,9,15,103,1,11), +(7676,6291456,4095,1,2,13,15,115,1,0), +(7677,6291456,4095,1,2,13,15,115,1,1), +(7678,6291456,4095,1,2,13,15,115,1,2), +(7679,6291456,4095,1,2,13,15,115,1,3), +(7680,6291456,4095,1,2,13,15,115,1,4), +(7681,6291456,4095,1,2,13,15,115,1,5), +(7682,6291456,4095,1,2,13,15,115,1,6), +(7683,6291456,4095,1,2,13,15,115,1,7), +(7684,6291456,4095,1,2,13,15,115,1,8), +(7685,6291456,4095,1,2,13,15,112,1,9), +(7686,6291456,4095,1,2,13,15,112,1,10), +(7687,6291456,4095,1,2,13,15,112,1,11), +(7688,4,4063,0,2,0,31,551,1,1), +(7689,4,4063,0,2,0,31,551,1,2), +(7690,4,4063,0,2,0,31,551,1,3), +(7691,4,4063,0,2,0,31,551,1,4), +(7692,4,4063,0,2,0,31,551,1,5), +(7693,4,4063,0,2,0,31,551,1,6), +(7694,4,4063,0,2,0,31,551,1,7), +(7695,4,4063,0,2,0,31,551,1,8), +(7696,4,32,0,2,0,31,561,1,19), +(7697,4,32,0,2,0,31,561,1,20), +(7698,4,32,0,2,0,31,561,1,21), +(7699,4,4063,0,2,0,31,551,1,26), +(7700,4,4063,0,2,1,31,552,1,1), +(7701,4,4063,0,2,1,31,552,1,2), +(7702,4,4063,0,2,1,31,552,1,3), +(7703,4,4063,0,2,1,31,552,1,4), +(7704,4,4063,0,2,1,31,552,1,5), +(7705,4,4063,0,2,1,31,552,1,6), +(7706,4,4063,0,2,1,31,552,1,7), +(7707,4,4063,0,2,1,31,552,1,8), +(7708,4,32,0,2,1,31,562,1,19), +(7709,4,32,0,2,1,31,562,1,20), +(7710,4,32,0,2,1,31,562,1,21), +(7711,4,4063,0,2,9,31,560,1,1), +(7712,4,4063,0,2,9,31,560,1,2), +(7713,4,4063,0,2,9,31,560,1,3), +(7714,4,4063,0,2,9,31,560,1,4), +(7715,4,4063,0,2,9,31,560,1,5), +(7716,4,4063,0,2,9,31,560,1,6), +(7717,4,4063,0,2,9,31,560,1,7), +(7718,4,4063,0,2,9,31,560,1,8), +(7719,4,32,0,2,9,31,570,1,19), +(7720,4,32,0,2,9,31,570,1,20), +(7721,4,32,0,2,9,31,570,1,21), +(7722,4,4063,1,2,0,36,634,1,1), +(7723,4,4063,1,2,0,36,634,1,2), +(7724,4,4063,1,2,0,36,634,1,3), +(7725,4,4063,1,2,0,36,634,1,4), +(7726,4,4063,1,2,0,36,634,1,5), +(7727,4,4063,1,2,0,36,634,1,6), +(7728,4,4063,1,2,0,36,634,1,7), +(7729,4,4063,1,2,0,36,634,1,8), +(7730,4,32,1,2,0,36,644,1,11), +(7731,4,32,1,2,0,36,644,1,12), +(7732,4,32,1,2,0,36,644,1,13), +(7733,4,4063,1,2,0,36,634,1,18), +(7734,4,4063,1,2,5,36,639,1,1), +(7735,4,4063,1,2,5,36,639,1,2), +(7736,4,4063,1,2,5,36,639,1,3), +(7737,4,4063,1,2,5,36,639,1,4), +(7738,4,4063,1,2,5,36,639,1,5), +(7739,4,4063,1,2,5,36,639,1,6), +(7740,4,4063,1,2,5,36,639,1,7), +(7741,4,4063,1,2,5,36,639,1,8), +(7742,4,32,1,2,5,36,649,1,11), +(7743,4,32,1,2,5,36,649,1,12), +(7744,4,32,1,2,5,36,649,1,13), +(7745,4,4063,1,2,6,36,640,1,1), +(7746,4,4063,1,2,6,36,640,1,2), +(7747,4,4063,1,2,6,36,640,1,3), +(7748,4,4063,1,2,6,36,640,1,4), +(7749,4,4063,1,2,6,36,640,1,5), +(7750,4,4063,1,2,6,36,640,1,6), +(7751,4,4063,1,2,6,36,640,1,7), +(7752,4,4063,1,2,6,36,640,1,8), +(7753,4,32,1,2,6,36,650,1,11), +(7754,4,32,1,2,6,36,650,1,12), +(7755,4,32,1,2,6,36,650,1,13), +(7756,8,4063,0,2,0,41,719,1,1), +(7757,8,4063,0,2,0,41,719,1,2), +(7758,8,4063,0,2,0,41,719,1,3), +(7759,8,4063,0,2,0,41,719,1,4), +(7760,8,4063,0,2,0,41,719,1,5), +(7761,8,4063,0,2,0,41,719,1,6), +(7762,8,4063,0,2,0,41,719,1,7), +(7763,8,4063,0,2,0,41,719,1,8), +(7764,8,4063,0,2,0,41,719,1,14), +(7765,8,4063,0,2,0,41,719,1,15), +(7766,8,4063,0,2,0,41,719,1,16), +(7767,8,4063,0,2,0,41,719,1,17), +(7768,8,4063,0,2,0,41,719,1,18), +(7769,8,4063,0,2,0,41,719,1,19), +(7770,8,4063,0,2,0,41,719,1,20), +(7771,8,4063,0,2,0,41,719,1,21), +(7772,8,4063,0,2,0,41,719,1,22), +(7773,8,32,0,2,0,41,728,1,9), +(7774,8,32,0,2,0,41,728,1,10), +(7775,8,32,0,2,0,41,728,1,11), +(7776,8,4063,0,2,1,41,720,1,1), +(7777,8,4063,0,2,1,41,720,1,2), +(7778,8,4063,0,2,1,41,720,1,3), +(7779,8,4063,0,2,1,41,720,1,4), +(7780,8,4063,0,2,1,41,720,1,5), +(7781,8,4063,0,2,1,41,720,1,6), +(7782,8,4063,0,2,1,41,720,1,7), +(7783,8,4063,0,2,1,41,720,1,8), +(7784,8,4063,0,2,1,41,720,1,14), +(7785,8,4063,0,2,1,41,720,1,15), +(7786,8,4063,0,2,1,41,720,1,16), +(7787,8,4063,0,2,1,41,720,1,17), +(7788,8,4063,0,2,1,41,720,1,18), +(7789,8,4063,0,2,1,41,720,1,19), +(7790,8,4063,0,2,1,41,720,1,22), +(7791,8,32,0,2,1,41,729,1,9), +(7792,8,32,0,2,1,41,729,1,10), +(7793,8,32,0,2,1,41,729,1,11), +(7794,8,4063,0,2,4,41,723,1,1), +(7795,8,4063,0,2,4,41,723,1,2), +(7796,8,4063,0,2,4,41,723,1,3), +(7797,8,4063,0,2,4,41,723,1,4), +(7798,8,4063,0,2,4,41,723,1,5), +(7799,8,4063,0,2,4,41,723,1,6), +(7800,8,4063,0,2,4,41,723,1,7), +(7801,8,4063,0,2,4,41,723,1,8), +(7802,8,4063,0,2,4,41,723,1,14), +(7803,8,4063,0,2,4,41,723,1,15), +(7804,8,4063,0,2,4,41,723,1,16), +(7805,8,4063,0,2,4,41,723,1,17), +(7806,8,4063,0,2,4,41,723,1,18), +(7807,8,4063,0,2,4,41,723,1,19), +(7808,8,4063,0,2,4,41,723,1,22), +(7809,8,32,0,2,4,41,732,1,9), +(7810,8,32,0,2,4,41,732,1,10), +(7811,8,32,0,2,4,41,732,1,11), +(7812,8,4063,1,2,0,50,825,1,1), +(7813,8,4063,1,2,0,50,825,1,2), +(7814,8,4063,1,2,0,50,825,1,3), +(7815,8,4063,1,2,0,50,825,1,4), +(7816,8,4063,1,2,0,50,825,1,5), +(7817,8,4063,1,2,0,50,825,1,6), +(7818,8,4063,1,2,0,50,825,1,7), +(7819,8,4063,1,2,0,50,825,1,8), +(7820,8,4063,1,2,0,50,825,1,14), +(7821,8,4063,1,2,0,50,825,1,15), +(7822,8,4063,1,2,0,50,825,1,16), +(7823,8,4063,1,2,0,50,825,1,17), +(7824,8,4063,1,2,0,50,825,1,18), +(7825,8,4063,1,2,0,50,825,1,19), +(7826,8,4063,1,2,0,50,825,1,20), +(7827,8,4063,1,2,0,50,825,1,21), +(7828,8,4063,1,2,0,50,825,1,22), +(7829,8,32,1,2,0,50,834,1,9), +(7830,8,32,1,2,0,50,834,1,10), +(7831,8,32,1,2,0,50,834,1,11), +(7832,8,4063,1,2,6,50,831,1,1), +(7833,8,4063,1,2,6,50,831,1,2), +(7834,8,4063,1,2,6,50,831,1,3), +(7835,8,4063,1,2,6,50,831,1,4), +(7836,8,4063,1,2,6,50,831,1,5), +(7837,8,4063,1,2,6,50,831,1,6), +(7838,8,4063,1,2,6,50,831,1,7), +(7839,8,4063,1,2,6,50,831,1,8), +(7840,8,4063,1,2,6,50,831,1,22), +(7841,8,32,1,2,6,50,840,1,9), +(7842,8,32,1,2,6,50,840,1,10), +(7843,8,32,1,2,6,50,840,1,11), +(7844,8,4063,1,2,7,50,832,1,1), +(7845,8,4063,1,2,7,50,832,1,2), +(7846,8,4063,1,2,7,50,832,1,3), +(7847,8,4063,1,2,7,50,832,1,4), +(7848,8,4063,1,2,7,50,832,1,5), +(7849,8,4063,1,2,7,50,832,1,6), +(7850,8,4063,1,2,7,50,832,1,7), +(7851,8,4063,1,2,7,50,832,1,8), +(7852,8,4063,1,2,7,50,832,1,22), +(7853,8,32,1,2,7,50,841,1,9), +(7854,8,32,1,2,7,50,841,1,10), +(7855,8,32,1,2,7,50,841,1,11), +(7856,64,4063,0,2,0,81,1185,1,1), +(7857,64,4063,0,2,0,81,1185,1,2), +(7858,64,4063,0,2,0,81,1185,1,3), +(7859,64,4063,0,2,0,81,1185,1,4), +(7860,64,4063,0,2,0,81,1185,1,10), +(7861,64,32,0,2,0,81,1192,1,7), +(7862,64,32,0,2,0,81,1192,1,8), +(7863,64,32,0,2,0,81,1192,1,9), +(7864,64,4063,0,2,2,81,1187,1,1), +(7865,64,4063,0,2,2,81,1187,1,2), +(7866,64,4063,0,2,2,81,1187,1,3), +(7867,64,4063,0,2,2,81,1187,1,4), +(7868,64,32,0,2,2,81,1194,1,7), +(7869,64,32,0,2,2,81,1194,1,8), +(7870,64,32,0,2,2,81,1194,1,9), +(7871,64,4063,0,2,3,81,1188,1,1), +(7872,64,4063,0,2,3,81,1188,1,2), +(7873,64,4063,0,2,3,81,1188,1,3), +(7874,64,4063,0,2,3,81,1188,1,4), +(7875,64,32,0,2,3,81,1195,1,7), +(7876,64,32,0,2,3,81,1195,1,8), +(7877,64,32,0,2,3,81,1195,1,9), +(7878,64,4063,1,2,0,86,1246,1,1), +(7879,64,4063,1,2,0,86,1246,1,2), +(7880,64,4063,1,2,0,86,1246,1,3), +(7881,64,4063,1,2,0,86,1246,1,4), +(7882,64,4063,1,2,0,86,1246,1,10), +(7883,64,32,1,2,0,86,1253,1,7), +(7884,64,32,1,2,0,86,1253,1,8), +(7885,64,32,1,2,0,86,1253,1,9), +(7886,64,4063,1,2,3,86,1249,1,1), +(7887,64,4063,1,2,3,86,1249,1,2), +(7888,64,4063,1,2,3,86,1249,1,3), +(7889,64,4063,1,2,3,86,1249,1,4), +(7890,64,32,1,2,3,86,1256,1,7), +(7891,64,32,1,2,3,86,1256,1,8), +(7892,64,32,1,2,3,86,1256,1,9), +(7893,64,4063,1,2,5,86,1251,1,1), +(7894,64,4063,1,2,5,86,1251,1,2), +(7895,64,4063,1,2,5,86,1251,1,3), +(7896,64,4063,1,2,5,86,1251,1,4), +(7897,64,32,1,2,5,86,1258,1,7), +(7898,64,32,1,2,5,86,1258,1,8), +(7899,64,32,1,2,5,86,1258,1,9), +(7900,1024,4063,0,2,1,129,1891,1,1), +(7901,1024,4063,0,2,1,129,1891,1,2), +(7902,1024,4063,0,2,1,129,1891,1,3), +(7903,1024,4063,0,2,1,129,1891,1,4), +(7904,1024,4063,0,2,1,129,1891,1,5), +(7905,1024,4063,0,2,1,129,1891,1,6), +(7906,1024,4063,0,2,1,129,1891,1,7), +(7907,1024,4063,0,2,1,129,1891,1,8), +(7908,1024,4063,0,2,1,129,1891,1,9), +(7909,1024,4063,0,2,1,129,1891,1,10), +(7910,1024,4063,0,2,1,129,1891,1,11), +(7911,1024,4063,0,2,1,129,1891,1,12), +(7912,1024,4063,0,2,1,129,1891,1,13), +(7913,1024,32,0,2,1,129,1901,1,14), +(7914,1024,32,0,2,1,129,1901,1,15), +(7915,1024,32,0,2,1,129,1901,1,16), +(7916,1024,4063,0,2,4,129,1894,1,1), +(7917,1024,4063,0,2,4,129,1894,1,2), +(7918,1024,4063,0,2,4,129,1894,1,3), +(7919,1024,4063,0,2,4,129,1894,1,4), +(7920,1024,4063,0,2,4,129,1894,1,5), +(7921,1024,4063,0,2,4,129,1894,1,6), +(7922,1024,4063,0,2,4,129,1894,1,7), +(7923,1024,4063,0,2,4,129,1894,1,8), +(7924,1024,4063,0,2,4,129,1894,1,9), +(7925,1024,4063,0,2,4,129,1894,1,10), +(7926,1024,4063,0,2,4,129,1894,1,11), +(7927,1024,4063,0,2,4,129,1894,1,12), +(7928,1024,4063,0,2,4,129,1894,1,13), +(7929,1024,32,0,2,4,129,1904,1,14), +(7930,1024,32,0,2,4,129,1904,1,15), +(7931,1024,32,0,2,4,129,1904,1,16), +(7932,1024,4063,0,2,9,129,1899,1,1), +(7933,1024,4063,0,2,9,129,1899,1,2), +(7934,1024,4063,0,2,9,129,1899,1,3), +(7935,1024,4063,0,2,9,129,1899,1,4), +(7936,1024,4063,0,2,9,129,1899,1,5), +(7937,1024,4063,0,2,9,129,1899,1,6), +(7938,1024,4063,0,2,9,129,1899,1,7), +(7939,1024,4063,0,2,9,129,1899,1,8), +(7940,1024,4063,0,2,9,129,1899,1,9), +(7941,1024,4063,0,2,9,129,1899,1,10), +(7942,1024,4063,0,2,9,129,1899,1,11), +(7943,1024,4063,0,2,9,129,1899,1,12), +(7944,1024,4063,0,2,9,129,1899,1,13), +(7945,1024,32,0,2,9,129,1909,1,14), +(7946,1024,32,0,2,9,129,1909,1,15), +(7947,1024,32,0,2,9,129,1909,1,16), +(7948,1024,4063,1,2,0,134,1963,1,1), +(7949,1024,4063,1,2,0,134,1963,1,2), +(7950,1024,4063,1,2,0,134,1963,1,3), +(7951,1024,4063,1,2,0,134,1963,1,4), +(7952,1024,4063,1,2,0,134,1963,1,5), +(7953,1024,4063,1,2,0,134,1963,1,6), +(7954,1024,4063,1,2,0,134,1963,1,7), +(7955,1024,4063,1,2,0,134,1963,1,8), +(7956,1024,4063,1,2,0,134,1963,1,9), +(7957,1024,4063,1,2,0,134,1963,1,10), +(7958,1024,4063,1,2,0,134,1963,1,11), +(7959,1024,4063,1,2,0,134,1963,1,18), +(7960,1024,32,1,2,0,134,1973,1,12), +(7961,1024,32,1,2,0,134,1973,1,13), +(7962,1024,32,1,2,0,134,1973,1,14), +(7963,1024,4063,1,2,4,134,1967,1,1), +(7964,1024,4063,1,2,4,134,1967,1,2), +(7965,1024,4063,1,2,4,134,1967,1,3), +(7966,1024,4063,1,2,4,134,1967,1,4), +(7967,1024,4063,1,2,4,134,1967,1,5), +(7968,1024,4063,1,2,4,134,1967,1,6), +(7969,1024,4063,1,2,4,134,1967,1,7), +(7970,1024,4063,1,2,4,134,1967,1,8), +(7971,1024,4063,1,2,4,134,1967,1,9), +(7972,1024,4063,1,2,4,134,1967,1,10), +(7973,1024,4063,1,2,4,134,1967,1,11), +(7974,1024,32,1,2,4,134,1977,1,12), +(7975,1024,32,1,2,4,134,1977,1,13), +(7976,1024,32,1,2,4,134,1977,1,14), +(7977,1024,4063,1,2,8,134,1971,1,1), +(7978,1024,4063,1,2,8,134,1971,1,2), +(7979,1024,4063,1,2,8,134,1971,1,3), +(7980,1024,4063,1,2,8,134,1971,1,4), +(7981,1024,4063,1,2,8,134,1971,1,5), +(7982,1024,4063,1,2,8,134,1971,1,6), +(7983,1024,4063,1,2,8,134,1971,1,7), +(7984,1024,4063,1,2,8,134,1971,1,8), +(7985,1024,4063,1,2,8,134,1971,1,9), +(7986,1024,4063,1,2,8,134,1971,1,10), +(7987,1024,4063,1,2,8,134,1971,1,11), +(7988,1024,32,1,2,8,134,1981,1,12), +(7989,1024,32,1,2,8,134,1981,1,13), +(7990,1024,32,1,2,8,134,1981,1,14), +(7991,2097152,4063,0,2,0,204,2241,1,1), +(7992,2097152,4063,0,2,0,204,2241,1,2), +(7993,2097152,4063,0,2,0,204,2241,1,3), +(7994,2097152,4063,0,2,0,204,2241,1,4), +(7995,2097152,4063,0,2,0,204,2241,1,8), +(7996,2097152,32,0,2,0,204,2246,1,5), +(7997,2097152,32,0,2,0,204,2246,1,6), +(7998,2097152,32,0,2,0,204,2246,1,7), +(7999,2097152,4063,1,2,7,209,2323,1,1), +(8000,2097152,4063,1,2,7,209,2323,1,2), +(8001,2097152,4063,1,2,7,209,2323,1,3), +(8002,2097152,4063,1,2,7,209,2323,1,4), +(8003,2097152,4063,1,2,7,209,2323,1,5), +(8004,2097152,4063,1,2,7,209,2323,1,6), +(8005,2097152,4063,1,2,7,209,2323,1,7), +(8006,2097152,4063,1,2,7,209,2323,1,8), +(8007,2097152,32,1,2,7,209,2337,1,9), +(8008,2097152,32,1,2,7,209,2337,1,10), +(8009,2097152,32,1,2,7,209,2337,1,11), +(8010,2097152,4063,1,2,9,209,2325,1,1), +(8011,2097152,4063,1,2,9,209,2325,1,2), +(8012,2097152,4063,1,2,9,209,2325,1,3), +(8013,2097152,4063,1,2,9,209,2325,1,4), +(8014,2097152,4063,1,2,9,209,2325,1,5), +(8015,2097152,4063,1,2,9,209,2325,1,6), +(8016,2097152,4063,1,2,9,209,2325,1,7), +(8017,2097152,4063,1,2,9,209,2325,1,8), +(8018,2097152,32,1,2,9,209,2339,1,9), +(8019,2097152,32,1,2,9,209,2339,1,10), +(8020,2097152,32,1,2,9,209,2339,1,11), +(8021,2097152,4063,1,2,13,209,2329,1,1), +(8022,2097152,4063,1,2,13,209,2329,1,2), +(8023,2097152,4063,1,2,13,209,2329,1,3), +(8024,2097152,4063,1,2,13,209,2329,1,4), +(8025,2097152,4063,1,2,13,209,2329,1,5), +(8026,2097152,4063,1,2,13,209,2329,1,6), +(8027,2097152,4063,1,2,13,209,2329,1,7), +(8028,2097152,4063,1,2,13,209,2329,1,8), +(8029,2097152,32,1,2,13,209,2343,1,9), +(8030,2097152,32,1,2,13,209,2343,1,10), +(8031,2097152,32,1,2,13,209,2343,1,11), +(8032,2,4063,0,2,0,20,384,1,1), +(8033,2,4063,0,2,0,20,384,1,2), +(8034,2,4063,0,2,0,20,384,1,3), +(8035,2,4063,0,2,0,20,384,1,4), +(8036,2,4063,0,2,0,20,384,1,5), +(8037,2,4063,0,2,0,20,384,1,6), +(8038,2,4063,0,2,0,20,384,1,7), +(8039,2,4063,0,2,0,20,384,1,8), +(8040,2,4063,0,2,0,20,384,1,30), +(8041,2,32,0,2,0,20,393,1,15), +(8042,2,32,0,2,0,20,393,1,16), +(8043,2,32,0,2,0,20,393,1,17), +(8044,2,4063,0,2,1,20,385,1,1), +(8045,2,4063,0,2,1,20,385,1,2), +(8046,2,4063,0,2,1,20,385,1,3), +(8047,2,4063,0,2,1,20,385,1,4), +(8048,2,4063,0,2,1,20,385,1,5), +(8049,2,4063,0,2,1,20,385,1,6), +(8050,2,4063,0,2,1,20,385,1,7), +(8051,2,4063,0,2,1,20,385,1,8), +(8052,2,32,0,2,1,20,394,1,15), +(8053,2,32,0,2,1,20,394,1,16), +(8054,2,32,0,2,1,20,394,1,17), +(8055,2,4063,0,2,5,20,389,1,1), +(8056,2,4063,0,2,5,20,389,1,2), +(8057,2,4063,0,2,5,20,389,1,3), +(8058,2,4063,0,2,5,20,389,1,4), +(8059,2,4063,0,2,5,20,389,1,5), +(8060,2,4063,0,2,5,20,389,1,6), +(8061,2,4063,0,2,5,20,389,1,7), +(8062,2,4063,0,2,5,20,389,1,8), +(8063,2,32,0,2,5,20,398,1,15), +(8064,2,32,0,2,5,20,398,1,16), +(8065,2,32,0,2,5,20,398,1,17), +(8066,2,4063,1,2,0,26,472,1,1), +(8067,2,4063,1,2,0,26,472,1,2), +(8068,2,4063,1,2,0,26,472,1,3), +(8069,2,4063,1,2,0,26,472,1,4), +(8070,2,4063,1,2,0,26,472,1,5), +(8071,2,4063,1,2,0,26,472,1,6), +(8072,2,4063,1,2,0,26,472,1,7), +(8073,2,4063,1,2,0,26,472,1,8), +(8074,2,4063,1,2,0,26,472,1,31), +(8075,2,32,1,2,0,26,481,1,11), +(8076,2,32,1,2,0,26,481,1,12), +(8077,2,32,1,2,0,26,481,1,13), +(8078,2,4063,1,2,7,26,479,1,1), +(8079,2,4063,1,2,7,26,479,1,2), +(8080,2,4063,1,2,7,26,479,1,3), +(8081,2,4063,1,2,7,26,479,1,4), +(8082,2,4063,1,2,7,26,479,1,5), +(8083,2,4063,1,2,7,26,479,1,6), +(8084,2,4063,1,2,7,26,479,1,7), +(8085,2,4063,1,2,7,26,479,1,8), +(8086,2,32,1,2,7,26,488,1,11), +(8087,2,32,1,2,7,26,488,1,12), +(8088,2,32,1,2,7,26,488,1,13), +(8089,2,4063,1,2,8,26,480,1,1), +(8090,2,4063,1,2,8,26,480,1,2), +(8091,2,4063,1,2,8,26,480,1,3), +(8092,2,4063,1,2,8,26,480,1,4), +(8093,2,4063,1,2,8,26,480,1,5), +(8094,2,4063,1,2,8,26,480,1,6), +(8095,2,4063,1,2,8,26,480,1,7), +(8096,2,4063,1,2,8,26,480,1,8), +(8097,2,32,1,2,8,26,489,1,11), +(8098,2,32,1,2,8,26,489,1,12), +(8099,2,32,1,2,8,26,489,1,13), +(8100,32,4063,0,2,0,378,1074,1,1), +(8101,32,4063,0,2,0,378,1074,1,2), +(8102,32,4063,0,2,0,378,1074,1,3), +(8103,32,4063,0,2,0,378,1074,1,4), +(8104,32,4063,0,2,0,378,1074,1,5), +(8105,32,4063,0,2,0,378,1074,1,6), +(8106,32,4063,0,2,0,378,1074,1,7), +(8107,32,4063,0,2,0,378,1074,1,8), +(8108,32,4063,0,2,0,378,1074,1,9), +(8109,32,4063,0,2,0,378,1074,1,10), +(8110,32,4063,0,2,0,378,1074,1,11), +(8111,32,4063,0,2,0,378,1074,1,12), +(8112,32,4063,0,2,0,378,1074,1,13), +(8113,32,4063,0,2,0,378,1074,1,14), +(8114,32,4063,0,2,0,378,1074,1,15), +(8115,32,4063,0,2,0,378,1074,1,16), +(8116,32,4063,0,2,0,378,1074,1,17), +(8117,32,4063,0,2,0,378,1074,1,18), +(8118,32,4063,0,2,0,378,1074,1,28), +(8119,32,32,0,2,0,378,1079,1,19), +(8120,32,32,0,2,0,378,1079,1,20), +(8121,32,32,0,2,0,378,1079,1,21), +(8122,32,4063,0,2,2,378,1076,1,1), +(8123,32,4063,0,2,2,378,1076,1,2), +(8124,32,4063,0,2,2,378,1076,1,3), +(8125,32,4063,0,2,2,378,1076,1,4), +(8126,32,4063,0,2,2,378,1076,1,5), +(8127,32,4063,0,2,2,378,1076,1,6), +(8128,32,4063,0,2,2,378,1076,1,7), +(8129,32,4063,0,2,2,378,1076,1,8), +(8130,32,4063,0,2,2,378,1076,1,9), +(8131,32,4063,0,2,2,378,1076,1,10), +(8132,32,4063,0,2,2,378,1076,1,11), +(8133,32,4063,0,2,2,378,1076,1,12), +(8134,32,4063,0,2,2,378,1076,1,13), +(8135,32,4063,0,2,2,378,1076,1,14), +(8136,32,4063,0,2,2,378,1076,1,15), +(8137,32,4063,0,2,2,378,1076,1,16), +(8138,32,4063,0,2,2,378,1076,1,17), +(8139,32,4063,0,2,2,378,1076,1,18), +(8140,32,32,0,2,2,378,1081,1,19), +(8141,32,32,0,2,2,378,1081,1,20), +(8142,32,32,0,2,2,378,1081,1,21), +(8143,32,4063,0,2,4,378,1078,1,1), +(8144,32,4063,0,2,4,378,1078,1,2), +(8145,32,4063,0,2,4,378,1078,1,3), +(8146,32,4063,0,2,4,378,1078,1,4), +(8147,32,4063,0,2,4,378,1078,1,5), +(8148,32,4063,0,2,4,378,1078,1,6), +(8149,32,4063,0,2,4,378,1078,1,7), +(8150,32,4063,0,2,4,378,1078,1,8), +(8151,32,4063,0,2,4,378,1078,1,9), +(8152,32,4063,0,2,4,378,1078,1,10), +(8153,32,4063,0,2,4,378,1078,1,11), +(8154,32,4063,0,2,4,378,1078,1,12), +(8155,32,4063,0,2,4,378,1078,1,13), +(8156,32,4063,0,2,4,378,1078,1,14), +(8157,32,4063,0,2,4,378,1078,1,15), +(8158,32,4063,0,2,4,378,1078,1,16), +(8159,32,4063,0,2,4,378,1078,1,17), +(8160,32,4063,0,2,4,378,1078,1,18), +(8161,32,32,0,2,4,378,1083,1,19), +(8162,32,32,0,2,4,378,1083,1,20), +(8163,32,32,0,2,4,378,1083,1,21), +(8164,32,4063,1,2,0,379,1135,1,1), +(8165,32,4063,1,2,0,379,1135,1,2), +(8166,32,4063,1,2,0,379,1135,1,3), +(8167,32,4063,1,2,0,379,1135,1,4), +(8168,32,4063,1,2,0,379,1135,1,5), +(8169,32,4063,1,2,0,379,1135,1,6), +(8170,32,4063,1,2,0,379,1135,1,7), +(8171,32,4063,1,2,0,379,1135,1,8), +(8172,32,4063,1,2,0,379,1135,1,9), +(8173,32,4063,1,2,0,379,1135,1,10), +(8174,32,4063,1,2,0,379,1135,1,20), +(8175,32,32,1,2,0,379,1139,1,11), +(8176,32,32,1,2,0,379,1139,1,12), +(8177,32,32,1,2,0,379,1139,1,13), +(8178,32,4063,1,2,2,379,1137,1,1), +(8179,32,4063,1,2,2,379,1137,1,2), +(8180,32,4063,1,2,2,379,1137,1,3), +(8181,32,4063,1,2,2,379,1137,1,4), +(8182,32,4063,1,2,2,379,1137,1,5), +(8183,32,4063,1,2,2,379,1137,1,6), +(8184,32,4063,1,2,2,379,1137,1,7), +(8185,32,4063,1,2,2,379,1137,1,8), +(8186,32,4063,1,2,2,379,1137,1,9), +(8187,32,4063,1,2,2,379,1137,1,10), +(8188,32,32,1,2,2,379,1141,1,11), +(8189,32,32,1,2,2,379,1141,1,12), +(8190,32,32,1,2,2,379,1141,1,13), +(8191,32,4063,1,2,3,379,1138,1,1), +(8192,32,4063,1,2,3,379,1138,1,2), +(8193,32,4063,1,2,3,379,1138,1,3), +(8194,32,4063,1,2,3,379,1138,1,4), +(8195,32,4063,1,2,3,379,1138,1,5), +(8196,32,4063,1,2,3,379,1138,1,6), +(8197,32,4063,1,2,3,379,1138,1,7), +(8198,32,4063,1,2,3,379,1138,1,8), +(8199,32,4063,1,2,3,379,1138,1,9), +(8200,32,4063,1,2,3,379,1138,1,10), +(8201,32,32,1,2,3,379,1142,1,11), +(8202,32,32,1,2,3,379,1142,1,12), +(8203,32,32,1,2,3,379,1142,1,13), +(8204,128,4063,0,2,0,91,1315,1,1), +(8205,128,4063,0,2,0,91,1315,1,2), +(8206,128,4063,0,2,0,91,1315,1,3), +(8207,128,4063,0,2,0,91,1315,1,4), +(8208,128,4063,0,2,0,91,1315,1,5), +(8209,128,4063,0,2,0,91,1315,1,18), +(8210,128,32,0,2,0,91,1320,1,15), +(8211,128,32,0,2,0,91,1320,1,16), +(8212,128,32,0,2,0,91,1320,1,17), +(8213,128,4063,0,2,1,91,1316,1,1), +(8214,128,4063,0,2,1,91,1316,1,2), +(8215,128,4063,0,2,1,91,1316,1,3), +(8216,128,4063,0,2,1,91,1316,1,4), +(8217,128,4063,0,2,1,91,1316,1,5), +(8218,128,32,0,2,1,91,1321,1,15), +(8219,128,32,0,2,1,91,1321,1,16), +(8220,128,32,0,2,1,91,1321,1,17), +(8221,128,4063,0,2,3,91,1318,1,1), +(8222,128,4063,0,2,3,91,1318,1,2), +(8223,128,4063,0,2,3,91,1318,1,3), +(8224,128,4063,0,2,3,91,1318,1,4), +(8225,128,4063,0,2,3,91,1318,1,5), +(8226,128,32,0,2,3,91,1323,1,15), +(8227,128,32,0,2,3,91,1323,1,16), +(8228,128,32,0,2,3,91,1323,1,17), +(8229,128,4063,1,2,0,96,1382,1,1), +(8230,128,4063,1,2,0,96,1382,1,2), +(8231,128,4063,1,2,0,96,1382,1,3), +(8232,128,4063,1,2,0,96,1382,1,4), +(8233,128,4063,1,2,0,96,1382,1,5), +(8234,128,4063,1,2,0,96,1382,1,18), +(8235,128,32,1,2,0,96,1388,1,15), +(8236,128,32,1,2,0,96,1388,1,16), +(8237,128,32,1,2,0,96,1388,1,17), +(8238,128,4063,1,2,3,96,1385,1,1), +(8239,128,4063,1,2,3,96,1385,1,2), +(8240,128,4063,1,2,3,96,1385,1,3), +(8241,128,4063,1,2,3,96,1385,1,4), +(8242,128,4063,1,2,3,96,1385,1,5), +(8243,128,32,1,2,3,96,1391,1,15), +(8244,128,32,1,2,3,96,1391,1,16), +(8245,128,32,1,2,3,96,1391,1,17), +(8246,128,4063,1,2,5,96,1387,1,1), +(8247,128,4063,1,2,5,96,1387,1,2), +(8248,128,4063,1,2,5,96,1387,1,3), +(8249,128,4063,1,2,5,96,1387,1,4), +(8250,128,4063,1,2,5,96,1387,1,5), +(8251,128,32,1,2,5,96,1393,1,15), +(8252,128,32,1,2,5,96,1393,1,16), +(8253,128,32,1,2,5,96,1393,1,17), +(8254,512,4063,0,2,2,111,1628,1,1), +(8255,512,4063,0,2,2,111,1628,1,2), +(8256,512,4063,0,2,2,111,1628,1,3), +(8257,512,4063,0,2,2,111,1628,1,4), +(8258,512,4063,0,2,2,111,1628,1,5), +(8259,512,4063,0,2,2,111,1628,1,6), +(8260,512,4063,0,2,2,111,1628,1,7), +(8261,512,4063,0,2,2,111,1628,1,8), +(8262,512,4063,0,2,2,111,1628,1,9), +(8263,512,4063,0,2,2,111,1628,1,19), +(8264,512,4063,0,2,2,111,1628,1,20), +(8265,512,4063,0,2,2,111,1628,1,21), +(8266,512,4063,0,2,2,111,1628,1,22), +(8267,512,4063,0,2,2,111,1628,1,23), +(8268,512,4063,0,2,2,111,1628,1,24), +(8269,512,32,0,2,2,111,1638,1,16), +(8270,512,32,0,2,2,111,1638,1,17), +(8271,512,32,0,2,2,111,1638,1,18), +(8272,512,4063,0,2,4,111,1630,1,1), +(8273,512,4063,0,2,4,111,1630,1,2), +(8274,512,4063,0,2,4,111,1630,1,3), +(8275,512,4063,0,2,4,111,1630,1,4), +(8276,512,4063,0,2,4,111,1630,1,5), +(8277,512,4063,0,2,4,111,1630,1,6), +(8278,512,4063,0,2,4,111,1630,1,7), +(8279,512,4063,0,2,4,111,1630,1,8), +(8280,512,4063,0,2,4,111,1630,1,9), +(8281,512,4063,0,2,4,111,1630,1,19), +(8282,512,4063,0,2,4,111,1630,1,20), +(8283,512,4063,0,2,4,111,1630,1,21), +(8284,512,4063,0,2,4,111,1630,1,22), +(8285,512,4063,0,2,4,111,1630,1,23), +(8286,512,4063,0,2,4,111,1630,1,24), +(8287,512,32,0,2,4,111,1640,1,16), +(8288,512,32,0,2,4,111,1640,1,17), +(8289,512,32,0,2,4,111,1640,1,18), +(8290,512,2015,0,2,7,111,1633,1,1), +(8291,512,2015,0,2,7,111,1633,1,2), +(8292,512,2015,0,2,7,111,1633,1,3), +(8293,512,2015,0,2,7,111,1633,1,4), +(8294,512,2015,0,2,7,111,1633,1,5), +(8295,512,2015,0,2,7,111,1633,1,6), +(8296,512,2015,0,2,7,111,1633,1,7), +(8297,512,2015,0,2,7,111,1633,1,8), +(8298,512,2015,0,2,7,111,1633,1,9), +(8299,512,32,0,2,7,111,1643,1,16), +(8300,512,32,0,2,7,111,1643,1,17), +(8301,512,32,0,2,7,111,1643,1,18), +(8302,512,4063,1,2,0,120,1758,1,1), +(8303,512,4063,1,2,0,120,1758,1,2), +(8304,512,4063,1,2,0,120,1758,1,3), +(8305,512,4063,1,2,0,120,1758,1,4), +(8306,512,4063,1,2,0,120,1758,1,5), +(8307,512,4063,1,2,0,120,1758,1,6), +(8308,512,4063,1,2,0,120,1758,1,7), +(8309,512,4063,1,2,0,120,1758,1,8), +(8310,512,4063,1,2,0,120,1758,1,9), +(8311,512,4063,1,2,0,120,1758,1,19), +(8312,512,4063,1,2,0,120,1758,1,20), +(8313,512,4063,1,2,0,120,1758,1,21), +(8314,512,4063,1,2,0,120,1758,1,22), +(8315,512,4063,1,2,0,120,1758,1,23), +(8316,512,4063,1,2,0,120,1758,1,24), +(8317,512,4063,1,2,0,120,1758,1,25), +(8318,512,32,1,2,0,120,1768,1,16), +(8319,512,32,1,2,0,120,1768,1,17), +(8320,512,32,1,2,0,120,1768,1,18), +(8321,512,4063,1,2,3,120,1761,1,1), +(8322,512,4063,1,2,3,120,1761,1,2), +(8323,512,4063,1,2,3,120,1761,1,3), +(8324,512,4063,1,2,3,120,1761,1,4), +(8325,512,4063,1,2,3,120,1761,1,5), +(8326,512,4063,1,2,3,120,1761,1,6), +(8327,512,4063,1,2,3,120,1761,1,7), +(8328,512,4063,1,2,3,120,1761,1,8), +(8329,512,4063,1,2,3,120,1761,1,9), +(8330,512,4063,1,2,3,120,1761,1,19), +(8331,512,4063,1,2,3,120,1761,1,20), +(8332,512,4063,1,2,3,120,1761,1,21), +(8333,512,4063,1,2,3,120,1761,1,22), +(8334,512,4063,1,2,3,120,1761,1,23), +(8335,512,4063,1,2,3,120,1761,1,24), +(8336,512,32,1,2,3,120,1771,1,16), +(8337,512,32,1,2,3,120,1771,1,17), +(8338,512,32,1,2,3,120,1771,1,18), +(8339,512,2015,1,2,8,120,1766,1,1), +(8340,512,2015,1,2,8,120,1766,1,2), +(8341,512,2015,1,2,8,120,1766,1,3), +(8342,512,2015,1,2,8,120,1766,1,4), +(8343,512,2015,1,2,8,120,1766,1,5), +(8344,512,2015,1,2,8,120,1766,1,6), +(8345,512,2015,1,2,8,120,1766,1,7), +(8346,512,2015,1,2,8,120,1766,1,8), +(8347,512,2015,1,2,8,120,1766,1,9), +(8348,512,32,1,2,8,120,1776,1,16), +(8349,512,32,1,2,8,120,1776,1,17), +(8350,512,32,1,2,8,120,1776,1,18), +(8351,256,4063,0,2,0,101,1446,1,1), +(8352,256,4063,0,2,0,101,1446,1,2), +(8353,256,4063,0,2,0,101,1446,1,3), +(8354,256,4063,0,2,0,101,1446,1,4), +(8355,256,4063,0,2,0,101,1446,1,5), +(8356,256,4063,0,2,0,101,1446,1,6), +(8357,256,4063,0,2,0,101,1446,1,7), +(8358,256,4063,0,2,0,101,1446,1,8), +(8359,256,32,0,2,0,101,1451,1,9), +(8360,256,32,0,2,0,101,1451,1,10), +(8361,256,32,0,2,0,101,1451,1,11), +(8362,256,4063,0,2,0,101,1446,1,19), +(8363,256,4063,0,2,1,101,1447,1,1), +(8364,256,4063,0,2,1,101,1447,1,2), +(8365,256,4063,0,2,1,101,1447,1,3), +(8366,256,4063,0,2,1,101,1447,1,4), +(8367,256,4063,0,2,1,101,1447,1,5), +(8368,256,4063,0,2,1,101,1447,1,6), +(8369,256,4063,0,2,1,101,1447,1,7), +(8370,256,4063,0,2,1,101,1447,1,8), +(8371,256,32,0,2,1,101,1452,1,9), +(8372,256,32,0,2,1,101,1452,1,10), +(8373,256,32,0,2,1,101,1452,1,11), +(8374,256,4063,0,2,2,101,1448,1,1), +(8375,256,4063,0,2,2,101,1448,1,2), +(8376,256,4063,0,2,2,101,1448,1,3), +(8377,256,4063,0,2,2,101,1448,1,4), +(8378,256,4063,0,2,2,101,1448,1,5), +(8379,256,4063,0,2,2,101,1448,1,6), +(8380,256,4063,0,2,2,101,1448,1,7), +(8381,256,4063,0,2,2,101,1448,1,8), +(8382,256,32,0,2,2,101,1453,1,9), +(8383,256,32,0,2,2,101,1453,1,10), +(8384,256,32,0,2,2,101,1453,1,11), +(8385,256,4063,1,2,0,106,1526,1,1), +(8386,256,4063,1,2,0,106,1526,1,2), +(8387,256,4063,1,2,0,106,1526,1,3), +(8388,256,4063,1,2,0,106,1526,1,4), +(8389,256,4063,1,2,0,106,1526,1,5), +(8390,256,4063,1,2,0,106,1526,1,6), +(8391,256,4063,1,2,0,106,1526,1,7), +(8392,256,4063,1,2,0,106,1526,1,8), +(8393,256,4063,1,2,0,106,1526,1,12), +(8394,256,32,1,2,0,106,1536,1,9), +(8395,256,32,1,2,0,106,1536,1,10), +(8396,256,32,1,2,0,106,1536,1,11), +(8397,256,4063,1,2,6,106,1532,1,1), +(8398,256,4063,1,2,6,106,1532,1,2), +(8399,256,4063,1,2,6,106,1532,1,3), +(8400,256,4063,1,2,6,106,1532,1,4), +(8401,256,4063,1,2,6,106,1532,1,5), +(8402,256,4063,1,2,6,106,1532,1,6), +(8403,256,4063,1,2,6,106,1532,1,7), +(8404,256,4063,1,2,6,106,1532,1,8), +(8405,256,32,1,2,6,106,1542,1,9), +(8406,256,32,1,2,6,106,1542,1,10), +(8407,256,32,1,2,6,106,1542,1,11), +(8408,256,4063,1,2,9,106,1535,1,1), +(8409,256,4063,1,2,9,106,1535,1,2), +(8410,256,4063,1,2,9,106,1535,1,3), +(8411,256,4063,1,2,9,106,1535,1,4), +(8412,256,4063,1,2,9,106,1535,1,5), +(8413,256,4063,1,2,9,106,1535,1,6), +(8414,256,4063,1,2,9,106,1535,1,7), +(8415,256,4063,1,2,9,106,1535,1,8), +(8416,256,32,1,2,9,106,15730,1,9), +(8417,256,32,1,2,9,106,15730,1,10), +(8418,256,32,1,2,9,106,15730,1,11), +(8419,8,2015,1,2,0,683,7622,1,1), +(8420,8,2015,1,2,0,683,7622,1,2), +(8421,8,2015,1,2,0,683,7622,1,3), +(8422,8,2015,1,2,0,683,7622,1,4), +(8423,8,2015,1,2,0,683,7622,1,5), +(8424,8,2015,1,2,0,683,7622,1,6), +(8425,8,2015,1,2,0,683,7622,1,7), +(8426,8,2015,1,2,0,683,7622,1,8), +(8427,8,32,1,2,0,683,7634,1,9), +(8428,8,32,1,2,0,683,7634,1,10), +(8429,8,32,1,2,0,683,7634,1,11), +(8430,8,2048,1,2,0,683,7636,1,14), +(8431,8,2048,1,2,0,683,7636,1,15), +(8432,8,2048,1,2,0,683,7636,1,16), +(8433,8,2048,1,2,0,683,7636,1,17), +(8434,8,2048,1,2,0,683,7636,1,18), +(8435,8,2048,1,2,0,683,7636,1,19), +(8436,8,4095,1,2,0,683,7638,1,20), +(8437,8,4095,1,2,0,683,7633,1,21), +(8438,8,2047,1,2,0,683,7630,1,22), +(8439,8,2015,1,2,1,683,7622,1,1), +(8440,8,2015,1,2,1,683,7622,1,2), +(8441,8,2015,1,2,1,683,7622,1,3), +(8442,8,2015,1,2,1,683,7622,1,4), +(8443,8,2015,1,2,1,683,7622,1,5), +(8444,8,2015,1,2,1,683,7622,1,6), +(8445,8,2015,1,2,1,683,7622,1,7), +(8446,8,2015,1,2,1,683,7622,1,8), +(8447,8,2048,1,2,1,683,7636,1,14), +(8448,8,2048,1,2,1,683,7636,1,15), +(8449,8,2048,1,2,1,683,7636,1,16), +(8450,8,2048,1,2,1,683,7636,1,17), +(8451,8,2048,1,2,1,683,7636,1,18), +(8452,8,2048,1,2,1,683,7636,1,19), +(8453,8,2047,1,2,1,683,7630,1,22), +(8454,8,2015,1,2,2,683,7622,1,1), +(8455,8,2015,1,2,2,683,7622,1,2), +(8456,8,2015,1,2,2,683,7622,1,3), +(8457,8,2015,1,2,2,683,7622,1,4), +(8458,8,2015,1,2,2,683,7622,1,5), +(8459,8,2015,1,2,2,683,7622,1,6), +(8460,8,2015,1,2,2,683,7622,1,7), +(8461,8,2015,1,2,2,683,7622,1,8), +(8462,8,2048,1,2,2,683,7636,1,14), +(8463,8,2048,1,2,2,683,7636,1,15), +(8464,8,2048,1,2,2,683,7636,1,16), +(8465,8,2048,1,2,2,683,7636,1,17), +(8466,8,2048,1,2,2,683,7636,1,18), +(8467,8,2048,1,2,2,683,7636,1,19), +(8468,8,2047,1,2,2,683,7630,1,22), +(8469,8,2047,1,2,3,683,7630,1,22), +(8470,8,2048,1,2,3,683,7636,1,19), +(8471,8,2048,1,2,3,683,7636,1,18), +(8472,8,2048,1,2,3,683,7636,1,17), +(8473,8,2048,1,2,3,683,7636,1,16), +(8474,8,2048,1,2,3,683,7636,1,15), +(8475,8,2048,1,2,3,683,7636,1,14), +(8476,8,2015,1,2,3,683,7622,1,8), +(8477,8,2015,1,2,3,683,7622,1,7), +(8478,8,2015,1,2,3,683,7622,1,6), +(8479,8,2015,1,2,3,683,7622,1,5), +(8480,8,2015,1,2,3,683,7622,1,4), +(8481,8,2015,1,2,3,683,7622,1,3), +(8482,8,2015,1,2,3,683,7622,1,2), +(8483,8,2015,1,2,3,683,7622,1,1), +(8484,8,2047,1,2,4,683,7630,1,22), +(8485,8,2048,1,2,4,683,7636,1,19), +(8486,8,2048,1,2,4,683,7636,1,18), +(8487,8,2048,1,2,4,683,7636,1,17), +(8488,8,2048,1,2,4,683,7636,1,16), +(8489,8,2048,1,2,4,683,7636,1,15), +(8490,8,2048,1,2,4,683,7636,1,14), +(8491,8,2015,1,2,4,683,7622,1,8), +(8492,8,2015,1,2,4,683,7622,1,7), +(8493,8,2015,1,2,4,683,7622,1,6), +(8494,8,2015,1,2,4,683,7622,1,5), +(8495,8,2015,1,2,4,683,7622,1,4), +(8496,8,2015,1,2,4,683,7622,1,3), +(8497,8,2015,1,2,4,683,7622,1,2), +(8498,8,2015,1,2,4,683,7622,1,1), +(8499,8,2047,1,2,5,683,7630,1,22), +(8500,8,2048,1,2,5,683,7636,1,19), +(8501,8,2048,1,2,5,683,7636,1,18), +(8502,8,2048,1,2,5,683,7636,1,17), +(8503,8,2048,1,2,5,683,7636,1,16), +(8504,8,2048,1,2,5,683,7636,1,15), +(8505,8,2048,1,2,5,683,7636,1,14), +(8506,8,2015,1,2,5,683,7622,1,8), +(8507,8,2015,1,2,5,683,7622,1,7), +(8508,8,2015,1,2,5,683,7622,1,6), +(8509,8,2015,1,2,5,683,7622,1,5), +(8510,8,2015,1,2,5,683,7622,1,4), +(8511,8,2015,1,2,5,683,7622,1,3), +(8512,8,2015,1,2,5,683,7622,1,2), +(8513,8,2015,1,2,5,683,7622,1,1), +(8514,8,2047,1,2,6,683,7630,1,22), +(8515,8,32,1,2,6,683,7634,1,11), +(8516,8,32,1,2,6,683,7634,1,10), +(8517,8,32,1,2,6,683,7634,1,9), +(8518,8,2015,1,2,6,683,7622,1,8), +(8519,8,2015,1,2,6,683,7622,1,7), +(8520,8,2015,1,2,6,683,7622,1,6), +(8521,8,2015,1,2,6,683,7622,1,5), +(8522,8,2015,1,2,6,683,7622,1,4), +(8523,8,2015,1,2,6,683,7622,1,3), +(8524,8,2015,1,2,6,683,7622,1,2), +(8525,8,2015,1,2,6,683,7622,1,1), +(8526,8,2047,1,2,7,683,7630,1,22), +(8527,8,32,1,2,7,683,7634,1,11), +(8528,8,32,1,2,7,683,7634,1,10), +(8529,8,32,1,2,7,683,7634,1,9), +(8530,8,2015,1,2,7,683,7622,1,8), +(8531,8,2015,1,2,7,683,7622,1,7), +(8532,8,2015,1,2,7,683,7622,1,6), +(8533,8,2015,1,2,7,683,7622,1,5), +(8534,8,2015,1,2,7,683,7622,1,4), +(8535,8,2015,1,2,7,683,7622,1,3), +(8536,8,2015,1,2,7,683,7622,1,2), +(8537,8,2015,1,2,7,683,7622,1,1), +(8538,8,2047,1,2,8,683,7630,1,22), +(8539,8,2015,1,2,8,683,7622,1,8), +(8540,8,2015,1,2,8,683,7622,1,7), +(8541,8,2015,1,2,8,683,7622,1,6), +(8542,8,2015,1,2,8,683,7622,1,5), +(8543,8,2015,1,2,8,683,7622,1,4), +(8544,8,2015,1,2,8,683,7622,1,3), +(8545,8,2015,1,2,8,683,7622,1,2), +(8546,8,2015,1,2,8,683,7622,1,1), +(8547,8,2015,0,2,0,682,7610,1,1), +(8548,8,2015,0,2,0,682,7610,1,2), +(8549,8,2015,0,2,0,682,7610,1,3), +(8550,8,2015,0,2,0,682,7610,1,4), +(8551,8,2015,0,2,0,682,7610,1,5), +(8552,8,2015,0,2,0,682,7610,1,6), +(8553,8,2015,0,2,0,682,7610,1,7), +(8554,8,2015,0,2,0,682,7610,1,8), +(8555,8,32,0,2,0,682,7618,1,9), +(8556,8,32,0,2,0,682,7618,1,10), +(8557,8,32,0,2,0,682,7618,1,11), +(8558,8,2048,0,2,0,682,7635,1,14), +(8559,8,2048,0,2,0,682,7635,1,15), +(8560,8,2048,0,2,0,682,7635,1,16), +(8561,8,2048,0,2,0,682,7635,1,17), +(8562,8,2048,0,2,0,682,7635,1,18), +(8563,8,2048,0,2,0,682,7635,1,19), +(8564,8,4095,0,2,0,682,7637,1,20), +(8565,8,4095,0,2,0,682,7617,1,21), +(8566,8,2047,0,2,0,682,7614,1,22), +(8567,8,2047,0,2,1,682,7614,1,22), +(8568,8,2048,0,2,1,682,7635,1,19), +(8569,8,2048,0,2,1,682,7635,1,18), +(8570,8,2048,0,2,1,682,7635,1,17), +(8571,8,2048,0,2,1,682,7635,1,16), +(8572,8,2048,0,2,1,682,7635,1,15), +(8573,8,2048,0,2,1,682,7635,1,14), +(8574,8,32,0,2,1,682,7618,1,11), +(8575,8,32,0,2,1,682,7618,1,10), +(8576,8,32,0,2,1,682,7618,1,9), +(8577,8,2015,0,2,1,682,7610,1,8), +(8578,8,2015,0,2,1,682,7610,1,7), +(8579,8,2015,0,2,1,682,7610,1,6), +(8580,8,2015,0,2,1,682,7610,1,5), +(8581,8,2015,0,2,1,682,7610,1,4), +(8582,8,2015,0,2,1,682,7610,1,3), +(8583,8,2015,0,2,1,682,7610,1,2), +(8584,8,2015,0,2,1,682,7610,1,1), +(8585,8,2047,0,2,2,682,7614,1,22), +(8586,8,2048,0,2,2,682,7635,1,19), +(8587,8,2048,0,2,2,682,7635,1,18), +(8588,8,2048,0,2,2,682,7635,1,17), +(8589,8,2048,0,2,2,682,7635,1,16), +(8590,8,2048,0,2,2,682,7635,1,15), +(8591,8,2048,0,2,2,682,7635,1,14), +(8592,8,2015,0,2,2,682,7610,1,8), +(8593,8,2015,0,2,2,682,7610,1,7), +(8594,8,2015,0,2,2,682,7610,1,6), +(8595,8,2015,0,2,2,682,7610,1,5), +(8596,8,2015,0,2,2,682,7610,1,4), +(8597,8,2015,0,2,2,682,7610,1,3), +(8598,8,2015,0,2,2,682,7610,1,2), +(8599,8,2015,0,2,2,682,7610,1,1), +(8600,8,2047,0,2,3,682,7614,1,22), +(8601,8,2048,0,2,3,682,7635,1,19), +(8602,8,2048,0,2,3,682,7635,1,18), +(8603,8,2048,0,2,3,682,7635,1,17), +(8604,8,2048,0,2,3,682,7635,1,16), +(8605,8,2048,0,2,3,682,7635,1,15), +(8606,8,2048,0,2,3,682,7635,1,14), +(8607,8,2015,0,2,3,682,7610,1,8), +(8608,8,2015,0,2,3,682,7610,1,7), +(8609,8,2015,0,2,3,682,7610,1,6), +(8610,8,2015,0,2,3,682,7610,1,5), +(8611,8,2015,0,2,3,682,7610,1,4), +(8612,8,2015,0,2,3,682,7610,1,3), +(8613,8,2015,0,2,3,682,7610,1,2), +(8614,8,2015,0,2,3,682,7610,1,1), +(8615,8,2047,0,2,4,682,7614,1,22), +(8616,8,2048,0,2,4,682,7635,1,19), +(8617,8,2048,0,2,4,682,7635,1,18), +(8618,8,2048,0,2,4,682,7635,1,17), +(8619,8,2048,0,2,4,682,7635,1,16), +(8620,8,2048,0,2,4,682,7635,1,15), +(8621,8,2048,0,2,4,682,7635,1,14), +(8622,8,32,0,2,4,682,7618,1,11), +(8623,8,32,0,2,4,682,7618,1,10), +(8624,8,32,0,2,4,682,7618,1,9), +(8625,8,2015,0,2,4,682,7610,1,8), +(8626,8,2015,0,2,4,682,7610,1,7), +(8627,8,2015,0,2,4,682,7610,1,6), +(8628,8,2015,0,2,4,682,7610,1,5), +(8629,8,2015,0,2,4,682,7610,1,4), +(8630,8,2015,0,2,4,682,7610,1,3), +(8631,8,2015,0,2,4,682,7610,1,2), +(8632,8,2015,0,2,4,682,7610,1,1), +(8633,8,2047,0,2,5,682,7614,1,22), +(8634,8,2048,0,2,5,682,7635,1,19), +(8635,8,2048,0,2,5,682,7635,1,18), +(8636,8,2048,0,2,5,682,7635,1,17), +(8637,8,2048,0,2,5,682,7635,1,16), +(8638,8,2048,0,2,5,682,7635,1,15), +(8639,8,2048,0,2,5,682,7635,1,14), +(8640,8,2015,0,2,5,682,7610,1,8), +(8641,8,2015,0,2,5,682,7610,1,7), +(8642,8,2015,0,2,5,682,7610,1,6), +(8643,8,2015,0,2,5,682,7610,1,5), +(8644,8,2015,0,2,5,682,7610,1,4), +(8645,8,2015,0,2,5,682,7610,1,3), +(8646,8,2015,0,2,5,682,7610,1,2), +(8647,8,2015,0,2,5,682,7610,1,1), +(8648,8,2047,0,2,6,682,7614,1,22), +(8649,8,2015,0,2,6,682,7610,1,8), +(8650,8,2015,0,2,6,682,7610,1,7), +(8651,8,2015,0,2,6,682,7610,1,6), +(8652,8,2015,0,2,6,682,7610,1,5), +(8653,8,2015,0,2,6,682,7610,1,4), +(8654,8,2015,0,2,6,682,7610,1,3), +(8655,8,2015,0,2,6,682,7610,1,2), +(8656,8,2015,0,2,6,682,7610,1,1), +(8657,8,2047,0,2,7,682,7614,1,22), +(8658,8,2015,0,2,7,682,7610,1,8), +(8659,8,2015,0,2,7,682,7610,1,7), +(8660,8,2015,0,2,7,682,7610,1,6), +(8661,8,2015,0,2,7,682,7610,1,5), +(8662,8,2015,0,2,7,682,7610,1,4), +(8663,8,2015,0,2,7,682,7610,1,3), +(8664,8,2015,0,2,7,682,7610,1,2), +(8665,8,2015,0,2,7,682,7610,1,1), +(8666,8,2047,0,2,8,682,7614,1,22), +(8667,8,2015,0,2,8,682,7610,1,8), +(8668,8,2015,0,2,8,682,7610,1,7), +(8669,8,2015,0,2,8,682,7610,1,6), +(8670,8,2015,0,2,8,682,7610,1,5), +(8671,8,2015,0,2,8,682,7610,1,4), +(8672,8,2015,0,2,8,682,7610,1,3), +(8673,8,2015,0,2,8,682,7610,1,2), +(8674,8,2015,0,2,8,682,7610,1,1), +(8675,1,4063,0,2,0,463,4138,1,1), +(8676,1,4063,0,2,0,463,4138,1,2), +(8677,1,4063,0,2,0,463,4138,1,3), +(8678,1,4063,0,2,0,463,4138,1,4), +(8679,1,4063,0,2,0,463,4138,1,5), +(8680,1,4063,0,2,0,463,4138,1,6), +(8681,1,4063,0,2,0,463,4138,1,7), +(8682,1,4063,0,2,0,463,4138,1,8), +(8683,1,4063,0,2,0,463,4131,1,9), +(8684,1,32,0,2,0,463,4534,1,12), +(8685,1,32,0,2,0,463,4534,1,13), +(8686,1,32,0,2,0,463,4534,1,14), +(8687,1,4095,0,2,0,463,7200,1,15), +(8688,1,4095,0,2,0,463,7197,1,16), +(8689,1,4095,0,2,0,463,7199,1,17), +(8690,1,4063,0,2,1,463,4140,1,1), +(8691,1,4063,0,2,1,463,4140,1,2), +(8692,1,4063,0,2,1,463,4140,1,3), +(8693,1,4063,0,2,1,463,4140,1,4), +(8694,1,4063,0,2,1,463,4140,1,5), +(8695,1,4063,0,2,1,463,4140,1,6), +(8696,1,4063,0,2,1,463,4140,1,7), +(8697,1,4063,0,2,1,463,4140,1,8), +(8698,1,4063,0,2,1,463,4126,1,9), +(8699,1,4063,0,2,2,463,4133,1,1), +(8700,1,4063,0,2,2,463,4133,1,2), +(8701,1,4063,0,2,2,463,4133,1,3), +(8702,1,4063,0,2,2,463,4133,1,4), +(8703,1,4063,0,2,2,463,4133,1,5), +(8704,1,4063,0,2,2,463,4133,1,6), +(8705,1,4063,0,2,2,463,4133,1,7), +(8706,1,4063,0,2,2,463,4133,1,8), +(8707,1,4063,0,2,2,463,4133,1,9), +(8708,1,32,0,2,2,463,4534,1,12), +(8709,1,32,0,2,2,463,4534,1,13), +(8710,1,32,0,2,2,463,4534,1,14), +(8711,1,4063,0,2,3,463,4135,1,1), +(8712,1,4063,0,2,3,463,4135,1,2), +(8713,1,4063,0,2,3,463,4135,1,3), +(8714,1,4063,0,2,3,463,4135,1,4), +(8715,1,4063,0,2,3,463,4135,1,5), +(8716,1,4063,0,2,3,463,4135,1,6), +(8717,1,4063,0,2,3,463,4135,1,7), +(8718,1,4063,0,2,3,463,4135,1,8), +(8719,1,4063,0,2,3,463,4137,1,9), +(8720,1,4063,0,2,4,463,4141,1,1), +(8721,1,4063,0,2,4,463,4141,1,2), +(8722,1,4063,0,2,4,463,4141,1,3), +(8723,1,4063,0,2,4,463,4141,1,4), +(8724,1,4063,0,2,4,463,4141,1,5), +(8725,1,4063,0,2,4,463,4141,1,6), +(8726,1,4063,0,2,4,463,4141,1,7), +(8727,1,4063,0,2,4,463,4141,1,8), +(8728,1,4063,0,2,4,463,4126,1,9), +(8729,1,4063,0,2,7,463,4138,1,1), +(8730,1,4063,0,2,7,463,4138,1,2), +(8731,1,4063,0,2,7,463,4138,1,3), +(8732,1,4063,0,2,7,463,4138,1,4), +(8733,1,4063,0,2,7,463,4138,1,5), +(8734,1,4063,0,2,7,463,4138,1,6), +(8735,1,4063,0,2,7,463,4138,1,7), +(8736,1,4063,0,2,7,463,4138,1,8), +(8737,1,4063,0,2,7,463,4131,1,9), +(8738,1,4063,0,2,8,463,4140,1,1), +(8739,1,4063,0,2,8,463,4140,1,2), +(8740,1,4063,0,2,8,463,4140,1,3), +(8741,1,4063,0,2,8,463,4140,1,4), +(8742,1,4063,0,2,8,463,4140,1,5), +(8743,1,4063,0,2,8,463,4140,1,6), +(8744,1,4063,0,2,8,463,4140,1,7), +(8745,1,4063,0,2,8,463,4140,1,8), +(8746,1,4063,0,2,8,463,4126,1,9), +(8747,1,4063,0,2,9,463,4135,1,1), +(8748,1,4063,0,2,9,463,4135,1,2), +(8749,1,4063,0,2,9,463,4135,1,3), +(8750,1,4063,0,2,9,463,4135,1,4), +(8751,1,4063,0,2,9,463,4135,1,5), +(8752,1,4063,0,2,9,463,4135,1,6), +(8753,1,4063,0,2,9,463,4135,1,7), +(8754,1,4063,0,2,9,463,4135,1,8), +(8755,1,4063,0,2,9,463,4126,1,9), +(8756,1,4063,0,2,11,463,4136,1,1), +(8757,1,4063,0,2,11,463,4136,1,2), +(8758,1,4063,0,2,11,463,4136,1,3), +(8759,1,4063,0,2,11,463,4136,1,4), +(8760,1,4063,0,2,11,463,4136,1,5), +(8761,1,4063,0,2,11,463,4136,1,6), +(8762,1,4063,0,2,11,463,4136,1,7), +(8763,1,4063,0,2,11,463,4136,1,8), +(8764,1,4063,0,2,11,463,4126,1,9), +(8765,1,32,0,2,11,463,4534,1,12), +(8766,1,32,0,2,11,463,4534,1,13), +(8767,1,32,0,2,11,463,4534,1,14), +(8768,6291456,4063,0,2,0,463,4138,1,1), +(8769,6291456,4063,0,2,0,463,4138,1,2), +(8770,6291456,4063,0,2,0,463,4138,1,3), +(8771,6291456,4063,0,2,0,463,4131,1,4), +(8772,6291456,32,0,2,0,463,4534,1,5), +(8773,6291456,32,0,2,0,463,4534,1,6), +(8774,6291456,32,0,2,0,463,4534,1,7), +(8775,6291456,4095,0,2,0,464,7198,1,8), +(8776,6291456,4063,0,2,1,463,4140,1,1), +(8777,6291456,4063,0,2,1,463,4140,1,2), +(8778,6291456,4063,0,2,1,463,4140,1,3), +(8779,6291456,4063,0,2,1,463,4126,1,4), +(8784,6291456,4063,0,2,3,463,4135,1,1), +(8785,6291456,4063,0,2,3,463,4135,1,2), +(8786,6291456,4063,0,2,3,463,4135,1,3), +(8787,6291456,4063,0,2,3,463,4137,1,4), +(8788,6291456,4063,0,2,4,463,4141,1,1), +(8789,6291456,4063,0,2,4,463,4141,1,2), +(8790,6291456,4063,0,2,4,463,4141,1,3), +(8791,6291456,4063,0,2,4,463,4126,1,4), +(8792,6291456,4063,0,2,15,463,4140,1,1), +(8793,6291456,4063,0,2,15,463,4140,1,2), +(8794,6291456,4063,0,2,15,463,4140,1,3), +(8795,6291456,4063,0,2,15,463,4126,1,4), +(8796,6291456,4095,1,5,7,501,4752,0,0), +(8797,6291456,4095,1,5,8,501,4753,0,0), +(8798,6291456,4095,1,5,9,501,4754,0,0), +(8799,6291456,4095,1,5,10,501,4755,0,0), +(8800,6291456,4095,1,5,11,501,4756,0,0), +(8801,6291456,4095,1,2,27,970,15684,0,0), +(8802,6291456,4095,1,2,26,970,15683,0,0), +(8803,6291456,4095,1,2,25,970,15682,0,0), +(8804,6291456,4095,1,2,24,970,15681,0,0), +(8805,6291456,4095,1,2,23,970,15680,0,0), +(8806,6291456,4095,1,2,22,970,15679,0,0), +(8807,6291456,4095,1,2,21,970,15678,0,0), +(8808,6291456,4095,1,2,20,970,15677,0,0), +(8809,6291456,4095,1,2,19,970,15676,0,0), +(8810,6291456,4095,1,2,18,970,15675,0,0), +(8811,6291456,4095,1,2,17,970,15674,0,0), +(8812,6291456,4095,1,2,16,970,15673,0,0), +(8813,6291456,4095,1,2,15,970,15672,0,0), +(8814,6291456,4095,1,2,14,970,15686,0,0), +(8815,6291456,4095,1,2,13,970,15685,1,0), +(8816,6291456,4095,1,2,12,970,15684,0,0), +(8817,6291456,4095,1,2,11,970,15683,0,0), +(8818,6291456,4095,1,2,10,970,15682,0,0), +(8819,6291456,4095,1,2,9,970,15681,1,0), +(8820,6291456,4095,1,2,8,970,15680,0,0), +(8821,6291456,4095,1,2,7,970,15679,1,0), +(8822,6291456,4095,1,2,6,970,15678,0,0), +(8823,6291456,4095,1,2,5,970,15677,0,0), +(8824,6291456,4095,1,2,4,970,15676,0,0), +(8825,6291456,4095,1,2,3,970,15675,0,0), +(8826,6291456,4095,1,2,2,970,15674,0,0), +(8827,6291456,4095,1,2,1,970,15673,0,0), +(8828,6291456,4095,1,2,0,970,15672,0,0), +(8829,6291456,4095,1,2,28,970,15682,0,0), +(8830,6291456,4095,1,2,30,970,15684,0,0), +(8831,6291456,4095,1,2,29,970,15677,0,0), +(8832,6291456,4095,1,2,31,970,15680,0,0), +(8833,6291456,4095,1,2,7,970,15679,1,1), +(8834,6291456,4095,1,2,7,970,15679,1,2), +(8835,6291456,4095,1,2,7,970,15679,1,3), +(8836,6291456,4095,1,2,7,970,15679,1,4), +(8837,6291456,4095,1,2,7,970,15679,1,5), +(8838,6291456,4095,1,2,7,970,15679,1,6), +(8839,6291456,4095,1,2,7,970,15679,1,7), +(8840,6291456,4095,1,2,7,970,15679,1,8), +(8841,6291456,4095,1,2,7,970,15672,1,9), +(8842,6291456,4095,1,2,7,970,15672,1,10), +(8843,6291456,4095,1,2,7,970,15672,1,11), +(8844,6291456,4095,1,2,9,970,15681,1,1), +(8845,6291456,4095,1,2,9,970,15681,1,2), +(8846,6291456,4095,1,2,9,970,15681,1,3), +(8847,6291456,4095,1,2,9,970,15681,1,4), +(8848,6291456,4095,1,2,9,970,15681,1,5), +(8849,6291456,4095,1,2,9,970,15681,1,6), +(8850,6291456,4095,1,2,9,970,15681,1,7), +(8851,6291456,4095,1,2,9,970,15681,1,8), +(8852,6291456,4095,1,2,9,970,15673,1,9), +(8853,6291456,4095,1,2,9,970,15673,1,10), +(8854,6291456,4095,1,2,9,970,15673,1,11), +(8855,6291456,4095,1,2,13,970,15685,1,1), +(8856,6291456,4095,1,2,13,970,15685,1,2), +(8857,6291456,4095,1,2,13,970,15685,1,3), +(8858,6291456,4095,1,2,13,970,15685,1,4), +(8859,6291456,4095,1,2,13,970,15685,1,5), +(8860,6291456,4095,1,2,13,970,15685,1,6), +(8861,6291456,4095,1,2,13,970,15685,1,7), +(8862,6291456,4095,1,2,13,970,15685,1,8), +(8863,6291456,4095,1,2,13,970,15682,1,9), +(8864,6291456,4095,1,2,13,970,15682,1,10), +(8865,6291456,4095,1,2,13,970,15682,1,11); +ALTER TABLE `chr_customization_conversion` ENABLE KEYS; +UNLOCK TABLES; + +-- +-- Table structure for table `chr_level_conversion` +-- +DROP TABLE IF EXISTS `chr_level_conversion`; +CREATE TABLE `chr_level_conversion` ( + `OldLevel` int NOT NULL, + `NewLevel` int NOT NULL, + PRIMARY KEY (`OldLevel`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `chr_level_conversion` +-- +INSERT INTO `chr_level_conversion` VALUES +(1,1), +(2,2), +(3,2), +(4,2), +(5,3), +(6,3), +(7,3), +(8,4), +(9,4), +(10,5), +(11,5), +(12,6), +(13,6), +(14,7), +(15,7), +(16,8), +(17,8), +(18,9), +(19,9), +(20,10), +(21,10), +(22,10), +(23,11), +(24,11), +(25,11), +(26,12), +(27,12), +(28,12), +(29,13), +(30,13), +(31,13), +(32,14), +(33,14), +(34,14), +(35,15), +(36,15), +(37,16), +(38,16), +(39,17), +(40,17), +(41,18), +(42,18), +(43,19), +(44,19), +(45,20), +(46,20), +(47,20), +(48,21), +(49,21), +(50,21), +(51,22), +(52,22), +(53,22), +(54,23), +(55,23), +(56,23), +(57,24), +(58,24), +(59,24), +(60,25), +(61,25), +(62,25), +(63,25), +(64,26), +(65,26), +(66,26), +(67,26), +(68,27), +(69,27), +(70,27), +(71,27), +(72,28), +(73,28), +(74,28), +(75,28), +(76,29), +(77,29), +(78,29), +(79,29), +(80,30), +(81,30), +(82,31), +(83,31), +(84,32), +(85,32), +(86,33), +(87,33), +(88,34), +(89,34), +(90,35), +(91,35), +(92,36), +(93,36), +(94,37), +(95,37), +(96,38), +(97,38), +(98,39), +(99,39), +(100,40), +(101,40), +(102,41), +(103,41), +(104,42), +(105,42), +(106,43), +(107,43), +(108,44), +(109,44), +(110,45), +(111,45), +(112,46), +(113,46), +(114,47), +(115,47), +(116,48), +(117,48), +(118,49), +(119,49), +(120,50); + +-- +-- Table structure for table `character_customizations` +-- +DROP TABLE IF EXISTS `character_customizations`; +CREATE TABLE `character_customizations` ( + `guid` bigint(20) unsigned NOT NULL, + `chrCustomizationOptionID` int(10) unsigned NOT NULL, + `chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guid`,`chrCustomizationOptionID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Skin +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.skin = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 1 AND ccc.DependentOptionID = 0; + +-- Face +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.face = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 2 AND ccc.DependentOptionID <> 1; + +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.face = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 2 AND ccc.DependentOptionID = 1 AND ccc.DependentData = c.skin; + +-- Hair style +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.hairStyle = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 3 AND ccc.DependentOptionID = 0; + +-- Hair color +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.hairColor = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 4 AND ccc.DependentOptionID = 0; + +-- Facial hair style +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.facialStyle = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 5 AND ccc.DependentOptionID = 0; + +-- Custom display option 1 +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay1 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 6 AND ccc.DependentOptionID <> 2; + +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay1 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 6 AND ccc.DependentOptionID = 2 AND ccc.DependentData = c.face; + +-- Custom display option 2 +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay2 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 7 AND ccc.DependentOptionID <> 2; + +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay2 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 7 AND ccc.DependentOptionID = 2 AND ccc.DependentData = c.face; + +-- Custom display option 3 +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay3 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 8 AND ccc.DependentOptionID <> 2; + +INSERT INTO `character_customizations` +SELECT c.guid, ccc.ChrCustomizationOptionID, ccc.ChrCustomizationChoiceID +FROM characters c +INNER JOIN chr_customization_conversion ccc ON c.customDisplay3 = ccc.`Data` AND (ccc.RaceMask & (1 << (c.race - 1))) <> 0 AND c.gender = ccc.Sex AND (ccc.ClassMask & (1 << (c.class - 1))) <> 0 +WHERE ccc.OptionID = 8 AND ccc.DependentOptionID = 2 AND ccc.DependentData = c.face; + +UPDATE `characters` SET `level`=COALESCE((SELECT `NewLevel` FROM `chr_level_conversion` WHERE `OldLevel`=`level`), `level`); + +ALTER TABLE `characters` + DROP `skin`, + DROP `face`, + DROP `hairStyle`, + DROP `hairColor`, + DROP `facialStyle`, + DROP `customDisplay1`, + DROP `customDisplay2`, + DROP `customDisplay3`; + +ALTER TABLE `corpse` + ADD `race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `itemCache`, + ADD `gender` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `race`; + +UPDATE `corpse` SET `race`=(`bytes1`>>8)&255, `gender`=(`bytes1`>>16)&255; + +ALTER TABLE `corpse` + DROP `bytes1`, + DROP `bytes2`; + +-- +-- Table structure for table `corpse_customizations` +-- +DROP TABLE IF EXISTS `corpse_customizations`; +CREATE TABLE `corpse_customizations` ( + `ownerGuid` bigint(20) unsigned NOT NULL, + `chrCustomizationOptionID` int(10) unsigned NOT NULL, + `chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`ownerGuid`,`chrCustomizationOptionID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `corpse_customizations` +SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID +FROM `character_customizations` cc +INNER JOIN `corpse` c ON cc.`guid` = c.`guid`; + +DROP TABLE `chr_customization_conversion`; +DROP TABLE `chr_level_conversion`; diff --git a/sql/updates/hotfixes/master/2020_11_30_00_hotfixes.sql b/sql/updates/hotfixes/master/2020_11_30_00_hotfixes.sql new file mode 100644 index 00000000000..14999992a73 --- /dev/null +++ b/sql/updates/hotfixes/master/2020_11_30_00_hotfixes.sql @@ -0,0 +1,489 @@ +ALTER TABLE `achievement` ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `SharesCriteria`; + +ALTER TABLE `area_table` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `WindSettingsID`; +ALTER TABLE `area_table` DROP `ExplorationLevel`; + +ALTER TABLE `battle_pet_breed_state` MODIFY `BattlePetStateID` int(11) NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `battle_pet_species` ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `LoadoutUIModelSceneID`; + +ALTER TABLE `battlemaster_list` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `HolidayWorldState`; +ALTER TABLE `battlemaster_list` MODIFY `RequiredPlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +ALTER TABLE `broadcast_text` MODIFY `LanguageID` int(11) NOT NULL DEFAULT '0' AFTER `ID`; + +-- +-- Table structure for table `character_loadout` +-- +DROP TABLE IF EXISTS `character_loadout`; +CREATE TABLE `character_loadout` ( + `RaceMask` bigint(20) NOT NULL DEFAULT '0', + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrClassID` tinyint(4) NOT NULL DEFAULT '0', + `Purpose` tinyint(4) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `character_loadout_item` +-- +DROP TABLE IF EXISTS `character_loadout_item`; +CREATE TABLE `character_loadout_item` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `CharacterLoadoutID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ItemID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +ALTER TABLE `chat_channels` ADD `Ruleset` int(11) NOT NULL DEFAULT '0' AFTER `FactionGroup`; +ALTER TABLE `chat_channels` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Shortcut`; + +ALTER TABLE `chr_classes` + ADD `Description` text AFTER `PetNameToken`, + ADD `RoleInfoString` text AFTER `Description`, + ADD `DisabledString` text AFTER `RoleInfoString`, + ADD `HyphenatedNameMale` text AFTER `DisabledString`, + ADD `HyphenatedNameFemale` text AFTER `HyphenatedNameMale`, + ADD `RolesMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellTextureBlobFileDataID`, + ADD `ArmorTypeMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RolesMask`, + ADD `CharStartKitUnknown901` int(11) NOT NULL DEFAULT '0' AFTER `ArmorTypeMask`, + ADD `MaleCharacterCreationVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharStartKitUnknown901`, + ADD `MaleCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `MaleCharacterCreationVisualFallback`, + ADD `FemaleCharacterCreationVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `MaleCharacterCreationIdleVisualFallback`, + ADD `FemaleCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `FemaleCharacterCreationVisualFallback`, + ADD `CharacterCreationIdleGroundVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `FemaleCharacterCreationIdleVisualFallback`, + ADD `CharacterCreationGroundVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharacterCreationIdleGroundVisualFallback`, + ADD `AlteredFormCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharacterCreationGroundVisualFallback`, + ADD `CharacterCreationAnimLoopWaitTimeMsFallback` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormCharacterCreationIdleVisualFallback`, + ADD `ChatColorR` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellClassSet`, + ADD `ChatColorG` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChatColorR`, + ADD `ChatColorB` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChatColorG`; + +ALTER TABLE `chr_classes` MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LowResScreenFileDataID`; +ALTER TABLE `chr_classes` DROP `StartingLevel`; + +ALTER TABLE `chr_classes_locale` + ADD `Description_lang` text AFTER `NameFemale_lang`, + ADD `RoleInfoString_lang` text AFTER `Description_lang`, + ADD `DisabledString_lang` text AFTER `RoleInfoString_lang`, + ADD `HyphenatedNameMale_lang` text AFTER `DisabledString_lang`, + ADD `HyphenatedNameFemale_lang` text AFTER `HyphenatedNameMale_lang`; + +-- +-- Table structure for table `chr_customization_choice` +-- +DROP TABLE IF EXISTS `chr_customization_choice`; +CREATE TABLE `chr_customization_choice` ( + `Name` text, + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrCustomizationOptionID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationReqID` int(11) NOT NULL DEFAULT '0', + `SortOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `SwatchColor1` int(11) NOT NULL DEFAULT '0', + `SwatchColor2` int(11) NOT NULL DEFAULT '0', + `UiOrderIndex` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_customization_choice_locale` +-- +DROP TABLE IF EXISTS `chr_customization_choice_locale`; +CREATE TABLE `chr_customization_choice_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +/*!50500 PARTITION BY LIST COLUMNS(locale) +(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB, + PARTITION esES VALUES IN ('esES') ENGINE = InnoDB, + PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB, + PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB, + PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB, + PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB, + PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB, + PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB, + PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB, + PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */; + +-- +-- Table structure for table `chr_customization_display_info` +-- +DROP TABLE IF EXISTS `chr_customization_display_info`; +CREATE TABLE `chr_customization_display_info` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftFormID` int(11) NOT NULL DEFAULT '0', + `DisplayID` int(11) NOT NULL DEFAULT '0', + `BarberShopMinCameraDistance` float NOT NULL DEFAULT '0', + `BarberShopHeightOffset` float NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_customization_element` +-- +DROP TABLE IF EXISTS `chr_customization_element`; +CREATE TABLE `chr_customization_element` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0', + `RelatedChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationGeosetID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationSkinnedModelID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationMaterialID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationBoneSetID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationCondModelID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationDisplayInfoID` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_customization_option` +-- +DROP TABLE IF EXISTS `chr_customization_option`; +CREATE TABLE `chr_customization_option` ( + `Name` text, + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SecondaryID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `ChrModelID` int(11) NOT NULL DEFAULT '0', + `SortIndex` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationCategoryID` int(11) NOT NULL DEFAULT '0', + `OptionType` int(11) NOT NULL DEFAULT '0', + `BarberShopCostModifier` float NOT NULL DEFAULT '0', + `ChrCustomizationID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationReqID` int(11) NOT NULL DEFAULT '0', + `UiOrderIndex` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_customization_option_locale` +-- +DROP TABLE IF EXISTS `chr_customization_option_locale`; +CREATE TABLE `chr_customization_option_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +/*!50500 PARTITION BY LIST COLUMNS(locale) +(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB, + PARTITION esES VALUES IN ('esES') ENGINE = InnoDB, + PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB, + PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB, + PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB, + PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB, + PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB, + PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB, + PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB, + PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */; + +-- +-- Table structure for table `chr_customization_req` +-- +DROP TABLE IF EXISTS `chr_customization_req`; +CREATE TABLE `chr_customization_req` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `ClassMask` int(11) NOT NULL DEFAULT '0', + `AchievementID` int(11) NOT NULL DEFAULT '0', + `OverrideArchive` int(11) NOT NULL DEFAULT '0', + `ItemModifiedAppearanceID` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_customization_req_choice` +-- +DROP TABLE IF EXISTS `chr_customization_req_choice`; +CREATE TABLE `chr_customization_req_choice` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0', + `ChrCustomizationReqID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_model` +-- +DROP TABLE IF EXISTS `chr_model`; +CREATE TABLE `chr_model` ( + `FaceCustomizationOffset1` float NOT NULL DEFAULT '0', + `FaceCustomizationOffset2` float NOT NULL DEFAULT '0', + `FaceCustomizationOffset3` float NOT NULL DEFAULT '0', + `CustomizeOffset1` float NOT NULL DEFAULT '0', + `CustomizeOffset2` float NOT NULL DEFAULT '0', + `CustomizeOffset3` float NOT NULL DEFAULT '0', + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Sex` int(11) NOT NULL DEFAULT '0', + `DisplayID` int(11) NOT NULL DEFAULT '0', + `CharComponentTextureLayoutID` int(11) NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `SkeletonFileDataID` int(11) NOT NULL DEFAULT '0', + `ModelFallbackChrModelID` int(11) NOT NULL DEFAULT '0', + `TextureFallbackChrModelID` int(11) NOT NULL DEFAULT '0', + `HelmVisFallbackChrModelID` int(11) NOT NULL DEFAULT '0', + `CustomizeScale` float NOT NULL DEFAULT '0', + `CustomizeFacing` float NOT NULL DEFAULT '0', + `CameraDistanceOffset` float NOT NULL DEFAULT '0', + `BarberShopCameraOffsetScale` float NOT NULL DEFAULT '0', + `BarberShopCameraRotationOffset` float NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `chr_race_x_chr_model` +-- +DROP TABLE IF EXISTS `chr_race_x_chr_model`; +CREATE TABLE `chr_race_x_chr_model` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrRacesID` int(11) NOT NULL DEFAULT '0', + `ChrModelID` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +ALTER TABLE `chr_races` + ADD `NameS` text AFTER `NameFemaleLowercase`, + ADD `NameFemaleS` text AFTER `NameS`, + ADD `NameLowercaseS` text AFTER `NameFemaleS`, + ADD `NameFemaleLowercaseS` text AFTER `NameLowercaseS`, + ADD `RaceFantasyDescription` text AFTER `NameFemaleLowercaseS`, + ADD `NameL` text AFTER `RaceFantasyDescription`, + ADD `NameFemaleL` text AFTER `NameL`, + ADD `NameLowercaseL` text AFTER `NameFemaleL`, + ADD `NameFemaleLowercaseL` text AFTER `NameLowercaseL`, + ADD `PlayableRaceBit` int(11) NOT NULL DEFAULT '0' AFTER `UiDisplayOrder`, + ADD `HelmetAnimScalingRaceID` int(11) NOT NULL DEFAULT '0' AFTER `PlayableRaceBit`, + ADD `AlteredFormCustomizeOffsetFallback1` float NOT NULL DEFAULT '0' AFTER `TransmogrifyDisabledSlotMask`, + ADD `AlteredFormCustomizeOffsetFallback2` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback1`, + ADD `AlteredFormCustomizeOffsetFallback3` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback2`, + ADD `AlteredFormCustomizeRotationFallback` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback3`, + ADD `UnalteredVisualCustomizationRaceID` tinyint(3) NOT NULL DEFAULT '0' AFTER `FemaleTextureFallbackSex`; + +ALTER TABLE `chr_races` + MODIFY `BaseLanguage` int(11) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `ResSicknessSpellID` int(11) NOT NULL DEFAULT '0' AFTER `BaseLanguage`, + MODIFY `SplashSoundID` int(11) NOT NULL DEFAULT '0' AFTER `ResSicknessSpellID`; + +ALTER TABLE `chr_races` + DROP `MaleDisplayId`, + DROP `FemaleDisplayId`, + DROP `HighResMaleDisplayId`, + DROP `HighResFemaleDisplayId`, + DROP `MaleCustomizeOffset1`, + DROP `MaleCustomizeOffset2`, + DROP `MaleCustomizeOffset3`, + DROP `FemaleCustomizeOffset1`, + DROP `FemaleCustomizeOffset2`, + DROP `FemaleCustomizeOffset3`, + DROP `FemaleSkeletonFileDataID`, + DROP `MaleSkeletonFileDataID`, + DROP `HelmVisFallbackRaceID`, + DROP `CharComponentTextureLayoutID`, + DROP `CharComponentTexLayoutHiResID`; + +ALTER TABLE `chr_races_locale` + ADD `NameS_lang` text AFTER `NameFemaleLowercase_lang`, + ADD `NameFemaleS_lang` text AFTER `NameS_lang`, + ADD `NameLowercaseS_lang` text AFTER `NameFemaleS_lang`, + ADD `NameFemaleLowercaseS_lang` text AFTER `NameLowercaseS_lang`, + ADD `RaceFantasyDescription_lang` text AFTER `NameFemaleLowercaseS_lang`, + ADD `NameL_lang` text AFTER `RaceFantasyDescription_lang`, + ADD `NameFemaleL_lang` text AFTER `NameL_lang`, + ADD `NameLowercaseL_lang` text AFTER `NameFemaleL_lang`, + ADD `NameFemaleLowercaseL_lang` text AFTER `NameLowercaseL_lang`; + +ALTER TABLE `content_tuning` + ADD `MinLevelType` int(11) NOT NULL DEFAULT '0' AFTER `MaxLevel`, + ADD `MaxLevelType` int(11) NOT NULL DEFAULT '0' AFTER `MinLevelType`, + ADD `TargetLevelDelta` int(11) NOT NULL DEFAULT '0' AFTER `MaxLevelType`, + ADD `TargetLevelMaxDelta` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelDelta`, + ADD `TargetLevelMin` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMaxDelta`, + ADD `TargetLevelMax` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMin`, + ADD `MinItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMax`; + +ALTER TABLE `content_tuning` + MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `ExpansionID` int(11) NOT NULL DEFAULT '0' AFTER `Flags`; + +ALTER TABLE `creature_display_info_extra` + DROP `SkinID`, + DROP `FaceID`, + DROP `HairStyleID`, + DROP `HairColorID`, + DROP `FacialHairID`, + DROP `CustomDisplayOption1`, + DROP `CustomDisplayOption2`, + DROP `CustomDisplayOption3`; + +ALTER TABLE `currency_types` CHANGE `ConvertToPlayerExperience` `XpQuestDifficulty` int(11) NOT NULL DEFAULT '0' AFTER `ItemGroupSoundsID`; +ALTER TABLE `currency_types` CHANGE `PlayerConditionID` `AwardConditionID` int(11) NOT NULL DEFAULT '0' AFTER `XpQuestDifficulty`; +ALTER TABLE `currency_types` ADD `MaxQtyWorldStateID` int(11) NOT NULL DEFAULT '0' AFTER `AwardConditionID`; +ALTER TABLE `currency_types` CHANGE `Flags` `Flags1` int(11) NOT NULL DEFAULT '0' AFTER `MaxQtyWorldStateID`; +ALTER TABLE `currency_types` ADD `Flags2` int(11) NOT NULL DEFAULT '0' AFTER `Flags1`; +ALTER TABLE `currency_types` MODIFY `CategoryID` int(11) NOT NULL DEFAULT '0' AFTER `Description`; + +ALTER TABLE `curve_point` + ADD `PosPreSquishX` float NOT NULL DEFAULT '0' AFTER `PosY`, + ADD `PosPreSquishY` float NOT NULL DEFAULT '0' AFTER `PosPreSquishX`; + +ALTER TABLE `destructible_model_data` + MODIFY `State1Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State0AmbientDoodadSet`, + MODIFY `State2Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State1AmbientDoodadSet`, + MODIFY `State3Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State2AmbientDoodadSet`, + MODIFY `State0Wmo` int(11) NOT NULL DEFAULT '0' AFTER `DoNotHighlight`; + +ALTER TABLE `dungeon_encounter` MODIFY `DifficultyID` int(11) NOT NULL DEFAULT '0' AFTER `MapID`; + +ALTER TABLE `gameobjects` + MODIFY `OwnerID` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `DisplayID` int(11) NOT NULL DEFAULT '0' AFTER `OwnerID`, + MODIFY `TypeID` int(11) NOT NULL DEFAULT '0' AFTER `Scale`, + MODIFY `PhaseUseFlags` int(11) NOT NULL DEFAULT '0' AFTER `TypeID`, + MODIFY `PhaseID` int(11) NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `PhaseGroupID` int(11) NOT NULL DEFAULT '0' AFTER `PhaseID`; + +ALTER TABLE `garr_building` MODIFY `GarrSiteID` int(11) NOT NULL DEFAULT '0' AFTER `AllianceGameObjectID`; + +ALTER TABLE `garr_follower` + ADD `AutoCombatantID` int(11) NOT NULL DEFAULT '0' AFTER `Gender`, + ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `AutoCombatantID`; + +ALTER TABLE `gem_properties` DROP `MinItemLevel`; + +ALTER TABLE `item` ADD `ModifiedCraftingReagentItemID` int(11) NOT NULL DEFAULT '0' AFTER `ItemGroupSoundsID`; + +ALTER TABLE `item_appearance` ADD `PlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `UiOrder`; + +ALTER TABLE `item_bonus` ADD `Value4` int(11) NOT NULL DEFAULT '0' AFTER `Value3`; + +ALTER TABLE `item_sparse` + ADD `ModifiedCraftingReagentItemID` int(11) NOT NULL DEFAULT '0' AFTER `FactionRelated`, + ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `ModifiedCraftingReagentItemID`, + ADD `PlayerLevelToItemLevelCurveID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`; + +ALTER TABLE `item_sparse` DROP `ScalingStatDistributionID`; + +ALTER TABLE `lfg_dungeons` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `MentorCharLevel`; + +ALTER TABLE `lfg_dungeons` + DROP `MinLevel`, + DROP `MaxLevel`, + DROP `TargetLevel`, + DROP `TargetLevelMin`, + DROP `TargetLevelMax`; + +ALTER TABLE `lock` ADD `Flags` int(11) NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `map` ADD `InternalName` text AFTER `MapName`; + +ALTER TABLE `player_condition` + ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `MaxPVPRank`, + ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`; + +ALTER TABLE `player_condition` + MODIFY `LanguageID` int(11) NOT NULL DEFAULT '0' AFTER `SkillLogic`, + MODIFY `WeatherID` int(11) NOT NULL DEFAULT '0' AFTER `WorldStateExpressionID`, + MODIFY `QuestKillID` int(11) NOT NULL DEFAULT '0' AFTER `CurrencyLogic`, + MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `PrevQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `MinReputation3`, + MODIFY `PrevQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID1`, + MODIFY `PrevQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID2`, + MODIFY `PrevQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID3`, + MODIFY `CurrQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID4`, + MODIFY `CurrQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID1`, + MODIFY `CurrQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID2`, + MODIFY `CurrQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID3`, + MODIFY `CurrentCompletedQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID4`, + MODIFY `CurrentCompletedQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID1`, + MODIFY `CurrentCompletedQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID2`, + MODIFY `CurrentCompletedQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID3`; + +ALTER TABLE `player_condition` + DROP `MinLevel`, + DROP `MaxLevel`; + +ALTER TABLE `scenario_step` MODIFY `RewardQuestID` int(11) NOT NULL DEFAULT '0' AFTER `Criteriatreeid`; + +ALTER TABLE `skill_line_ability` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `TrivialSkillLineRankLow`; + +ALTER TABLE `spell_cast_times` DROP `PerLevel`; + +ALTER TABLE `spell_duration` DROP `DurationPerLevel`; + +ALTER TABLE `spell_effect` MODIFY `Effect` int(11) NOT NULL DEFAULT '0' AFTER `EffectIndex`; + +ALTER TABLE `spell_item_enchantment` + ADD `MinItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + ADD `MaxItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `MinItemLevel`, + ADD `TransmogUseConditionID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxItemLevel`; + +ALTER TABLE `spell_item_enchantment` + MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeName`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectScalingPoints3`; + +ALTER TABLE `spell_item_enchantment` DROP `TransmogPlayerConditionID`; + +ALTER TABLE `spell_levels` + MODIFY `MaxPassiveAuraLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `BaseLevel` int(11) NOT NULL DEFAULT '0' AFTER `MaxPassiveAuraLevel`, + MODIFY `SpellLevel` int(11) NOT NULL DEFAULT '0' AFTER `BaseLevel`; + +ALTER TABLE `spell_misc` + ADD `Attributes15` int(11) NOT NULL DEFAULT '0' AFTER `Attributes14`, + ADD `ShowFutureSpellPlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`, + ADD `SpellVisualScript` int(11) NOT NULL DEFAULT '0' AFTER `ShowFutureSpellPlayerConditionID`, + ADD `ActiveSpellVisualScript` int(11) NOT NULL DEFAULT '0' AFTER `SpellVisualScript`; + +ALTER TABLE `spell_procs_per_minute_mod` MODIFY `Param` int(11) NOT NULL DEFAULT '0' AFTER `Type`; + +ALTER TABLE `spell_x_spell_visual` DROP `Flags`; + +-- +-- Table structure for table `transmog_illusion` +-- +DROP TABLE IF EXISTS `transmog_illusion`; +CREATE TABLE `transmog_illusion` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `UnlockConditionID` int(11) NOT NULL DEFAULT '0', + `TransmogCost` int(11) NOT NULL DEFAULT '0', + `SpellItemEnchantmentID` int(11) NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +ALTER TABLE `ui_map` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `AlternateUiMapGroup`; + +ALTER TABLE `ui_map` + DROP `LevelRangeMin`, + DROP `LevelRangeMax`; + +ALTER TABLE `ui_map_link` ADD `Flags` int(11) NOT NULL DEFAULT '0' AFTER `OverrideHighlightAtlasID`; + +ALTER TABLE `vehicle` ADD `VehiclePOITypeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MissileTargetingID`; +ALTER TABLE `vehicle` DROP `UiLocomotionType`; + +DROP TABLE `char_base_section`; + +DROP TABLE `char_sections`; + +DROP TABLE `char_start_outfit`; + +DROP TABLE `character_facial_hair_styles`; + +DROP TABLE `scaling_stat_distribution`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index c17fe356680..cbce793b1a2 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -49,24 +49,29 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, " "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CHAR_SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC); 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); @@ -76,7 +81,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -84,6 +89,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "honor, honorLevel, honorRestState, honorRestBonus, numRespecs " "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, extendState, resettime, entranceId FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, difficulty, stackCount, maxDuration, remainTime, remainCharges, castItemId, castItemLevel FROM character_aura WHERE guid = ?", CONNECTION_ASYNC); @@ -415,13 +421,16 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); // Corpse - PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_CORPSE_PHASES, "INSERT INTO corpse_phases (OwnerGuid, PhaseId) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE OwnerGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CORPSE_CUSTOMIZATIONS, "SELECT cc.ownerGuid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM corpse_customizations cc LEFT JOIN corpse c ON cc.ownerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? ORDER BY cc.ownerGuid, cc.chrCustomizationOptionID", CONNECTION_SYNCH); + PrepareStatement(CHAR_INS_CORPSE_CUSTOMIZATIONS, "INSERT INTO corpse_customizations (ownerGuid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)", CONNECTION_ASYNC); + 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 @@ -463,7 +472,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC); // Player saving - PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " "taximask, cinematic, " "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " @@ -471,8 +480,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," @@ -486,6 +495,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHARACTER_CUSTOMIZATION, "INSERT INTO character_customizations (guid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHARACTER_CUSTOMIZATIONS, "DELETE FROM character_customizations WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_GROUP, "INSERT INTO `groups` (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, legacyRaidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC); @@ -520,7 +531,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_GENDER_AND_APPEARANCE, "UPDATE characters SET gender = ?, skin = ?, face = ?, hairStyle = ?, hairColor = ?, facialStyle = ?, customDisplay1 = ?, customDisplay2 = ?, customDisplay3 = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 8dc1d522e47..c756578c206 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -48,8 +48,10 @@ enum CharacterDatabaseStatements : uint32 CHAR_SEL_MAIL_LIST_ITEMS, CHAR_SEL_ENUM, CHAR_SEL_ENUM_DECLINED_NAME, + CHAR_SEL_ENUM_CUSTOMIZATIONS, CHAR_SEL_UNDELETE_ENUM, CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, + CHAR_SEL_UNDELETE_ENUM_CUSTOMIZATIONS, CHAR_SEL_FREE_NAME, CHAR_SEL_CHAR_ZONE, CHAR_SEL_CHAR_POSITION_XYZ, @@ -60,6 +62,7 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_BATTLEGROUND_RANDOM, CHAR_SEL_CHARACTER, + CHAR_SEL_CHARACTER_CUSTOMIZATIONS, CHAR_SEL_GROUP_MEMBER, CHAR_SEL_CHARACTER_INSTANCE, CHAR_SEL_CHARACTER_AURAS, @@ -334,6 +337,9 @@ enum CharacterDatabaseStatements : uint32 CHAR_SEL_CORPSE_PHASES, CHAR_INS_CORPSE_PHASES, CHAR_DEL_CORPSE_PHASES, + CHAR_SEL_CORPSE_CUSTOMIZATIONS, + CHAR_INS_CORPSE_CUSTOMIZATIONS, + CHAR_DEL_CORPSE_CUSTOMIZATIONS, CHAR_SEL_CORPSE_LOCATION, CHAR_SEL_CREATURE_RESPAWNS, @@ -375,6 +381,8 @@ enum CharacterDatabaseStatements : uint32 CHAR_UPD_PETITION_NAME, CHAR_INS_PETITION_SIGNATURE, CHAR_UPD_ACCOUNT_ONLINE, + CHAR_INS_CHARACTER_CUSTOMIZATION, + CHAR_DEL_CHARACTER_CUSTOMIZATIONS, CHAR_INS_GROUP, CHAR_INS_GROUP_MEMBER, CHAR_DEL_GROUP_MEMBER, @@ -409,7 +417,6 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, CHAR_UPD_CHAR_INSTANCE, CHAR_INS_CHAR_INSTANCE, - CHAR_UPD_GENDER_AND_APPEARANCE, CHAR_DEL_CHARACTER_SKILL, CHAR_UPD_CHARACTER_SOCIAL_FLAGS, CHAR_INS_CHARACTER_SOCIAL, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 098f3679a23..8f4930262cc 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -38,7 +38,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // Achievement.db2 PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " - "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria FROM achievement WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria, CovenantID FROM achievement WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT MAX(ID) + 1 FROM achievement", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale" " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -59,8 +59,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() // AreaTable.db2 PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " - "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " - "AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " + "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, IntroSound, UwIntroSound, FactionGroupMask, AmbientMultiplier, " + "MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, ContentTuningID, Flags1, Flags2, " "LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4 FROM area_table WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT MAX(ID) + 1 FROM area_table", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -227,7 +227,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // BattlePetSpecies.db2 PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " - "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID, CovenantID FROM battle_pet_species WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT MAX(ID) + 1 FROM battle_pet_species", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, Description_lang, SourceText_lang FROM battle_pet_species_locale" " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -259,67 +259,109 @@ void HotfixDatabaseConnection::DoPrepareStatements() " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CFG_REGIONS, "SELECT MAX(ID) + 1 FROM cfg_regions", CONNECTION_SYNCH); - // CharacterFacialHairStyles.db2 - PrepareStatement(HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" - " FROM character_facial_hair_styles WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT MAX(ID) + 1 FROM character_facial_hair_styles", CONNECTION_SYNCH); - - // CharBaseSection.db2 - PrepareStatement(HOTFIX_SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHAR_BASE_SECTION, "SELECT MAX(ID) + 1 FROM char_base_section", CONNECTION_SYNCH); - - // CharSections.db2 - PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " - "MaterialResourcesID2, MaterialResourcesID3 FROM char_sections WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHAR_SECTIONS, "SELECT MAX(ID) + 1 FROM char_sections", CONNECTION_SYNCH); - - // CharStartOutfit.db2 - PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " - "ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " - "ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, RaceID FROM char_start_outfit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT MAX(ID) + 1 FROM char_start_outfit", CONNECTION_SYNCH); - // CharTitles.db2 PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, Name, Name1, MaskID, Flags FROM char_titles WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT MAX(ID) + 1 FROM char_titles", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, Name_lang, Name1_lang FROM char_titles_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); + // CharacterLoadout.db2 + PrepareStatement(HOTFIX_SEL_CHARACTER_LOADOUT, "SELECT RaceMask, ID, ChrClassID, Purpose FROM character_loadout WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHARACTER_LOADOUT, "SELECT MAX(ID) + 1 FROM character_loadout", CONNECTION_SYNCH); + + // CharacterLoadoutItem.db2 + PrepareStatement(HOTFIX_SEL_CHARACTER_LOADOUT_ITEM, "SELECT ID, CharacterLoadoutID, ItemID FROM character_loadout_item" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHARACTER_LOADOUT_ITEM, "SELECT MAX(ID) + 1 FROM character_loadout_item", CONNECTION_SYNCH); + // ChatChannels.db2 - PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name, Shortcut, Flags, FactionGroup FROM chat_channels WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT Name, Shortcut, ID, Flags, FactionGroup, Ruleset FROM chat_channels" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT MAX(ID) + 1 FROM chat_channels", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); // ChrClasses.db2 - PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " - "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, SpellTextureBlobFileDataID, Flags, CinematicSequenceID, " - "DefaultSpec, PrimaryStatPriority, DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet" + PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " + "HyphenatedNameMale, HyphenatedNameFemale, ID, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " + "SpellTextureBlobFileDataID, RolesMask, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " + "MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " + "CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " + "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, DisplayPower, " + "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ChatColorR, ChatColorG, ChatColorB" " FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT MAX(ID) + 1 FROM chr_classes", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale" - " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " + "DisabledString_lang, HyphenatedNameMale_lang, HyphenatedNameFemale_lang FROM chr_classes_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?", CONNECTION_SYNCH); // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT MAX(ID) + 1 FROM chr_classes_x_power_types", CONNECTION_SYNCH); + // ChrCustomizationChoice.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, SwatchColor1, " + "SwatchColor2, UiOrderIndex, Flags FROM chr_customization_choice WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT MAX(ID) + 1 FROM chr_customization_choice", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT ID, Name_lang FROM chr_customization_choice_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + + // ChrCustomizationDisplayInfo.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " + "BarberShopHeightOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT MAX(ID) + 1 FROM chr_customization_display_info", CONNECTION_SYNCH); + + // ChrCustomizationElement.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " + "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " + "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT MAX(ID) + 1 FROM chr_customization_element", CONNECTION_SYNCH); + + // ChrCustomizationOption.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " + "OptionType, BarberShopCostModifier, ChrCustomizationID, ChrCustomizationReqID, UiOrderIndex FROM chr_customization_option" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION, "SELECT MAX(ID) + 1 FROM chr_customization_option", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION, "SELECT ID, Name_lang FROM chr_customization_option_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + + // ChrCustomizationReq.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, Flags, ClassMask, AchievementID, OverrideArchive, ItemModifiedAppearanceID" + " FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT MAX(ID) + 1 FROM chr_customization_req", CONNECTION_SYNCH); + + // ChrCustomizationReqChoice.db2 + PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE, "SELECT ID, ChrCustomizationChoiceID, ChrCustomizationReqID" + " FROM chr_customization_req_choice WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE, "SELECT MAX(ID) + 1 FROM chr_customization_req_choice", CONNECTION_SYNCH); + + // ChrModel.db2 + PrepareStatement(HOTFIX_SEL_CHR_MODEL, "SELECT FaceCustomizationOffset1, FaceCustomizationOffset2, FaceCustomizationOffset3, CustomizeOffset1, " + "CustomizeOffset2, CustomizeOffset3, ID, Sex, DisplayID, CharComponentTextureLayoutID, Flags, SkeletonFileDataID, ModelFallbackChrModelID, " + "TextureFallbackChrModelID, HelmVisFallbackChrModelID, CustomizeScale, CustomizeFacing, CameraDistanceOffset, BarberShopCameraOffsetScale, " + "BarberShopCameraRotationOffset FROM chr_model WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_MODEL, "SELECT MAX(ID) + 1 FROM chr_model", CONNECTION_SYNCH); + + // ChrRaceXChrModel.db2 + PrepareStatement(HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID FROM chr_race_x_chr_model WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, "SELECT MAX(ID) + 1 FROM chr_race_x_chr_model", CONNECTION_SYNCH); + // ChrRaces.db2 - PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " - "MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " - "MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " - "LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " - "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " - "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, TransmogrifyDisabledSlotMask, FactionID, " - "CinematicSequenceID, ResSicknessSpellID, SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, " - "CharComponentTextureLayoutID, CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, " - "FemaleModelFallbackRaceID, FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, " - "FemaleTextureFallbackSex FROM chr_races WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, NameS, " + "NameFemaleS, NameLowercaseS, NameFemaleLowercaseS, RaceFantasyDescription, NameL, NameFemaleL, NameLowercaseL, NameFemaleLowercaseL, ID, " + "Flags, BaseLanguage, ResSicknessSpellID, SplashSoundID, CreateScreenFileDataID, SelectScreenFileDataID, LowResScreenFileDataID, " + "AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " + "AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, PlayableRaceBit, " + "HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " + "AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, FactionID, CinematicSequenceID, CreatureType, Alliance, " + "RaceRelated, UnalteredVisualRaceID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " + "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex, " + "UnalteredVisualCustomizationRaceID FROM chr_races WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_RACES, "SELECT MAX(ID) + 1 FROM chr_races", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" - " FROM chr_races_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, NameS_lang, " + "NameFemaleS_lang, NameLowercaseS_lang, NameFemaleLowercaseS_lang, RaceFantasyDescription_lang, NameL_lang, NameFemaleL_lang, " + "NameLowercaseL_lang, NameFemaleLowercaseL_lang FROM chr_races_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // ChrSpecialization.db2 PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " @@ -340,7 +382,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT MAX(ID) + 1 FROM cinematic_sequences", CONNECTION_SYNCH); // ContentTuning.db2 - PrepareStatement(HOTFIX_SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " + "TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CONTENT_TUNING, "SELECT MAX(ID) + 1 FROM content_tuning", CONNECTION_SYNCH); // ContentTuningXExpected.db2 @@ -367,9 +410,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT MAX(ID) + 1 FROM creature_display_info", CONNECTION_SYNCH); // CreatureDisplayInfoExtra.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " - "HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " - "CustomDisplayOption3 FROM creature_display_info_extra WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, Flags, BakeMaterialResourcesID, " + "HDBakeMaterialResourcesID FROM creature_display_info_extra WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT MAX(ID) + 1 FROM creature_display_info_extra", CONNECTION_SYNCH); // CreatureFamily.db2 @@ -406,8 +448,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() // CurrencyTypes.db2 PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " - "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID, ConvertToPlayerExperience, PlayerConditionID FROM currency_types" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, Flags1, Flags2" + " FROM currency_types WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT MAX(ID) + 1 FROM currency_types", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); @@ -417,7 +459,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURVE, "SELECT MAX(ID) + 1 FROM curve", CONNECTION_SYNCH); // CurvePoint.db2 - PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, PosX, PosY, CurveID, OrderIndex FROM curve_point WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, PosX, PosY, PosPreSquishX, PosPreSquishY, CurveID, OrderIndex FROM curve_point" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURVE_POINT, "SELECT MAX(ID) + 1 FROM curve_point", CONNECTION_SYNCH); // DestructibleModelData.db2 @@ -540,8 +583,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " "FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " - "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender, AutoCombatantID, " + "CovenantID FROM garr_follower WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT MAX(ID) + 1 FROM garr_follower", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -575,7 +618,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT MAX(ID) + 1 FROM garr_site_level_plot_inst", CONNECTION_SYNCH); // GemProperties.db2 - PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type, MinItemLevel FROM gem_properties WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type FROM gem_properties WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_GEM_PROPERTIES, "SELECT MAX(ID) + 1 FROM gem_properties", CONNECTION_SYNCH); // GlyphBindableSpell.db2 @@ -643,12 +686,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() // Item.db2 PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " - "ItemGroupSoundsID FROM item WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "ItemGroupSoundsID, ModifiedCraftingReagentItemID FROM item WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM, "SELECT MAX(ID) + 1 FROM item", CONNECTION_SYNCH); // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder, PlayerConditionID" + " FROM item_appearance WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT MAX(ID) + 1 FROM item_appearance", CONNECTION_SYNCH); // ItemArmorQuality.db2 @@ -672,7 +715,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // ItemBonus.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" + PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, Value4, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_BONUS, "SELECT MAX(ID) + 1 FROM item_bonus", CONNECTION_SYNCH); @@ -810,13 +853,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " - "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " - "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, " - "MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, " - "SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " - "StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " - "StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " - "RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " + "RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, " + "ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, " + "AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, " + "PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, " + "StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, " + "StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, " + "InventoryType, OverallQualityID FROM item_sparse WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT MAX(ID) + 1 FROM item_sparse", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" " FROM item_sparse_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -841,11 +885,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_KEYCHAIN, "SELECT MAX(ID) + 1 FROM keychain", CONNECTION_SYNCH); // LfgDungeons.db2 - PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " - "RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " - "TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " - "MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, MentorCharLevel, Flags1, Flags2 FROM lfg_dungeons" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, TypeID, Subtype, Faction, IconTextureFileID, RewardsBgTextureFileID, " + "PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, RandomID, ScenarioID, " + "FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, " + "MentorCharLevel, ContentTuningID, Flags1, Flags2 FROM lfg_dungeons WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT MAX(ID) + 1 FROM lfg_dungeons", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); @@ -866,8 +909,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_LIQUID_TYPE, "SELECT MAX(ID) + 1 FROM liquid_type", CONNECTION_SYNCH); // Lock.db2 - PrepareStatement(HOTFIX_SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " - "Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " + PrepareStatement(HOTFIX_SEL_LOCK, "SELECT ID, Flags, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, " + "Skill4, Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " "Action6, Action7, Action8 FROM `lock` WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_LOCK, "SELECT MAX(ID) + 1 FROM `lock`", CONNECTION_SYNCH); @@ -877,10 +920,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // Map.db2 - PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " - "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " - "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, MapName, InternalName, MapDescription0, MapDescription1, PvpShortDescription, " + "PvpLongDescription, CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, " + "CosmeticParentMapID, TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2" + " FROM map WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_MAP, "SELECT MAX(ID) + 1 FROM map", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " "PvpLongDescription_lang FROM map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -958,23 +1001,23 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT MAX(ID) + 1 FROM phase_x_phase_group", CONNECTION_SYNCH); // PlayerCondition.db2 - PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " - "MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " + PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, ClassMask, SkillLogic, LanguageID, MinLanguage, " + "MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " - "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " - "SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " - "MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " - "CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " - "CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " - "ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " - "AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " - "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " - "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " - "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" - " FROM player_condition WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, ContentTuningID, CovenantID, " + "SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, " + "MinFactionID1, MinFactionID2, MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, " + "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " + "CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, " + "ItemCount2, ItemCount3, ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, " + "AuraStacks2, AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, " + "LfgStatus1, LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, " + "LfgValue4, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, " + "QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, " + "MovementFlags2 FROM player_condition WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT MAX(ID) + 1 FROM player_condition", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); @@ -1068,11 +1111,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_REWARD_PACK_X_ITEM, "SELECT MAX(ID) + 1 FROM reward_pack_x_item", CONNECTION_SYNCH); - // ScalingStatDistribution.db2 - PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" - " FROM scaling_stat_distribution WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT MAX(ID) + 1 FROM scaling_stat_distribution", CONNECTION_SYNCH); - // Scenario.db2 PrepareStatement(HOTFIX_SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID FROM scenario WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SCENARIO, "SELECT MAX(ID) + 1 FROM scenario", CONNECTION_SYNCH); @@ -1149,7 +1187,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT MAX(ID) + 1 FROM spell_aura_restrictions", CONNECTION_SYNCH); // SpellCastTimes.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, Base, PerLevel, Minimum FROM spell_cast_times WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, Base, Minimum FROM spell_cast_times WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT MAX(ID) + 1 FROM spell_cast_times", CONNECTION_SYNCH); // SpellCastingRequirements.db2 @@ -1179,8 +1217,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT MAX(ID) + 1 FROM spell_cooldowns", CONNECTION_SYNCH); // SpellDuration.db2 - PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration FROM spell_duration WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_DURATION, "SELECT MAX(ID) + 1 FROM spell_duration", CONNECTION_SYNCH); // SpellEffect.db2 @@ -1209,10 +1246,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT MAX(ID) + 1 FROM spell_interrupts", CONNECTION_SYNCH); // SpellItemEnchantment.db2 - PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " - "EffectScalingPoints2, EffectScalingPoints3, TransmogPlayerConditionID, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, " - "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " - "ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT Name, HordeName, ID, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " + "EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, TransmogCost, " + "EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, " + "Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT MAX(ID) + 1 FROM spell_item_enchantment", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale" " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -1230,15 +1268,16 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT MAX(ID) + 1 FROM spell_learn_spell", CONNECTION_SYNCH); // SpellLevels.db2 - PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, MaxLevel, MaxPassiveAuraLevel, BaseLevel, SpellLevel, SpellID" " FROM spell_levels WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_LEVELS, "SELECT MAX(ID) + 1 FROM spell_levels", CONNECTION_SYNCH); // SpellMisc.db2 PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " - "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, DifficultyID, CastingTimeIndex, " - "DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, SpellID" - " FROM spell_misc WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, Attributes15, DifficultyID, " + "CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, " + "ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_MISC, "SELECT MAX(ID) + 1 FROM spell_misc", CONNECTION_SYNCH); // SpellName.db2 @@ -1319,7 +1358,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_VISUAL_KIT, "SELECT MAX(ID) + 1 FROM spell_visual_kit", CONNECTION_SYNCH); // SpellXSpellVisual.db2 - PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Priority, SpellIconFileID, " "ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" " FROM spell_x_spell_visual WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT MAX(ID) + 1 FROM spell_x_spell_visual", CONNECTION_SYNCH); @@ -1371,6 +1410,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT MAX(ID) + 1 FROM transmog_holiday", CONNECTION_SYNCH); + // TransmogIllusion.db2 + PrepareStatement(HOTFIX_SEL_TRANSMOG_ILLUSION, "SELECT ID, UnlockConditionID, TransmogCost, SpellItemEnchantmentID, Flags FROM transmog_illusion" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRANSMOG_ILLUSION, "SELECT MAX(ID) + 1 FROM transmog_illusion", CONNECTION_SYNCH); + // TransmogSet.db2 PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " "ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder, PlayerConditionID FROM transmog_set WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); @@ -1399,9 +1443,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT MAX(ID) + 1 FROM transport_rotation", CONNECTION_SYNCH); // UiMap.db2 - PrepareStatement(HOTFIX_SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, `System`, Type, LevelRangeMin, LevelRangeMax, BountySetID, " - "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup FROM ui_map" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, `System`, Type, BountySetID, BountyDisplayLocation, " + "VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID FROM ui_map WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP, "SELECT MAX(ID) + 1 FROM ui_map", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_UI_MAP, "SELECT ID, Name_lang FROM ui_map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -1412,7 +1455,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // UiMapLink.db2 PrepareStatement(HOTFIX_SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, " - "OverrideHighlightFileDataID, OverrideHighlightAtlasID FROM ui_map_link WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "OverrideHighlightFileDataID, OverrideHighlightAtlasID, Flags FROM ui_map_link WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP_LINK, "SELECT MAX(ID) + 1 FROM ui_map_link", CONNECTION_SYNCH); // UiMapXMapArt.db2 @@ -1429,9 +1472,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() // Vehicle.db2 PrepareStatement(HOTFIX_SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " - "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " - "VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " - "PowerDisplayID2, PowerDisplayID3 FROM vehicle WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, " + "VehicleUIIndicatorID, MissileTargetingID, VehiclePOITypeID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, " + "PowerDisplayID1, PowerDisplayID2, PowerDisplayID3 FROM vehicle WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_VEHICLE, "SELECT MAX(ID) + 1 FROM vehicle", CONNECTION_SYNCH); // VehicleSeat.db2 diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 57e797b2251..37b6dc165c7 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -166,22 +166,16 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_CFG_REGIONS, HOTFIX_SEL_CFG_REGIONS_MAX_ID, - HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES, - HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES_MAX_ID, - - HOTFIX_SEL_CHAR_BASE_SECTION, - HOTFIX_SEL_CHAR_BASE_SECTION_MAX_ID, - - HOTFIX_SEL_CHAR_SECTIONS, - HOTFIX_SEL_CHAR_SECTIONS_MAX_ID, - - HOTFIX_SEL_CHAR_START_OUTFIT, - HOTFIX_SEL_CHAR_START_OUTFIT_MAX_ID, - HOTFIX_SEL_CHAR_TITLES, HOTFIX_SEL_CHAR_TITLES_MAX_ID, HOTFIX_SEL_CHAR_TITLES_LOCALE, + HOTFIX_SEL_CHARACTER_LOADOUT, + HOTFIX_SEL_CHARACTER_LOADOUT_MAX_ID, + + HOTFIX_SEL_CHARACTER_LOADOUT_ITEM, + HOTFIX_SEL_CHARACTER_LOADOUT_ITEM_MAX_ID, + HOTFIX_SEL_CHAT_CHANNELS, HOTFIX_SEL_CHAT_CHANNELS_MAX_ID, HOTFIX_SEL_CHAT_CHANNELS_LOCALE, @@ -193,6 +187,32 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES_MAX_ID, + HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, + HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE_MAX_ID, + HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE, + + HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, + HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO_MAX_ID, + + HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, + HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT_MAX_ID, + + HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION, + HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION_MAX_ID, + HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION_LOCALE, + + HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, + HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_MAX_ID, + + HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE, + HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE_MAX_ID, + + HOTFIX_SEL_CHR_MODEL, + HOTFIX_SEL_CHR_MODEL_MAX_ID, + + HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, + HOTFIX_SEL_CHR_RACE_X_CHR_MODEL_MAX_ID, + HOTFIX_SEL_CHR_RACES, HOTFIX_SEL_CHR_RACES_MAX_ID, HOTFIX_SEL_CHR_RACES_LOCALE, @@ -623,9 +643,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_REWARD_PACK_X_ITEM, HOTFIX_SEL_REWARD_PACK_X_ITEM_MAX_ID, - HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, - HOTFIX_SEL_SCALING_STAT_DISTRIBUTION_MAX_ID, - HOTFIX_SEL_SCENARIO, HOTFIX_SEL_SCENARIO_MAX_ID, HOTFIX_SEL_SCENARIO_LOCALE, @@ -802,6 +819,9 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_TRANSMOG_HOLIDAY, HOTFIX_SEL_TRANSMOG_HOLIDAY_MAX_ID, + HOTFIX_SEL_TRANSMOG_ILLUSION, + HOTFIX_SEL_TRANSMOG_ILLUSION_MAX_ID, + HOTFIX_SEL_TRANSMOG_SET, HOTFIX_SEL_TRANSMOG_SET_MAX_ID, HOTFIX_SEL_TRANSMOG_SET_LOCALE, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index eec3c81fb35..2d542fc4a70 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -98,6 +98,13 @@ bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTre return false; } + if (achievement->CovenantID && referencePlayer->m_playerData->CovenantID != achievement->CovenantID) + { + TC_LOG_TRACE("criteria.achievement", "AchievementMgr::CanUpdateCriteriaTree: (Id: %u Type %s Achievement %u) Wrong covenant", + criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), achievement->ID); + return false; + } + return CriteriaHandler::CanUpdateCriteriaTree(criteria, tree, referencePlayer); } @@ -522,7 +529,7 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. - if (uint32 titleId = reward->TitleId[achievement->ID == 1793 ? _owner->m_playerData->NativeSex : (_owner->GetTeam() == ALLIANCE ? 0 : 1)]) + if (uint32 titleId = reward->TitleId[achievement->ID == 1793 ? _owner->GetNativeSex() : (_owner->GetTeam() == ALLIANCE ? 0 : 1)]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) _owner->SetTitle(titleEntry); diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 38a30a877ce..bce5b6ecb9c 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -523,6 +523,10 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 case CRITERIA_TYPE_PRESTIGE_REACHED: case CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT: case CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED: + case CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE: + case CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR: + case CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR: + case CRITERIA_TYPE_TRAVELLED_TO_AREA: SetCriteriaProgress(criteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: increment at miscValue1 @@ -810,6 +814,9 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 case CRITERIA_TYPE_EARN_HONOR_XP: case CRITERIA_TYPE_RELIC_TALENT_UNLOCKED: case CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL: + case CRITERIA_TYPE_MYTHIC_KEYSTONE_COMPLETED: + case CRITERIA_TYPE_APPLY_CONDUIT: + case CRITERIA_TYPE_CONVERT_ITEMS_TO_CURRENCY: break; // Not implemented yet :( } @@ -1175,6 +1182,10 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL: case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: case CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED: + case CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE: + case CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR: + case CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR: + case CRITERIA_TYPE_TRAVELLED_TO_AREA: return progress->Counter >= requiredAmount; case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case CRITERIA_TYPE_COMPLETE_QUEST: @@ -1336,6 +1347,9 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis case CRITERIA_TYPE_WIN_DUEL: case CRITERIA_TYPE_WIN_RATED_ARENA: case CRITERIA_TYPE_WON_AUCTIONS: + case CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE: + case CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR: + case CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR: if (!miscValue1) return false; break; @@ -1590,6 +1604,9 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis if (!miscValue2 /*login case*/ || miscValue1 != uint32(criteria->Entry->Asset.EquipmentSlot)) return false; break; + case CRITERIA_TYPE_TRAVELLED_TO_AREA: + if (miscValue1 != uint32(criteria->Entry->Asset.AreaID)) + return false; default: break; } @@ -2017,7 +2034,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; case CRITERIA_ADDITIONAL_CONDITION_SOURCE_NATIVE_SEX: // 98 - if (referencePlayer->m_playerData->NativeSex != uint8(reqValue)) + if (referencePlayer->GetNativeSex() != uint8(reqValue)) return false; break; case CRITERIA_ADDITIONAL_CONDITION_SKILL: // 99 @@ -2701,7 +2718,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 break; } case CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_120: // 264 - if (referencePlayer->getLevel() != 120) + if (referencePlayer->getLevel() != 60) return false; break; case CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_LOWER: // 266 @@ -2720,6 +2737,46 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 if (essence.AzeriteEssenceID == selectedEssences->AzeriteEssenceID[reqValue] && essence.Rank > secondaryAsset) return true; return false; + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_IN_RANGE_CT: // 268 + { + uint8 level = referencePlayer->getLevel(); + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(reqValue, 0)) + { + if (secondaryAsset) + return level >= levels->MinLevelWithDelta && level <= levels->MaxLevelWithDelta; + return level >= levels->MinLevel && level <= levels->MaxLevel; + } + return false; + } + case CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_IN_RANGE_CT: // 269 + { + if (!unit) + return false; + uint8 level = unit->getLevel(); + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(reqValue, 0)) + { + if (secondaryAsset) + return level >= levels->MinLevelWithDelta && level <= levels->MaxLevelWithDelta; + return level >= levels->MinLevel && level <= levels->MaxLevel; + } + return false; + } + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_GREATER_CT: // 272 + { + uint8 level = referencePlayer->getLevel(); + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(reqValue, 0)) + return secondaryAsset ? level >= levels->MinLevelWithDelta : level >= levels->MinLevel; + return false; + } + case CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_GREATER_CT: // 273 + { + if (!unit) + return false; + uint8 level = unit->getLevel(); + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(reqValue, 0)) + return secondaryAsset ? level >= levels->MinLevelWithDelta : level >= levels->MinLevel; + return false; + } case CRITERIA_ADDITIONAL_CONDITION_MAP_OR_COSMETIC_MAP: // 280 { MapEntry const* map = referencePlayer->GetMap()->GetEntry(); @@ -2727,6 +2784,60 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; } + case CRITERIA_ADDITIONAL_CONDITION_COVENANT: // 288 + if (referencePlayer->m_playerData->CovenantID != int32(reqValue)) + return false; + break; + case CRITERIA_ADDITIONAL_CONDITION_SOULBIND: // 291 + if (referencePlayer->m_playerData->SoulbindID != int32(reqValue)) + return false; + break; + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE_IN_GROUP: // 293 + { + std::vector<uint32> areas = sDB2Manager.GetAreasForGroup(reqValue); + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(referencePlayer->GetAreaId())) + for (uint32 areaInGroup : areas) + if (areaInGroup == area->ID || areaInGroup == area->ParentAreaID) + return true; + return false; + } + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_SPECIFIC_CHROMIE_TIME: // 300 + if (referencePlayer->m_activePlayerData->UiChromieTimeExpansionID != int32(reqValue)) + return false; + break; + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_ANY_CHROMIE_TIME: // 301 + if (referencePlayer->m_activePlayerData->UiChromieTimeExpansionID == 0) + return false; + break; + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_RUNEFORGE_LEGENDARY_KNOWN: // 303 + { + uint32 block = reqValue / 32; + if (block >= referencePlayer->m_activePlayerData->RuneforgePowers.size()) + return false; + + uint32 bit = reqValue % 32; + return referencePlayer->m_activePlayerData->RuneforgePowers[block] & (1 << bit); + } + case CRITERIA_ADDITIONAL_CONDITION_SHAPESHIFT_FORM_CUSTOMIZATION_DISPLAY: // 308 + { + ShapeshiftFormModelData const* formModelData = sDB2Manager.GetShapeshiftFormModelData(referencePlayer->getRace(), referencePlayer->GetNativeSex(), secondaryAsset); + if (!formModelData) + return false; + uint32 formChoice = referencePlayer->GetCustomizationChoice(formModelData->OptionID); + auto choiceItr = std::find_if(formModelData->Choices->begin(), formModelData->Choices->end(), [formChoice](ChrCustomizationChoiceEntry const* choice) + { + return choice->ID == formChoice; + }); + if (choiceItr == formModelData->Choices->end()) + return false; + if (int32(reqValue) != formModelData->Displays[std::distance(formModelData->Choices->begin(), choiceItr)]->DisplayID) + return false; + break; + } + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_FLYING: // 311 + if (!referencePlayer->IsFlying()) + return false; + break; default: break; } @@ -3106,6 +3217,20 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaTypes type) return "HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED"; case CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED: return "HEART_OF_AZEROTH_LEVEL_REACHED"; + case CRITERIA_TYPE_MYTHIC_KEYSTONE_COMPLETED: + return "MYTHIC_KEYSTONE_COMPLETED"; + case CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE: + return "COMPLETE_QUEST_ACCUMULATE"; + case CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR: + return "BOUGHT_ITEM_FROM_VENDOR"; + case CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR: + return "SOLD_ITEM_TO_VENDOR"; + case CRITERIA_TYPE_TRAVELLED_TO_AREA: + return "TRAVELLED_TO_AREA"; + case CRITERIA_TYPE_APPLY_CONDUIT: + return "APPLY_CONDUIT"; + case CRITERIA_TYPE_CONVERT_ITEMS_TO_CURRENCY: + return "CONVERT_ITEMS_TO_CURRENCY"; } return "MISSING_TYPE"; } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 409c9b4a852..fbf3a370ca0 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1629,7 +1629,7 @@ bool Battleground::AddSpiritGuide(uint32 type, float x, float y, float z, float // creature->SetVisibleAura(0, SPELL_SPIRIT_HEAL_CHANNEL); // casting visual effect creature->SetChannelSpellId(SPELL_SPIRIT_HEAL_CHANNEL); - creature->SetChannelSpellXSpellVisualId(VISUAL_SPIRIT_HEAL_CHANNEL); + creature->SetChannelVisual({ VISUAL_SPIRIT_HEAL_CHANNEL, 0 }); //creature->CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true); return true; } diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp index 5e297d3f90b..a078c502e40 100644 --- a/src/server/game/Cache/CharacterCache.cpp +++ b/src/server/game/Cache/CharacterCache.cpp @@ -141,6 +141,15 @@ void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string con _characterCacheByNameStore[name] = &itr->second; } +void CharacterCache::UpdateCharacterGender(ObjectGuid const& guid, uint8 gender) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.Sex = gender; +} + void CharacterCache::UpdateCharacterLevel(ObjectGuid const& guid, uint8 level) { auto itr = _characterCacheStore.find(guid); diff --git a/src/server/game/Cache/CharacterCache.h b/src/server/game/Cache/CharacterCache.h index c76bb04ecb1..a9a872da837 100644 --- a/src/server/game/Cache/CharacterCache.h +++ b/src/server/game/Cache/CharacterCache.h @@ -48,6 +48,7 @@ class TC_GAME_API CharacterCache void DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name); void UpdateCharacterData(ObjectGuid const& guid, std::string const& name, uint8* gender = nullptr, uint8* race = nullptr); + void UpdateCharacterGender(ObjectGuid const& guid, uint8 gender); void UpdateCharacterLevel(ObjectGuid const& guid, uint8 level); void UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId); void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 4c3f074588e..dbeaf49c757 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -98,17 +98,18 @@ enum ChannelFlags enum ChannelDBCFlags { - CHANNEL_DBC_FLAG_NONE = 0x00000, - CHANNEL_DBC_FLAG_INITIAL = 0x00001, // General, Trade, LocalDefense, LFG - CHANNEL_DBC_FLAG_ZONE_DEP = 0x00002, // General, Trade, LocalDefense, GuildRecruitment - CHANNEL_DBC_FLAG_GLOBAL = 0x00004, // WorldDefense - CHANNEL_DBC_FLAG_TRADE = 0x00008, // Trade, LFG - CHANNEL_DBC_FLAG_CITY_ONLY = 0x00010, // Trade, GuildRecruitment, LFG - CHANNEL_DBC_FLAG_CITY_ONLY2 = 0x00020, // Trade, GuildRecruitment, LFG - CHANNEL_DBC_FLAG_DEFENSE = 0x10000, // LocalDefense, WorldDefense - CHANNEL_DBC_FLAG_GUILD_REQ = 0x20000, // GuildRecruitment - CHANNEL_DBC_FLAG_LFG = 0x40000, // LFG - CHANNEL_DBC_FLAG_UNK1 = 0x80000 // General + CHANNEL_DBC_FLAG_NONE = 0x00000, + CHANNEL_DBC_FLAG_INITIAL = 0x00001, // General, Trade, LocalDefense, LFG + CHANNEL_DBC_FLAG_ZONE_DEP = 0x00002, // General, Trade, LocalDefense, GuildRecruitment + CHANNEL_DBC_FLAG_GLOBAL = 0x00004, // WorldDefense + CHANNEL_DBC_FLAG_TRADE = 0x00008, // Trade, LFG + CHANNEL_DBC_FLAG_CITY_ONLY = 0x00010, // Trade, GuildRecruitment, LFG + CHANNEL_DBC_FLAG_CITY_ONLY2 = 0x00020, // Trade, GuildRecruitment, LFG + CHANNEL_DBC_FLAG_DEFENSE = 0x10000, // LocalDefense, WorldDefense + CHANNEL_DBC_FLAG_GUILD_REQ = 0x20000, // GuildRecruitment + CHANNEL_DBC_FLAG_LFG = 0x40000, // LFG + CHANNEL_DBC_FLAG_UNK1 = 0x80000, // General + CHANNEL_DBC_FLAG_NO_CLIENT_JOIN = 0x200000 }; enum ChannelMemberFlags diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 03c75df9348..bc0e8f64742 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2547,11 +2547,30 @@ uint32 ConditionMgr::GetPlayerConditionLfgValue(Player const* player, PlayerCond bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditionEntry const* condition) { - if (condition->MinLevel && player->getLevel() < condition->MinLevel) - return false; + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(condition->ContentTuningID, player->m_playerData->CtrOptions->ContentTuningConditionMask)) + { + uint8 minLevel = condition->Flags & 0x800 ? levels->MinLevelWithDelta : levels->MinLevel; + uint8 maxLevel = 0; + if (!(condition->Flags & 0x20)) + maxLevel = condition->Flags & 0x800 ? levels->MaxLevelWithDelta : levels->MaxLevel; - if (condition->MaxLevel && player->getLevel() > condition->MaxLevel) - return false; + if (condition->Flags & 0x80) + { + if (minLevel && player->getLevel() >= minLevel && (!maxLevel || player->getLevel() <= maxLevel)) + return false; + + if (maxLevel && player->getLevel() <= maxLevel && (!minLevel || player->getLevel() >= minLevel)) + return false; + } + else + { + if (minLevel && player->getLevel() < minLevel) + return false; + + if (maxLevel && player->getLevel() > maxLevel) + return false; + } + } if (condition->RaceMask && !condition->RaceMask.HasRace(player->getRace())) return false; @@ -2562,7 +2581,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio if (condition->Gender >= 0 && player->getGender() != condition->Gender) return false; - if (condition->NativeGender >= 0 && player->m_playerData->NativeSex != condition->NativeGender) + if (condition->NativeGender >= 0 && player->GetNativeSex() != condition->NativeGender) return false; if (condition->PowerType != -1 && condition->PowerTypeComp) @@ -2946,6 +2965,9 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio if (condition->ModifierTreeID && !player->ModifierTreeSatisfied(condition->ModifierTreeID)) return false; + if (condition->CovenantID && player->m_playerData->CovenantID != condition->CovenantID) + return false; + return true; } diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 9fa79edfdbd..dde5b4fa2ba 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -46,6 +46,7 @@ struct AchievementLoadInfo { true, FT_INT, "RewardItemID" }, { false, FT_INT, "CriteriaTree" }, { true, FT_SHORT, "SharesCriteria" }, + { true, FT_INT, "CovenantID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT); return &loadInfo; @@ -119,7 +120,6 @@ struct AreaTableLoadInfo { false, FT_SHORT, "UwAmbience" }, { false, FT_SHORT, "ZoneMusic" }, { false, FT_SHORT, "UwZoneMusic" }, - { true, FT_BYTE, "ExplorationLevel" }, { false, FT_SHORT, "IntroSound" }, { false, FT_INT, "UwIntroSound" }, { false, FT_BYTE, "FactionGroupMask" }, @@ -129,6 +129,7 @@ struct AreaTableLoadInfo { false, FT_BYTE, "WildBattlePetLevelMin" }, { false, FT_BYTE, "WildBattlePetLevelMax" }, { false, FT_BYTE, "WindSettingsID" }, + { true, FT_INT, "ContentTuningID" }, { true, FT_INT, "Flags1" }, { true, FT_INT, "Flags2" }, { false, FT_SHORT, "LiquidTypeID1" }, @@ -688,7 +689,7 @@ struct BattlePetBreedStateLoadInfo static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, - { false, FT_BYTE, "BattlePetStateID" }, + { true, FT_INT, "BattlePetStateID" }, { false, FT_SHORT, "Value" }, { false, FT_INT, "BattlePetBreedID" }, }; @@ -714,6 +715,7 @@ struct BattlePetSpeciesLoadInfo { true, FT_BYTE, "SourceTypeEnum" }, { true, FT_INT, "CardUIModelSceneID" }, { true, FT_INT, "LoadoutUIModelSceneID" }, + { true, FT_INT, "CovenantID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES); return &loadInfo; @@ -756,9 +758,9 @@ struct BattlemasterListLoadInfo { true, FT_BYTE, "GroupsAllowed" }, { true, FT_BYTE, "MaxGroupSize" }, { true, FT_SHORT, "HolidayWorldState" }, - { true, FT_BYTE, "Flags" }, + { true, FT_INT, "Flags" }, { true, FT_INT, "IconFileDataID" }, - { true, FT_SHORT, "RequiredPlayerConditionID" }, + { true, FT_INT, "RequiredPlayerConditionID" }, { true, FT_SHORT, "MapID1" }, { true, FT_SHORT, "MapID2" }, { true, FT_SHORT, "MapID3" }, @@ -790,7 +792,7 @@ struct BroadcastTextLoadInfo { false, FT_STRING, "Text" }, { false, FT_STRING, "Text1" }, { false, FT_INT, "ID" }, - { false, FT_BYTE, "LanguageID" }, + { true, FT_INT, "LanguageID" }, { true, FT_INT, "ConditionID" }, { false, FT_SHORT, "EmotesID" }, { false, FT_BYTE, "Flags" }, @@ -827,121 +829,50 @@ struct CfgRegionsLoadInfo } }; -struct CharacterFacialHairStylesLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { true, FT_INT, "Geoset1" }, - { true, FT_INT, "Geoset2" }, - { true, FT_INT, "Geoset3" }, - { true, FT_INT, "Geoset4" }, - { true, FT_INT, "Geoset5" }, - { false, FT_BYTE, "RaceID" }, - { false, FT_BYTE, "SexID" }, - { false, FT_BYTE, "VariationID" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharacterFacialHairStylesMeta::Instance(), HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES); - return &loadInfo; - } -}; - -struct CharBaseSectionLoadInfo +struct CharTitlesLoadInfo { static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, - { false, FT_BYTE, "LayoutResType" }, - { false, FT_BYTE, "VariationEnum" }, - { false, FT_BYTE, "ResolutionVariationEnum" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Name1" }, + { true, FT_SHORT, "MaskID" }, + { true, FT_BYTE, "Flags" }, }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharBaseSectionMeta::Instance(), HOTFIX_SEL_CHAR_BASE_SECTION); + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); return &loadInfo; } }; -struct CharSectionsLoadInfo +struct CharacterLoadoutLoadInfo { static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { + { true, FT_LONG, "RaceMask" }, { false, FT_INT, "ID" }, - { true, FT_BYTE, "RaceID" }, - { true, FT_BYTE, "SexID" }, - { true, FT_BYTE, "BaseSection" }, - { true, FT_BYTE, "VariationIndex" }, - { true, FT_BYTE, "ColorIndex" }, - { true, FT_SHORT, "Flags" }, - { true, FT_INT, "MaterialResourcesID1" }, - { true, FT_INT, "MaterialResourcesID2" }, - { true, FT_INT, "MaterialResourcesID3" }, + { true, FT_BYTE, "ChrClassID" }, + { true, FT_BYTE, "Purpose" }, }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS); + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharacterLoadoutMeta::Instance(), HOTFIX_SEL_CHARACTER_LOADOUT); return &loadInfo; } }; -struct CharStartOutfitLoadInfo +struct CharacterLoadoutItemLoadInfo { static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, - { false, FT_BYTE, "ClassID" }, - { false, FT_BYTE, "SexID" }, - { false, FT_BYTE, "OutfitID" }, - { false, FT_INT, "PetDisplayID" }, - { false, FT_BYTE, "PetFamilyID" }, - { true, FT_INT, "ItemID1" }, - { true, FT_INT, "ItemID2" }, - { true, FT_INT, "ItemID3" }, - { true, FT_INT, "ItemID4" }, - { true, FT_INT, "ItemID5" }, - { true, FT_INT, "ItemID6" }, - { true, FT_INT, "ItemID7" }, - { true, FT_INT, "ItemID8" }, - { true, FT_INT, "ItemID9" }, - { true, FT_INT, "ItemID10" }, - { true, FT_INT, "ItemID11" }, - { true, FT_INT, "ItemID12" }, - { true, FT_INT, "ItemID13" }, - { true, FT_INT, "ItemID14" }, - { true, FT_INT, "ItemID15" }, - { true, FT_INT, "ItemID16" }, - { true, FT_INT, "ItemID17" }, - { true, FT_INT, "ItemID18" }, - { true, FT_INT, "ItemID19" }, - { true, FT_INT, "ItemID20" }, - { true, FT_INT, "ItemID21" }, - { true, FT_INT, "ItemID22" }, - { true, FT_INT, "ItemID23" }, - { true, FT_INT, "ItemID24" }, - { false, FT_INT, "RaceID" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT); - return &loadInfo; - } -}; - -struct CharTitlesLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { false, FT_STRING, "Name" }, - { false, FT_STRING, "Name1" }, - { true, FT_SHORT, "MaskID" }, - { true, FT_BYTE, "Flags" }, + { false, FT_SHORT, "CharacterLoadoutID" }, + { false, FT_INT, "ItemID" }, }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharacterLoadoutItemMeta::Instance(), HOTFIX_SEL_CHARACTER_LOADOUT_ITEM); return &loadInfo; } }; @@ -952,11 +883,12 @@ struct ChatChannelsLoadInfo { static DB2FieldMeta const fields[] = { - { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, { false, FT_STRING, "Shortcut" }, + { false, FT_INT, "ID" }, { true, FT_INT, "Flags" }, { true, FT_BYTE, "FactionGroup" }, + { true, FT_INT, "Ruleset" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS); return &loadInfo; @@ -974,14 +906,29 @@ struct ChrClassesLoadInfo { false, FT_STRING, "NameMale" }, { false, FT_STRING, "NameFemale" }, { false, FT_STRING_NOT_LOCALIZED, "PetNameToken" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "RoleInfoString" }, + { false, FT_STRING, "DisabledString" }, + { false, FT_STRING, "HyphenatedNameMale" }, + { false, FT_STRING, "HyphenatedNameFemale" }, { false, FT_INT, "ID" }, { false, FT_INT, "CreateScreenFileDataID" }, { false, FT_INT, "SelectScreenFileDataID" }, { false, FT_INT, "IconFileDataID" }, { false, FT_INT, "LowResScreenFileDataID" }, - { true, FT_INT, "StartingLevel" }, + { false, FT_INT, "Flags" }, { false, FT_INT, "SpellTextureBlobFileDataID" }, - { false, FT_SHORT, "Flags" }, + { false, FT_INT, "RolesMask" }, + { false, FT_INT, "ArmorTypeMask" }, + { true, FT_INT, "CharStartKitUnknown901" }, + { true, FT_INT, "MaleCharacterCreationVisualFallback" }, + { true, FT_INT, "MaleCharacterCreationIdleVisualFallback" }, + { true, FT_INT, "FemaleCharacterCreationVisualFallback" }, + { true, FT_INT, "FemaleCharacterCreationIdleVisualFallback" }, + { true, FT_INT, "CharacterCreationIdleGroundVisualFallback" }, + { true, FT_INT, "CharacterCreationGroundVisualFallback" }, + { true, FT_INT, "AlteredFormCharacterCreationIdleVisualFallback" }, + { true, FT_INT, "CharacterCreationAnimLoopWaitTimeMsFallback" }, { false, FT_SHORT, "CinematicSequenceID" }, { false, FT_SHORT, "DefaultSpec" }, { false, FT_BYTE, "PrimaryStatPriority" }, @@ -990,6 +937,9 @@ struct ChrClassesLoadInfo { false, FT_BYTE, "AttackPowerPerAgility" }, { false, FT_BYTE, "AttackPowerPerStrength" }, { false, FT_BYTE, "SpellClassSet" }, + { false, FT_BYTE, "ChatColorR" }, + { false, FT_BYTE, "ChatColorG" }, + { false, FT_BYTE, "ChatColorB" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES); return &loadInfo; @@ -1011,6 +961,169 @@ struct ChrClassesXPowerTypesLoadInfo } }; +struct ChrCustomizationChoiceLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_INT, "ID" }, + { true, FT_INT, "ChrCustomizationOptionID" }, + { true, FT_INT, "ChrCustomizationReqID" }, + { false, FT_SHORT, "SortOrder" }, + { true, FT_INT, "SwatchColor1" }, + { true, FT_INT, "SwatchColor2" }, + { false, FT_SHORT, "UiOrderIndex" }, + { true, FT_INT, "Flags" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationChoiceMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE); + return &loadInfo; + } +}; + +struct ChrCustomizationDisplayInfoLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "ShapeshiftFormID" }, + { true, FT_INT, "DisplayID" }, + { false, FT_FLOAT, "BarberShopMinCameraDistance" }, + { false, FT_FLOAT, "BarberShopHeightOffset" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationDisplayInfoMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO); + return &loadInfo; + } +}; + +struct ChrCustomizationElementLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "ChrCustomizationChoiceID" }, + { true, FT_INT, "RelatedChrCustomizationChoiceID" }, + { true, FT_INT, "ChrCustomizationGeosetID" }, + { true, FT_INT, "ChrCustomizationSkinnedModelID" }, + { true, FT_INT, "ChrCustomizationMaterialID" }, + { true, FT_INT, "ChrCustomizationBoneSetID" }, + { true, FT_INT, "ChrCustomizationCondModelID" }, + { true, FT_INT, "ChrCustomizationDisplayInfoID" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationElementMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT); + return &loadInfo; + } +}; + +struct ChrCustomizationOptionLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_INT, "ID" }, + { false, FT_SHORT, "SecondaryID" }, + { true, FT_INT, "Flags" }, + { true, FT_INT, "ChrModelID" }, + { true, FT_INT, "SortIndex" }, + { true, FT_INT, "ChrCustomizationCategoryID" }, + { true, FT_INT, "OptionType" }, + { false, FT_FLOAT, "BarberShopCostModifier" }, + { true, FT_INT, "ChrCustomizationID" }, + { true, FT_INT, "ChrCustomizationReqID" }, + { true, FT_INT, "UiOrderIndex" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationOptionMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_OPTION); + return &loadInfo; + } +}; + +struct ChrCustomizationReqLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "Flags" }, + { true, FT_INT, "ClassMask" }, + { true, FT_INT, "AchievementID" }, + { true, FT_INT, "OverrideArchive" }, + { true, FT_INT, "ItemModifiedAppearanceID" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationReqMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_REQ); + return &loadInfo; + } +}; + +struct ChrCustomizationReqChoiceLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "ChrCustomizationChoiceID" }, + { false, FT_INT, "ChrCustomizationReqID" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrCustomizationReqChoiceMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE); + return &loadInfo; + } +}; + +struct ChrModelLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "FaceCustomizationOffset1" }, + { false, FT_FLOAT, "FaceCustomizationOffset2" }, + { false, FT_FLOAT, "FaceCustomizationOffset3" }, + { false, FT_FLOAT, "CustomizeOffset1" }, + { false, FT_FLOAT, "CustomizeOffset2" }, + { false, FT_FLOAT, "CustomizeOffset3" }, + { false, FT_INT, "ID" }, + { true, FT_INT, "Sex" }, + { true, FT_INT, "DisplayID" }, + { true, FT_INT, "CharComponentTextureLayoutID" }, + { true, FT_INT, "Flags" }, + { true, FT_INT, "SkeletonFileDataID" }, + { true, FT_INT, "ModelFallbackChrModelID" }, + { true, FT_INT, "TextureFallbackChrModelID" }, + { true, FT_INT, "HelmVisFallbackChrModelID" }, + { false, FT_FLOAT, "CustomizeScale" }, + { false, FT_FLOAT, "CustomizeFacing" }, + { false, FT_FLOAT, "CameraDistanceOffset" }, + { false, FT_FLOAT, "BarberShopCameraOffsetScale" }, + { false, FT_FLOAT, "BarberShopCameraRotationOffset" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrModelMeta::Instance(), HOTFIX_SEL_CHR_MODEL); + return &loadInfo; + } +}; + +struct ChrRaceXChrModelLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "ChrRacesID" }, + { true, FT_INT, "ChrModelID" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrRaceXChrModelMeta::Instance(), HOTFIX_SEL_CHR_RACE_X_CHR_MODEL); + return &loadInfo; + } +}; + struct ChrRacesLoadInfo { static DB2LoadInfo const* Instance() @@ -1023,20 +1136,22 @@ struct ChrRacesLoadInfo { false, FT_STRING, "NameFemale" }, { false, FT_STRING, "NameLowercase" }, { false, FT_STRING, "NameFemaleLowercase" }, + { false, FT_STRING, "NameS" }, + { false, FT_STRING, "NameFemaleS" }, + { false, FT_STRING, "NameLowercaseS" }, + { false, FT_STRING, "NameFemaleLowercaseS" }, + { false, FT_STRING, "RaceFantasyDescription" }, + { false, FT_STRING, "NameL" }, + { false, FT_STRING, "NameFemaleL" }, + { false, FT_STRING, "NameLowercaseL" }, + { false, FT_STRING, "NameFemaleLowercaseL" }, { false, FT_INT, "ID" }, { true, FT_INT, "Flags" }, - { false, FT_INT, "MaleDisplayId" }, - { false, FT_INT, "FemaleDisplayId" }, - { false, FT_INT, "HighResMaleDisplayId" }, - { false, FT_INT, "HighResFemaleDisplayId" }, + { true, FT_INT, "BaseLanguage" }, + { true, FT_INT, "ResSicknessSpellID" }, + { true, FT_INT, "SplashSoundID" }, { true, FT_INT, "CreateScreenFileDataID" }, { true, FT_INT, "SelectScreenFileDataID" }, - { false, FT_FLOAT, "MaleCustomizeOffset1" }, - { false, FT_FLOAT, "MaleCustomizeOffset2" }, - { false, FT_FLOAT, "MaleCustomizeOffset3" }, - { false, FT_FLOAT, "FemaleCustomizeOffset1" }, - { false, FT_FLOAT, "FemaleCustomizeOffset2" }, - { false, FT_FLOAT, "FemaleCustomizeOffset3" }, { true, FT_INT, "LowResScreenFileDataID" }, { false, FT_INT, "AlteredFormStartVisualKitID1" }, { false, FT_INT, "AlteredFormStartVisualKitID2" }, @@ -1047,21 +1162,19 @@ struct ChrRacesLoadInfo { true, FT_INT, "HeritageArmorAchievementID" }, { true, FT_INT, "StartingLevel" }, { true, FT_INT, "UiDisplayOrder" }, - { true, FT_INT, "FemaleSkeletonFileDataID" }, - { true, FT_INT, "MaleSkeletonFileDataID" }, - { true, FT_INT, "HelmVisFallbackRaceID" }, + { true, FT_INT, "PlayableRaceBit" }, + { true, FT_INT, "HelmetAnimScalingRaceID" }, { true, FT_INT, "TransmogrifyDisabledSlotMask" }, + { false, FT_FLOAT, "AlteredFormCustomizeOffsetFallback1" }, + { false, FT_FLOAT, "AlteredFormCustomizeOffsetFallback2" }, + { false, FT_FLOAT, "AlteredFormCustomizeOffsetFallback3" }, + { false, FT_FLOAT, "AlteredFormCustomizeRotationFallback" }, { true, FT_SHORT, "FactionID" }, { true, FT_SHORT, "CinematicSequenceID" }, - { true, FT_SHORT, "ResSicknessSpellID" }, - { true, FT_SHORT, "SplashSoundID" }, - { true, FT_BYTE, "BaseLanguage" }, { true, FT_BYTE, "CreatureType" }, { true, FT_BYTE, "Alliance" }, { true, FT_BYTE, "RaceRelated" }, { true, FT_BYTE, "UnalteredVisualRaceID" }, - { true, FT_BYTE, "CharComponentTextureLayoutID" }, - { true, FT_BYTE, "CharComponentTexLayoutHiResID" }, { true, FT_BYTE, "DefaultClassID" }, { true, FT_BYTE, "NeutralRaceID" }, { true, FT_BYTE, "MaleModelFallbackRaceID" }, @@ -1072,6 +1185,7 @@ struct ChrRacesLoadInfo { true, FT_BYTE, "MaleTextureFallbackSex" }, { true, FT_BYTE, "FemaleTextureFallbackRaceID" }, { true, FT_BYTE, "FemaleTextureFallbackSex" }, + { true, FT_BYTE, "UnalteredVisualCustomizationRaceID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES); return &loadInfo; @@ -1152,10 +1266,17 @@ struct ContentTuningLoadInfo static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, - { true, FT_INT, "MinLevel" }, - { true, FT_INT, "MaxLevel" }, { true, FT_INT, "Flags" }, { true, FT_INT, "ExpansionID" }, + { true, FT_INT, "MinLevel" }, + { true, FT_INT, "MaxLevel" }, + { true, FT_INT, "MinLevelType" }, + { true, FT_INT, "MaxLevelType" }, + { true, FT_INT, "TargetLevelDelta" }, + { true, FT_INT, "TargetLevelMaxDelta" }, + { true, FT_INT, "TargetLevelMin" }, + { true, FT_INT, "TargetLevelMax" }, + { true, FT_INT, "MinItemLevel" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ContentTuningMeta::Instance(), HOTFIX_SEL_CONTENT_TUNING); return &loadInfo; @@ -1265,17 +1386,9 @@ struct CreatureDisplayInfoExtraLoadInfo { true, FT_BYTE, "DisplayRaceID" }, { true, FT_BYTE, "DisplaySexID" }, { true, FT_BYTE, "DisplayClassID" }, - { true, FT_BYTE, "SkinID" }, - { true, FT_BYTE, "FaceID" }, - { true, FT_BYTE, "HairStyleID" }, - { true, FT_BYTE, "HairColorID" }, - { true, FT_BYTE, "FacialHairID" }, { true, FT_BYTE, "Flags" }, { true, FT_INT, "BakeMaterialResourcesID" }, { true, FT_INT, "HDBakeMaterialResourcesID" }, - { false, FT_BYTE, "CustomDisplayOption1" }, - { false, FT_BYTE, "CustomDisplayOption2" }, - { false, FT_BYTE, "CustomDisplayOption3" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); return &loadInfo; @@ -1423,18 +1536,20 @@ struct CurrencyTypesLoadInfo { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, { false, FT_STRING, "Description" }, - { false, FT_BYTE, "CategoryID" }, + { true, FT_INT, "CategoryID" }, { true, FT_INT, "InventoryIconFileID" }, { false, FT_INT, "SpellWeight" }, { false, FT_BYTE, "SpellCategory" }, { false, FT_INT, "MaxQty" }, { false, FT_INT, "MaxEarnablePerWeek" }, - { false, FT_INT, "Flags" }, { true, FT_BYTE, "Quality" }, { true, FT_INT, "FactionID" }, { true, FT_INT, "ItemGroupSoundsID" }, - { true, FT_INT, "ConvertToPlayerExperience" }, - { true, FT_INT, "PlayerConditionID" }, + { true, FT_INT, "XpQuestDifficulty" }, + { true, FT_INT, "AwardConditionID" }, + { true, FT_INT, "MaxQtyWorldStateID" }, + { true, FT_INT, "Flags1" }, + { true, FT_INT, "Flags2" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES); return &loadInfo; @@ -1465,6 +1580,8 @@ struct CurvePointLoadInfo { false, FT_INT, "ID" }, { false, FT_FLOAT, "PosX" }, { false, FT_FLOAT, "PosY" }, + { false, FT_FLOAT, "PosPreSquishX" }, + { false, FT_FLOAT, "PosPreSquishY" }, { false, FT_SHORT, "CurveID" }, { false, FT_BYTE, "OrderIndex" }, }; @@ -1482,20 +1599,20 @@ struct DestructibleModelDataLoadInfo { false, FT_INT, "ID" }, { true, FT_BYTE, "State0ImpactEffectDoodadSet" }, { false, FT_BYTE, "State0AmbientDoodadSet" }, - { false, FT_SHORT, "State1Wmo" }, + { true, FT_INT, "State1Wmo" }, { true, FT_BYTE, "State1DestructionDoodadSet" }, { true, FT_BYTE, "State1ImpactEffectDoodadSet" }, { false, FT_BYTE, "State1AmbientDoodadSet" }, - { false, FT_SHORT, "State2Wmo" }, + { true, FT_INT, "State2Wmo" }, { true, FT_BYTE, "State2DestructionDoodadSet" }, { true, FT_BYTE, "State2ImpactEffectDoodadSet" }, { false, FT_BYTE, "State2AmbientDoodadSet" }, - { false, FT_SHORT, "State3Wmo" }, + { true, FT_INT, "State3Wmo" }, { false, FT_BYTE, "State3InitDoodadSet" }, { false, FT_BYTE, "State3AmbientDoodadSet" }, { false, FT_BYTE, "EjectDirection" }, { false, FT_BYTE, "DoNotHighlight" }, - { false, FT_SHORT, "State0Wmo" }, + { true, FT_INT, "State0Wmo" }, { false, FT_BYTE, "HealEffect" }, { false, FT_SHORT, "HealEffectSpeed" }, { true, FT_BYTE, "State0NameSet" }, @@ -1543,7 +1660,7 @@ struct DungeonEncounterLoadInfo { false, FT_STRING, "Name" }, { false, FT_INT, "ID" }, { true, FT_SHORT, "MapID" }, - { true, FT_BYTE, "DifficultyID" }, + { true, FT_INT, "DifficultyID" }, { true, FT_INT, "OrderIndex" }, { true, FT_INT, "CompleteWorldStateID" }, { true, FT_BYTE, "Bit" }, @@ -1823,13 +1940,13 @@ struct GameobjectsLoadInfo { false, FT_FLOAT, "Rot3" }, { false, FT_FLOAT, "Rot4" }, { false, FT_INT, "ID" }, - { false, FT_SHORT, "OwnerID" }, - { false, FT_SHORT, "DisplayID" }, + { true, FT_INT, "OwnerID" }, + { true, FT_INT, "DisplayID" }, { false, FT_FLOAT, "Scale" }, - { false, FT_BYTE, "TypeID" }, - { false, FT_BYTE, "PhaseUseFlags" }, - { false, FT_SHORT, "PhaseID" }, - { false, FT_SHORT, "PhaseGroupID" }, + { true, FT_INT, "TypeID" }, + { true, FT_INT, "PhaseUseFlags" }, + { true, FT_INT, "PhaseID" }, + { true, FT_INT, "PhaseGroupID" }, { true, FT_INT, "PropValue1" }, { true, FT_INT, "PropValue2" }, { true, FT_INT, "PropValue3" }, @@ -1879,7 +1996,7 @@ struct GarrBuildingLoadInfo { false, FT_BYTE, "BuildingType" }, { true, FT_INT, "HordeGameObjectID" }, { true, FT_INT, "AllianceGameObjectID" }, - { false, FT_BYTE, "GarrSiteID" }, + { true, FT_INT, "GarrSiteID" }, { false, FT_BYTE, "UpgradeLevel" }, { true, FT_INT, "BuildSeconds" }, { false, FT_SHORT, "CurrencyTypeID" }, @@ -1977,6 +2094,8 @@ struct GarrFollowerLoadInfo { false, FT_BYTE, "ChrClassID" }, { false, FT_BYTE, "Flags" }, { false, FT_BYTE, "Gender" }, + { true, FT_INT, "AutoCombatantID" }, + { true, FT_INT, "CovenantID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER); return &loadInfo; @@ -2101,7 +2220,6 @@ struct GemPropertiesLoadInfo { false, FT_INT, "ID" }, { false, FT_SHORT, "EnchantId" }, { true, FT_INT, "Type" }, - { false, FT_SHORT, "MinItemLevel" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES); return &loadInfo; @@ -2388,6 +2506,7 @@ struct ItemLoadInfo { true, FT_BYTE, "SoundOverrideSubclassID" }, { true, FT_INT, "IconFileDataID" }, { false, FT_BYTE, "ItemGroupSoundsID" }, + { true, FT_INT, "ModifiedCraftingReagentItemID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM); return &loadInfo; @@ -2405,6 +2524,7 @@ struct ItemAppearanceLoadInfo { true, FT_INT, "ItemDisplayInfoID" }, { true, FT_INT, "DefaultIconFileDataID" }, { true, FT_INT, "UiOrder" }, + { true, FT_INT, "PlayerConditionID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE); return &loadInfo; @@ -2494,6 +2614,7 @@ struct ItemBonusLoadInfo { true, FT_INT, "Value1" }, { true, FT_INT, "Value2" }, { true, FT_INT, "Value3" }, + { true, FT_INT, "Value4" }, { false, FT_SHORT, "ParentItemBonusListID" }, { false, FT_BYTE, "Type" }, { false, FT_BYTE, "OrderIndex" }, @@ -3027,6 +3148,9 @@ struct ItemSparseLoadInfo { true, FT_INT, "Flags3" }, { true, FT_INT, "Flags4" }, { true, FT_INT, "FactionRelated" }, + { true, FT_INT, "ModifiedCraftingReagentItemID" }, + { true, FT_INT, "ContentTuningID" }, + { true, FT_INT, "PlayerLevelToItemLevelCurveID" }, { false, FT_SHORT, "ItemNameDescriptionID" }, { false, FT_SHORT, "RequiredTransmogHoliday" }, { false, FT_SHORT, "RequiredHoliday" }, @@ -3042,7 +3166,6 @@ struct ItemSparseLoadInfo { false, FT_SHORT, "StartQuestID" }, { false, FT_SHORT, "PageID" }, { false, FT_SHORT, "ItemDelay" }, - { false, FT_SHORT, "ScalingStatDistributionID" }, { false, FT_SHORT, "MinFactionID" }, { false, FT_SHORT, "RequiredSkillRank" }, { false, FT_SHORT, "RequiredSkill" }, @@ -3187,8 +3310,6 @@ struct LfgDungeonsLoadInfo { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, { false, FT_STRING, "Description" }, - { false, FT_BYTE, "MinLevel" }, - { false, FT_SHORT, "MaxLevel" }, { false, FT_BYTE, "TypeID" }, { false, FT_BYTE, "Subtype" }, { true, FT_BYTE, "Faction" }, @@ -3202,9 +3323,6 @@ struct LfgDungeonsLoadInfo { false, FT_BYTE, "GroupID" }, { false, FT_BYTE, "OrderIndex" }, { false, FT_INT, "RequiredPlayerConditionId" }, - { false, FT_BYTE, "TargetLevel" }, - { false, FT_BYTE, "TargetLevelMin" }, - { false, FT_SHORT, "TargetLevelMax" }, { false, FT_SHORT, "RandomID" }, { false, FT_SHORT, "ScenarioID" }, { false, FT_SHORT, "FinalEncounterID" }, @@ -3217,6 +3335,7 @@ struct LfgDungeonsLoadInfo { false, FT_SHORT, "BonusReputationAmount" }, { false, FT_SHORT, "MentorItemLevel" }, { false, FT_BYTE, "MentorCharLevel" }, + { true, FT_INT, "ContentTuningID" }, { true, FT_INT, "Flags1" }, { true, FT_INT, "Flags2" }, }; @@ -3327,6 +3446,7 @@ struct LockLoadInfo static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, + { true, FT_INT, "Flags" }, { true, FT_INT, "Index1" }, { true, FT_INT, "Index2" }, { true, FT_INT, "Index3" }, @@ -3388,6 +3508,7 @@ struct MapLoadInfo { false, FT_INT, "ID" }, { false, FT_STRING_NOT_LOCALIZED, "Directory" }, { false, FT_STRING, "MapName" }, + { false, FT_STRING_NOT_LOCALIZED, "InternalName" }, { false, FT_STRING, "MapDescription0" }, { false, FT_STRING, "MapDescription1" }, { false, FT_STRING, "PvpShortDescription" }, @@ -3694,11 +3815,9 @@ struct PlayerConditionLoadInfo { true, FT_LONG, "RaceMask" }, { false, FT_STRING, "FailureDescription" }, { false, FT_INT, "ID" }, - { false, FT_SHORT, "MinLevel" }, - { false, FT_SHORT, "MaxLevel" }, { true, FT_INT, "ClassMask" }, { false, FT_INT, "SkillLogic" }, - { false, FT_BYTE, "LanguageID" }, + { true, FT_INT, "LanguageID" }, { false, FT_BYTE, "MinLanguage" }, { true, FT_INT, "MaxLanguage" }, { false, FT_SHORT, "MaxFactionID" }, @@ -3714,7 +3833,7 @@ struct PlayerConditionLoadInfo { false, FT_BYTE, "ItemFlags" }, { false, FT_INT, "AuraSpellLogic" }, { false, FT_SHORT, "WorldStateExpressionID" }, - { false, FT_BYTE, "WeatherID" }, + { true, FT_INT, "WeatherID" }, { false, FT_BYTE, "PartyStatus" }, { false, FT_BYTE, "LifetimeMaxPVPRank" }, { false, FT_INT, "AchievementLogic" }, @@ -3723,7 +3842,7 @@ struct PlayerConditionLoadInfo { false, FT_INT, "AreaLogic" }, { false, FT_INT, "LfgLogic" }, { false, FT_INT, "CurrencyLogic" }, - { false, FT_SHORT, "QuestKillID" }, + { true, FT_INT, "QuestKillID" }, { false, FT_INT, "QuestKillLogic" }, { true, FT_BYTE, "MinExpansionLevel" }, { true, FT_BYTE, "MaxExpansionLevel" }, @@ -3734,7 +3853,7 @@ struct PlayerConditionLoadInfo { false, FT_BYTE, "PhaseUseFlags" }, { false, FT_SHORT, "PhaseID" }, { false, FT_INT, "PhaseGroupID" }, - { false, FT_BYTE, "Flags" }, + { true, FT_INT, "Flags" }, { true, FT_BYTE, "ChrSpecializationIndex" }, { true, FT_BYTE, "ChrSpecializationRole" }, { false, FT_INT, "ModifierTreeID" }, @@ -3748,6 +3867,8 @@ struct PlayerConditionLoadInfo { true, FT_BYTE, "MinExpansionTier" }, { false, FT_BYTE, "MinPVPRank" }, { false, FT_BYTE, "MaxPVPRank" }, + { true, FT_INT, "ContentTuningID" }, + { true, FT_INT, "CovenantID" }, { false, FT_SHORT, "SkillID1" }, { false, FT_SHORT, "SkillID2" }, { false, FT_SHORT, "SkillID3" }, @@ -3766,18 +3887,18 @@ struct PlayerConditionLoadInfo { false, FT_BYTE, "MinReputation1" }, { false, FT_BYTE, "MinReputation2" }, { false, FT_BYTE, "MinReputation3" }, - { false, FT_SHORT, "PrevQuestID1" }, - { false, FT_SHORT, "PrevQuestID2" }, - { false, FT_SHORT, "PrevQuestID3" }, - { false, FT_SHORT, "PrevQuestID4" }, - { false, FT_SHORT, "CurrQuestID1" }, - { false, FT_SHORT, "CurrQuestID2" }, - { false, FT_SHORT, "CurrQuestID3" }, - { false, FT_SHORT, "CurrQuestID4" }, - { false, FT_SHORT, "CurrentCompletedQuestID1" }, - { false, FT_SHORT, "CurrentCompletedQuestID2" }, - { false, FT_SHORT, "CurrentCompletedQuestID3" }, - { false, FT_SHORT, "CurrentCompletedQuestID4" }, + { true, FT_INT, "PrevQuestID1" }, + { true, FT_INT, "PrevQuestID2" }, + { true, FT_INT, "PrevQuestID3" }, + { true, FT_INT, "PrevQuestID4" }, + { true, FT_INT, "CurrQuestID1" }, + { true, FT_INT, "CurrQuestID2" }, + { true, FT_INT, "CurrQuestID3" }, + { true, FT_INT, "CurrQuestID4" }, + { true, FT_INT, "CurrentCompletedQuestID1" }, + { true, FT_INT, "CurrentCompletedQuestID2" }, + { true, FT_INT, "CurrentCompletedQuestID3" }, + { true, FT_INT, "CurrentCompletedQuestID4" }, { true, FT_INT, "SpellID1" }, { true, FT_INT, "SpellID2" }, { true, FT_INT, "SpellID3" }, @@ -4185,22 +4306,6 @@ struct RewardPackXItemLoadInfo } }; -struct ScalingStatDistributionLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { false, FT_SHORT, "PlayerLevelToItemLevelCurveID" }, - { true, FT_INT, "MinLevel" }, - { true, FT_INT, "MaxLevel" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); - return &loadInfo; - } -}; - struct ScenarioLoadInfo { static DB2LoadInfo const* Instance() @@ -4230,7 +4335,7 @@ struct ScenarioStepLoadInfo { false, FT_STRING, "Title" }, { false, FT_SHORT, "ScenarioID" }, { false, FT_INT, "Criteriatreeid" }, - { false, FT_SHORT, "RewardQuestID" }, + { true, FT_INT, "RewardQuestID" }, { true, FT_INT, "RelatedStep" }, { false, FT_SHORT, "Supersedes" }, { false, FT_BYTE, "OrderIndex" }, @@ -4343,7 +4448,7 @@ struct SkillLineAbilityLoadInfo { true, FT_BYTE, "AcquireMethod" }, { true, FT_SHORT, "TrivialSkillLineRankHigh" }, { true, FT_SHORT, "TrivialSkillLineRankLow" }, - { true, FT_BYTE, "Flags" }, + { true, FT_INT, "Flags" }, { true, FT_BYTE, "NumSkillUps" }, { true, FT_SHORT, "UniqueBit" }, { true, FT_SHORT, "TradeSkillCategoryID" }, @@ -4488,7 +4593,6 @@ struct SpellCastTimesLoadInfo { { false, FT_INT, "ID" }, { true, FT_INT, "Base" }, - { true, FT_SHORT, "PerLevel" }, { true, FT_INT, "Minimum" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES); @@ -4603,7 +4707,6 @@ struct SpellDurationLoadInfo { { false, FT_INT, "ID" }, { true, FT_INT, "Duration" }, - { false, FT_INT, "DurationPerLevel" }, { true, FT_INT, "MaxDuration" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION); @@ -4621,7 +4724,7 @@ struct SpellEffectLoadInfo { true, FT_SHORT, "EffectAura" }, { true, FT_INT, "DifficultyID" }, { true, FT_INT, "EffectIndex" }, - { false, FT_INT, "Effect" }, + { true, FT_INT, "Effect" }, { false, FT_FLOAT, "EffectAmplitude" }, { true, FT_INT, "EffectAttributes" }, { true, FT_INT, "EffectAuraPeriod" }, @@ -4715,18 +4818,20 @@ struct SpellItemEnchantmentLoadInfo { static DB2FieldMeta const fields[] = { - { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, { false, FT_STRING, "HordeName" }, + { false, FT_INT, "ID" }, { false, FT_INT, "EffectArg1" }, { false, FT_INT, "EffectArg2" }, { false, FT_INT, "EffectArg3" }, { false, FT_FLOAT, "EffectScalingPoints1" }, { false, FT_FLOAT, "EffectScalingPoints2" }, { false, FT_FLOAT, "EffectScalingPoints3" }, - { false, FT_INT, "TransmogPlayerConditionID" }, - { false, FT_INT, "TransmogCost" }, { false, FT_INT, "IconFileDataID" }, + { true, FT_INT, "MinItemLevel" }, + { true, FT_INT, "MaxItemLevel" }, + { false, FT_INT, "TransmogUseConditionID" }, + { false, FT_INT, "TransmogCost" }, { true, FT_SHORT, "EffectPointsMin1" }, { true, FT_SHORT, "EffectPointsMin2" }, { true, FT_SHORT, "EffectPointsMin3" }, @@ -4817,10 +4922,10 @@ struct SpellLevelsLoadInfo { { false, FT_INT, "ID" }, { false, FT_BYTE, "DifficultyID" }, - { true, FT_SHORT, "BaseLevel" }, { true, FT_SHORT, "MaxLevel" }, - { true, FT_SHORT, "SpellLevel" }, { false, FT_BYTE, "MaxPassiveAuraLevel" }, + { true, FT_INT, "BaseLevel" }, + { true, FT_INT, "SpellLevel" }, { false, FT_INT, "SpellID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS); @@ -4849,6 +4954,7 @@ struct SpellMiscLoadInfo { true, FT_INT, "Attributes12" }, { true, FT_INT, "Attributes13" }, { true, FT_INT, "Attributes14" }, + { true, FT_INT, "Attributes15" }, { false, FT_BYTE, "DifficultyID" }, { false, FT_SHORT, "CastingTimeIndex" }, { false, FT_SHORT, "DurationIndex" }, @@ -4860,6 +4966,9 @@ struct SpellMiscLoadInfo { true, FT_INT, "SpellIconFileDataID" }, { true, FT_INT, "ActiveIconFileDataID" }, { true, FT_INT, "ContentTuningID" }, + { true, FT_INT, "ShowFutureSpellPlayerConditionID" }, + { true, FT_INT, "SpellVisualScript" }, + { true, FT_INT, "ActiveSpellVisualScript" }, { false, FT_INT, "SpellID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); @@ -4945,7 +5054,7 @@ struct SpellProcsPerMinuteModLoadInfo { { false, FT_INT, "ID" }, { false, FT_BYTE, "Type" }, - { true, FT_SHORT, "Param" }, + { true, FT_INT, "Param" }, { false, FT_FLOAT, "Coeff" }, { false, FT_INT, "SpellProcsPerMinuteID" }, }; @@ -5159,7 +5268,6 @@ struct SpellXSpellVisualLoadInfo { false, FT_BYTE, "DifficultyID" }, { false, FT_INT, "SpellVisualID" }, { false, FT_FLOAT, "Probability" }, - { false, FT_BYTE, "Flags" }, { false, FT_BYTE, "Priority" }, { true, FT_INT, "SpellIconFileID" }, { true, FT_INT, "ActiveIconFileID" }, @@ -5362,6 +5470,23 @@ struct TransmogHolidayLoadInfo } }; +struct TransmogIllusionLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "UnlockConditionID" }, + { true, FT_INT, "TransmogCost" }, + { true, FT_INT, "SpellItemEnchantmentID" }, + { true, FT_INT, "Flags" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogIllusionMeta::Instance(), HOTFIX_SEL_TRANSMOG_ILLUSION); + return &loadInfo; + } +}; + struct TransmogSetLoadInfo { static DB2LoadInfo const* Instance() @@ -5467,14 +5592,13 @@ struct UiMapLoadInfo { true, FT_INT, "Flags" }, { true, FT_INT, "System" }, { true, FT_INT, "Type" }, - { false, FT_INT, "LevelRangeMin" }, - { false, FT_INT, "LevelRangeMax" }, { true, FT_INT, "BountySetID" }, { false, FT_INT, "BountyDisplayLocation" }, { true, FT_INT, "VisibilityPlayerConditionID" }, { true, FT_BYTE, "HelpTextPosition" }, { true, FT_INT, "BkgAtlasID" }, { true, FT_INT, "AlternateUiMapGroup" }, + { true, FT_INT, "ContentTuningID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapMeta::Instance(), HOTFIX_SEL_UI_MAP); return &loadInfo; @@ -5526,6 +5650,7 @@ struct UiMapLinkLoadInfo { true, FT_INT, "ChildUiMapID" }, { true, FT_INT, "OverrideHighlightFileDataID" }, { true, FT_INT, "OverrideHighlightAtlasID" }, + { true, FT_INT, "Flags" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapLinkMeta::Instance(), HOTFIX_SEL_UI_MAP_LINK); return &loadInfo; @@ -5607,9 +5732,9 @@ struct VehicleLoadInfo { false, FT_FLOAT, "FacingLimitRight" }, { false, FT_FLOAT, "FacingLimitLeft" }, { false, FT_FLOAT, "CameraYawOffset" }, - { false, FT_BYTE, "UiLocomotionType" }, { false, FT_SHORT, "VehicleUIIndicatorID" }, { true, FT_INT, "MissileTargetingID" }, + { false, FT_SHORT, "VehiclePOITypeID" }, { false, FT_SHORT, "SeatID1" }, { false, FT_SHORT, "SeatID2" }, { false, FT_SHORT, "SeatID3" }, diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 44e0b72e792..555784e56d0 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -24,7 +24,7 @@ struct AchievementMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[16] = + static DB2MetaField const fields[17] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -42,8 +42,9 @@ struct AchievementMeta { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_SHORT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1260179, 3, 16, 16, 0xB0CDA956, fields, 11); + static DB2Meta instance(1260179, 3, 17, 17, 0x03687ABD, fields, 11); return &instance; } }; @@ -81,7 +82,7 @@ struct AdventureJournalMeta { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, @@ -93,7 +94,7 @@ struct AdventureJournalMeta { FT_INT, 2, false }, { FT_BYTE, 2, false }, }; - static DB2Meta instance(1115949, -1, 22, 22, 0x76736DC1, fields, -1); + static DB2Meta instance(1115949, -1, 22, 22, 0x8591A17C, fields, -1); return &instance; } }; @@ -126,35 +127,19 @@ struct AlliedRaceMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[9] = { { FT_INT, 1, false }, { FT_INT, 1, true }, - { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - }; - static DB2Meta instance(1710672, 0, 8, 8, 0xBA13C058, fields, -1); - return &instance; - } -}; - -struct AlliedRaceRacialAbilityMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[5] = - { - { FT_STRING, 1, true }, - { FT_STRING, 1, true }, { FT_INT, 1, true }, - { FT_BYTE, 1, false }, { FT_INT, 1, true }, }; - static DB2Meta instance(1720145, -1, 5, 4, 0x5FF19738, fields, 4); + static DB2Meta instance(1710672, 0, 9, 9, 0xCAF97110, fields, -1); return &instance; } }; @@ -178,14 +163,15 @@ struct AnimKitBoneSetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1375433, -1, 4, 4, 0xE620E362, fields, -1); + static DB2Meta instance(1375433, -1, 5, 5, 0x48CA2284, fields, -1); return &instance; } }; @@ -266,7 +252,7 @@ struct AnimKitSegmentMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[18] = + static DB2MetaField const fields[19] = { { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, @@ -286,8 +272,9 @@ struct AnimKitSegmentMeta { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, + { FT_FLOAT, 1, true }, }; - static DB2Meta instance(1304324, -1, 18, 18, 0x827B9DD7, fields, 0); + static DB2Meta instance(1304324, -1, 19, 19, 0x3099BD1B, fields, 0); return &instance; } }; @@ -322,6 +309,115 @@ struct AnimReplacementSetMeta } }; +struct AnimaCableMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[35] = + { + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3286805, -1, 35, 35, 0xBA340158, fields, -1); + return &instance; + } +}; + +struct AnimaCylinderMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[7] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3286804, -1, 7, 7, 0x033E8736, fields, -1); + return &instance; + } +}; + +struct AnimaMaterialMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[31] = + { + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 3, true }, + }; + static DB2Meta instance(3153990, -1, 31, 31, 0x23D776A4, fields, -1); + return &instance; + } +}; + struct AnimationDataMeta { static DB2Meta const* Instance() @@ -449,7 +545,6 @@ struct AreaTableMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, { FT_BYTE, 1, false }, @@ -459,10 +554,11 @@ struct AreaTableMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 2, true }, { FT_SHORT, 4, false }, }; - static DB2Meta instance(1353545, -1, 23, 23, 0x9944A57F, fields, -1); + static DB2Meta instance(1353545, -1, 23, 23, 0x7EF13BBB, fields, -1); return &instance; } }; @@ -500,9 +596,9 @@ struct AreaTriggerActionSetMeta { static DB2MetaField const fields[1] = { - { FT_SHORT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1352378, -1, 1, 1, 0x7E8012C8, fields, -1); + static DB2Meta instance(1352378, -1, 1, 1, 0xD7673266, fields, -1); return &instance; } }; @@ -562,6 +658,21 @@ struct AreaTriggerSphereMeta } }; +struct ArenaCcItemMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3849793, 0, 3, 2, 0x8611CEBF, fields, 2); + return &instance; + } +}; + struct ArmorLocationMeta { static DB2Meta const* Instance() @@ -957,9 +1068,9 @@ struct AzeriteTierUnlockMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, false }, }; - static DB2Meta instance(1846043, -1, 4, 3, 0xD2BEFD49, fields, 3); + static DB2Meta instance(1846043, -1, 4, 3, 0x365B7BC1, fields, 3); return &instance; } }; @@ -1157,11 +1268,11 @@ struct BattlePetBreedStateMeta { static DB2MetaField const fields[3] = { - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(801579, -1, 3, 2, 0x5140A97C, fields, 2); + static DB2Meta instance(801579, -1, 3, 2, 0xBEA26E1B, fields, 2); return &instance; } }; @@ -1214,7 +1325,7 @@ struct BattlePetSpeciesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[11] = + static DB2MetaField const fields[12] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -1227,8 +1338,9 @@ struct BattlePetSpeciesMeta { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(841622, 2, 11, 11, 0xD48B948B, fields, -1); + static DB2Meta instance(841622, 2, 12, 12, 0x33F39540, fields, -1); return &instance; } }; @@ -1264,6 +1376,20 @@ struct BattlePetSpeciesXAbilityMeta } }; +struct BattlePetSpeciesXCovenantMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_SHORT, 1, false }, + { FT_SHORT, 1, false }, + }; + static DB2Meta instance(3669304, -1, 2, 1, 0xABBC028A, fields, 1); + return &instance; + } +}; + struct BattlePetStateMeta { static DB2Meta const* Instance() @@ -1317,12 +1443,12 @@ struct BattlemasterListMeta { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_SHORT, 1, true }, - { FT_BYTE, 1, true }, { FT_INT, 1, true }, - { FT_SHORT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 16, true }, }; - static DB2Meta instance(1360265, -1, 17, 17, 0x191968B6, fields, -1); + static DB2Meta instance(1360265, -1, 17, 17, 0xBA348260, fields, -1); return &instance; } }; @@ -1397,15 +1523,16 @@ struct BountyMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[6] = { - { FT_SHORT, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1367866, -1, 5, 4, 0x29E1E7AD, fields, 4); + static DB2Meta instance(1367866, 0, 6, 5, 0x66D9FE53, fields, 5); return &instance; } }; @@ -1417,9 +1544,9 @@ struct BountySetMeta static DB2MetaField const fields[2] = { { FT_INT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1367865, -1, 2, 2, 0x2C4F72C9, fields, -1); + static DB2Meta instance(1367865, -1, 2, 2, 0xB86A8476, fields, -1); return &instance; } }; @@ -1433,7 +1560,7 @@ struct BroadcastTextMeta { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, @@ -1442,7 +1569,7 @@ struct BroadcastTextMeta { FT_SHORT, 3, false }, { FT_SHORT, 3, false }, }; - static DB2Meta instance(841604, 2, 11, 11, 0x1EDED3E1, fields, -1); + static DB2Meta instance(841604, 2, 11, 11, 0x762EC396, fields, -1); return &instance; } }; @@ -1530,18 +1657,22 @@ struct CampaignMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[12] = { { FT_STRING, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, false }, }; - static DB2Meta instance(2031607, 3, 8, 8, 0x9794A9C1, fields, -1); + static DB2Meta instance(2031607, 3, 12, 12, 0xA6065A95, fields, -1); return &instance; } }; @@ -1550,14 +1681,15 @@ struct CampaignXConditionMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { + { FT_STRING, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(2031611, -1, 4, 3, 0x530A9A14, fields, 3); + static DB2Meta instance(2031611, -1, 5, 4, 0xC7C42FAD, fields, 4); return &instance; } }; @@ -1736,15 +1868,15 @@ struct CharComponentTextureSectionsMeta { static DB2MetaField const fields[7] = { - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, - { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, - { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1360263, -1, 7, 7, 0x7C4B248E, fields, -1); + static DB2Meta instance(1360263, -1, 7, 7, 0xB6E9C94F, fields, 0); return &instance; } }; @@ -1845,7 +1977,7 @@ struct CharShipmentContainerMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_BYTE, 1, false }, @@ -1853,26 +1985,33 @@ struct CharShipmentContainerMeta { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(972405, -1, 16, 16, 0x9692590F, fields, -1); + static DB2Meta instance(972405, -1, 16, 16, 0x2278DB5A, fields, -1); return &instance; } }; -struct CharStartOutfitMeta +struct CharStartKitMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[14] = { + { FT_STRING, 1, true }, + { FT_FLOAT, 3, true }, { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_INT, 1, false }, - { FT_BYTE, 1, false }, - { FT_INT, 24, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1237591, -1, 7, 6, 0x3B34251C, fields, 6); + static DB2Meta instance(3055696, -1, 14, 13, 0xF22C193E, fields, 13); return &instance; } }; @@ -1893,23 +2032,6 @@ struct CharTitlesMeta } }; -struct CharacterFaceBoneSetMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[5] = - { - { FT_BYTE, 1, false }, - { FT_INT, 1, true }, - { FT_BYTE, 1, false }, - { FT_INT, 1, true }, - { FT_BYTE, 1, false }, - }; - static DB2Meta instance(1028733, -1, 5, 4, 0x7A686AEA, fields, 4); - return &instance; - } -}; - struct CharacterFacialHairStylesMeta { static DB2Meta const* Instance() @@ -1930,13 +2052,14 @@ struct CharacterLoadoutMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[4] = { { FT_LONG, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, }; - static DB2Meta instance(1344281, -1, 3, 3, 0xCB8F0F1A, fields, -1); + static DB2Meta instance(1344281, 1, 4, 4, 0x7BA6DD4F, fields, -1); return &instance; } }; @@ -1955,6 +2078,22 @@ struct CharacterLoadoutItemMeta } }; +struct CharacterLoadoutPetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3724843, -1, 4, 3, 0x10D43187, fields, 3); + return &instance; + } +}; + struct CharacterServiceInfoMeta { static DB2Meta const* Instance() @@ -1982,14 +2121,16 @@ struct ChatChannelsMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[6] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, + { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_BYTE, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1345278, -1, 4, 4, 0x66E15E36, fields, -1); + static DB2Meta instance(1345278, 2, 6, 6, 0x331D8CF2, fields, -1); return &instance; } }; @@ -2041,6 +2182,22 @@ struct ChrClassTitleMeta } }; +struct ChrClassUIChrModelInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_FLOAT, 3, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3754770, -1, 4, 4, 0xEC04FE04, fields, -1); + return &instance; + } +}; + struct ChrClassUIDisplayMeta { static DB2Meta const* Instance() @@ -2075,23 +2232,41 @@ struct ChrClassesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[21] = + static DB2MetaField const fields[39] = { { FT_STRING, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_INT, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_BYTE, 1, false }, + { FT_BYTE, 1, false }, + { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, @@ -2099,7 +2274,7 @@ struct ChrClassesMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1361031, 5, 21, 21, 0xB036848B, fields, -1); + static DB2Meta instance(1361031, 10, 39, 39, 0x7EF5ADB3, fields, -1); return &instance; } }; @@ -2118,13 +2293,65 @@ struct ChrClassesXPowerTypesMeta } }; -struct ChrCustomizationMeta +struct ChrCreateClassAnimTargetMeta { static DB2Meta const* Instance() { static DB2MetaField const fields[7] = { + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3671168, -1, 7, 6, 0xBA3B39ED, fields, 6); + return &instance; + } +}; + +struct ChrCreateClassAnimTargetInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3671169, 0, 4, 3, 0x5D06AB00, fields, 3); + return &instance; + } +}; + +struct ChrCustClientChoiceConversionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3590348, 0, 4, 3, 0x531DD388, fields, 3); + return &instance; + } +}; + +struct ChrCustomizationMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[8] = + { { FT_STRING, 1, true }, + { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, @@ -2132,33 +2359,381 @@ struct ChrCustomizationMeta { FT_INT, 3, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1611874, -1, 7, 6, 0x25807B05, fields, 6); + static DB2Meta instance(1611874, 1, 8, 7, 0xCE94DFDA, fields, 7); return &instance; } }; -struct ChrRacesMeta +struct ChrCustomizationBoneSetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[47] = + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3460181, -1, 2, 2, 0x46FB30D0, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationCategoryMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = { - { FT_STRING_NOT_LOCALIZED, 1, true }, - { FT_STRING_NOT_LOCALIZED, 1, true }, - { FT_STRING, 1, true }, - { FT_STRING, 1, true }, { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3526439, 1, 9, 9, 0x69C90AAA, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationChoiceMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = + { { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3450554, 1, 9, 9, 0x5E646924, fields, 2); + return &instance; + } +}; + +struct ChrCustomizationCondModelMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 3, true }, + }; + static DB2Meta instance(3460182, -1, 2, 2, 0x5B4D36CD, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationConversionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[7] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3463337, -1, 7, 7, 0x1D1B187B, fields, 4); + return &instance; + } +}; + +struct ChrCustomizationDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3593032, 0, 5, 5, 0xE662481C, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationElementMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = + { { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3512765, 0, 9, 9, 0x29E7E6E9, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationGeosetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3456171, -1, 3, 3, 0xF1B919BA, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationMaterialMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3459652, 0, 3, 3, 0x25D08F0C, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationOptionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[12] = + { + { FT_STRING, 1, true }, { FT_INT, 1, false }, + { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3384247, 1, 12, 12, 0xEB7143AC, fields, 4); + return &instance; + } +}; + +struct ChrCustomizationReqMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3450453, 0, 6, 6, 0xEA6C595F, fields, -1); + return &instance; + } +}; + +struct ChrCustomizationReqChoiceMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3580359, -1, 2, 1, 0x263E53D8, fields, 1); + return &instance; + } +}; + +struct ChrCustomizationSkinnedModelMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + }; + static DB2Meta instance(3460183, -1, 4, 4, 0x0A19C75E, fields, -1); + return &instance; + } +}; + +struct ChrModelMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[16] = + { { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3384313, 2, 16, 16, 0xE62BB49C, fields, -1); + return &instance; + } +}; + +struct ChrModelMaterialMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[7] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3566562, 0, 7, 7, 0x09B4418C, fields, 1); + return &instance; + } +}; + +struct ChrModelTextureLayerMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 3, true }, + { FT_INT, 2, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3548976, 0, 9, 8, 0xB6E31714, fields, 8); + return &instance; + } +}; + +struct ChrModelTextureTargetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[1] = + { + { FT_INT, 1, false }, + }; + static DB2Meta instance(3536417, 0, 1, 1, 0x28EBA06A, fields, -1); + return &instance; + } +}; + +struct ChrRaceRacialAbilityMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3507821, -1, 6, 5, 0xC07F1EE4, fields, 5); + return &instance; + } +}; + +struct ChrRaceXChrModelMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3490304, -1, 2, 2, 0x888FDCA8, fields, 0); + return &instance; + } +}; + +struct ChrRacesMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[50] = + { + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 3, false }, { FT_INT, 3, false }, @@ -2168,9 +2743,8 @@ struct ChrRacesMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, + { FT_FLOAT, 3, true }, + { FT_FLOAT, 1, true }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, { FT_BYTE, 1, true }, @@ -2188,10 +2762,8 @@ struct ChrRacesMeta { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, }; - static DB2Meta instance(1305311, 6, 47, 47, 0xC1BC2966, fields, -1); + static DB2Meta instance(1305311, 15, 50, 50, 0x85A50CA9, fields, -1); return &instance; } }; @@ -2462,6 +3034,22 @@ struct ComponentTextureFileDataMeta } }; +struct ConditionalContentTuningMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3501965, -1, 4, 3, 0x209DE3DD, fields, 3); + return &instance; + } +}; + struct ConfigurationWarningMeta { static DB2Meta const* Instance() @@ -2480,15 +3068,22 @@ struct ContentTuningMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[12] = { { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1962930, 0, 5, 5, 0x3C5246D1, fields, -1); + static DB2Meta instance(1962930, 0, 12, 12, 0x7802E330, fields, -1); return &instance; } }; @@ -2595,6 +3190,26 @@ struct CorruptionEffectsMeta } }; +struct CovenantMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[8] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3384973, 2, 8, 8, 0x551DD981, fields, -1); + return &instance; + } +}; + struct CreatureMeta { static DB2Meta const* Instance() @@ -2622,17 +3237,19 @@ struct CreatureDifficultyMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[9] = { { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, true }, - { FT_INT, 7, true }, + { FT_INT, 8, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(879282, -1, 7, 6, 0xA7D21F05, fields, 6); + static DB2Meta instance(879282, -1, 9, 8, 0x592C0350, fields, 8); return &instance; } }; @@ -2692,25 +3309,32 @@ struct CreatureDisplayInfoCondMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[15] = + static DB2MetaField const fields[8] = { { FT_LONG, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, { FT_INT, 1, true }, - { FT_INT, 2, true }, - { FT_INT, 2, true }, - { FT_INT, 2, true }, { FT_INT, 3, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1332686, -1, 15, 14, 0x89765207, fields, 14); + static DB2Meta instance(1332686, 1, 8, 7, 0x0AA29755, fields, 7); + return &instance; + } +}; + +struct CreatureDisplayInfoCondXChoiceMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3670439, -1, 2, 2, 0xE8CD17F9, fields, 0); return &instance; } }; @@ -2735,22 +3359,17 @@ struct CreatureDisplayInfoExtraMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[12] = + static DB2MetaField const fields[7] = { - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, - { FT_BYTE, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_BYTE, 3, false }, }; - static DB2Meta instance(1264997, -1, 12, 12, 0xC4CF4823, fields, -1); + static DB2Meta instance(1264997, 0, 7, 7, 0x1BE6635C, fields, -1); return &instance; } }; @@ -2770,6 +3389,21 @@ struct CreatureDisplayInfoGeosetDataMeta } }; +struct CreatureDisplayInfoOptionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3692043, -1, 3, 2, 0x2155E881, fields, 2); + return &instance; + } +}; + struct CreatureDisplayInfoTrnMeta { static DB2Meta const* Instance() @@ -2981,6 +3615,21 @@ struct CreatureXDisplayInfoMeta } }; +struct CreatureXUiWidgetSetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3055738, -1, 3, 3, 0xCB7DB164, fields, -1); + return &instance; + } +}; + struct CriteriaMeta { static DB2Meta const* Instance() @@ -3076,24 +3725,25 @@ struct CurrencyTypesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[14] = + static DB2MetaField const fields[15] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 2, true }, }; - static DB2Meta instance(1095531, -1, 14, 14, 0x16E369D6, fields, -1); + static DB2Meta instance(1095531, -1, 15, 15, 0x33B2E0C5, fields, -1); return &instance; } }; @@ -3116,13 +3766,14 @@ struct CurvePointMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[4] = { { FT_FLOAT, 2, true }, + { FT_FLOAT, 2, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(892586, -1, 3, 3, 0x2C43C039, fields, -1); + static DB2Meta instance(892586, -1, 4, 4, 0x2E31C506, fields, -1); return &instance; } }; @@ -3147,7 +3798,7 @@ struct DecalPropertiesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[18] = + static DB2MetaField const fields[22] = { { FT_INT, 1, false }, { FT_INT, 1, true }, @@ -3167,8 +3818,12 @@ struct DecalPropertiesMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 4, true }, + { FT_FLOAT, 4, true }, }; - static DB2Meta instance(1278176, 0, 18, 18, 0x43F203C0, fields, -1); + static DB2Meta instance(1278176, 0, 22, 22, 0xF090CC1E, fields, -1); return &instance; } }; @@ -3210,20 +3865,20 @@ struct DestructibleModelDataMeta { { FT_BYTE, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_BYTE, 1, true }, @@ -3231,7 +3886,7 @@ struct DestructibleModelDataMeta { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, }; - static DB2Meta instance(1122116, -1, 22, 22, 0x1E0D0E51, fields, -1); + static DB2Meta instance(1122116, -1, 22, 22, 0xFFFAFB89, fields, -1); return &instance; } }; @@ -3344,7 +3999,7 @@ struct DungeonEncounterMeta { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_SHORT, 1, true }, - { FT_BYTE, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_BYTE, 1, true }, @@ -3353,7 +4008,7 @@ struct DungeonEncounterMeta { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1347279, 1, 11, 11, 0xFED52D20, fields, 2); + static DB2Meta instance(1347279, 1, 11, 11, 0x5BFA4FD8, fields, 2); return &instance; } }; @@ -3483,10 +4138,10 @@ struct EnvironmentalDamageMeta { static DB2MetaField const fields[2] = { - { FT_BYTE, 1, false }, + { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(1278398, -1, 2, 2, 0x7E47BDEE, fields, -1); + static DB2Meta instance(1278398, -1, 2, 2, 0x792416B2, fields, -1); return &instance; } }; @@ -3555,6 +4210,25 @@ struct ExpectedStatModMeta } }; +struct ExtraAbilityInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[7] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3527889, 1, 7, 7, 0x1DEAB5A7, fields, 2); + return &instance; + } +}; + struct FactionMeta { static DB2Meta const* Instance() @@ -3793,6 +4467,22 @@ struct GameClockDebugMeta } }; +struct GameObjectAnimGroupMemberMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, false }, + }; + static DB2Meta instance(3565753, -1, 4, 4, 0xC165C488, fields, 0); + return &instance; + } +}; + struct GameObjectArtKitMeta { static DB2Meta const* Instance() @@ -3815,10 +4505,10 @@ struct GameObjectDiffAnimMapMeta { { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1302847, -1, 4, 3, 0xBE81E7C9, fields, 3); + static DB2Meta instance(1302847, -1, 4, 3, 0xDB388EFA, fields, 3); return &instance; } }; @@ -3865,16 +4555,33 @@ struct GameObjectsMeta { FT_FLOAT, 3, true }, { FT_FLOAT, 4, true }, { FT_INT, 1, false }, - { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_FLOAT, 1, true }, - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 8, true }, }; - static DB2Meta instance(841620, 3, 12, 12, 0x9DBD8029, fields, 4); + static DB2Meta instance(841620, 3, 12, 12, 0x816F3855, fields, 4); + return &instance; + } +}; + +struct GameParameterMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3405438, -1, 5, 5, 0xC81AA519, fields, -1); return &instance; } }; @@ -3883,14 +4590,15 @@ struct GameTipsMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_STRING, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1368021, -1, 4, 4, 0xAC5C7C88, fields, -1); + static DB2Meta instance(1368021, -1, 5, 5, 0xF24F7ABD, fields, -1); return &instance; } }; @@ -3952,6 +4660,68 @@ struct GarrAbilityEffectMeta } }; +struct GarrAutoCombatantMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[10] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3305399, 0, 10, 10, 0xBC77BB9B, fields, -1); + return &instance; + } +}; + +struct GarrAutoSpellMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[8] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3305400, 2, 8, 8, 0xDFD06B4A, fields, -1); + return &instance; + } +}; + +struct GarrAutoSpellEffectMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[8] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_BYTE, 1, false }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3307335, 0, 8, 8, 0x8A09C203, fields, 1); + return &instance; + } +}; + struct GarrBuildingMeta { static DB2Meta const* Instance() @@ -3966,7 +4736,7 @@ struct GarrBuildingMeta { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, @@ -3983,7 +4753,7 @@ struct GarrBuildingMeta { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(929747, -1, 24, 24, 0x36C47766, fields, -1); + static DB2Meta instance(929747, -1, 24, 24, 0x69CFEA8D, fields, -1); return &instance; } }; @@ -4064,7 +4834,7 @@ struct GarrEncounterMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[9] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -4074,8 +4844,9 @@ struct GarrEncounterMeta { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(975304, 1, 8, 8, 0x878A0152, fields, -1); + static DB2Meta instance(975304, 1, 9, 9, 0x785239C5, fields, -1); return &instance; } }; @@ -4101,11 +4872,11 @@ struct GarrEncounterXMechanicMeta { static DB2MetaField const fields[3] = { - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(967961, -1, 3, 2, 0x8ACECE98, fields, 2); + static DB2Meta instance(967961, -1, 3, 2, 0x7E4E18F9, fields, 2); return &instance; } }; @@ -4146,7 +4917,7 @@ struct GarrFollowerMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[32] = + static DB2MetaField const fields[34] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -4180,8 +4951,10 @@ struct GarrFollowerMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(949906, 3, 32, 32, 0x1651FD00, fields, -1); + static DB2Meta instance(949906, 3, 34, 34, 0x712646FC, fields, -1); return &instance; } }; @@ -4327,10 +5100,10 @@ struct GarrMechanicSetXMechanicMeta static DB2MetaField const fields[3] = { { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, }; - static DB2Meta instance(1391531, 0, 3, 2, 0xD8ABDEEA, fields, 2); + static DB2Meta instance(1391531, 0, 3, 2, 0x146817DD, fields, 2); return &instance; } }; @@ -4356,7 +5129,7 @@ struct GarrMissionMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[29] = + static DB2MetaField const fields[32] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -4373,8 +5146,9 @@ struct GarrMissionMeta { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, true }, @@ -4386,9 +5160,29 @@ struct GarrMissionMeta { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(967962, 5, 32, 32, 0x09B91DB9, fields, 17); + return &instance; + } +}; + +struct GarrMissionSetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(967962, 5, 29, 28, 0x379617D1, fields, 28); + static DB2Meta instance(3055759, -1, 6, 6, 0x62B4E01D, fields, -1); return &instance; } }; @@ -4426,15 +5220,16 @@ struct GarrMissionXEncounterMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[6] = { { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_BYTE, 1, false }, + { FT_BYTE, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(967960, 0, 5, 4, 0xFFEB2050, fields, 4); + static DB2Meta instance(967960, 0, 6, 5, 0x2926B50E, fields, 5); return &instance; } }; @@ -4443,13 +5238,14 @@ struct GarrMissionXFollowerMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[4] = { { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_BYTE, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1359096, -1, 3, 2, 0x653A593A, fields, 2); + static DB2Meta instance(1359096, -1, 4, 3, 0x2B1293BC, fields, 3); return &instance; } }; @@ -4620,7 +5416,7 @@ struct GarrTalentMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[13] = + static DB2MetaField const fields[15] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -4635,8 +5431,45 @@ struct GarrTalentMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1361032, 2, 13, 13, 0x9A9E08BC, fields, 3); + static DB2Meta instance(1361032, 2, 15, 15, 0xE4B665DF, fields, 3); + return &instance; + } +}; + +struct GarrTalentCostMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = + { + { FT_LONG, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3514438, 1, 9, 9, 0xA5152E26, fields, 2); + return &instance; + } +}; + +struct GarrTalentMapPOIMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_FLOAT, 2, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3534056, -1, 2, 2, 0x11363DB5, fields, -1); return &instance; } }; @@ -4685,11 +5518,25 @@ struct GarrTalentResearchMeta } }; +struct GarrTalentSocketPropertiesMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3612617, -1, 2, 2, 0x6EBDB6D1, fields, -1); + return &instance; + } +}; + struct GarrTalentTreeMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[9] = + static DB2MetaField const fields[12] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -4700,8 +5547,11 @@ struct GarrTalentTreeMeta { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1361030, 1, 9, 9, 0x8DF3F074, fields, -1); + static DB2Meta instance(1361030, 1, 12, 12, 0xA9265795, fields, -1); return &instance; } }; @@ -4710,15 +5560,18 @@ struct GarrTypeMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[8] = { { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, { FT_INT, 2, true }, }; - static DB2Meta instance(1333161, -1, 5, 5, 0x5CBB1F5F, fields, -1); + static DB2Meta instance(1333161, -1, 8, 8, 0x2D0BF086, fields, -1); return &instance; } }; @@ -4770,13 +5623,40 @@ struct GemPropertiesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[2] = { { FT_SHORT, 1, false }, { FT_INT, 1, true }, - { FT_SHORT, 1, false }, }; - static DB2Meta instance(1343604, -1, 3, 3, 0xE674AE42, fields, -1); + static DB2Meta instance(1343604, -1, 2, 2, 0x62229700, fields, -1); + return &instance; + } +}; + +struct GlobalCurveMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3752002, -1, 2, 2, 0x6EE9627F, fields, -1); + return &instance; + } +}; + +struct GlobalGameContentTuningMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3756368, -1, 2, 2, 0x2594D1ED, fields, -1); return &instance; } }; @@ -4796,6 +5676,20 @@ struct GlobalStringsMeta } }; +struct GlobalTable_PlayerConditionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3476011, -1, 2, 2, 0x331A6B6C, fields, -1); + return &instance; + } +}; + struct GlyphBindableSpellMeta { static DB2Meta const* Instance() @@ -4853,6 +5747,21 @@ struct GlyphRequiredSpecMeta } }; +struct GossipXUIDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3622253, 0, 3, 3, 0xC9A649B0, fields, -1); + return &instance; + } +}; + struct GradientEffectMeta { static DB2Meta const* Instance() @@ -4885,14 +5794,19 @@ struct GroundEffectDoodadMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[9] = { { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1308057, -1, 4, 4, 0x7AC0B592, fields, -1); + static DB2Meta instance(1308057, -1, 9, 9, 0x549FA0D3, fields, -1); return &instance; } }; @@ -4901,14 +5815,15 @@ struct GroundEffectTextureMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_INT, 1, false }, { FT_BYTE, 1, false }, { FT_SHORT, 4, false }, { FT_BYTE, 4, true }, + { FT_BYTE, 4, true }, }; - static DB2Meta instance(1308499, -1, 4, 4, 0x50B304D6, fields, -1); + static DB2Meta instance(1308499, -1, 5, 5, 0x32807C98, fields, -1); return &instance; } }; @@ -4924,17 +5839,17 @@ struct GroupFinderActivityMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(974813, -1, 14, 14, 0xB0090189, fields, -1); + static DB2Meta instance(974813, -1, 14, 14, 0xD3114D3D, fields, -1); return &instance; } }; @@ -5163,13 +6078,14 @@ struct HelmetGeosetDataMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[4] = { { FT_INT, 1, true }, { FT_BYTE, 1, true }, + { FT_BYTE, 1, false }, { FT_INT, 1, true }, }; - static DB2Meta instance(2821752, -1, 3, 2, 0x4C7DCA12, fields, 2); + static DB2Meta instance(2821752, -1, 4, 3, 0x7667436E, fields, 3); return &instance; } }; @@ -5338,7 +6254,7 @@ struct ItemMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[9] = { { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, @@ -5348,8 +6264,9 @@ struct ItemMeta { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(841626, -1, 8, 8, 0x4517779D, fields, -1); + static DB2Meta instance(841626, -1, 9, 9, 0x5432FBBA, fields, -1); return &instance; } }; @@ -5358,14 +6275,15 @@ struct ItemAppearanceMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(982462, -1, 4, 4, 0x83D2C1C9, fields, -1); + static DB2Meta instance(982462, -1, 5, 5, 0x02129C17, fields, -1); return &instance; } }; @@ -5447,12 +6365,12 @@ struct ItemBonusMeta { static DB2MetaField const fields[4] = { - { FT_INT, 3, true }, + { FT_INT, 4, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(959070, -1, 4, 4, 0xE119360C, fields, 1); + static DB2Meta instance(959070, -1, 4, 4, 0x84110DA5, fields, 1); return &instance; } }; @@ -5470,19 +6388,33 @@ struct ItemBonusListMeta } }; +struct ItemBonusListGroupMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[1] = + { + { FT_INT, 1, true }, + }; + static DB2Meta instance(3755382, -1, 1, 1, 0x25BF4C79, fields, -1); + return &instance; + } +}; + struct ItemBonusListGroupEntryMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[6] = { { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(3025306, -1, 5, 4, 0xCA17B2FF, fields, 4); + static DB2Meta instance(3025306, -1, 6, 6, 0x9FB5C578, fields, 0); return &instance; } }; @@ -5529,6 +6461,20 @@ struct ItemBonusSequenceSpellMeta } }; +struct ItemBonusTreeMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3055768, -1, 2, 2, 0xF295C11C, fields, -1); + return &instance; + } +}; + struct ItemBonusTreeNodeMeta { static DB2Meta const* Instance() @@ -5608,6 +6554,22 @@ struct ItemCurrencyCostMeta } }; +struct ItemCurrencyValueMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 4, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3755770, 0, 4, 3, 0xD411AFA8, fields, 3); + return &instance; + } +}; + struct ItemDamageAmmoMeta { static DB2Meta const* Instance() @@ -5714,12 +6676,12 @@ struct ItemDisplayInfoMeta { FT_INT, 1, true }, { FT_INT, 2, false }, { FT_INT, 2, true }, - { FT_BYTE, 2, false }, + { FT_INT, 2, true }, { FT_INT, 6, true }, { FT_INT, 6, true }, { FT_INT, 2, true }, }; - static DB2Meta instance(1266429, -1, 15, 15, 0x404901C8, fields, -1); + static DB2Meta instance(1266429, -1, 15, 15, 0xB923D577, fields, -1); return &instance; } }; @@ -5947,6 +6909,21 @@ struct ItemNameDescriptionMeta } }; +struct ItemNameSlotOverrideMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3723474, -1, 3, 2, 0x3333801A, fields, 2); + return &instance; + } +}; + struct ItemPetFoodMeta { static DB2Meta const* Instance() @@ -6012,7 +6989,7 @@ struct ItemSearchNameMeta { FT_SHORT, 1, false }, { FT_INT, 4, true }, }; - static DB2Meta instance(1273408, 2, 14, 14, 0x9C53DE68, fields, -1); + static DB2Meta instance(1273408, 2, 14, 14, 0xA5ED136F, fields, -1); return &instance; } }; @@ -6054,7 +7031,7 @@ struct ItemSparseMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[62] = + static DB2MetaField const fields[64] = { { FT_LONG, 1, true }, { FT_STRING, 1, true }, @@ -6079,6 +7056,9 @@ struct ItemSparseMeta { FT_FLOAT, 1, true }, { FT_INT, 4, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -6097,7 +7077,6 @@ struct ItemSparseMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, { FT_SHORT, 1, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, @@ -6119,7 +7098,7 @@ struct ItemSparseMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1572924, -1, 62, 62, 0xAC420B53, fields, -1); + static DB2Meta instance(1572924, -1, 64, 64, 0x12CC2F52, fields, -1); return &instance; } }; @@ -6160,10 +7139,11 @@ struct ItemSubClassMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[10] = + static DB2MetaField const fields[11] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, false }, @@ -6173,7 +7153,7 @@ struct ItemSubClassMeta { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, }; - static DB2Meta instance(1261604, -1, 10, 10, 0x2B018A83, fields, 2); + static DB2Meta instance(1261604, 2, 11, 11, 0x2EDFDAA6, fields, 3); return &instance; } }; @@ -6238,6 +7218,20 @@ struct ItemXBonusTreeMeta } }; +struct ItemXItemEffectMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3177687, -1, 2, 1, 0x5D602214, fields, 1); + return &instance; + } +}; + struct JournalEncounterMeta { static DB2Meta const* Instance() @@ -6412,11 +7406,12 @@ struct JournalTierMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[1] = + static DB2MetaField const fields[2] = { { FT_STRING, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1349056, -1, 1, 1, 0x2ABC8A8B, fields, -1); + static DB2Meta instance(1349056, -1, 2, 2, 0xBD0C2DC1, fields, -1); return &instance; } }; @@ -6464,25 +7459,6 @@ struct KeystoneAffixMeta } }; -struct LFGDungeonExpansionMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[7] = - { - { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_SHORT, 1, false }, - }; - static DB2Meta instance(1343606, -1, 7, 6, 0x074C83A4, fields, 6); - return &instance; - } -}; - struct LFGDungeonGroupMeta { static DB2Meta const* Instance() @@ -6503,13 +7479,11 @@ struct LFGDungeonsMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[33] = + static DB2MetaField const fields[29] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, @@ -6522,9 +7496,6 @@ struct LFGDungeonsMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -6537,9 +7508,10 @@ struct LFGDungeonsMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 2, true }, }; - static DB2Meta instance(1361033, -1, 33, 33, 0x4D903335, fields, -1); + static DB2Meta instance(1361033, -1, 29, 29, 0x0BAF7AF1, fields, -1); return &instance; } }; @@ -6623,7 +7595,7 @@ struct LightDataMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[37] = + static DB2MetaField const fields[40] = { { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -6653,6 +7625,8 @@ struct LightDataMeta { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, @@ -6662,8 +7636,9 @@ struct LightDataMeta { FT_FLOAT, 1, true }, { FT_INT, 1, false }, { FT_FLOAT, 4, true }, + { FT_FLOAT, 4, true }, }; - static DB2Meta instance(1375580, -1, 37, 37, 0x07423F4E, fields, 0); + static DB2Meta instance(1375580, -1, 40, 40, 0x14259798, fields, 0); return &instance; } }; @@ -6921,14 +7896,15 @@ struct LockMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { + { FT_INT, 1, true }, { FT_INT, 8, true }, { FT_SHORT, 8, false }, { FT_BYTE, 8, false }, { FT_BYTE, 8, false }, }; - static DB2Meta instance(1343608, -1, 4, 4, 0x2BD710C7, fields, -1); + static DB2Meta instance(1343608, -1, 5, 5, 0x2EDD6B10, fields, -1); return &instance; } }; @@ -6937,15 +7913,16 @@ struct LockTypeMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[6] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1284823, 4, 5, 5, 0x1BCEC060, fields, -1); + static DB2Meta instance(1284823, 4, 6, 6, 0xC811899B, fields, -1); return &instance; } }; @@ -6980,6 +7957,53 @@ struct LookAtControllerMeta } }; +struct LoreTextMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3311370, -1, 3, 3, 0x196A0B3F, fields, -1); + return &instance; + } +}; + +struct LoreTextPublicMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_BYTE, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3479846, 0, 6, 5, 0x19A70CF2, fields, 5); + return &instance; + } +}; + +struct MCRSlotXMCRCategoryMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3390955, -1, 2, 1, 0x342AD8FB, fields, 1); + return &instance; + } +}; + struct MailTemplateMeta { static DB2Meta const* Instance() @@ -7117,10 +8141,11 @@ struct MapMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[23] = + static DB2MetaField const fields[24] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -7143,7 +8168,7 @@ struct MapMeta { FT_INT, 1, true }, { FT_INT, 2, true }, }; - static DB2Meta instance(1349477, -1, 23, 23, 0xDA9493AF, fields, -1); + static DB2Meta instance(1349477, -1, 24, 24, 0x793F4E8E, fields, -1); return &instance; } }; @@ -7167,15 +8192,16 @@ struct MapChallengeModeMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[6] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, false }, { FT_SHORT, 3, true }, }; - static DB2Meta instance(801709, 1, 5, 5, 0xD1A78B20, fields, 2); + static DB2Meta instance(801709, 1, 6, 6, 0x0531FF07, fields, 2); return &instance; } }; @@ -7270,6 +8296,35 @@ struct MaterialMeta } }; +struct MawPowerMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(2991315, 0, 3, 3, 0xEE3C69AF, fields, 1); + return &instance; + } +}; + +struct MawPowerRarityMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(2997952, -1, 2, 2, 0x88D5E656, fields, -1); + return &instance; + } +}; + struct MinorTalentMeta { static DB2Meta const* Instance() @@ -7354,6 +8409,80 @@ struct ModelRibbonQualityMeta } }; +struct ModifiedCraftingCategoryMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3386486, -1, 2, 2, 0xEC698BBC, fields, -1); + return &instance; + } +}; + +struct ModifiedCraftingReagentItemMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3386487, -1, 4, 4, 0xCC09E623, fields, -1); + return &instance; + } +}; + +struct ModifiedCraftingReagentSlotMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3386488, -1, 2, 2, 0x79B765B9, fields, -1); + return &instance; + } +}; + +struct ModifiedCraftingSpellSlotMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3390956, -1, 4, 4, 0xF450A714, fields, 0); + return &instance; + } +}; + +struct ModifiedReagentItemMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3386490, 0, 2, 2, 0x8CB2494F, fields, -1); + return &instance; + } +}; + struct ModifierTreeMeta { static DB2Meta const* Instance() @@ -7982,6 +9111,20 @@ struct ParticleColorMeta } }; +struct ParticulateMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3396285, -1, 2, 2, 0x41991AD7, fields, -1); + return &instance; + } +}; + struct ParticulateSoundMeta { static DB2Meta const* Instance() @@ -8143,11 +9286,9 @@ struct PlayerConditionMeta { FT_LONG, 1, true }, { FT_STRING, 1, true }, { FT_INT, 1, false }, - { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, @@ -8163,7 +9304,7 @@ struct PlayerConditionMeta { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_INT, 1, false }, @@ -8172,7 +9313,7 @@ struct PlayerConditionMeta { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, @@ -8183,7 +9324,7 @@ struct PlayerConditionMeta { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, false }, @@ -8197,14 +9338,16 @@ struct PlayerConditionMeta { FT_BYTE, 1, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 4, false }, { FT_SHORT, 4, false }, { FT_SHORT, 4, false }, { FT_INT, 3, false }, { FT_BYTE, 3, false }, - { FT_SHORT, 4, false }, - { FT_SHORT, 4, false }, - { FT_SHORT, 4, false }, + { FT_INT, 4, true }, + { FT_INT, 4, true }, + { FT_INT, 4, true }, { FT_INT, 4, true }, { FT_INT, 4, true }, { FT_INT, 4, false }, @@ -8222,7 +9365,7 @@ struct PlayerConditionMeta { FT_INT, 6, false }, { FT_INT, 2, true }, }; - static DB2Meta instance(1045411, 2, 81, 81, 0x5BE293E6, fields, -1); + static DB2Meta instance(1045411, 2, 81, 81, 0x19151309, fields, -1); return &instance; } }; @@ -8508,7 +9651,7 @@ struct QuestFeedbackEffectMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[8] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_INT, 1, false }, @@ -8517,8 +9660,9 @@ struct QuestFeedbackEffectMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1343388, -1, 7, 7, 0x279132CC, fields, -1); + static DB2Meta instance(1343388, -1, 8, 8, 0x540D504A, fields, -1); return &instance; } }; @@ -8543,13 +9687,14 @@ struct QuestLineMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[4] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(973430, -1, 3, 3, 0x860E7B54, fields, -1); + static DB2Meta instance(973430, -1, 4, 4, 0x20DB8520, fields, -1); return &instance; } }; @@ -8606,7 +9751,7 @@ struct QuestPOIBlobMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[9] = { { FT_INT, 1, false }, { FT_SHORT, 1, true }, @@ -8614,9 +9759,11 @@ struct QuestPOIBlobMeta { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, false }, { FT_INT, 1, false }, }; - static DB2Meta instance(1251882, 0, 7, 7, 0xED2583D9, fields, 1); + static DB2Meta instance(1251882, 0, 9, 9, 0x3C4D1099, fields, 1); return &instance; } }; @@ -8625,14 +9772,15 @@ struct QuestPOIPointMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_INT, 1, false }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, + { FT_SHORT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1251883, 0, 4, 3, 0xCCABC187, fields, 3); + static DB2Meta instance(1251883, 0, 5, 4, 0xD291971B, fields, 4); return &instance; } }; @@ -8703,16 +9851,16 @@ struct QuestV2CliTaskMeta { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, { FT_INT, 1, true }, - { FT_SHORT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 3, true }, { FT_INT, 3, false }, }; - static DB2Meta instance(1028735, 3, 25, 25, 0xC85E3AAF, fields, -1); + static DB2Meta instance(1028735, 3, 25, 25, 0x7AE578CB, fields, -1); return &instance; } }; @@ -8744,6 +9892,69 @@ struct QuestXPMeta } }; +struct QuestXUIQuestDetailsThemeMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3448517, -1, 2, 2, 0xE5F50D56, fields, -1); + return &instance; + } +}; + +struct QuestXUiWidgetSetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3923421, -1, 2, 2, 0x9D15AFB1, fields, -1); + return &instance; + } +}; + +struct RTPCMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3405439, 0, 6, 6, 0x0D410D54, fields, 5); + return &instance; + } +}; + +struct RTPCDataMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3405440, -1, 5, 5, 0x25A83DE9, fields, 0); + return &instance; + } +}; + struct RafActivityMeta { static DB2Meta const* Instance() @@ -8776,6 +9987,24 @@ struct RandPropPointsMeta } }; +struct RecipeProgressionGroupEntryMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3671785, -1, 6, 6, 0x6D84AC24, fields, 0); + return &instance; + } +}; + struct RelicSlotTierRequirementMeta { static DB2Meta const* Instance() @@ -8808,6 +10037,37 @@ struct RelicTalentMeta } }; +struct RenownRewardsMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[19] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3743117, 3, 19, 19, 0xE58AA7BC, fields, 4); + return &instance; + } +}; + struct ResearchBranchMeta { static DB2Meta const* Instance() @@ -8979,47 +10239,56 @@ struct RopeEffectMeta } }; -struct SDReplacementModelMeta +struct RuneforgeLegendaryAbilityMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[1] = + static DB2MetaField const fields[9] = { + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1712172, -1, 1, 1, 0x5C3E39E7, fields, -1); + static DB2Meta instance(3500241, 1, 9, 9, 0x61DAAC70, fields, -1); return &instance; } }; -struct SSAOSettingsMeta +struct SDReplacementModelMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[1] = { - { FT_INT, 1, false }, - { FT_FLOAT, 1, true }, - { FT_FLOAT, 1, true }, - { FT_FLOAT, 1, true }, - { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(2056369, 0, 5, 5, 0x20BC890C, fields, -1); + static DB2Meta instance(1712172, -1, 1, 1, 0x5C3E39E7, fields, -1); return &instance; } }; -struct ScalingStatDistributionMeta +struct SSAOSettingsMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[8] = { - { FT_SHORT, 1, false }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, + { FT_INT, 1, false }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, }; - static DB2Meta instance(1141728, -1, 3, 3, 0xE9A4FF63, fields, -1); + static DB2Meta instance(2056369, 0, 8, 8, 0xD7975681, fields, -1); return &instance; } }; @@ -9065,7 +10334,7 @@ struct ScenarioStepMeta { FT_STRING, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, @@ -9073,7 +10342,7 @@ struct ScenarioStepMeta { FT_INT, 1, false }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(1132761, -1, 11, 11, 0x9FD44A1F, fields, 2); + static DB2Meta instance(1132761, -1, 11, 11, 0xA19BAF50, fields, 2); return &instance; } }; @@ -9166,58 +10435,6 @@ struct ScheduledIntervalMeta } }; -struct ScheduledWorldStateMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[8] = - { - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - }; - static DB2Meta instance(1327083, -1, 8, 8, 0x1AE5AC2A, fields, 0); - return &instance; - } -}; - -struct ScheduledWorldStateGroupMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[5] = - { - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - }; - static DB2Meta instance(1327084, -1, 5, 5, 0x139E018C, fields, -1); - return &instance; - } -}; - -struct ScheduledWorldStateXUniqCatMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[3] = - { - { FT_INT, 1, false }, - { FT_INT, 1, true }, - { FT_INT, 1, true }, - }; - static DB2Meta instance(1388724, 0, 3, 2, 0xCA3A84D6, fields, 2); - return &instance; - } -}; - struct ScreenEffectMeta { static DB2Meta const* Instance() @@ -9242,6 +10459,19 @@ struct ScreenEffectMeta } }; +struct ScreenEffectTypeMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[1] = + { + { FT_INT, 1, true }, + }; + static DB2Meta instance(3063174, -1, 1, 1, 0xBE649273, fields, -1); + return &instance; + } +}; + struct ScreenLocationMeta { static DB2Meta const* Instance() @@ -9363,13 +10593,13 @@ struct SkillLineAbilityMeta { FT_BYTE, 1, true }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, - { FT_BYTE, 1, true }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, }; - static DB2Meta instance(1266278, 1, 15, 15, 0xF0DE0EBD, fields, 2); + static DB2Meta instance(1266278, 1, 15, 15, 0x765222E5, fields, 2); return &instance; } }; @@ -9393,6 +10623,121 @@ struct SkillRaceClassInfoMeta } }; +struct SkySceneXPlayerConditionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3581893, -1, 2, 1, 0xBF5812B6, fields, 1); + return &instance; + } +}; + +struct SoulbindMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[7] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3488583, 1, 7, 7, 0xD29923C2, fields, -1); + return &instance; + } +}; + +struct SoulbindConduitMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3594380, 0, 4, 4, 0x5F7D8851, fields, -1); + return &instance; + } +}; + +struct SoulbindConduitItemMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3604984, -1, 2, 2, 0xA64372DE, fields, -1); + return &instance; + } +}; + +struct SoulbindConduitRankMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3620681, -1, 4, 3, 0xE97AAA36, fields, 3); + return &instance; + } +}; + +struct SoulbindConduitRankPropertiesMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3858895, -1, 3, 3, 0xB2FCF094, fields, -1); + return &instance; + } +}; + +struct SoulbindUIDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[9] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3490472, 1, 9, 9, 0x58274CBA, fields, -1); + return &instance; + } +}; + struct SoundAmbienceMeta { static DB2Meta const* Instance() @@ -9707,6 +11052,23 @@ struct SoundOverrideMeta } }; +struct SoundParameterMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3405441, -1, 5, 5, 0xD1E7724D, fields, -1); + return &instance; + } +}; + struct SoundProviderPreferencesMeta { static DB2Meta const* Instance() @@ -9943,13 +11305,12 @@ struct SpellCastTimesMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[2] = { { FT_INT, 1, true }, - { FT_SHORT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1134089, -1, 3, 3, 0x9BD18C05, fields, -1); + static DB2Meta instance(1134089, -1, 2, 2, 0xA423CA34, fields, -1); return &instance; } }; @@ -10240,13 +11601,12 @@ struct SpellDurationMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[3] = + static DB2MetaField const fields[2] = { { FT_INT, 1, true }, - { FT_INT, 1, false }, { FT_INT, 1, true }, }; - static DB2Meta instance(1137828, -1, 3, 3, 0x70784BCD, fields, -1); + static DB2Meta instance(1137828, -1, 2, 2, 0x8C317431, fields, -1); return &instance; } }; @@ -10260,7 +11620,7 @@ struct SpellEffectMeta { FT_SHORT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_INT, 1, false }, + { FT_INT, 1, true }, { FT_FLOAT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, @@ -10286,7 +11646,7 @@ struct SpellEffectMeta { FT_SHORT, 2, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1140088, -1, 28, 27, 0x63D5AFF5, fields, 27); + static DB2Meta instance(1140088, -1, 28, 27, 0x8E2EAEB1, fields, 27); return &instance; } }; @@ -10411,13 +11771,16 @@ struct SpellItemEnchantmentMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[20] = + static DB2MetaField const fields[23] = { { FT_STRING, 1, true }, { FT_STRING, 1, true }, + { FT_INT, 1, false }, { FT_INT, 3, false }, { FT_FLOAT, 3, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_SHORT, 3, true }, @@ -10434,7 +11797,7 @@ struct SpellItemEnchantmentMeta { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, }; - static DB2Meta instance(1362771, -1, 20, 20, 0x3933F488, fields, -1); + static DB2Meta instance(1362771, 2, 23, 23, 0x9E09787D, fields, -1); return &instance; } }; @@ -10509,12 +11872,12 @@ struct SpellLevelsMeta { { FT_BYTE, 1, false }, { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, - { FT_SHORT, 1, true }, { FT_BYTE, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1140079, -1, 6, 5, 0xDC8F8F3D, fields, 5); + static DB2Meta instance(1140079, -1, 6, 5, 0x79D1C0A1, fields, 5); return &instance; } }; @@ -10536,9 +11899,9 @@ struct SpellMiscMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[13] = + static DB2MetaField const fields[16] = { - { FT_INT, 14, true }, + { FT_INT, 15, true }, { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -10551,8 +11914,11 @@ struct SpellMiscMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1003144, -1, 13, 12, 0x82FFFB5F, fields, 12); + static DB2Meta instance(1003144, -1, 16, 15, 0xB252FDD7, fields, 15); return &instance; } }; @@ -10704,11 +12070,11 @@ struct SpellProcsPerMinuteModMeta static DB2MetaField const fields[4] = { { FT_BYTE, 1, false }, - { FT_SHORT, 1, true }, + { FT_INT, 1, true }, { FT_FLOAT, 1, true }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(1133525, -1, 4, 3, 0x147FD7E9, fields, 3); + static DB2Meta instance(1133525, -1, 4, 3, 0x2EF9CF3F, fields, 3); return &instance; } }; @@ -10793,6 +12159,41 @@ struct SpellScalingMeta } }; +struct SpellScriptMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[6] = + { + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3055899, 3, 6, 6, 0xA2577E7A, fields, -1); + return &instance; + } +}; + +struct SpellScriptTextMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3055901, 1, 5, 4, 0x1DD3B137, fields, 4); + return &instance; + } +}; + struct SpellShapeshiftMeta { static DB2Meta const* Instance() @@ -10884,7 +12285,7 @@ struct SpellVisualMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[15] = + static DB2MetaField const fields[16] = { { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, @@ -10900,9 +12301,10 @@ struct SpellVisualMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, }; - static DB2Meta instance(897952, -1, 15, 15, 0x17962AA0, fields, -1); + static DB2Meta instance(897952, -1, 16, 16, 0xD49A0A98, fields, -1); return &instance; } }; @@ -10931,7 +12333,7 @@ struct SpellVisualColorEffectMeta { FT_FLOAT, 1, true }, { FT_INT, 1, true }, { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, + { FT_BYTE, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -10940,7 +12342,7 @@ struct SpellVisualColorEffectMeta { FT_FLOAT, 1, true }, { FT_INT, 1, false }, }; - static DB2Meta instance(1094006, -1, 11, 11, 0x41C2763B, fields, -1); + static DB2Meta instance(1094006, -1, 11, 11, 0x316310A7, fields, -1); return &instance; } }; @@ -11046,7 +12448,7 @@ struct SpellVisualKitModelAttachMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[22] = + static DB2MetaField const fields[23] = { { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, @@ -11069,9 +12471,10 @@ struct SpellVisualKitModelAttachMeta { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(897953, 2, 22, 21, 0xB8BDA6F9, fields, 21); + static DB2Meta instance(897953, 2, 23, 22, 0xF2BEEF44, fields, 22); return &instance; } }; @@ -11080,7 +12483,7 @@ struct SpellVisualMissileMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[17] = + static DB2MetaField const fields[18] = { { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, @@ -11098,9 +12501,24 @@ struct SpellVisualMissileMeta { FT_SHORT, 1, false }, { FT_INT, 1, false }, { FT_BYTE, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, }; - static DB2Meta instance(897954, 2, 17, 16, 0xBE91C62B, fields, 16); + static DB2Meta instance(897954, 2, 18, 17, 0x68D6B039, fields, 17); + return &instance; + } +}; + +struct SpellVisualScreenEffectMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3607312, -1, 2, 2, 0x879B50D1, fields, -1); return &instance; } }; @@ -11123,14 +12541,13 @@ struct SpellXSpellVisualMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[13] = + static DB2MetaField const fields[12] = { { FT_INT, 1, false }, { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_FLOAT, 1, true }, { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, @@ -11139,7 +12556,7 @@ struct SpellXSpellVisualMeta { FT_INT, 1, false }, { FT_INT, 1, true }, }; - static DB2Meta instance(1101657, 0, 13, 12, 0x8D0B1C8F, fields, 12); + static DB2Meta instance(1101657, 0, 12, 11, 0xE4509F95, fields, 11); return &instance; } }; @@ -11316,6 +12733,22 @@ struct TaxiPathNodeMeta } }; +struct TerrainColorGradingRampMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3501705, -1, 4, 4, 0x2031C9AD, fields, -1); + return &instance; + } +}; + struct TerrainMaterialMeta { static DB2Meta const* Instance() @@ -11365,20 +12798,21 @@ struct TextureBlendSetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[10] = + static DB2MetaField const fields[11] = { { FT_INT, 3, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, { FT_FLOAT, 3, true }, { FT_FLOAT, 4, true }, }; - static DB2Meta instance(1328721, -1, 10, 10, 0x9CDAC82F, fields, -1); + static DB2Meta instance(1328721, -1, 11, 11, 0x1BBA6A98, fields, -1); return &instance; } }; @@ -11398,6 +12832,22 @@ struct TextureFileDataMeta } }; +struct TierTransitionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3076928, -1, 4, 4, 0x467A48BA, fields, -1); + return &instance; + } +}; + struct TotemCategoryMeta { static DB2Meta const* Instance() @@ -11453,12 +12903,11 @@ struct TradeSkillItemMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[2] = + static DB2MetaField const fields[1] = { { FT_SHORT, 1, false }, - { FT_BYTE, 1, true }, }; - static DB2Meta instance(1329070, -1, 2, 2, 0xF7BCB2E0, fields, -1); + static DB2Meta instance(1329070, -1, 1, 1, 0x55557361, fields, -1); return &instance; } }; @@ -11489,7 +12938,7 @@ struct TransmogDefaultLevelMeta { FT_BYTE, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(2399695, -1, 2, 2, 0x5B2F3204, fields, -1); + static DB2Meta instance(2399695, -1, 2, 2, 0xC7625152, fields, -1); return &instance; } }; @@ -11508,6 +12957,23 @@ struct TransmogHolidayMeta } }; +struct TransmogIllusionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3580450, 0, 5, 5, 0xE579B752, fields, -1); + return &instance; + } +}; + struct TransmogSetMeta { static DB2Meta const* Instance() @@ -11624,10 +13090,76 @@ struct TrophyMeta { { FT_STRING, 1, true }, { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, false }, + }; + static DB2Meta instance(975024, -1, 4, 4, 0x27A846CD, fields, -1); + return &instance; + } +}; + +struct UIChromieTimeExpansionInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[10] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3488582, 2, 10, 10, 0x3EEBBD91, fields, -1); + return &instance; + } +}; + +struct UICovenantAbilityMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_BYTE, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3502042, -1, 4, 4, 0x7286CBAB, fields, 0); + return &instance; + } +}; + +struct UICovenantPreviewMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[16] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(975024, -1, 4, 4, 0x05F94D28, fields, -1); + static DB2Meta instance(3502043, 2, 16, 16, 0x09E1B4C7, fields, -1); return &instance; } }; @@ -11662,6 +13194,63 @@ struct UIExpansionDisplayInfoIconMeta } }; +struct UIScriptedAnimationEffectMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[17] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3556601, 0, 17, 17, 0xBBA9C412, fields, -1); + return &instance; + } +}; + +struct UISplashScreenMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[16] = + { + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_STRING, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_BYTE, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(2960122, 7, 16, 16, 0xCB8F573D, fields, -1); + return &instance; + } +}; + struct UiCamFbackTransmogChrRaceMeta { static DB2Meta const* Instance() @@ -11746,6 +13335,31 @@ struct UiCanvasMeta } }; +struct UiCovenantDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[13] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3509132, 0, 13, 13, 0x577C57A9, fields, -1); + return &instance; + } +}; + struct UiItemInteractionMeta { static DB2Meta const* Instance() @@ -11768,7 +13382,7 @@ struct UiItemInteractionMeta { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(3182424, 4, 15, 15, 0x32F22391, fields, -1); + static DB2Meta instance(3182424, 4, 15, 15, 0x62BB4D7F, fields, -1); return &instance; } }; @@ -11777,7 +13391,7 @@ struct UiMapMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[14] = + static DB2MetaField const fields[13] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -11785,16 +13399,15 @@ struct UiMapMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_INT, 1, false }, - { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1957206, 1, 14, 14, 0xF982A2E5, fields, 2); + static DB2Meta instance(1957206, 1, 13, 13, 0x18361012, fields, 2); return &instance; } }; @@ -11926,7 +13539,7 @@ struct UiMapLinkMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[9] = { { FT_FLOAT, 2, true }, { FT_FLOAT, 2, true }, @@ -11936,8 +13549,9 @@ struct UiMapLinkMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(2030690, 2, 8, 8, 0x033167B1, fields, 3); + static DB2Meta instance(2030690, 2, 9, 9, 0x90B080E2, fields, 3); return &instance; } }; @@ -12058,6 +13672,21 @@ struct UiPartyPoseMeta } }; +struct UiQuestDetailsThemeMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_STRING, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3448518, -1, 3, 3, 0xDFF2A61D, fields, -1); + return &instance; + } +}; + struct UiTextureAtlasMeta { static DB2Meta const* Instance() @@ -12088,6 +13717,20 @@ struct UiTextureAtlasElementMeta } }; +struct UiTextureAtlasElementOverrideMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3765186, -1, 2, 1, 0x6B5B752D, fields, 1); + return &instance; + } +}; + struct UiTextureAtlasMemberMeta { static DB2Meta const* Instance() @@ -12129,7 +13772,7 @@ struct UiWidgetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[8] = + static DB2MetaField const fields[9] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_INT, 1, false }, @@ -12139,8 +13782,9 @@ struct UiWidgetMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_BYTE, 1, true }, }; - static DB2Meta instance(1983278, 1, 8, 8, 0xF2FE9CB9, fields, -1); + static DB2Meta instance(1983278, 1, 9, 9, 0xBCC7B06B, fields, -1); return &instance; } }; @@ -12190,6 +13834,20 @@ struct UiWidgetMapMeta } }; +struct UiWidgetSetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_BYTE, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3055925, -1, 2, 2, 0x7CB0FD20, fields, -1); + return &instance; + } +}; + struct UiWidgetStringSourceMeta { static DB2Meta const* Instance() @@ -12227,17 +13885,33 @@ struct UiWidgetVisualizationMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[9] = { { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_SHORT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_BYTE, 1, true }, }; - static DB2Meta instance(1983276, -1, 7, 7, 0x07795E95, fields, -1); + static DB2Meta instance(1983276, 1, 9, 9, 0x6089B8EF, fields, -1); + return &instance; + } +}; + +struct UiWidgetXWidgetSetMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3386363, -1, 2, 1, 0xA8FB2A6F, fields, 1); return &instance; } }; @@ -12336,13 +14010,30 @@ struct VehicleMeta { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, - { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, true }, + { FT_SHORT, 1, false }, { FT_SHORT, 8, false }, { FT_SHORT, 3, false }, }; - static DB2Meta instance(1368621, -1, 18, 18, 0x51C0ABAB, fields, -1); + static DB2Meta instance(1368621, -1, 18, 18, 0xF04F7E8F, fields, -1); + return &instance; + } +}; + +struct VehiclePOITypeMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[5] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3311405, -1, 5, 5, 0x8C0FAD10, fields, -1); return &instance; } }; @@ -12453,7 +14144,7 @@ struct VignetteMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[9] = + static DB2MetaField const fields[10] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -12464,8 +14155,9 @@ struct VignetteMeta { FT_FLOAT, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(892861, -1, 9, 9, 0x4AC89FFC, fields, -1); + static DB2Meta instance(892861, -1, 10, 10, 0x8256C3F7, fields, -1); return &instance; } }; @@ -12515,6 +14207,22 @@ struct VocalUISoundsMeta } }; +struct VolumeFogConditionMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[4] = + { + { FT_INT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3587230, -1, 4, 3, 0x93FE029C, fields, 3); + return &instance; + } +}; + struct WMOAreaTableMeta { static DB2Meta const* Instance() @@ -12770,9 +14478,10 @@ struct WeatherMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[22] = + static DB2MetaField const fields[23] = { { FT_BYTE, 1, false }, + { FT_BYTE, 1, false }, { FT_FLOAT, 1, true }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, @@ -12795,7 +14504,7 @@ struct WeatherMeta { FT_FLOAT, 2, true }, { FT_FLOAT, 3, true }, }; - static DB2Meta instance(1343311, -1, 22, 22, 0x50346E3B, fields, -1); + static DB2Meta instance(1343311, -1, 23, 23, 0xD65D6CD5, fields, -1); return &instance; } }; @@ -12814,6 +14523,21 @@ struct WeatherXParticulateMeta } }; +struct WeeklyRewardChestThresholdMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3580962, -1, 3, 3, 0x73C0E8B4, fields, -1); + return &instance; + } +}; + struct WindSettingsMeta { static DB2Meta const* Instance() @@ -12843,9 +14567,9 @@ struct WorldBossLockoutMeta static DB2MetaField const fields[2] = { { FT_STRING, 1, true }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(975279, -1, 2, 2, 0x4FB18779, fields, -1); + static DB2Meta instance(975279, -1, 2, 2, 0xDBCC9926, fields, -1); return &instance; } }; @@ -13016,7 +14740,7 @@ struct ZoneLightMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[6] = + static DB2MetaField const fields[7] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_SHORT, 1, false }, @@ -13024,8 +14748,9 @@ struct ZoneLightMeta { FT_BYTE, 1, false }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, + { FT_SHORT, 1, false }, }; - static DB2Meta instance(1310253, -1, 6, 6, 0x5BE043F9, fields, -1); + static DB2Meta instance(1310253, -1, 7, 7, 0x1065A739, fields, -1); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 1d74072f3a0..90ec65c3b30 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -27,6 +27,8 @@ #include "Regex.h" #include "Timer.h" #include "Util.h" +#include "World.h" +#include "advstd.h" #include <boost/filesystem/operations.hpp> #include <array> #include <bitset> @@ -80,14 +82,20 @@ DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("Bat DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", BattlemasterListLoadInfo::Instance()); DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextLoadInfo::Instance()); DB2Storage<Cfg_RegionsEntry> sCfgRegionsStore("Cfg_Regions.db2", CfgRegionsLoadInfo::Instance()); -DB2Storage<CharacterFacialHairStylesEntry> sCharacterFacialHairStylesStore("CharacterFacialHairStyles.db2", CharacterFacialHairStylesLoadInfo::Instance()); -DB2Storage<CharBaseSectionEntry> sCharBaseSectionStore("CharBaseSection.db2", CharBaseSectionLoadInfo::Instance()); -DB2Storage<CharSectionsEntry> sCharSectionsStore("CharSections.db2", CharSectionsLoadInfo::Instance()); -DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitLoadInfo::Instance()); DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesLoadInfo::Instance()); +DB2Storage<CharacterLoadoutEntry> sCharacterLoadoutStore("CharacterLoadout.db2", CharacterLoadoutLoadInfo::Instance()); +DB2Storage<CharacterLoadoutItemEntry> sCharacterLoadoutItemStore("CharacterLoadoutItem.db2", CharacterLoadoutItemLoadInfo::Instance()); DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsLoadInfo::Instance()); DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesLoadInfo::Instance()); DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesLoadInfo::Instance()); +DB2Storage<ChrCustomizationChoiceEntry> sChrCustomizationChoiceStore("ChrCustomizationChoice.db2", ChrCustomizationChoiceLoadInfo::Instance()); +DB2Storage<ChrCustomizationDisplayInfoEntry> sChrCustomizationDisplayInfoStore("ChrCustomizationDisplayInfo.db2", ChrCustomizationDisplayInfoLoadInfo::Instance()); +DB2Storage<ChrCustomizationElementEntry> sChrCustomizationElementStore("ChrCustomizationElement.db2", ChrCustomizationElementLoadInfo::Instance()); +DB2Storage<ChrCustomizationOptionEntry> sChrCustomizationOptionStore("ChrCustomizationOption.db2", ChrCustomizationOptionLoadInfo::Instance()); +DB2Storage<ChrCustomizationReqEntry> sChrCustomizationReqStore("ChrCustomizationReq.db2", ChrCustomizationReqLoadInfo::Instance()); +DB2Storage<ChrCustomizationReqChoiceEntry> sChrCustomizationReqChoiceStore("ChrCustomizationReqChoice.db2", ChrCustomizationReqChoiceLoadInfo::Instance()); +DB2Storage<ChrModelEntry> sChrModelStore("ChrModel.db2", ChrModelLoadInfo::Instance()); +DB2Storage<ChrRaceXChrModelEntry> sChrRaceXChrModelStore("ChrRaceXChrModel.db2", ChrRaceXChrModelLoadInfo::Instance()); DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesLoadInfo::Instance()); DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationLoadInfo::Instance()); DB2Storage<CinematicCameraEntry> sCinematicCameraStore("CinematicCamera.db2", CinematicCameraLoadInfo::Instance()); @@ -221,7 +229,6 @@ DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPo DB2Storage<RewardPackEntry> sRewardPackStore("RewardPack.db2", RewardPackLoadInfo::Instance()); DB2Storage<RewardPackXCurrencyTypeEntry> sRewardPackXCurrencyTypeStore("RewardPackXCurrencyType.db2", RewardPackXCurrencyTypeLoadInfo::Instance()); DB2Storage<RewardPackXItemEntry> sRewardPackXItemStore("RewardPackXItem.db2", RewardPackXItemLoadInfo::Instance()); -DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionLoadInfo::Instance()); DB2Storage<ScenarioEntry> sScenarioStore("Scenario.db2", ScenarioLoadInfo::Instance()); DB2Storage<ScenarioStepEntry> sScenarioStepStore("ScenarioStep.db2", ScenarioStepLoadInfo::Instance()); DB2Storage<SceneScriptEntry> sSceneScriptStore("SceneScript.db2", SceneScriptLoadInfo::Instance()); @@ -276,6 +283,7 @@ DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryLoadInfo::Instance()); DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyLoadInfo::Instance()); DB2Storage<TransmogHolidayEntry> sTransmogHolidayStore("TransmogHoliday.db2", TransmogHolidayLoadInfo::Instance()); +DB2Storage<TransmogIllusionEntry> sTransmogIllusionStore("TransmogIllusion.db2", TransmogIllusionLoadInfo::Instance()); DB2Storage<TransmogSetEntry> sTransmogSetStore("TransmogSet.db2", TransmogSetLoadInfo::Instance()); DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore("TransmogSetGroup.db2", TransmogSetGroupLoadInfo::Instance()); DB2Storage<TransmogSetItemEntry> sTransmogSetItemStore("TransmogSetItem.db2", TransmogSetItemLoadInfo::Instance()); @@ -316,9 +324,7 @@ typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/> typedef std::unordered_map<uint32, std::vector<ArtifactPowerEntry const*>> ArtifactPowersContainer; typedef std::unordered_map<uint32, std::unordered_set<uint32>> ArtifactPowerLinksContainer; typedef std::unordered_map<std::pair<uint32, uint8>, ArtifactPowerRankEntry const*> ArtifactPowerRanksContainer; -typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer; typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; -typedef std::unordered_map<uint32, ChrSpecializationEntry const*> ChrSpecialzationByClassContainer; typedef std::unordered_map<uint32 /*curveID*/, std::vector<CurvePointEntry const*>> CurvePointsContainer; typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer; @@ -380,12 +386,13 @@ namespace std::unordered_map<uint32 /*azeritePowerSetId*/, std::vector<AzeritePowerSetMemberEntry const*>> _azeritePowers; std::unordered_map<std::pair<uint32 /*azeriteUnlockSetId*/, ItemContext>, std::array<uint8, MAX_AZERITE_EMPOWERED_TIER>> _azeriteTierUnlockLevels; std::unordered_map<std::pair<uint32 /*itemId*/, ItemContext>, AzeriteUnlockMappingEntry const*> _azeriteUnlockMappings; - std::set<std::tuple<uint8, uint8, uint32>> _characterFacialHairStyles; - std::multimap<std::tuple<uint8, uint8, CharBaseSectionVariation>, CharSectionsEntry const*> _charSections; - CharStartOutfitContainer _charStartOutfits; - uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + std::array<std::array<uint32, MAX_POWERS>, MAX_CLASSES> _powersByClass; + std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<ChrCustomizationChoiceEntry const*>> _chrCustomizationChoicesByOption; + std::unordered_map<std::pair<uint8, uint8>, ChrModelEntry const*> _chrModelsByRaceAndGender; + std::map<std::tuple<uint8 /*race*/, uint8/*gender*/, uint8/*shapeshift*/>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts; + std::unordered_map<std::pair<uint8 /*race*/, uint8/*gender*/>, std::vector<ChrCustomizationOptionEntry const*>> _chrCustomizationOptionsByRaceAndGender; + std::unordered_map<uint32 /*chrCustomizationReqId*/, std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>> _chrCustomizationRequiredChoices; ChrSpecializationByIndexContainer _chrSpecializationsByIndex; - ChrSpecialzationByClassContainer _defaultChrSpecializationsByClass; CurvePointsContainer _curvePoints; EmotesTextSoundContainer _emoteTextSounds; std::unordered_map<std::pair<uint32 /*level*/, int32 /*expansion*/>, ExpectedStatEntry const*> _expectedStatsByLevel; @@ -600,14 +607,20 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sBattlemasterListStore); LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCfgRegionsStore); - LOAD_DB2(sCharacterFacialHairStylesStore); - LOAD_DB2(sCharBaseSectionStore); - LOAD_DB2(sCharSectionsStore); - LOAD_DB2(sCharStartOutfitStore); LOAD_DB2(sCharTitlesStore); + LOAD_DB2(sCharacterLoadoutStore); + LOAD_DB2(sCharacterLoadoutItemStore); LOAD_DB2(sChatChannelsStore); LOAD_DB2(sChrClassesStore); LOAD_DB2(sChrClassesXPowerTypesStore); + LOAD_DB2(sChrCustomizationChoiceStore); + LOAD_DB2(sChrCustomizationDisplayInfoStore); + LOAD_DB2(sChrCustomizationElementStore); + LOAD_DB2(sChrCustomizationOptionStore); + LOAD_DB2(sChrCustomizationReqStore); + LOAD_DB2(sChrCustomizationReqChoiceStore); + LOAD_DB2(sChrModelStore); + LOAD_DB2(sChrRaceXChrModelStore); LOAD_DB2(sChrRacesStore); LOAD_DB2(sChrSpecializationStore); LOAD_DB2(sCinematicCameraStore); @@ -741,7 +754,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sRewardPackStore); LOAD_DB2(sRewardPackXCurrencyTypeStore); LOAD_DB2(sRewardPackXItemStore); - LOAD_DB2(sScalingStatDistributionStore); LOAD_DB2(sScenarioStore); LOAD_DB2(sScenarioStepStore); LOAD_DB2(sSceneScriptStore); @@ -796,6 +808,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sTotemCategoryStore); LOAD_DB2(sToyStore); LOAD_DB2(sTransmogHolidayStore); + LOAD_DB2(sTransmogIllusionStore); LOAD_DB2(sTransmogSetStore); LOAD_DB2(sTransmogSetGroupStore); LOAD_DB2(sTransmogSetItemStore); @@ -910,46 +923,13 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul ASSERT(BATTLE_PET_SPECIES_MAX_ID >= sBattlePetSpeciesStore.GetNumRows(), "BATTLE_PET_SPECIES_MAX_ID (%d) must be equal to or greater than %u", BATTLE_PET_SPECIES_MAX_ID, sBattlePetSpeciesStore.GetNumRows()); - for (CharacterFacialHairStylesEntry const* characterFacialStyle : sCharacterFacialHairStylesStore) - _characterFacialHairStyles.emplace(characterFacialStyle->RaceID, characterFacialStyle->SexID, characterFacialStyle->VariationID); - - std::array<CharBaseSectionVariation, SECTION_TYPE_MAX> sectionToBase = { {} }; - for (CharBaseSectionEntry const* charBaseSection : sCharBaseSectionStore) - { - ASSERT(charBaseSection->ResolutionVariationEnum < SECTION_TYPE_MAX, - "SECTION_TYPE_MAX (%d) must be equal to or greater than %u", uint32(SECTION_TYPE_MAX), uint32(charBaseSection->ResolutionVariationEnum + 1)); - ASSERT(charBaseSection->VariationEnum < AsUnderlyingType(CharBaseSectionVariation::Count), - "CharBaseSectionVariation::Count %u must be equal to or greater than %u", uint32(CharBaseSectionVariation::Count), uint32(charBaseSection->VariationEnum + 1)); - - sectionToBase[charBaseSection->ResolutionVariationEnum] = static_cast<CharBaseSectionVariation>(charBaseSection->VariationEnum); - } - - std::map<std::tuple<uint8, uint8, CharBaseSectionVariation>, std::set<std::pair<uint8, uint8>>> addedSections; - for (CharSectionsEntry const* charSection : sCharSectionsStore) - { - ASSERT(charSection->BaseSection < SECTION_TYPE_MAX, - "SECTION_TYPE_MAX (%d) must be equal to or greater than %u", uint32(SECTION_TYPE_MAX), uint32(charSection->BaseSection + 1)); - - std::tuple<uint8, uint8, CharBaseSectionVariation> sectionKey{ charSection->RaceID, charSection->SexID, sectionToBase[charSection->BaseSection] }; - std::pair<uint8, uint8> sectionCombination{ charSection->VariationIndex, charSection->ColorIndex }; - if (addedSections[sectionKey].count(sectionCombination)) - continue; - - addedSections[sectionKey].insert(sectionCombination); - _charSections.insert({ sectionKey, charSection }); - } - - for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) - _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->SexID << 16)] = outfit; - { std::set<ChrClassesXPowerTypesEntry const*, ChrClassesXPowerTypesEntryComparator> powers; for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) powers.insert(power); - for (uint32 i = 0; i < MAX_CLASSES; ++i) - for (uint32 j = 0; j < MAX_POWERS; ++j) - _powersByClass[i][j] = MAX_POWERS; + for (std::size_t i = 0; i < _powersByClass.size(); ++i) + _powersByClass[i].fill(MAX_POWERS); for (ChrClassesXPowerTypesEntry const* power : powers) { @@ -964,6 +944,59 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } } + for (ChrCustomizationChoiceEntry const* customizationChoice : sChrCustomizationChoiceStore) + _chrCustomizationChoicesByOption[customizationChoice->ChrCustomizationOptionID].push_back(customizationChoice); + + std::unordered_multimap<uint32, std::pair<uint32, uint8>> shapeshiftFormByModel; + std::unordered_map<uint32, ChrCustomizationDisplayInfoEntry const*> displayInfoByCustomizationChoice; + + // build shapeshift form model lookup + for (ChrCustomizationElementEntry const* customizationElement : sChrCustomizationElementStore) + { + if (ChrCustomizationDisplayInfoEntry const* customizationDisplayInfo = sChrCustomizationDisplayInfoStore.LookupEntry(customizationElement->ChrCustomizationDisplayInfoID)) + { + if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(customizationElement->ChrCustomizationChoiceID)) + { + displayInfoByCustomizationChoice[customizationElement->ChrCustomizationChoiceID] = customizationDisplayInfo; + if (ChrCustomizationOptionEntry const* customizationOption = sChrCustomizationOptionStore.LookupEntry(customizationChoice->ChrCustomizationOptionID)) + shapeshiftFormByModel.emplace(customizationOption->ChrModelID, std::make_pair(customizationOption->ID, uint8(customizationDisplayInfo->ShapeshiftFormID))); + } + } + } + + std::unordered_map<uint32, std::vector<ChrCustomizationOptionEntry const*>> customizationOptionsByModel; + for (ChrCustomizationOptionEntry const* customizationOption : sChrCustomizationOptionStore) + customizationOptionsByModel[customizationOption->ChrModelID].push_back(customizationOption); + + for (ChrCustomizationReqChoiceEntry const* reqChoice : sChrCustomizationReqChoiceStore) + if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(reqChoice->ChrCustomizationChoiceID)) + _chrCustomizationRequiredChoices[reqChoice->ChrCustomizationReqID][customizationChoice->ChrCustomizationOptionID].push_back(reqChoice->ChrCustomizationChoiceID); + + for (ChrRaceXChrModelEntry const* raceModel : sChrRaceXChrModelStore) + { + if (ChrModelEntry const* model = sChrModelStore.LookupEntry(raceModel->ChrModelID)) + { + _chrModelsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(model->Sex) }] = model; + + if (std::vector<ChrCustomizationOptionEntry const*> const* customizationOptionsForModel = Trinity::Containers::MapGetValuePtr(customizationOptionsByModel, model->ID)) + _chrCustomizationOptionsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(model->Sex) }] = *customizationOptionsForModel; + + // link shapeshift displays to race/gender/form + for (std::pair<uint32 const, std::pair<uint32, uint8>> const& shapeshiftOptionsForModel : Trinity::Containers::MapEqualRange(shapeshiftFormByModel, model->ID)) + { + ShapeshiftFormModelData& data = _chrCustomizationChoicesForShapeshifts[{ uint8(raceModel->ChrRacesID), uint8(model->Sex), shapeshiftOptionsForModel.second.second }]; + data.OptionID = shapeshiftOptionsForModel.second.first; + data.Choices = Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, shapeshiftOptionsForModel.second.first); + if (data.Choices) + { + data.Displays.resize(data.Choices->size()); + for (std::size_t i = 0; i < data.Choices->size(); ++i) + data.Displays[i] = Trinity::Containers::MapGetValuePtr(displayInfoByCustomizationChoice, (*data.Choices)[i]->ID); + } + } + } + } + memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex)); for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore) { @@ -978,8 +1011,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; - if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_RECOMMENDED) - _defaultChrSpecializationsByClass[chrSpec->ClassID] = chrSpec; } for (ContentTuningXExpectedEntry const* contentTuningXExpectedStat : sContentTuningXExpectedStore) @@ -1247,7 +1278,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul uiMapAssignmentByUiMap.emplace(uiMapAssignment->UiMapID, uiMapAssignment); if (UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapAssignment->UiMapID)) { - ASSERT(uiMap->System < MAX_UI_MAP_SYSTEM, "MAX_TALENT_TIERS must be at least %u", uiMap->System + 1); + ASSERT(uiMap->System < MAX_UI_MAP_SYSTEM, "MAX_UI_MAP_SYSTEM must be at least %u", uiMap->System + 1); if (uiMapAssignment->MapID >= 0) _uiMapAssignmentByMap[uiMap->System].emplace(uiMapAssignment->MapID, uiMapAssignment); if (uiMapAssignment->AreaID) @@ -1269,12 +1300,12 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul memset(&bounds, 0, sizeof(bounds)); if (UiMapEntry const* parentUiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID)) { - if (parentUiMap->Flags & 0x80) + if (parentUiMap->GetFlags().HasFlag(UiMapFlag::NoWorldPositions)) continue; UiMapAssignmentEntry const* uiMapAssignment = nullptr; UiMapAssignmentEntry const* parentUiMapAssignment = nullptr; - for (auto uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ID)) + for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ID)) { if (uiMapAssignmentForMap.second->MapID >= 0 && uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 && @@ -1288,7 +1319,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul if (!uiMapAssignment) continue; - for (auto uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ParentUiMapID)) + for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ParentUiMapID)) { if (uiMapAssignmentForMap.second->MapID == uiMapAssignment->MapID && uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 && @@ -1510,9 +1541,7 @@ std::vector<uint8> const* DB2Manager::GetHotfixBlobData(uint32 tableHash, int32 uint32 DB2Manager::GetEmptyAnimStateID() const { - return 1484; - // TEMP: well... AnimationData.db2 in 8.3.0 has more rows than max hardcoded anim id in client - // return sAnimationDataStore.GetNumRows(); + return sAnimationDataStore.GetNumRows(); } void DB2Manager::InsertNewHotfix(uint32 tableHash, uint32 recordId) @@ -1642,50 +1671,41 @@ char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcas return broadcastText->Text[DEFAULT_LOCALE]; } -bool DB2Manager::HasCharacterFacialHairStyle(uint8 race, uint8 gender, uint8 variationId) const +char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/) { - return _characterFacialHairStyles.find(std::make_tuple(race, gender, variationId)) != _characterFacialHairStyles.end(); + ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); + if (!classEntry) + return ""; + + if (classEntry->Name[locale][0] != '\0') + return classEntry->Name[locale]; + + return classEntry->Name[DEFAULT_LOCALE]; } -bool DB2Manager::HasCharSections(uint8 race, uint8 gender, CharBaseSectionVariation variation) const +uint32 DB2Manager::GetPowerIndexByClass(Powers power, uint32 classId) const { - auto range = Trinity::Containers::MapEqualRange(_charSections, std::make_tuple(race, gender, variation)); - return range.begin() != range.end(); + return _powersByClass[classId][power]; } -CharSectionsEntry const* DB2Manager::GetCharSectionEntry(uint8 race, uint8 gender, CharBaseSectionVariation variation, uint8 variationIndex, uint8 colorIndex) const +std::vector<ChrCustomizationChoiceEntry const*> const* DB2Manager::GetCustomiztionChoices(uint32 chrCustomizationOptionId) const { - for (auto const& section : Trinity::Containers::MapEqualRange(_charSections, std::make_tuple(race, gender, variation))) - if (section.second->VariationIndex == variationIndex && section.second->ColorIndex == colorIndex) - return section.second; - - return nullptr; + return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, chrCustomizationOptionId); } -CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const +std::vector<ChrCustomizationOptionEntry const*> const* DB2Manager::GetCustomiztionOptions(uint8 race, uint8 gender) const { - auto itr = _charStartOutfits.find(race | (class_ << 8) | (gender << 16)); - if (itr == _charStartOutfits.end()) - return nullptr; - - return itr->second; + return Trinity::Containers::MapGetValuePtr(_chrCustomizationOptionsByRaceAndGender, { race,gender }); } -char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/) +std::unordered_map<uint32, std::vector<uint32>> const* DB2Manager::GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const { - ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); - if (!classEntry) - return ""; - - if (classEntry->Name[locale][0] != '\0') - return classEntry->Name[locale]; - - return classEntry->Name[DEFAULT_LOCALE]; + return Trinity::Containers::MapGetValuePtr(_chrCustomizationRequiredChoices, chrCustomizationReqId); } -uint32 DB2Manager::GetPowerIndexByClass(Powers power, uint32 classId) const +ChrModelEntry const* DB2Manager::GetChrModel(uint8 race, uint8 gender) const { - return _powersByClass[classId][power]; + return Trinity::Containers::MapGetValuePtr(_chrModelsByRaceAndGender, { race, gender }); } char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEFAULT_LOCALE*/) @@ -1707,11 +1727,54 @@ ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 cla ChrSpecializationEntry const* DB2Manager::GetDefaultChrSpecializationForClass(uint32 class_) const { - auto itr = _defaultChrSpecializationsByClass.find(class_); - if (itr != _defaultChrSpecializationsByClass.end()) - return itr->second; + return GetChrSpecializationByIndex(class_, INITIAL_SPECIALIZATION_INDEX); +} - return nullptr; +Optional<ContentTuningLevels> DB2Manager::GetContentTuningData(uint32 contentTuningId, uint32 /*replacementConditionMask*/, bool forItem /*= false*/) const +{ + ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(contentTuningId); + if (!contentTuning) + return {}; + + if (forItem && contentTuning->GetFlags().HasFlag(ContentTuningFlag::DisabledForItem)) + return {}; + + auto getLevelAdjustment = [](ContentTuningCalcType type) -> int32 + { + switch (type) + { + case ContentTuningCalcType::PlusOne: + return 1; + case ContentTuningCalcType::PlusMaxLevelForExpansion: + return GetMaxLevelForExpansion(sWorld->getIntConfig(CONFIG_EXPANSION)); + default: + break; + } + + return 0; + }; + + ContentTuningLevels levels; + levels.MinLevel = contentTuning->MinLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MinLevelType)); + levels.MaxLevel = contentTuning->MaxLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MaxLevelType)); + levels.MinLevelWithDelta = advstd::clamp<int32>(levels.MinLevel + contentTuning->TargetLevelDelta, 1, MAX_LEVEL); + levels.MaxLevelWithDelta = advstd::clamp<int32>(levels.MaxLevel + contentTuning->TargetLevelMaxDelta, 1, MAX_LEVEL); + + // clamp after calculating levels with delta (delta can bring "overflown" level back into correct range) + levels.MinLevel = advstd::clamp<int32>(levels.MinLevel, 1, MAX_LEVEL); + levels.MaxLevel = advstd::clamp<int32>(levels.MaxLevel, 1, MAX_LEVEL); + + if (contentTuning->TargetLevelMin) + levels.TargetLevelMin = contentTuning->TargetLevelMin; + else + levels.TargetLevelMin = levels.MinLevelWithDelta; + + if (contentTuning->TargetLevelMax) + levels.TargetLevelMax = contentTuning->TargetLevelMax; + else + levels.TargetLevelMax = levels.MaxLevelWithDelta; + + return levels; } char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, LocaleConstant locale) @@ -2609,6 +2672,11 @@ std::vector<RewardPackXItemEntry const*> const* DB2Manager::GetRewardPackItemsBy return nullptr; } +ShapeshiftFormModelData const* DB2Manager::GetShapeshiftFormModelData(uint8 race, uint8 gender, uint8 form) const +{ + return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesForShapeshifts, { race, gender, form }); +} + std::vector<SkillLineEntry const*> const* DB2Manager::GetSkillLinesForParentSkill(uint32 parentSkillId) const { return Trinity::Containers::MapGetValuePtr(_skillLinesByParentSkillLine, parentSkillId); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 665b56e178f..b0dfb56f9cc 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -20,6 +20,7 @@ #include "DB2Store.h" #include "DB2Structure.h" +#include <Optional.h> #include "SharedDefines.h" #include <map> #include <set> @@ -64,10 +65,13 @@ TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSp TC_GAME_API extern DB2Storage<BattlemasterListEntry> sBattlemasterListStore; TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; TC_GAME_API extern DB2Storage<Cfg_RegionsEntry> sCfgRegionsStore; -TC_GAME_API extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore; TC_GAME_API extern DB2Storage<CharTitlesEntry> sCharTitlesStore; +TC_GAME_API extern DB2Storage<CharacterLoadoutEntry> sCharacterLoadoutStore; +TC_GAME_API extern DB2Storage<CharacterLoadoutItemEntry> sCharacterLoadoutItemStore; TC_GAME_API extern DB2Storage<ChatChannelsEntry> sChatChannelsStore; TC_GAME_API extern DB2Storage<ChrClassesEntry> sChrClassesStore; +TC_GAME_API extern DB2Storage<ChrCustomizationReqEntry> sChrCustomizationReqStore; +TC_GAME_API extern DB2Storage<ChrCustomizationOptionEntry> sChrCustomizationOptionStore; TC_GAME_API extern DB2Storage<ChrRacesEntry> sChrRacesStore; TC_GAME_API extern DB2Storage<ChrSpecializationEntry> sChrSpecializationStore; TC_GAME_API extern DB2Storage<CinematicCameraEntry> sCinematicCameraStore; @@ -163,7 +167,6 @@ TC_GAME_API extern DB2Storage<QuestSortEntry> sQuestSortSt TC_GAME_API extern DB2Storage<QuestXPEntry> sQuestXPStore; TC_GAME_API extern DB2Storage<RandPropPointsEntry> sRandPropPointsStore; TC_GAME_API extern DB2Storage<RewardPackEntry> sRewardPackStore; -TC_GAME_API extern DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore; TC_GAME_API extern DB2Storage<ScenarioEntry> sScenarioStore; TC_GAME_API extern DB2Storage<ScenarioStepEntry> sScenarioStepStore; TC_GAME_API extern DB2Storage<SkillLineEntry> sSkillLineStore; @@ -220,6 +223,23 @@ TC_GAME_API extern DB2Storage<WorldEffectEntry> sWorldEffect TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore; TC_GAME_API extern DB2Storage<WorldStateExpressionEntry> sWorldStateExpressionStore; +struct ContentTuningLevels +{ + int16 MinLevel = 0; + int16 MaxLevel = 0; + int16 MinLevelWithDelta = 0; + int16 MaxLevelWithDelta = 0; + int16 TargetLevelMin = 0; + int16 TargetLevelMax = 0; +}; + +struct ShapeshiftFormModelData +{ + uint32 OptionID; + std::vector<ChrCustomizationChoiceEntry const*> const* Choices; + std::vector<ChrCustomizationDisplayInfoEntry const*> Displays; +}; + struct TaxiPathBySourceAndDestination { TaxiPathBySourceAndDestination() : ID(0), price(0) { } @@ -298,15 +318,16 @@ public: std::vector<AzeritePowerSetMemberEntry const*> const* GetAzeritePowers(uint32 itemId) const; uint32 GetRequiredAzeriteLevelForAzeritePowerTier(uint32 azeriteUnlockSetId, ItemContext context, uint32 tier) const; static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); - bool HasCharacterFacialHairStyle(uint8 race, uint8 gender, uint8 variationId) const; - bool HasCharSections(uint8 race, uint8 gender, CharBaseSectionVariation variation) const; - CharSectionsEntry const* GetCharSectionEntry(uint8 race, uint8 gender, CharBaseSectionVariation variation, uint8 variationIndex, uint8 color) const; - CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; static char const* GetClassName(uint8 class_, LocaleConstant locale = DEFAULT_LOCALE); uint32 GetPowerIndexByClass(Powers power, uint32 classId) const; + std::vector<ChrCustomizationChoiceEntry const*> const* GetCustomiztionChoices(uint32 chrCustomizationOptionId) const; + std::vector<ChrCustomizationOptionEntry const*> const* GetCustomiztionOptions(uint8 race, uint8 gender) const; + std::unordered_map<uint32, std::vector<uint32>> const* GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const; + ChrModelEntry const* GetChrModel(uint8 race, uint8 gender) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; ChrSpecializationEntry const* GetDefaultChrSpecializationForClass(uint32 class_) const; + Optional<ContentTuningLevels> GetContentTuningData(uint32 contentTuningId, uint32 replacementConditionMask, bool forItem = false) const; static char const* GetCreatureFamilyPetName(uint32 petfamily, LocaleConstant locale); float GetCurveValueAt(uint32 curveId, float x) const; EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; @@ -354,6 +375,7 @@ public: uint32 GetQuestUniqueBitFlag(uint32 questId); std::vector<RewardPackXCurrencyTypeEntry const*> const* GetRewardPackCurrencyTypesByRewardID(uint32 rewardPackID) const; std::vector<RewardPackXItemEntry const*> const* GetRewardPackItemsByRewardID(uint32 rewardPackID) const; + ShapeshiftFormModelData const* GetShapeshiftFormModelData(uint8 race, uint8 gender, uint8 form) const; std::vector<SkillLineEntry const*> const* GetSkillLinesForParentSkill(uint32 parentSkillId) const; std::vector<SkillLineAbilityEntry const*> const* GetSkillLineAbilitiesBySkill(uint32 skillId) const; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index b1b0b3f093f..36f315edb80 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -43,6 +43,7 @@ struct AchievementEntry int32 RewardItemID; uint32 CriteriaTree; int16 SharesCriteria; // referenced achievement (counting of all completed criterias) + int32 CovenantID; }; struct AnimationDataEntry @@ -83,7 +84,6 @@ struct AreaTableEntry uint16 UwAmbience; uint16 ZoneMusic; uint16 UwZoneMusic; - int8 ExplorationLevel; uint16 IntroSound; uint32 UwIntroSound; uint8 FactionGroupMask; @@ -93,6 +93,7 @@ struct AreaTableEntry uint8 WildBattlePetLevelMin; uint8 WildBattlePetLevelMax; uint8 WindSettingsID; + int32 ContentTuningID; int32 Flags[2]; uint16 LiquidTypeID[4]; @@ -407,7 +408,7 @@ struct BattlePetBreedQualityEntry struct BattlePetBreedStateEntry { uint32 ID; - uint8 BattlePetStateID; + int32 BattlePetStateID; uint16 Value; uint32 BattlePetBreedID; }; @@ -425,6 +426,7 @@ struct BattlePetSpeciesEntry int8 SourceTypeEnum; int32 CardUIModelSceneID; int32 LoadoutUIModelSceneID; + int32 CovenantID; }; struct BattlePetSpeciesStateEntry @@ -451,9 +453,9 @@ struct BattlemasterListEntry int8 GroupsAllowed; int8 MaxGroupSize; int16 HolidayWorldState; - int8 Flags; + int32 Flags; int32 IconFileDataID; - int16 RequiredPlayerConditionID; + int32 RequiredPlayerConditionID; int16 MapID[16]; }; @@ -464,7 +466,7 @@ struct BroadcastTextEntry LocalizedString Text; LocalizedString Text1; uint32 ID; - uint8 LanguageID; + int32 LanguageID; int32 ConditionID; uint16 EmotesID; uint8 Flags; @@ -484,65 +486,40 @@ struct Cfg_RegionsEntry uint32 ChallengeOrigin; }; -struct CharacterFacialHairStylesEntry +struct CharTitlesEntry { uint32 ID; - int32 Geoset[5]; - uint8 RaceID; - uint8 SexID; - uint8 VariationID; + LocalizedString Name; + LocalizedString Name1; + int16 MaskID; + int8 Flags; }; -struct CharBaseSectionEntry +struct CharacterLoadoutEntry { + Trinity::RaceMask<int64> RaceMask; uint32 ID; - uint8 LayoutResType; - uint8 VariationEnum; - uint8 ResolutionVariationEnum; -}; + int8 ChrClassID; + int8 Purpose; -struct CharSectionsEntry -{ - uint32 ID; - int8 RaceID; - int8 SexID; - int8 BaseSection; - int8 VariationIndex; - int8 ColorIndex; - int16 Flags; - int32 MaterialResourcesID[3]; + bool IsForNewCharacter() const { return Purpose == 9; } }; -#define MAX_OUTFIT_ITEMS 24 - -struct CharStartOutfitEntry +struct CharacterLoadoutItemEntry { uint32 ID; - uint8 ClassID; - uint8 SexID; - uint8 OutfitID; - uint32 PetDisplayID; // Pet Model ID for starting pet - uint8 PetFamilyID; // Pet Family Entry for starting pet - int32 ItemID[MAX_OUTFIT_ITEMS]; - uint32 RaceID; -}; - -struct CharTitlesEntry -{ - uint32 ID; - LocalizedString Name; - LocalizedString Name1; - int16 MaskID; - int8 Flags; + uint16 CharacterLoadoutID; + uint32 ItemID; }; struct ChatChannelsEntry { - uint32 ID; LocalizedString Name; LocalizedString Shortcut; + uint32 ID; int32 Flags; int8 FactionGroup; + int32 Ruleset; }; struct ChrClassesEntry @@ -552,14 +529,29 @@ struct ChrClassesEntry LocalizedString NameMale; LocalizedString NameFemale; char const* PetNameToken; + LocalizedString Description; + LocalizedString RoleInfoString; + LocalizedString DisabledString; + LocalizedString HyphenatedNameMale; + LocalizedString HyphenatedNameFemale; uint32 ID; uint32 CreateScreenFileDataID; uint32 SelectScreenFileDataID; uint32 IconFileDataID; uint32 LowResScreenFileDataID; - int32 StartingLevel; + uint32 Flags; uint32 SpellTextureBlobFileDataID; - uint16 Flags; + uint32 RolesMask; + uint32 ArmorTypeMask; + int32 CharStartKitUnknown901; + int32 MaleCharacterCreationVisualFallback; + int32 MaleCharacterCreationIdleVisualFallback; + int32 FemaleCharacterCreationVisualFallback; + int32 FemaleCharacterCreationIdleVisualFallback; + int32 CharacterCreationIdleGroundVisualFallback; + int32 CharacterCreationGroundVisualFallback; + int32 AlteredFormCharacterCreationIdleVisualFallback; + int32 CharacterCreationAnimLoopWaitTimeMsFallback; uint16 CinematicSequenceID; uint16 DefaultSpec; uint8 PrimaryStatPriority; @@ -568,6 +560,9 @@ struct ChrClassesEntry uint8 AttackPowerPerAgility; uint8 AttackPowerPerStrength; uint8 SpellClassSet; + uint8 ChatColorR; + uint8 ChatColorG; + uint8 ChatColorB; }; struct ChrClassesXPowerTypesEntry @@ -577,6 +572,103 @@ struct ChrClassesXPowerTypesEntry uint32 ClassID; }; +struct ChrCustomizationChoiceEntry +{ + LocalizedString Name; + uint32 ID; + int32 ChrCustomizationOptionID; + int32 ChrCustomizationReqID; + uint16 SortOrder; + int32 SwatchColor1; + int32 SwatchColor2; + uint16 UiOrderIndex; + int32 Flags; +}; + +struct ChrCustomizationDisplayInfoEntry +{ + uint32 ID; + int32 ShapeshiftFormID; + int32 DisplayID; + float BarberShopMinCameraDistance; + float BarberShopHeightOffset; +}; + +struct ChrCustomizationElementEntry +{ + uint32 ID; + int32 ChrCustomizationChoiceID; + int32 RelatedChrCustomizationChoiceID; + int32 ChrCustomizationGeosetID; + int32 ChrCustomizationSkinnedModelID; + int32 ChrCustomizationMaterialID; + int32 ChrCustomizationBoneSetID; + int32 ChrCustomizationCondModelID; + int32 ChrCustomizationDisplayInfoID; +}; + +struct ChrCustomizationOptionEntry +{ + LocalizedString Name; + uint32 ID; + uint16 SecondaryID; + int32 Flags; + int32 ChrModelID; + int32 SortIndex; + int32 ChrCustomizationCategoryID; + int32 OptionType; + float BarberShopCostModifier; + int32 ChrCustomizationID; + int32 ChrCustomizationReqID; + int32 UiOrderIndex; +}; + +struct ChrCustomizationReqEntry +{ + uint32 ID; + int32 Flags; + int32 ClassMask; + int32 AchievementID; + int32 OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar + int32 ItemModifiedAppearanceID; + + EnumFlag<ChrCustomizationReqFlag> GetFlags() const { return static_cast<ChrCustomizationReqFlag>(Flags); } +}; + +struct ChrCustomizationReqChoiceEntry +{ + uint32 ID; + int32 ChrCustomizationChoiceID; + uint32 ChrCustomizationReqID; +}; + +struct ChrModelEntry +{ + float FaceCustomizationOffset[3]; + float CustomizeOffset[3]; + uint32 ID; + int32 Sex; + int32 DisplayID; + int32 CharComponentTextureLayoutID; + int32 Flags; + int32 SkeletonFileDataID; + int32 ModelFallbackChrModelID; + int32 TextureFallbackChrModelID; + int32 HelmVisFallbackChrModelID; + float CustomizeScale; + float CustomizeFacing; + float CameraDistanceOffset; + float BarberShopCameraOffsetScale; + float BarberShopCameraRotationOffset; +}; + +struct ChrRaceXChrModelEntry +{ + uint32 ID; + int32 ChrRacesID; + int32 ChrModelID; +}; + struct ChrRacesEntry { char const* ClientPrefix; @@ -585,37 +677,39 @@ struct ChrRacesEntry LocalizedString NameFemale; LocalizedString NameLowercase; LocalizedString NameFemaleLowercase; + LocalizedString NameS; + LocalizedString NameFemaleS; + LocalizedString NameLowercaseS; + LocalizedString NameFemaleLowercaseS; + LocalizedString RaceFantasyDescription; + LocalizedString NameL; + LocalizedString NameFemaleL; + LocalizedString NameLowercaseL; + LocalizedString NameFemaleLowercaseL; uint32 ID; int32 Flags; - uint32 MaleDisplayId; - uint32 FemaleDisplayId; - uint32 HighResMaleDisplayId; - uint32 HighResFemaleDisplayId; + int32 BaseLanguage; + int32 ResSicknessSpellID; + int32 SplashSoundID; int32 CreateScreenFileDataID; int32 SelectScreenFileDataID; - float MaleCustomizeOffset[3]; - float FemaleCustomizeOffset[3]; int32 LowResScreenFileDataID; uint32 AlteredFormStartVisualKitID[3]; uint32 AlteredFormFinishVisualKitID[3]; int32 HeritageArmorAchievementID; int32 StartingLevel; int32 UiDisplayOrder; - int32 FemaleSkeletonFileDataID; - int32 MaleSkeletonFileDataID; - int32 HelmVisFallbackRaceID; + int32 PlayableRaceBit; + int32 HelmetAnimScalingRaceID; int32 TransmogrifyDisabledSlotMask; + float AlteredFormCustomizeOffsetFallback[3]; + float AlteredFormCustomizeRotationFallback; int16 FactionID; int16 CinematicSequenceID; - int16 ResSicknessSpellID; - int16 SplashSoundID; - int8 BaseLanguage; int8 CreatureType; int8 Alliance; int8 RaceRelated; int8 UnalteredVisualRaceID; - int8 CharComponentTextureLayoutID; - int8 CharComponentTexLayoutHiResID; int8 DefaultClassID; int8 NeutralRaceID; int8 MaleModelFallbackRaceID; @@ -626,6 +720,7 @@ struct ChrRacesEntry int8 MaleTextureFallbackSex; int8 FemaleTextureFallbackRaceID; int8 FemaleTextureFallbackSex; + int8 UnalteredVisualCustomizationRaceID; }; #define MAX_MASTERY_SPELLS 2 @@ -671,10 +766,31 @@ struct CinematicSequencesEntry struct ContentTuningEntry { uint32 ID; - int32 MinLevel; - int32 MaxLevel; int32 Flags; int32 ExpansionID; + int32 MinLevel; + int32 MaxLevel; + int32 MinLevelType; + int32 MaxLevelType; + int32 TargetLevelDelta; + int32 TargetLevelMaxDelta; + int32 TargetLevelMin; + int32 TargetLevelMax; + int32 MinItemLevel; + + EnumFlag<ContentTuningFlag> GetFlags() const { return static_cast<ContentTuningFlag>(Flags); } + + int32 GetScalingFactionGroup() const + { + EnumFlag<ContentTuningFlag> flags = GetFlags(); + if (flags.HasFlag(ContentTuningFlag::Horde)) + return 5; + + if (flags.HasFlag(ContentTuningFlag::Alliance)) + return 3; + + return 0; + } }; struct ContentTuningXExpectedEntry @@ -742,15 +858,9 @@ struct CreatureDisplayInfoExtraEntry int8 DisplayRaceID; int8 DisplaySexID; int8 DisplayClassID; - int8 SkinID; - int8 FaceID; - int8 HairStyleID; - int8 HairColorID; - int8 FacialHairID; int8 Flags; int32 BakeMaterialResourcesID; int32 HDBakeMaterialResourcesID; - uint8 CustomDisplayOption[3]; }; struct CreatureFamilyEntry @@ -866,6 +976,7 @@ struct CriteriaEntry // CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31 // CRITERIA_TYPE_ENTER_AREA = 163 // CRITERIA_TYPE_LEAVE_AREA = 164 + // CRITERIA_TYPE_TRAVELED_TO_AREA = 225 int32 AreaID; // CRITERIA_TYPE_OWN_ITEM = 36 @@ -977,18 +1088,19 @@ struct CurrencyTypesEntry uint32 ID; LocalizedString Name; LocalizedString Description; - uint8 CategoryID; + int32 CategoryID; int32 InventoryIconFileID; uint32 SpellWeight; uint8 SpellCategory; uint32 MaxQty; uint32 MaxEarnablePerWeek; - uint32 Flags; int8 Quality; int32 FactionID; int32 ItemGroupSoundsID; - int32 ConvertToPlayerExperience; - int32 PlayerConditionID; + int32 XpQuestDifficulty; + int32 AwardConditionID; + int32 MaxQtyWorldStateID; + int32 Flags[2]; }; struct CurveEntry @@ -1002,6 +1114,7 @@ struct CurvePointEntry { uint32 ID; DBCPosition2D Pos; + DBCPosition2D PosPreSquish; uint16 CurveID; uint8 OrderIndex; }; @@ -1011,20 +1124,20 @@ struct DestructibleModelDataEntry uint32 ID; int8 State0ImpactEffectDoodadSet; uint8 State0AmbientDoodadSet; - uint16 State1Wmo; + int32 State1Wmo; int8 State1DestructionDoodadSet; int8 State1ImpactEffectDoodadSet; uint8 State1AmbientDoodadSet; - uint16 State2Wmo; + int32 State2Wmo; int8 State2DestructionDoodadSet; int8 State2ImpactEffectDoodadSet; uint8 State2AmbientDoodadSet; - uint16 State3Wmo; + int32 State3Wmo; uint8 State3InitDoodadSet; uint8 State3AmbientDoodadSet; uint8 EjectDirection; uint8 DoNotHighlight; - uint16 State0Wmo; + int32 State0Wmo; uint8 HealEffect; uint16 HealEffectSpeed; int8 State0NameSet; @@ -1056,7 +1169,7 @@ struct DungeonEncounterEntry LocalizedString Name; uint32 ID; int16 MapID; - int8 DifficultyID; + int32 DifficultyID; int32 OrderIndex; int32 CompleteWorldStateID; int8 Bit; @@ -1240,13 +1353,13 @@ struct GameObjectsEntry DBCPosition3D Pos; float Rot[4]; uint32 ID; - uint16 OwnerID; - uint16 DisplayID; + int32 OwnerID; + int32 DisplayID; float Scale; - uint8 TypeID; - uint8 PhaseUseFlags; - uint16 PhaseID; - uint16 PhaseGroupID; + int32 TypeID; + int32 PhaseUseFlags; + int32 PhaseID; + int32 PhaseGroupID; int32 PropValue[8]; }; @@ -1273,7 +1386,7 @@ struct GarrBuildingEntry uint8 BuildingType; int32 HordeGameObjectID; int32 AllianceGameObjectID; - uint8 GarrSiteID; + int32 GarrSiteID; uint8 UpgradeLevel; int32 BuildSeconds; uint16 CurrencyTypeID; @@ -1346,6 +1459,8 @@ struct GarrFollowerEntry uint8 ChrClassID; uint8 Flags; uint8 Gender; + int32 AutoCombatantID; + int32 CovenantID; }; struct GarrFollowerXAbilityEntry @@ -1411,7 +1526,6 @@ struct GemPropertiesEntry uint32 ID; uint16 EnchantId; int32 Type; - uint16 MinItemLevel; }; struct GlyphBindableSpellEntry @@ -1539,6 +1653,7 @@ struct ItemEntry int8 SoundOverrideSubclassID; int32 IconFileDataID; uint8 ItemGroupSoundsID; + int32 ModifiedCraftingReagentItemID; }; struct ItemAppearanceEntry @@ -1548,6 +1663,7 @@ struct ItemAppearanceEntry int32 ItemDisplayInfoID; int32 DefaultIconFileDataID; int32 UiOrder; + int32 PlayerConditionID; }; struct ItemArmorQualityEntry @@ -1582,7 +1698,7 @@ struct ItemBagFamilyEntry struct ItemBonusEntry { uint32 ID; - int32 Value[3]; + int32 Value[4]; uint16 ParentItemBonusListID; uint8 Type; uint8 OrderIndex; @@ -1592,11 +1708,12 @@ struct ItemBonusEntry //struct ItemBonusListGroupEntryEntry //{ // uint32 ID; +// int32 ItemBonusListGroupID; // int32 ItemBonusListID; // int32 ItemLevelSelectorID; // int32 OrderIndex; // int32 ItemExtendedCostID; -// int32 ItemBonusListGroupID; +// int32 PlayerConditionID; //}; struct ItemBonusListLevelDeltaEntry @@ -1853,6 +1970,9 @@ struct ItemSparseEntry float PriceRandomValue; int32 Flags[MAX_ITEM_PROTO_FLAGS]; int32 FactionRelated; + int32 ModifiedCraftingReagentItemID; + int32 ContentTuningID; + int32 PlayerLevelToItemLevelCurveID; uint16 ItemNameDescriptionID; uint16 RequiredTransmogHoliday; uint16 RequiredHoliday; @@ -1867,7 +1987,6 @@ struct ItemSparseEntry uint16 StartQuestID; uint16 PageID; uint16 ItemDelay; - uint16 ScalingStatDistributionID; uint16 MinFactionID; uint16 RequiredSkillRank; uint16 RequiredSkill; @@ -1932,8 +2051,6 @@ struct LFGDungeonsEntry uint32 ID; LocalizedString Name; LocalizedString Description; - uint8 MinLevel; - uint16 MaxLevel; uint8 TypeID; uint8 Subtype; int8 Faction; @@ -1947,9 +2064,6 @@ struct LFGDungeonsEntry uint8 GroupID; uint8 OrderIndex; uint32 RequiredPlayerConditionId; - uint8 TargetLevel; - uint8 TargetLevelMin; - uint16 TargetLevelMax; uint16 RandomID; uint16 ScenarioID; uint16 FinalEncounterID; @@ -1962,6 +2076,7 @@ struct LFGDungeonsEntry uint16 BonusReputationAmount; uint16 MentorItemLevel; uint8 MentorCharLevel; + int32 ContentTuningID; int32 Flags[2]; // Helpers @@ -2009,6 +2124,7 @@ struct LiquidTypeEntry struct LockEntry { uint32 ID; + int32 Flags; int32 Index[MAX_LOCK_CASE]; uint16 Skill[MAX_LOCK_CASE]; uint8 Type[MAX_LOCK_CASE]; @@ -2026,6 +2142,7 @@ struct MapEntry uint32 ID; char const* Directory; LocalizedString MapName; + char const* InternalName; LocalizedString MapDescription0; // Horde LocalizedString MapDescription1; // Alliance LocalizedString PvpShortDescription; @@ -2237,11 +2354,9 @@ struct PlayerConditionEntry Trinity::RaceMask<int64> RaceMask; LocalizedString FailureDescription; uint32 ID; - uint16 MinLevel; - uint16 MaxLevel; int32 ClassMask; uint32 SkillLogic; - uint8 LanguageID; + int32 LanguageID; uint8 MinLanguage; int32 MaxLanguage; uint16 MaxFactionID; @@ -2257,7 +2372,7 @@ struct PlayerConditionEntry uint8 ItemFlags; uint32 AuraSpellLogic; uint16 WorldStateExpressionID; - uint8 WeatherID; + int32 WeatherID; uint8 PartyStatus; uint8 LifetimeMaxPVPRank; uint32 AchievementLogic; @@ -2266,7 +2381,7 @@ struct PlayerConditionEntry uint32 AreaLogic; uint32 LfgLogic; uint32 CurrencyLogic; - uint16 QuestKillID; + int32 QuestKillID; uint32 QuestKillLogic; int8 MinExpansionLevel; int8 MaxExpansionLevel; @@ -2277,7 +2392,7 @@ struct PlayerConditionEntry uint8 PhaseUseFlags; uint16 PhaseID; uint32 PhaseGroupID; - uint8 Flags; + int32 Flags; int8 ChrSpecializationIndex; int8 ChrSpecializationRole; uint32 ModifierTreeID; @@ -2291,14 +2406,16 @@ struct PlayerConditionEntry int8 MinExpansionTier; uint8 MinPVPRank; uint8 MaxPVPRank; + int32 ContentTuningID; + int32 CovenantID; uint16 SkillID[4]; uint16 MinSkill[4]; uint16 MaxSkill[4]; uint32 MinFactionID[3]; uint8 MinReputation[3]; - uint16 PrevQuestID[4]; - uint16 CurrQuestID[4]; - uint16 CurrentCompletedQuestID[4]; + int32 PrevQuestID[4]; + int32 CurrQuestID[4]; + int32 CurrentCompletedQuestID[4]; int32 SpellID[4]; int32 ItemID[4]; uint32 ItemCount[4]; @@ -2480,14 +2597,6 @@ struct RewardPackXItemEntry uint32 RewardPackID; }; -struct ScalingStatDistributionEntry -{ - uint32 ID; - uint16 PlayerLevelToItemLevelCurveID; - int32 MinLevel; - int32 MaxLevel; -}; - struct ScenarioEntry { uint32 ID; @@ -2505,7 +2614,7 @@ struct ScenarioStepEntry LocalizedString Title; uint16 ScenarioID; uint32 Criteriatreeid; - uint16 RewardQuestID; + int32 RewardQuestID; int32 RelatedStep; // Bonus step can only be completed if scenario is in the step specified in this field uint16 Supersedes; // Used in conjunction with Proving Grounds scenarios, when sequencing steps (Not using step order?) uint8 OrderIndex; @@ -2576,7 +2685,7 @@ struct SkillLineAbilityEntry int8 AcquireMethod; int16 TrivialSkillLineRankHigh; int16 TrivialSkillLineRankLow; - int8 Flags; + int32 Flags; int8 NumSkillUps; int16 UniqueBit; int16 TradeSkillCategoryID; @@ -2664,7 +2773,6 @@ struct SpellCastTimesEntry { uint32 ID; int32 Base; - int16 PerLevel; int32 Minimum; }; @@ -2728,7 +2836,6 @@ struct SpellDurationEntry { uint32 ID; int32 Duration; - uint32 DurationPerLevel; int32 MaxDuration; }; @@ -2738,7 +2845,7 @@ struct SpellEffectEntry int16 EffectAura; int32 DifficultyID; int32 EffectIndex; - uint32 Effect; + int32 Effect; float EffectAmplitude; int32 EffectAttributes; int32 EffectAuraPeriod; @@ -2794,14 +2901,16 @@ struct SpellInterruptsEntry struct SpellItemEnchantmentEntry { - uint32 ID; LocalizedString Name; LocalizedString HordeName; + uint32 ID; uint32 EffectArg[MAX_ITEM_ENCHANTMENT_EFFECTS]; float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS]; - uint32 TransmogPlayerConditionID; - uint32 TransmogCost; uint32 IconFileDataID; + int32 MinItemLevel; + int32 MaxItemLevel; + uint32 TransmogUseConditionID; + uint32 TransmogCost; int16 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS]; uint16 ItemVisual; uint16 Flags; @@ -2840,17 +2949,17 @@ struct SpellLevelsEntry { uint32 ID; uint8 DifficultyID; - int16 BaseLevel; int16 MaxLevel; - int16 SpellLevel; uint8 MaxPassiveAuraLevel; + int32 BaseLevel; + int32 SpellLevel; uint32 SpellID; }; struct SpellMiscEntry { uint32 ID; - int32 Attributes[14]; + int32 Attributes[15]; uint8 DifficultyID; uint16 CastingTimeIndex; uint16 DurationIndex; @@ -2862,6 +2971,9 @@ struct SpellMiscEntry int32 SpellIconFileDataID; int32 ActiveIconFileDataID; int32 ContentTuningID; + int32 ShowFutureSpellPlayerConditionID; + int32 SpellVisualScript; + int32 ActiveSpellVisualScript; uint32 SpellID; }; @@ -2908,7 +3020,7 @@ struct SpellProcsPerMinuteModEntry { uint32 ID; uint8 Type; - int16 Param; + int32 Param; float Coeff; uint32 SpellProcsPerMinuteID; }; @@ -3017,7 +3129,6 @@ struct SpellXSpellVisualEntry uint8 DifficultyID; uint32 SpellVisualID; float Probability; - uint8 Flags; uint8 Priority; int32 SpellIconFileID; int32 ActiveIconFileID; @@ -3123,6 +3234,15 @@ struct TransmogHolidayEntry int32 RequiredTransmogHoliday; }; +struct TransmogIllusionEntry +{ + uint32 ID; + int32 UnlockConditionID; + int32 TransmogCost; + int32 SpellItemEnchantmentID; + int32 Flags; +}; + struct TransmogSetEntry { LocalizedString Name; @@ -3179,14 +3299,15 @@ struct UiMapEntry int32 Flags; int32 System; int32 Type; - uint32 LevelRangeMin; - uint32 LevelRangeMax; int32 BountySetID; uint32 BountyDisplayLocation; int32 VisibilityPlayerConditionID; int8 HelpTextPosition; int32 BkgAtlasID; int32 AlternateUiMapGroup; + int32 ContentTuningID; + + EnumFlag<UiMapFlag> GetFlags() const { return EnumFlag<UiMapFlag>(static_cast<UiMapFlag>(Flags)); } }; struct UiMapAssignmentEntry @@ -3213,6 +3334,7 @@ struct UiMapLinkEntry int32 ChildUiMapID; int32 OverrideHighlightFileDataID; int32 OverrideHighlightAtlasID; + int32 Flags; }; struct UiMapXMapArtEntry @@ -3262,9 +3384,9 @@ struct VehicleEntry float FacingLimitRight; float FacingLimitLeft; float CameraYawOffset; - uint8 UiLocomotionType; uint16 VehicleUIIndicatorID; int32 MissileTargetingID; + uint16 VehiclePOITypeID; uint16 SeatID[8]; uint16 PowerDisplayID[3]; }; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 21f89c7b301..f9b79bbe2b1 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -44,11 +44,11 @@ enum LevelLimit // Client expected level limitation, like as used in DBC item max levels for "until max player level" // use as default max player level, must be fit max level for used client // also see MAX_LEVEL and STRONG_MAX_LEVEL define - DEFAULT_MAX_LEVEL = 120, + DEFAULT_MAX_LEVEL = 60, // client supported max level for player/pets/etc. Avoid overflow or client stability affected. // also see GT_MAX_LEVEL define - MAX_LEVEL = 120, + MAX_LEVEL = 123, // Server side limitation. Base at used code requirements. // also see MAX_LEVEL and GT_MAX_LEVEL define @@ -188,7 +188,7 @@ enum AzeriteTierUnlockSetFlags AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT = 0x1 }; -#define BATTLE_PET_SPECIES_MAX_ID 2873 +#define BATTLE_PET_SPECIES_MAX_ID 3084 enum BattlemasterListFlags { @@ -212,6 +212,22 @@ enum ChrSpecializationFlag CHR_SPECIALIZATION_FLAG_RECOMMENDED = 0x40, }; +enum class ContentTuningCalcType : int32 +{ + Base = 0, + PlusOne = 1, + PlusMaxLevelForExpansion = 2 +}; + +enum class ContentTuningFlag : int32 +{ + DisabledForItem = 0x04, + Horde = 0x8, + Alliance = 0x10 +}; + +DEFINE_ENUM_FLAG(ContentTuningFlag); + enum class CorruptionEffectsFlag { None = 0, @@ -507,24 +523,50 @@ enum CriteriaAdditionalCondition //CRITERIA_ADDITIONAL_CONDITION_UNK_265 = 265, CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_LOWER = 266, CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_GREATER = 267, - //CRITERIA_ADDITIONAL_CONDITION_UNK_268 = 268, - //CRITERIA_ADDITIONAL_CONDITION_UNK_269 = 269, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_IN_RANGE_CT = 268, + CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_IN_RANGE_CT = 269, //CRITERIA_ADDITIONAL_CONDITION_UNK_270 = 270, //CRITERIA_ADDITIONAL_CONDITION_UNK_271 = 271, - //CRITERIA_ADDITIONAL_CONDITION_UNK_272 = 272, - //CRITERIA_ADDITIONAL_CONDITION_UNK_273 = 273, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_GREATER_CT = 272, // compare levels using content tuning + CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_GREATER_CT = 273, // compare levels using content tuning //CRITERIA_ADDITIONAL_CONDITION_UNK_274 = 274, //CRITERIA_ADDITIONAL_CONDITION_UNK_275 = 275, //CRITERIA_ADDITIONAL_CONDITION_UNK_276 = 276, - //CRITERIA_ADDITIONAL_CONDITION_UNK_277 = 277, + CRITERIA_ADDITIONAL_CONDITION_RAF_RECRUIT_IN_PARTY = 277, // NYI //CRITERIA_ADDITIONAL_CONDITION_UNK_278 = 278, //CRITERIA_ADDITIONAL_CONDITION_UNK_279 = 279, CRITERIA_ADDITIONAL_CONDITION_MAP_OR_COSMETIC_MAP = 280, //CRITERIA_ADDITIONAL_CONDITION_UNK_281 = 281, - CRITERIA_ADDITIONAL_CONDITION_HAS_ENTITLEMENT = 282, - CRITERIA_ADDITIONAL_CONDITION_HAS_QUEST_SESSION = 283, + CRITERIA_ADDITIONAL_CONDITION_HAS_ENTITLEMENT = 282, // NYI + CRITERIA_ADDITIONAL_CONDITION_HAS_QUEST_SESSION = 283, // NYI //CRITERIA_ADDITIONAL_CONDITION_UNK_284 = 284, //CRITERIA_ADDITIONAL_CONDITION_UNK_285 = 285, + //CRITERIA_ADDITIONAL_CONDITION_UNK_286 = 286, + //CRITERIA_ADDITIONAL_CONDITION_UNK_287 = 287, + CRITERIA_ADDITIONAL_CONDITION_COVENANT = 288, + //CRITERIA_ADDITIONAL_CONDITION_UNK_289 = 289, // related to pvp ranking + CRITERIA_ADDITIONAL_CONDITION_PERMANENT_ANIMA_DIVERSION_TALENT = 290, // NYI + CRITERIA_ADDITIONAL_CONDITION_SOULBIND = 291, + //CRITERIA_ADDITIONAL_CONDITION_UNK_292 = 292, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE_IN_GROUP = 293, + //CRITERIA_ADDITIONAL_CONDITION_UNK_294 = 294, + //CRITERIA_ADDITIONAL_CONDITION_UNK_295 = 295, + //CRITERIA_ADDITIONAL_CONDITION_UNK_296 = 296, + //CRITERIA_ADDITIONAL_CONDITION_UNK_297 = 297, + //CRITERIA_ADDITIONAL_CONDITION_UNK_298 = 298, + //CRITERIA_ADDITIONAL_CONDITION_UNK_299 = 299, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_SPECIFIC_CHROMIE_TIME = 300, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_ANY_CHROMIE_TIME = 301, + //CRITERIA_ADDITIONAL_CONDITION_UNK_302 = 302, + CRITERIA_ADDITIONAL_CONDITION_SOURCE_RUNEFORGE_LEGENDARY_KNOWN = 303, + //CRITERIA_ADDITIONAL_CONDITION_UNK_304 = 304, + //CRITERIA_ADDITIONAL_CONDITION_UNK_305 = 305, + //CRITERIA_ADDITIONAL_CONDITION_UNK_306 = 306, + CRITERIA_ADDITIONAL_CONDITION_SOULBIND_CONDUIT_RANK = 307, // NYI + CRITERIA_ADDITIONAL_CONDITION_SHAPESHIFT_FORM_CUSTOMIZATION_DISPLAY = 308, + CRITERIA_ADDITIONAL_CONDITION_SOULBIND_MIN_CONDUITS_AT_RANK = 309, // NYI + CRITERIA_ADDITIONAL_CONDITION_IS_RESTRICTED_ACCOUNT = 310, // NYI + CRITERIA_ADDITIONAL_CONDITION_SOURCE_FLYING = 311, }; enum CriteriaFlags @@ -763,10 +805,24 @@ enum CriteriaTypes : uint8 CRITERIA_TYPE_RELIC_TALENT_UNLOCKED = 211, CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL = 213, CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED= 214, - CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED = 215 -}; - -#define CRITERIA_TYPE_TOTAL 219 + CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED = 215, + CRITERIA_TYPE_MYTHIC_KEYSTONE_COMPLETED = 216, // NYI + // 217 - 0 criterias + CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE = 218, + CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR = 219, + CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR = 220, + // 221 - 0 criterias + // 222 - 0 criterias + // 223 - 0 criterias + // 224 - 0 criterias + CRITERIA_TYPE_TRAVELLED_TO_AREA = 225, + // 226 - 0 criterias + // 227 - 0 criterias + CRITERIA_TYPE_APPLY_CONDUIT = 228, + CRITERIA_TYPE_CONVERT_ITEMS_TO_CURRENCY = 229, +}; + +#define CRITERIA_TYPE_TOTAL 230 enum CriteriaTreeFlags : uint16 { @@ -790,50 +846,20 @@ enum CriteriaTreeOperator : uint8 CRITERIA_TREE_OPERATOR_SUM_CHILDREN_WEIGHT = 9 }; -enum class CharBaseSectionVariation : uint8 +enum class ChrCustomizationOptionFlag : int32 { - Skin = 0, - Face = 1, - FacialHair = 2, - Hair = 3, - Underwear = 4, - CustomDisplay1 = 5, - CustomDisplay2 = 6, - CustomDisplay3 = 7, - - Count + Disabled = 0x4, }; -enum CharSectionFlags -{ - SECTION_FLAG_PLAYER = 0x01, - SECTION_FLAG_DEATH_KNIGHT = 0x04, - SECTION_FLAG_DEMON_HUNTER = 0x20, - SECTION_FLAG_CONDITIONAL = 0x400 -}; +DEFINE_ENUM_FLAG(ChrCustomizationOptionFlag) -enum CharSectionType +enum class ChrCustomizationReqFlag : int32 { - SECTION_TYPE_SKIN_LOW_RES = 0, - SECTION_TYPE_FACE_LOW_RES = 1, - SECTION_TYPE_FACIAL_HAIR_LOW_RES = 2, - SECTION_TYPE_HAIR_LOW_RES = 3, - SECTION_TYPE_UNDERWEAR_LOW_RES = 4, - SECTION_TYPE_SKIN = 5, - SECTION_TYPE_FACE = 6, - SECTION_TYPE_FACIAL_HAIR = 7, - SECTION_TYPE_HAIR = 8, - SECTION_TYPE_UNDERWEAR = 9, - SECTION_TYPE_CUSTOM_DISPLAY_1_LOW_RES = 10, - SECTION_TYPE_CUSTOM_DISPLAY_1 = 11, - SECTION_TYPE_CUSTOM_DISPLAY_2_LOW_RES = 12, - SECTION_TYPE_CUSTOM_DISPLAY_2 = 13, - SECTION_TYPE_CUSTOM_DISPLAY_3_LOW_RES = 14, - SECTION_TYPE_CUSTOM_DISPLAY_3 = 15, - - SECTION_TYPE_MAX + HasRequirements = 0x1 }; +DEFINE_ENUM_FLAG(ChrCustomizationReqFlag) + enum Curves { CURVE_ID_ARTIFACT_RELIC_ITEM_LEVEL_BONUS = 1718, @@ -1013,7 +1039,7 @@ enum ItemBonusType ITEM_BONUS_ITEM_LEVEL = 1, ITEM_BONUS_STAT = 2, ITEM_BONUS_QUALITY = 3, - ITEM_BONUS_DESCRIPTION = 4, + ITEM_BONUS_NAME_SUBTITLE = 4, // Text under name ITEM_BONUS_SUFFIX = 5, ITEM_BONUS_SOCKET = 6, ITEM_BONUS_APPEARANCE = 7, @@ -1033,6 +1059,10 @@ enum ItemBonusType ITEM_BONUS_OVERRIDE_CAN_DISENCHANT = 21, ITEM_BONUS_OVERRIDE_CAN_SCRAP = 22, ITEM_BONUS_ITEM_EFFECT_ID = 23, + ITEM_BONUS_MODIFIED_CRAFTING_STAT = 25, + ITEM_BONUS_REQUIRED_LEVEL_CURVE = 27, + ITEM_BONUS_DESCRIPTION_TEXT = 30, // Item description + ITEM_BONUS_OVERRIDE_NAME = 31, // ItemNameDescription id }; enum class ItemContext : uint8 @@ -1292,7 +1322,7 @@ enum SpellShapeshiftFormFlags SHAPESHIFT_FORM_PREVENT_EMOTE_SOUNDS = 0x1000 }; -#define TaxiMaskSize 319 +#define TaxiMaskSize 336 typedef std::array<uint8, TaxiMaskSize> TaxiMask; enum TotemCategoryType @@ -1380,12 +1410,36 @@ enum TaxiPathNodeFlags TAXI_PATH_NODE_FLAG_STOP = 0x2 }; +enum class UiMapFlag : int32 +{ + None = 0, + NoHighlight = 0x00000001, + ShowOverlays = 0x00000002, + ShowTaxiNodes = 0x00000004, + GarrisonMap = 0x00000008, + FallbackToParentMap = 0x00000010, + NoHighlightTexture = 0x00000020, + ShowTaskObjectives = 0x00000040, + NoWorldPositions = 0x00000080, + HideArchaeologyDigs = 0x00000100, + Deprecated = 0x00000200, + HideIcons = 0x00000400, + HideVignettes = 0x00000800, + ForceAllOverlayExplored = 0x00001000, + FlightMapShowZoomOut = 0x00002000, + FlightMapAutoZoom = 0x00004000, + ForceOnNavbar = 0x00008000 +}; + +DEFINE_ENUM_FLAG(UiMapFlag) + enum UiMapSystem : int8 { UI_MAP_SYSTEM_WORLD = 0, UI_MAP_SYSTEM_TAXI = 1, UI_MAP_SYSTEM_ADVENTURE = 2, - MAX_UI_MAP_SYSTEM = 3 + UI_MAP_SYSTEM_MINIMAP = 3, + MAX_UI_MAP_SYSTEM }; enum UiMapType : int8 diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index de4ea7d41b2..54bc82c9be0 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -44,15 +44,14 @@ namespace lfg { -LFGDungeonData::LFGDungeonData() : id(0), name(), map(0), type(0), expansion(0), group(0), minlevel(0), - maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), - requiredItemLevel(0) +LFGDungeonData::LFGDungeonData() : id(0), name(), map(0), type(0), expansion(0), group(0), contentTuningId(0), + difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), requiredItemLevel(0) { } LFGDungeonData::LFGDungeonData(LFGDungeonsEntry const* dbc) : id(dbc->ID), name(dbc->Name[sWorld->GetDefaultDbcLocale()]), map(dbc->MapID), type(uint8(dbc->TypeID)), expansion(uint8(dbc->ExpansionLevel)), group(uint8(dbc->GroupID)), - minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)), + contentTuningId(uint32(dbc->ContentTuningID)), difficulty(Difficulty(dbc->DifficultyID)), seasonal((dbc->Flags[0] & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f), requiredItemLevel(0) { @@ -1651,48 +1650,55 @@ LfgLockMap LFGMgr::GetLockedDungeons(ObjectGuid guid) if (!dungeon) // should never happen - We provide a list from sLfgDungeonsStore continue; - uint32 lockStatus = 0; - if (denyJoin) - lockStatus = LFG_LOCKSTATUS_RAID_LOCKED; - else if (dungeon->expansion > expansion) - lockStatus = LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION; - else if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, dungeon->map, player)) - lockStatus = LFG_LOCKSTATUS_NOT_IN_SEASON; - else if (DisableMgr::IsDisabledFor(DISABLE_TYPE_LFG_MAP, dungeon->map, player)) - lockStatus = LFG_LOCKSTATUS_RAID_LOCKED; - else if (dungeon->difficulty > DIFFICULTY_NORMAL && player->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) - lockStatus = LFG_LOCKSTATUS_RAID_LOCKED; - else if (dungeon->minlevel > level) - lockStatus = LFG_LOCKSTATUS_TOO_LOW_LEVEL; - else if (dungeon->maxlevel < level) - lockStatus = LFG_LOCKSTATUS_TOO_HIGH_LEVEL; - else if (dungeon->seasonal && !IsSeasonActive(dungeon->id)) - lockStatus = LFG_LOCKSTATUS_NOT_IN_SEASON; - else if (dungeon->requiredItemLevel > player->GetAverageItemLevel()) - lockStatus = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE; - else if (AccessRequirement const* ar = sObjectMgr->GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty))) + uint32 lockStatus = [&]() -> uint32 { - if (ar->achievement && !player->HasAchieved(ar->achievement)) - lockStatus = LFG_LOCKSTATUS_MISSING_ACHIEVEMENT; - else if (player->GetTeam() == ALLIANCE && ar->quest_A && !player->GetQuestRewardStatus(ar->quest_A)) - lockStatus = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; - else if (player->GetTeam() == HORDE && ar->quest_H && !player->GetQuestRewardStatus(ar->quest_H)) - lockStatus = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; - else + if (denyJoin) + return LFG_LOCKSTATUS_RAID_LOCKED; + if (dungeon->expansion > expansion) + return LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION; + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, dungeon->map, player)) + return LFG_LOCKSTATUS_NOT_IN_SEASON; + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_LFG_MAP, dungeon->map, player)) + return LFG_LOCKSTATUS_RAID_LOCKED; + if (dungeon->difficulty > DIFFICULTY_NORMAL && player->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) + return LFG_LOCKSTATUS_RAID_LOCKED; + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(dungeon->contentTuningId, player->m_playerData->CtrOptions->ContentTuningConditionMask)) + { + if (levels->MinLevel > level) + return LFG_LOCKSTATUS_TOO_LOW_LEVEL; + if (levels->MaxLevel < level) + return LFG_LOCKSTATUS_TOO_HIGH_LEVEL; + } + if (dungeon->seasonal && !IsSeasonActive(dungeon->id)) + return LFG_LOCKSTATUS_NOT_IN_SEASON; + if (dungeon->requiredItemLevel > player->GetAverageItemLevel()) + return LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE; + if (AccessRequirement const* ar = sObjectMgr->GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty))) + { + if (ar->achievement && !player->HasAchieved(ar->achievement)) + return LFG_LOCKSTATUS_MISSING_ACHIEVEMENT; + if (player->GetTeam() == ALLIANCE && ar->quest_A && !player->GetQuestRewardStatus(ar->quest_A)) + return LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; + if (player->GetTeam() == HORDE && ar->quest_H && !player->GetQuestRewardStatus(ar->quest_H)) + return LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; + + if (ar->item) { if (!player->HasItemCount(ar->item) && (!ar->item2 || !player->HasItemCount(ar->item2))) - lockStatus = LFG_LOCKSTATUS_MISSING_ITEM; + return LFG_LOCKSTATUS_MISSING_ITEM; } else if (ar->item2 && !player->HasItemCount(ar->item2)) - lockStatus = LFG_LOCKSTATUS_MISSING_ITEM; - } + return LFG_LOCKSTATUS_MISSING_ITEM; + } - /* @todo VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED) - lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE; - lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL; - lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL; - */ + /* @todo VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED) + lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE; + lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL; + lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL; + */ + return 0; + }(); if (lockStatus) lock[dungeon->Entry()] = LfgLockInfoData(lockStatus, dungeon->requiredItemLevel, player->GetAverageItemLevel()); @@ -2086,15 +2092,23 @@ uint32 LFGMgr::GetLFGDungeonEntry(uint32 id) return 0; } -LfgDungeonSet LFGMgr::GetRandomAndSeasonalDungeons(uint8 level, uint8 expansion) +LfgDungeonSet LFGMgr::GetRandomAndSeasonalDungeons(uint8 level, uint8 expansion, uint32 contentTuningReplacementConditionMask) { LfgDungeonSet randomDungeons; for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr) { lfg::LFGDungeonData const& dungeon = itr->second; - if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id))) - && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel) - randomDungeons.insert(dungeon.Entry()); + if (!(dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))) + continue; + + if (dungeon.expansion > expansion) + continue; + + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(dungeon.contentTuningId, contentTuningReplacementConditionMask)) + if (levels->MinLevel > level || level > levels->MaxLevel) + continue; + + randomDungeons.insert(dungeon.Entry()); } return randomDungeons; } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 2c2063d0ff4..6174a1c1ec2 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -299,8 +299,7 @@ struct LFGDungeonData uint8 type; uint8 expansion; uint8 group; - uint8 minlevel; - uint8 maxlevel; + uint32 contentTuningId; Difficulty difficulty; bool seasonal; float x, y, z, o; @@ -398,7 +397,7 @@ class TC_GAME_API LFGMgr /// Gets the random dungeon reward corresponding to given dungeon and player level LfgReward const* GetRandomDungeonReward(uint32 dungeon, uint8 level); /// Returns all random and seasonal dungeons for given level and expansion - LfgDungeonSet GetRandomAndSeasonalDungeons(uint8 level, uint8 expansion); + LfgDungeonSet GetRandomAndSeasonalDungeons(uint8 level, uint8 expansion, uint32 contentTuningReplacementConditionMask); /// Teleport a player to/from selected dungeon void TeleportPlayer(Player* player, bool out, bool fromOpcode = false); /// Inits new proposal to boot a player diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index d3f549cb30a..c5d50dc9ed6 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -117,7 +117,8 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellID), spell->Id); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spell->Id); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetMiscTemplate()->TimeToTargetScale != 0 ? GetMiscTemplate()->TimeToTargetScale : *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetTemplate()->MaxSearchRadius); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetMiscTemplate()->DecalPropertiesId); diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp index 32648507033..1e622b642f9 100644 --- a/src/server/game/Entities/Conversation/Conversation.cpp +++ b/src/server/game/Entities/Conversation/Conversation.cpp @@ -169,7 +169,7 @@ bool Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, for (uint16 actorIndex : actorIndices) { UF::ConversationActor const* actor = actorIndex < m_conversationData->Actors.size() ? &m_conversationData->Actors[actorIndex] : nullptr; - if (!actor || (!actor->CreatureID && actor->ActorGUID.IsEmpty())) + if (!actor || (!actor->CreatureID && actor->ActorGUID.IsEmpty() && !actor->NoActorObject)) { TC_LOG_ERROR("entities.conversation", "Failed to create conversation (Id: %u) due to missing actor (Idx: %u).", conversationEntry, actorIndex); return false; diff --git a/src/server/game/Entities/Conversation/Conversation.h b/src/server/game/Entities/Conversation/Conversation.h index b17dbd9d393..821bfcaa30f 100644 --- a/src/server/game/Entities/Conversation/Conversation.h +++ b/src/server/game/Entities/Conversation/Conversation.h @@ -25,14 +25,6 @@ class Unit; class SpellInfo; -namespace UF -{ - inline bool operator==(ConversationLine const& left, ConversationLine const& right) - { - return left.ConversationLineID == right.ConversationLineID; - } -} - class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversation> { public: diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 234be6705c3..299117ace95 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -102,9 +102,6 @@ void Corpse::SaveToDB() for (uint16 index = 0; index < EQUIPMENT_SLOT_END; ++index) items << m_corpseData->Items[index] << ' '; - uint32 bytes1 = (uint32(*m_corpseData->RaceID) << 8) | (uint32(*m_corpseData->Sex) << 16) | (uint32(*m_corpseData->SkinID) << 24); - uint32 bytes2 = (uint32(*m_corpseData->FaceID)) | (uint32(*m_corpseData->HairStyleID) << 8) | (uint32(*m_corpseData->HairColorID) << 16) | (uint32(*m_corpseData->FacialHairStyleID) << 24); - uint16 index = 0; CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE); stmt->setUInt64(index++, GetOwnerGUID().GetCounter()); // guid @@ -115,8 +112,8 @@ void Corpse::SaveToDB() stmt->setUInt16(index++, GetMapId()); // mapId stmt->setUInt32(index++, m_corpseData->DisplayID); // displayId stmt->setString(index++, items.str()); // itemCache - stmt->setUInt32(index++, bytes1); // bytes1 - stmt->setUInt32(index++, bytes2); // bytes2 + stmt->setUInt8 (index++, m_corpseData->RaceID); // race + stmt->setUInt8 (index++, m_corpseData->Sex); // gender stmt->setUInt8 (index++, m_corpseData->Flags); // flags stmt->setUInt8 (index++, m_corpseData->DynamicFlags); // dynFlags stmt->setUInt32(index++, uint32(m_time)); // time @@ -133,6 +130,16 @@ void Corpse::SaveToDB() trans->Append(stmt); } + for (UF::ChrCustomizationChoice customization : m_corpseData->Customizations) + { + index = 0; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE_CUSTOMIZATIONS); + stmt->setUInt64(index++, GetOwnerGUID().GetCounter()); // OwnerGuid + stmt->setUInt32(index++, customization.ChrCustomizationOptionID); + stmt->setUInt32(index++, customization.ChrCustomizationChoiceID); + trans->Append(stmt); + } + CharacterDatabase.CommitTransaction(trans); } @@ -150,12 +157,16 @@ void Corpse::DeleteFromDB(ObjectGuid const& ownerGuid, CharacterDatabaseTransact stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE_PHASES); stmt->setUInt64(0, ownerGuid.GetCounter()); CharacterDatabase.ExecuteOrAppend(trans, stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE_CUSTOMIZATIONS); + stmt->setUInt64(0, ownerGuid.GetCounter()); + CharacterDatabase.ExecuteOrAppend(trans, stmt); } bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, race, gender, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? float posX = fields[0].GetFloat(); float posY = fields[1].GetFloat(); @@ -172,15 +183,8 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) for (uint32 index = 0; index < EQUIPMENT_SLOT_END; ++index) SetItem(index, atoul(items[index])); - uint32 bytes1 = fields[7].GetUInt32(); - uint32 bytes2 = fields[8].GetUInt32(); - SetRace((bytes1 >> 8) & 0xFF); - SetSex((bytes1 >> 16) & 0xFF); - SetSkin((bytes1 >> 24) & 0xFF); - SetFace(bytes2 & 0xFF); - SetHairStyle((bytes2 >> 8) & 0xFF); - SetHairColor((bytes2 >> 16) & 0xFF); - SetFacialHairStyle((bytes2 >> 24) & 0xFF); + SetRace(fields[7].GetUInt8()); + SetSex(fields[8].GetUInt8()); SetFlags(fields[9].GetUInt8()); SetCorpseDynamicFlags(CorpseDynFlags(fields[10].GetUInt8())); SetOwnerGUID(ObjectGuid::Create<HighGuid::Player>(fields[14].GetUInt64())); diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h index 5f3b234158a..fc3030ff2ac 100644 --- a/src/server/game/Entities/Corpse/Corpse.h +++ b/src/server/game/Entities/Corpse/Corpse.h @@ -21,6 +21,7 @@ #include "Object.h" #include "DatabaseEnvFwd.h" #include "GridDefines.h" +#include "IteratorPair.h" #include "Loot.h" enum CorpseType @@ -83,15 +84,21 @@ class TC_GAME_API Corpse : public WorldObject, public GridObject<Corpse> void SetDisplayId(uint32 displayId) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DisplayID), displayId); } void SetRace(uint8 race) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::RaceID), race); } void SetSex(uint8 sex) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Sex), sex); } - void SetSkin(uint8 skin) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::SkinID), skin); } - void SetFace(uint8 face) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::FaceID), face); } - void SetHairStyle(uint8 hairStyle) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::HairStyleID), hairStyle); } - void SetHairColor(uint8 hairColor) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::HairColorID), hairColor); } - void SetFacialHairStyle(uint8 facialHairStyle) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::FacialHairStyleID), facialHairStyle); } void SetFlags(uint32 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Flags), flags); } void SetFactionTemplate(int32 factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::FactionTemplate), factionTemplate); } void SetItem(uint32 slot, uint32 item) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Items, slot), item); } - void SetCustomDisplayOption(uint32 slot, uint8 customDisplayOption) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::CustomDisplayOption, slot), customDisplayOption); } + + template<typename Iter> + void SetCustomizations(Trinity::IteratorPair<Iter> customizations) + { + ClearDynamicUpdateFieldValues(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Customizations)); + for (auto&& customization : customizations) + { + UF::ChrCustomizationChoice& newChoice = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Customizations)); + newChoice.ChrCustomizationOptionID = customization.ChrCustomizationOptionID; + newChoice.ChrCustomizationChoiceID = customization.ChrCustomizationChoiceID; + } + } time_t const& GetGhostTime() const { return m_time; } void ResetGhostTime() { m_time = time(nullptr); } diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index cb00b2f41d2..550ca700d90 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -100,7 +100,8 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste auto dynamicObjectData = m_values.ModifyValue(&DynamicObject::m_dynamicObjectData); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Caster), caster->GetGUID()); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Type), type); - SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellID), spell->Id); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Radius), radius); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::CastTime), GameTime::GetGameTimeMS()); diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp index 7f56bc235bc..f81b2e1a6b2 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp @@ -76,7 +76,7 @@ void AzeriteItem::SaveToDB(CharacterDatabaseTransaction& trans) for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) stmt->setUInt32(5 + specIndex * 5 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]); } - for (; specIndex < MAX_SPECIALIZATIONS; ++specIndex) + for (; specIndex < 4; ++specIndex) { stmt->setUInt32(4 + specIndex * 5, 0); for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9accf6abf42..aa250eb5dd2 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -265,43 +265,28 @@ ItemModifier const AppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS] = ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, - ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4 + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_5 }; -static uint64 constexpr AppearanceModifierMaskSpecSpecific = - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4); - ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS] = { ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, - ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4 + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_5 }; -static uint64 constexpr IllusionModifierMaskSpecSpecific = - (UI64LIT(1) << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1) | - (UI64LIT(1) << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2) | - (UI64LIT(1) << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3) | - (UI64LIT(1) << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4); - ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS] = { ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1, ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2, ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3, - ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4 + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_5 }; -static uint64 constexpr SecondaryAppearanceModifierMaskSpecSpecific = - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3) | - (UI64LIT(1) << ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4); - void ItemAdditionalLoadInfo::Init(std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo>* loadInfo, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, @@ -363,7 +348,7 @@ void ItemAdditionalLoadInfo::Init(std::unordered_map<ObjectGuid::LowType, ItemAd info.AzeriteItem->Xp = fields[1].GetUInt64(); info.AzeriteItem->Level = fields[2].GetUInt32(); info.AzeriteItem->KnowledgeLevel = fields[3].GetUInt32(); - for (std::size_t i = 0; i < MAX_SPECIALIZATIONS; ++i) + for (std::size_t i = 0; i < info.AzeriteItem->SelectedAzeriteEssences.size(); ++i) { uint32 specializationId = fields[4 + i * 4].GetUInt32(); if (!sChrSpecializationStore.LookupEntry(specializationId)) @@ -1411,8 +1396,8 @@ void Item::SetGem(uint16 slot, ItemDynamicFieldGems const* gem, uint32 gemScalin gemBonus.AddBonusList(bonusListId); uint32 gemBaseItemLevel = gemTemplate->GetBaseItemLevel(); - if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(gemBonus.ScalingStatDistribution)) - if (uint32 scaledIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->PlayerLevelToItemLevelCurveID, gemScalingLevel))) + if (gemBonus.PlayerLevelToItemLevelCurveId) + if (uint32 scaledIlvl = uint32(sDB2Manager.GetCurveValueAt(gemBonus.PlayerLevelToItemLevelCurveId, gemScalingLevel))) gemBaseItemLevel = scaledIlvl; _bonusData.GemRelicType[slot] = gemBonus.RelicType; @@ -1848,7 +1833,7 @@ bool Item::HasStats() const ItemTemplate const* proto = GetTemplate(); Player const* owner = GetOwner(); for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if ((owner ? GetItemStatValue(i, owner) : proto->GetItemStatAllocation(i)) != 0) + if ((owner ? GetItemStatValue(i, owner) : proto->GetStatPercentEditor(i)) != 0) return true; return false; @@ -1857,7 +1842,7 @@ bool Item::HasStats() const bool Item::HasStats(WorldPackets::Item::ItemInstance const& /*itemInstance*/, BonusData const* bonus) { for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if (bonus->ItemStatAllocation[i] != 0) + if (bonus->StatPercentEditor[i] != 0) return true; return false; @@ -2179,19 +2164,14 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon if (AzeriteLevelInfoEntry const* azeriteLevelInfo = sAzeriteLevelInfoStore.LookupEntry(azeriteLevel)) itemLevel = azeriteLevelInfo->ItemLevel; - if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(bonusData.ScalingStatDistribution)) + if (bonusData.PlayerLevelToItemLevelCurveId) { if (fixedLevel) level = fixedLevel; - else - level = std::min(std::max(int32(level), ssd->MinLevel), ssd->MaxLevel); - - if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(bonusData.ContentTuningId)) - if ((contentTuning->Flags & 2 || contentTuning->MinLevel || contentTuning->MaxLevel) && !(contentTuning->Flags & 4)) - level = std::min(std::max(int32(level), contentTuning->MinLevel), contentTuning->MaxLevel); + else if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(bonusData.ContentTuningId, 0, true)) + level = std::min(std::max(int16(level), levels->MinLevel), levels->MaxLevel); - if (uint32 heirloomIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->PlayerLevelToItemLevelCurveID, level))) - itemLevel = heirloomIlvl; + itemLevel = uint32(sDB2Manager.GetCurveValueAt(bonusData.PlayerLevelToItemLevelCurveId, level)); } itemLevel += bonusData.ItemLevelBonus; @@ -2223,7 +2203,7 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const { case ITEM_MOD_CORRUPTION: case ITEM_MOD_CORRUPTION_RESISTANCE: - return _bonusData.ItemStatAllocation[index]; + return _bonusData.StatPercentEditor[index]; default: break; } @@ -2231,7 +2211,7 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const uint32 itemLevel = GetItemLevel(owner); if (uint32 randomPropPoints = GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate()->GetInventoryType(), GetTemplate()->GetSubClass())) { - float statValue = float(_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f; + float statValue = float(_bonusData.StatPercentEditor[index] * randomPropPoints) * 0.0001f; if (GtItemSocketCostPerLevelEntry const* gtCost = sItemSocketCostPerLevelGameTable.GetRow(itemLevel)) statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->SocketCost)); @@ -2288,11 +2268,11 @@ ItemDisenchantLootEntry const* Item::GetDisenchantLoot(ItemTemplate const* itemT uint32 Item::GetDisplayId(Player const* owner) const { - ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; - if (*m_itemData->ModifiersMask & AppearanceModifierMaskSpecSpecific) - transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + uint32 itemModifiedAppearanceId = GetModifier(AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]); + if (!itemModifiedAppearanceId) + itemModifiedAppearanceId = GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS); - if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(itemModifiedAppearanceId)) if (ItemAppearanceEntry const* itemAppearance = sItemAppearanceStore.LookupEntry(transmog->ItemAppearanceID)) return itemAppearance->ItemDisplayInfoID; @@ -2306,51 +2286,56 @@ ItemModifiedAppearanceEntry const* Item::GetItemModifiedAppearance() const uint32 Item::GetModifier(ItemModifier modifier) const { - if (!(*m_itemData->ModifiersMask & (1 << modifier))) - return 0; + int32 modifierIndex = m_itemData->Modifiers->Values.FindIndexIf([modifier](UF::ItemMod mod) + { + return mod.Type == modifier; + }); - uint32 valueIndex = 0; - uint32 mask = m_itemData->ModifiersMask; - for (uint32 i = 0; i < modifier; ++i) - if (mask & (1 << i)) - ++valueIndex; + if (modifierIndex != -1) + return m_itemData->Modifiers->Values[modifierIndex].Value; - return m_itemData->Modifiers[valueIndex]; + return 0; } void Item::SetModifier(ItemModifier modifier, uint32 value) { - uint32 valueIndex = 0; - uint32 mask = m_itemData->ModifiersMask; - for (uint32 i = 0; i < modifier; ++i) - if (mask & (1 << i)) - ++valueIndex; + int32 modifierIndex = m_itemData->Modifiers->Values.FindIndexIf([modifier](UF::ItemMod mod) + { + return mod.Type == modifier; + }); if (value) { - if (mask & (1 << modifier)) - return; + if (modifierIndex == -1) + { + UF::ItemMod& mod = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData) + .ModifyValue(&UF::ItemData::Modifiers).ModifyValue(&UF::ItemModList::Values)); - SetUpdateFieldFlagValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ModifiersMask), 1 << modifier); - InsertDynamicUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::Modifiers), valueIndex) = value; + mod.Value = value; + mod.Type = modifier; + } + else + SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData) + .ModifyValue(&UF::ItemData::Modifiers) + .ModifyValue(&UF::ItemModList::Values, modifierIndex) + .ModifyValue(&UF::ItemMod::Value), value); } else { - if (!(mask & (1 << modifier))) + if (modifierIndex == -1) return; - RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ModifiersMask), 1 << modifier); - RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::Modifiers), valueIndex); + RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::Modifiers).ModifyValue(&UF::ItemModList::Values), modifierIndex); } } uint32 Item::GetVisibleEntry(Player const* owner) const { - ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; - if (*m_itemData->ModifiersMask & AppearanceModifierMaskSpecSpecific) - transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + uint32 itemModifiedAppearanceId = GetModifier(AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]); + if (!itemModifiedAppearanceId) + itemModifiedAppearanceId = GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS); - if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(itemModifiedAppearanceId)) return transmog->ItemID; return GetEntry(); @@ -2358,11 +2343,11 @@ uint32 Item::GetVisibleEntry(Player const* owner) const uint16 Item::GetVisibleAppearanceModId(Player const* owner) const { - ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; - if (*m_itemData->ModifiersMask & AppearanceModifierMaskSpecSpecific) - transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + uint32 itemModifiedAppearanceId = GetModifier(AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]); + if (!itemModifiedAppearanceId) + itemModifiedAppearanceId = GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS); - if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(itemModifiedAppearanceId)) return transmog->ItemAppearanceModifierID; return uint16(GetAppearanceModId()); @@ -2370,14 +2355,14 @@ uint16 Item::GetVisibleAppearanceModId(Player const* owner) const uint32 Item::GetVisibleEnchantmentId(Player const* owner) const { - ItemModifier illusionModifier = ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS; - if (*m_itemData->ModifiersMask & IllusionModifierMaskSpecSpecific) - illusionModifier = IllusionModifierSlotBySpec[owner->GetActiveTalentGroup()]; + uint32 enchantmentId = GetModifier(IllusionModifierSlotBySpec[owner->GetActiveTalentGroup()]); + if (!enchantmentId) + enchantmentId = GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS); - if (uint32 enchantIllusion = GetModifier(illusionModifier)) - return enchantIllusion; + if (!enchantmentId) + enchantmentId = GetEnchantmentId(PERM_ENCHANTMENT_SLOT); - return GetEnchantmentId(PERM_ENCHANTMENT_SLOT); + return enchantmentId; } uint16 Item::GetVisibleItemVisual(Player const* owner) const @@ -2625,13 +2610,10 @@ void Item::SetFixedLevel(uint8 level) if (!_bonusData.HasFixedLevel || GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL)) return; - if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(_bonusData.ScalingStatDistribution)) + if (_bonusData.PlayerLevelToItemLevelCurveId) { - level = std::min(std::max(int32(level), ssd->MinLevel), ssd->MaxLevel); - - if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(_bonusData.ContentTuningId)) - if ((contentTuning->Flags & 2 || contentTuning->MinLevel || contentTuning->MaxLevel) && !(contentTuning->Flags & 4)) - level = std::min(std::max(int32(level), contentTuning->MinLevel), contentTuning->MaxLevel); + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(_bonusData.ContentTuningId, 0, true)) + level = std::min(std::max(int16(level), levels->MinLevel), levels->MaxLevel); SetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL, level); } @@ -2639,12 +2621,14 @@ void Item::SetFixedLevel(uint8 level) int32 Item::GetRequiredLevel() const { + int32 fixedLevel = GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL); + if (_bonusData.RequiredLevelCurve) + return sDB2Manager.GetCurveValueAt(_bonusData.RequiredLevelCurve, fixedLevel); if (_bonusData.RequiredLevelOverride) return _bonusData.RequiredLevelOverride; - else if (_bonusData.HasFixedLevel) - return GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL); - else - return _bonusData.RequiredLevel; + if (_bonusData.HasFixedLevel && _bonusData.PlayerLevelToItemLevelCurveId) + return fixedLevel; + return _bonusData.RequiredLevel; } void BonusData::Initialize(ItemTemplate const* proto) @@ -2653,13 +2637,13 @@ void BonusData::Initialize(ItemTemplate const* proto) ItemLevelBonus = 0; RequiredLevel = proto->GetBaseRequiredLevel(); for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - ItemStatType[i] = proto->GetItemStatType(i); + ItemStatType[i] = proto->GetStatModifierBonusStat(i); for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - ItemStatAllocation[i] = proto->GetItemStatAllocation(i); + StatPercentEditor[i] = proto->GetStatPercentEditor(i); for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - ItemStatSocketCostMultiplier[i] = proto->GetItemStatSocketCostMultiplier(i); + ItemStatSocketCostMultiplier[i] = proto->GetStatPercentageOfSocket(i); for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i) { @@ -2673,8 +2657,8 @@ void BonusData::Initialize(ItemTemplate const* proto) AppearanceModID = 0; RepairCostMultiplier = 1.0f; - ScalingStatDistribution = proto->GetScalingStatDistribution(); - ContentTuningId = 0; + ContentTuningId = proto->GetScalingStatContentTuning(); + PlayerLevelToItemLevelCurveId = proto->GetPlayerLevelToItemLevelCurveId(); RelicType = -1; HasFixedLevel = false; RequiredLevelOverride = 0; @@ -2683,6 +2667,7 @@ void BonusData::Initialize(ItemTemplate const* proto) AzeriteTierUnlockSetId = azeriteEmpoweredItem->AzeriteTierUnlockSetID; Suffix = 0; + RequiredLevelCurve = 0; EffectCount = 0; for (ItemEffectEntry const* itemEffect : proto->Effects) @@ -2698,6 +2683,7 @@ void BonusData::Initialize(ItemTemplate const* proto) _state.AppearanceModPriority = std::numeric_limits<int32>::max(); _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max(); _state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max(); + _state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max(); _state.HasQualityBonus = false; } @@ -2721,7 +2707,7 @@ void BonusData::AddBonusList(uint32 bonusListId) AddBonus(bonus->Type, bonus->Value); } -void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) +void BonusData::AddBonus(uint32 type, int32 const (&values)[4]) { switch (type) { @@ -2738,7 +2724,7 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) if (statIndex < MAX_ITEM_PROTO_STATS) { ItemStatType[statIndex] = values[0]; - ItemStatAllocation[statIndex] += values[1]; + StatPercentEditor[statIndex] += values[1]; } break; } @@ -2788,8 +2774,8 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) case ITEM_BONUS_SCALING_STAT_DISTRIBUTION_FIXED: if (values[1] < _state.ScalingStatDistributionPriority) { - ScalingStatDistribution = static_cast<uint32>(values[0]); ContentTuningId = static_cast<uint32>(values[2]); + PlayerLevelToItemLevelCurveId = static_cast<uint32>(values[3]); _state.ScalingStatDistributionPriority = values[1]; HasFixedLevel = type == ITEM_BONUS_SCALING_STAT_DISTRIBUTION_FIXED; } @@ -2820,5 +2806,14 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) if (ItemEffectEntry const* itemEffect = sItemEffectStore.LookupEntry(values[0])) Effects[EffectCount++] = itemEffect; break; + case ITEM_BONUS_REQUIRED_LEVEL_CURVE: + if (values[2] < _state.RequiredLevelCurvePriority) + { + RequiredLevelCurve = values[0]; + _state.RequiredLevelCurvePriority = values[2]; + if (values[1]) + ContentTuningId = static_cast<uint32>(values[1]); + } + break; } } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 53744f5b1b5..4d2e84cabda 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -71,14 +71,14 @@ struct BonusData int32 ItemLevelBonus; int32 RequiredLevel; int32 ItemStatType[MAX_ITEM_PROTO_STATS]; - int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; + int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]; float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; uint32 SocketColor[MAX_ITEM_PROTO_SOCKETS]; ItemBondingType Bonding; uint32 AppearanceModID; float RepairCostMultiplier; - uint32 ScalingStatDistribution; uint32 ContentTuningId; + uint32 PlayerLevelToItemLevelCurveId; uint32 DisenchantLootId; uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]; int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]; @@ -87,6 +87,7 @@ struct BonusData int32 RequiredLevelOverride; int32 AzeriteTierUnlockSetId; uint32 Suffix; + int32 RequiredLevelCurve; std::array<ItemEffectEntry const*, 13> Effects; std::size_t EffectCount; bool CanDisenchant; @@ -96,7 +97,7 @@ struct BonusData void Initialize(ItemTemplate const* proto); void Initialize(WorldPackets::Item::ItemInstance const& itemInstance); void AddBonusList(uint32 bonusListId); - void AddBonus(uint32 type, int32 const (&values)[3]); + void AddBonus(uint32 type, int32 const (&values)[4]); private: struct @@ -105,6 +106,7 @@ private: int32 AppearanceModPriority; int32 ScalingStatDistributionPriority; int32 AzeriteTierUnlockSetPriority; + int32 RequiredLevelCurvePriority; bool HasQualityBonus; } _state; }; @@ -137,7 +139,7 @@ struct AzeriteItemData uint32 KnowledgeLevel; std::vector<uint32> AzeriteItemMilestonePowers; std::vector<AzeriteEssencePowerEntry const*> UnlockedAzeriteEssences; - std::array<AzeriteItemSelectedEssencesData, MAX_SPECIALIZATIONS> SelectedAzeriteEssences = { }; + std::array<AzeriteItemSelectedEssencesData, 4> SelectedAzeriteEssences = { }; }; struct AzeriteEmpoweredItemData @@ -335,7 +337,7 @@ class TC_GAME_API Item : public Object uint32 GetDisplayId(Player const* owner) const; ItemModifiedAppearanceEntry const* GetItemModifiedAppearance() const; float GetRepairCostMultiplier() const { return _bonusData.RepairCostMultiplier; } - uint32 GetScalingStatDistribution() const { return _bonusData.ScalingStatDistribution; } + uint32 GetScalingContentTuningId() const { return _bonusData.ContentTuningId; } ItemDisenchantLootEntry const* GetDisenchantLoot(Player const* owner) const; static ItemDisenchantLootEntry const* GetDisenchantLoot(ItemTemplate const* itemTemplate, uint32 quality, uint32 itemLevel); void SetFixedLevel(uint8 level); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 86ddaea9e41..990ee108dc6 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -46,8 +46,8 @@ enum ItemModType ITEM_MOD_CRIT_SPELL_RATING = 21, ITEM_MOD_CORRUPTION = 22, ITEM_MOD_CORRUPTION_RESISTANCE = 23, - ITEM_MOD_HIT_TAKEN_SPELL_RATING = 24, - ITEM_MOD_CRIT_TAKEN_MELEE_RATING = 25, + ITEM_MOD_MODIFIED_CRAFTING_STAT_1 = 24, + ITEM_MOD_MODIFIED_CRAFTING_STAT_2 = 25, ITEM_MOD_CRIT_TAKEN_RANGED_RATING = 26, ITEM_MOD_CRIT_TAKEN_SPELL_RATING = 27, ITEM_MOD_HASTE_MELEE_RATING = 28, @@ -757,10 +757,11 @@ struct TC_GAME_API ItemTemplate uint32 GetRequiredReputationRank() const { return ExtendedData->MinReputation; } uint32 GetMaxCount() const { return ExtendedData->MaxCount; } uint32 GetContainerSlots() const { return ExtendedData->ContainerSlots; } - int32 GetItemStatType(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatModifierBonusStat[index]; } - int32 GetItemStatAllocation(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatPercentEditor[index]; } - float GetItemStatSocketCostMultiplier(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatPercentageOfSocket[index]; } - uint32 GetScalingStatDistribution() const { return ExtendedData->ScalingStatDistributionID; } + int32 GetStatModifierBonusStat(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatModifierBonusStat[index]; } + int32 GetStatPercentEditor(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatPercentEditor[index]; } + float GetStatPercentageOfSocket(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatPercentageOfSocket[index]; } + uint32 GetScalingStatContentTuning() const { return ExtendedData->ContentTuningID; } + uint32 GetPlayerLevelToItemLevelCurveId() const { return ExtendedData->PlayerLevelToItemLevelCurveID; } uint32 GetDamageType() const { return ExtendedData->DamageDamageType; } uint32 GetDelay() const { return ExtendedData->ItemDelay; } float GetRangedModRange() const { return ExtendedData->ItemRange; } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 98e01cbe141..4b0581b623c 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -16,7 +16,10 @@ */ #include "UpdateFields.h" +#include "AreaTrigger.h" #include "ByteBuffer.h" +#include "Corpse.h" +#include "DynamicObject.h" #include "Player.h" #include "ViewerDependentValues.h" @@ -119,6 +122,75 @@ void ItemEnchantment::ClearChangesMask() _changesMask.ResetAll(); } +void ItemMod::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const +{ + data << int32(Value); + data << uint8(Type); +} + +void ItemMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const +{ + data << int32(Value); + data << uint8(Type); +} + +bool ItemMod::operator==(ItemMod const& right) const +{ + return Value == right.Value + && Type == right.Type; +} + +void ItemModList::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const +{ + data.WriteBits(Values.size(), 6); + for (std::size_t i = 0; i < Values.size(); ++i) + { + Values[i].WriteCreate(data, owner, receiver); + } + data.FlushBits(); +} + +void ItemModList::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const +{ + UpdateMask<1> changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 1); + + if (changesMask[0]) + { + if (changesMask[0]) + { + if (!ignoreChangesMask) + Values.WriteUpdateMask(data, 6); + else + WriteCompleteDynamicFieldUpdateMask(Values.size(), data, 6); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[0]) + { + for (std::size_t i = 0; i < Values.size(); ++i) + { + if (Values.HasChanged(i) || ignoreChangesMask) + { + Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + } + } + } + data.FlushBits(); +} + +void ItemModList::ClearChangesMask() +{ + Base::ClearChangesMask(Values); + _changesMask.ResetAll(); +} + void ArtifactPower::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const { data << int16(ArtifactPowerID); @@ -133,6 +205,13 @@ void ArtifactPower::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item c data << uint8(CurrentRankWithBonus); } +bool ArtifactPower::operator==(ArtifactPower const& right) const +{ + return ArtifactPowerID == right.ArtifactPowerID + && PurchasedRank == right.PurchasedRank + && CurrentRankWithBonus == right.CurrentRankWithBonus; +} + void SocketedGem::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const { data << int32(ItemID); @@ -216,27 +295,19 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(MaxDurability); } data << uint32(CreatePlayedTime); - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - { - data << uint32(ModifiersMask); - } data << int32(Context); + data << int32(CreateTime); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { data << uint64(ArtifactXP); data << uint8(ItemAppearanceModID); } - data << uint32(Modifiers.size()); data << uint32(ArtifactPowers.size()); data << uint32(Gems.size()); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { data << uint32(DynamicFlags2); } - for (std::size_t i = 0; i < Modifiers.size(); ++i) - { - data << int32(Modifiers[i]); - } for (std::size_t i = 0; i < ArtifactPowers.size(); ++i) { ArtifactPowers[i].WriteCreate(data, owner, receiver); @@ -245,11 +316,12 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { Gems[i].WriteCreate(data, owner, receiver); } + Modifiers->WriteCreate(data, owner, receiver); } void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const { - UpdateMask<40> allowedMaskForTarget({ 0xFC0149FFu, 0x000000FFu }); + UpdateMask<40> allowedMaskForTarget({ 0xFC04E4FFu, 0x000000FFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -257,13 +329,13 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::AppendAllowedFieldsMaskForFlag(UpdateMask<40>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x03FEB600u, 0x00000000u }; + allowedMaskForTarget |= { 0x03FB1B00u, 0x00000000u }; } void ItemData::FilterDisallowedFieldsMaskForFlag(UpdateMask<40>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - changesMask &= { 0xFC0149FFu, 0xFFFFFFFFu }; + changesMask &= { 0xFC04E4FFu, 0xFFFFFFFFu }; } void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, bool ignoreNestedChangesMask, Item const* owner, Player const* receiver) const @@ -290,18 +362,11 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, if (changesMask[2]) { if (!ignoreNestedChangesMask) - Modifiers.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(Modifiers.size(), data); - } - if (changesMask[3]) - { - if (!ignoreNestedChangesMask) ArtifactPowers.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ArtifactPowers.size(), data); } - if (changesMask[4]) + if (changesMask[3]) { if (!ignoreNestedChangesMask) Gems.WriteUpdateMask(data); @@ -314,16 +379,6 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, { if (changesMask[2]) { - for (std::size_t i = 0; i < Modifiers.size(); ++i) - { - if (Modifiers.HasChanged(i) || ignoreNestedChangesMask) - { - data << int32(Modifiers[i]); - } - } - } - if (changesMask[3]) - { for (std::size_t i = 0; i < ArtifactPowers.size(); ++i) { if (ArtifactPowers.HasChanged(i) || ignoreNestedChangesMask) @@ -332,7 +387,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, } } } - if (changesMask[4]) + if (changesMask[3]) { for (std::size_t i = 0; i < Gems.size(); ++i) { @@ -342,59 +397,59 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, } } } - if (changesMask[5]) + if (changesMask[4]) { data << Owner; } - if (changesMask[6]) + if (changesMask[5]) { data << ContainedIn; } - if (changesMask[7]) + if (changesMask[6]) { data << Creator; } - if (changesMask[8]) + if (changesMask[7]) { data << GiftCreator; } - if (changesMask[9]) + if (changesMask[8]) { data << uint32(StackCount); } - if (changesMask[10]) + if (changesMask[9]) { data << uint32(Expiration); } - if (changesMask[11]) + if (changesMask[10]) { data << uint32(DynamicFlags); } - if (changesMask[12]) + if (changesMask[11]) { data << uint32(Durability); } - if (changesMask[13]) + if (changesMask[12]) { data << uint32(MaxDurability); } - if (changesMask[14]) + if (changesMask[13]) { data << uint32(CreatePlayedTime); } - if (changesMask[15]) + if (changesMask[14]) { - data << uint32(ModifiersMask); + data << int32(Context); } - if (changesMask[16]) + if (changesMask[15]) { - data << int32(Context); + data << int32(CreateTime); } - if (changesMask[17]) + if (changesMask[16]) { data << uint64(ArtifactXP); } - if (changesMask[18]) + if (changesMask[17]) { data << uint8(ItemAppearanceModID); } @@ -402,6 +457,10 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, { data << uint32(DynamicFlags2); } + if (changesMask[18]) + { + Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } } if (changesMask[20]) { @@ -428,7 +487,6 @@ void ItemData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, void ItemData::ClearChangesMask() { Base::ClearChangesMask(BonusListIDs); - Base::ClearChangesMask(Modifiers); Base::ClearChangesMask(ArtifactPowers); Base::ClearChangesMask(Gems); Base::ClearChangesMask(Owner); @@ -441,10 +499,11 @@ void ItemData::ClearChangesMask() Base::ClearChangesMask(Durability); Base::ClearChangesMask(MaxDurability); Base::ClearChangesMask(CreatePlayedTime); - Base::ClearChangesMask(ModifiersMask); Base::ClearChangesMask(Context); + Base::ClearChangesMask(CreateTime); Base::ClearChangesMask(ArtifactXP); Base::ClearChangesMask(ItemAppearanceModID); + Base::ClearChangesMask(Modifiers); Base::ClearChangesMask(DynamicFlags2); Base::ClearChangesMask(SpellCharges); Base::ClearChangesMask(Enchantment); @@ -549,6 +608,12 @@ void UnlockedAzeriteEssence::WriteUpdate(ByteBuffer& data, bool ignoreChangesMas data << uint32(Rank); } +bool UnlockedAzeriteEssence::operator==(UnlockedAzeriteEssence const& right) const +{ + return AzeriteEssenceID == right.AzeriteEssenceID + && Rank == right.Rank; +} + void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const { for (std::size_t i = 0; i < 4; ++i) @@ -624,52 +689,59 @@ void AzeriteItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi { data << uint32(UnlockedEssenceMilestones[i]); } + data.FlushBits(); + data.WriteBit(Enabled); for (std::size_t i = 0; i < SelectedEssences.size(); ++i) { SelectedEssences[i].WriteCreate(data, owner, receiver); } + data.FlushBits(); } void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const { - UpdateMask<9> allowedMaskForTarget({ 0x0000000Fu }); + UpdateMask<10> allowedMaskForTarget({ 0x0000001Fu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } -void AzeriteItemData::AppendAllowedFieldsMaskForFlag(UpdateMask<9>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void AzeriteItemData::AppendAllowedFieldsMaskForFlag(UpdateMask<10>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x000001F0u }; + allowedMaskForTarget |= { 0x000003E0u }; } -void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(UpdateMask<9>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(UpdateMask<10>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - changesMask &= { 0xFFFFFE0Fu }; + changesMask &= { 0xFFFFFC1Fu }; } -void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const +void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<10> const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 9); + data.WriteBits(changesMask.GetBlock(0), 10); if (changesMask[0]) { if (changesMask[1]) { + data.WriteBit(Enabled); + } + if (changesMask[2]) + { if (!ignoreNestedChangesMask) UnlockedEssences.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(UnlockedEssences.size(), data); } - if (changesMask[2]) + if (changesMask[3]) { if (!ignoreNestedChangesMask) SelectedEssences.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SelectedEssences.size(), data); } - if (changesMask[3]) + if (changesMask[4]) { if (!ignoreNestedChangesMask) UnlockedEssenceMilestones.WriteUpdateMask(data); @@ -680,7 +752,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes data.FlushBits(); if (changesMask[0]) { - if (changesMask[1]) + if (changesMask[2]) { for (std::size_t i = 0; i < UnlockedEssences.size(); ++i) { @@ -690,7 +762,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } } } - if (changesMask[3]) + if (changesMask[4]) { for (std::size_t i = 0; i < UnlockedEssenceMilestones.size(); ++i) { @@ -700,7 +772,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } } } - if (changesMask[2]) + if (changesMask[3]) { for (std::size_t i = 0; i < SelectedEssences.size(); ++i) { @@ -710,31 +782,33 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } } } - if (changesMask[4]) + if (changesMask[5]) { data << uint64(Xp); } - if (changesMask[5]) + if (changesMask[6]) { data << uint32(Level); } - if (changesMask[6]) + if (changesMask[7]) { data << uint32(AuraLevel); } - if (changesMask[7]) + if (changesMask[8]) { data << uint32(KnowledgeLevel); } - if (changesMask[8]) + if (changesMask[9]) { data << int32(DEBUGknowledgeWeek); } } + data.FlushBits(); } void AzeriteItemData::ClearChangesMask() { + Base::ClearChangesMask(Enabled); Base::ClearChangesMask(UnlockedEssences); Base::ClearChangesMask(UnlockedEssenceMilestones); Base::ClearChangesMask(SelectedEssences); @@ -746,32 +820,57 @@ void AzeriteItemData::ClearChangesMask() _changesMask.ResetAll(); } +void SpellCastVisual::WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const +{ + data << int32(SpellXSpellVisualID); + data << int32(ScriptVisualID); +} + +void SpellCastVisual::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const +{ + data << int32(SpellXSpellVisualID); + data << int32(ScriptVisualID); +} + +bool SpellCastVisual::operator==(SpellCastVisual const& right) const +{ + return SpellXSpellVisualID == right.SpellXSpellVisualID + && ScriptVisualID == right.ScriptVisualID; +} + void UnitChannel::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const { data << int32(SpellID); - data << int32(SpellXSpellVisualID); + SpellVisual.WriteCreate(data, owner, receiver); } void UnitChannel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const { data << int32(SpellID); - data << int32(SpellXSpellVisualID); + SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver); +} + +bool UnitChannel::operator==(UnitChannel const& right) const +{ + return SpellID == right.SpellID + && SpellVisual == right.SpellVisual; } void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const { data << int32(ItemID); + data << int32(ItemModifiedAppearanceID); data << uint16(ItemAppearanceModID); data << uint16(ItemVisual); } void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const { - UpdateMask<4> changesMask = _changesMask; + UpdateMask<5> changesMask = _changesMask; if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 4); + data.WriteBits(changesMask.GetBlock(0), 5); data.FlushBits(); if (changesMask[0]) @@ -782,10 +881,14 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con } if (changesMask[2]) { - data << uint16(ItemAppearanceModID); + data << int32(ItemModifiedAppearanceID); } if (changesMask[3]) { + data << uint16(ItemAppearanceModID); + } + if (changesMask[4]) + { data << uint16(ItemVisual); } } @@ -794,6 +897,7 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con void VisibleItem::ClearChangesMask() { Base::ClearChangesMask(ItemID); + Base::ClearChangesMask(ItemModifiedAppearanceID); Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(ItemVisual); _changesMask.ResetAll(); @@ -811,6 +915,12 @@ void PassiveSpellHistory::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, data << int32(AuraSpellID); } +bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const +{ + return SpellID == right.SpellID + && AuraSpellID == right.AuraSpellID; +} + void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(DisplayID, owner, receiver)); @@ -823,6 +933,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(StateAnimKitID); data << uint32(StateWorldEffectIDs->size()); data << uint32(StateWorldEffectsQuestObjectiveID); + data << int32(SpellOverrideNameID); for (std::size_t i = 0; i < StateWorldEffectIDs->size(); ++i) { data << uint32((*StateWorldEffectIDs)[i]); @@ -893,6 +1004,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(BoundingRadius); data << float(CombatReach); data << float(DisplayScale); + data << int32(CreatureFamily); + data << int32(CreatureType); data << int32(NativeDisplayID); data << float(NativeXDisplayScale); data << int32(MountDisplayID); @@ -913,6 +1026,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(PetExperience); data << uint32(PetNextLevelExperience); data << float(ModCastingSpeed); + data << float(ModCastingSpeedNeg); data << float(ModSpellHaste); data << float(ModHaste); data << float(ModRangedHaste); @@ -983,7 +1097,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(BattlePetCompanionNameTimestamp); data << int32(InteractSpellID); data << int32(ScaleDuration); - data << int32(SpellOverrideNameID); data << int32(LooksLikeMountID); data << int32(LooksLikeCreatureID); data << int32(LookAtControllerID); @@ -993,6 +1106,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(WorldEffects.size()); data << uint32(ChannelObjects.size()); data << SkinningOwnerGUID; + data << uint32(SilencedSchoolMask); for (std::size_t i = 0; i < PassiveSpells.size(); ++i) { PassiveSpells[i].WriteCreate(data, owner, receiver); @@ -1009,35 +1123,35 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - UpdateMask<192> allowedMaskForTarget({ 0xFFFFEFFFu, 0xFC3FBFFFu, 0x0001EFFFu, 0xFFBFFFF9u, 0x003F8007u, 0x00000000u }); + UpdateMask<196> allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0x00000000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } -void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<196>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00001000u, 0x03C04000u, 0xFFFE1000u, 0x00400006u, 0xFFC07FF8u, 0xFFFFFFFFu }; + allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0xFFFFFFFFu, 0x0000000Fu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00400000u, 0x00007FF8u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x03C00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u }; + allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u, 0x00000000u }; } -void UnitData::FilterDisallowedFieldsMaskForFlag(UpdateMask<192>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void UnitData::FilterDisallowedFieldsMaskForFlag(UpdateMask<196>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - changesMask &= { 0xFFFFEFFFu, 0xFC3FBFFFu, 0x0001EFFFu, 0xFFBFFFF9u, 0x003F8007u, 0x00000000u }; + changesMask &= { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0x00000000u, 0xFFFFFFF0u }; if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - changesMask &= { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFBFFFFFu, 0xFFFF8007u, 0xFFFFFFFFu }; + changesMask &= { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFBFFFFFFu, 0xFFF8007Fu, 0xFFFFFFFFu, 0xFFFFFFFFu }; if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - changesMask &= { 0xFFFFFFFFu, 0xFC3FFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFF807u }; + changesMask &= { 0xFFFFFFFFu, 0xE1FFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFF807Fu, 0xFFFFFFFFu }; } -void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const +void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<196> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 6); - for (std::size_t i = 0; i < 6; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 7); + for (std::size_t i = 0; i < 7; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -1132,509 +1246,525 @@ void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, } if (changesMask[10]) { - data << Charm; + data << int32(SpellOverrideNameID); } if (changesMask[11]) { - data << Summon; + data << Charm; } if (changesMask[12]) { - data << Critter; + data << Summon; } if (changesMask[13]) { - data << CharmedBy; + data << Critter; } if (changesMask[14]) { - data << SummonedBy; + data << CharmedBy; } if (changesMask[15]) { - data << CreatedBy; + data << SummonedBy; } if (changesMask[16]) { - data << DemonCreator; + data << CreatedBy; } if (changesMask[17]) { - data << LookAtControllerTarget; + data << DemonCreator; } if (changesMask[18]) { - data << Target; + data << LookAtControllerTarget; } if (changesMask[19]) { - data << BattlePetCompanionGUID; + data << Target; } if (changesMask[20]) { - data << uint64(BattlePetDBID); + data << BattlePetCompanionGUID; } if (changesMask[21]) { - ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint64(BattlePetDBID); } if (changesMask[22]) { - data << uint32(SummonedByHomeRealm); + ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[23]) { - data << uint8(Race); + data << uint32(SummonedByHomeRealm); } if (changesMask[24]) { - data << uint8(ClassId); + data << uint8(Race); } if (changesMask[25]) { - data << uint8(PlayerClassId); + data << uint8(ClassId); } if (changesMask[26]) { - data << uint8(Sex); + data << uint8(PlayerClassId); } if (changesMask[27]) { - data << uint8(DisplayPower); + data << uint8(Sex); } if (changesMask[28]) { - data << uint32(OverrideDisplayPowerID); + data << uint8(DisplayPower); } if (changesMask[29]) { - data << int64(Health); + data << uint32(OverrideDisplayPowerID); } if (changesMask[30]) { - data << int64(MaxHealth); + data << int64(Health); } if (changesMask[31]) { - data << int32(Level); + data << int64(MaxHealth); } } if (changesMask[32]) { if (changesMask[33]) { - data << int32(EffectiveLevel); + data << int32(Level); } if (changesMask[34]) { - data << int32(ContentTuningID); + data << int32(EffectiveLevel); } if (changesMask[35]) { - data << int32(ScalingLevelMin); + data << int32(ContentTuningID); } if (changesMask[36]) { - data << int32(ScalingLevelMax); + data << int32(ScalingLevelMin); } if (changesMask[37]) { - data << int32(ScalingLevelDelta); + data << int32(ScalingLevelMax); } if (changesMask[38]) { - data << int32(ScalingFactionGroup); + data << int32(ScalingLevelDelta); } if (changesMask[39]) { - data << int32(ScalingHealthItemLevelCurveID); + data << int32(ScalingFactionGroup); } if (changesMask[40]) { - data << int32(ScalingDamageItemLevelCurveID); + data << int32(ScalingHealthItemLevelCurveID); } if (changesMask[41]) { - data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(FactionTemplate, owner, receiver)); + data << int32(ScalingDamageItemLevelCurveID); } if (changesMask[42]) { - data << uint32(ViewerDependentValue<FlagsTag>::GetValue(Flags, owner, receiver)); + data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(FactionTemplate, owner, receiver)); } if (changesMask[43]) { - data << uint32(Flags2); + data << uint32(ViewerDependentValue<FlagsTag>::GetValue(Flags, owner, receiver)); } if (changesMask[44]) { - data << uint32(Flags3); + data << uint32(Flags2); } if (changesMask[45]) { - data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(AuraState, owner, receiver)); + data << uint32(Flags3); } if (changesMask[46]) { - data << uint32(RangedAttackRoundBaseTime); + data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(AuraState, owner, receiver)); } if (changesMask[47]) { - data << float(BoundingRadius); + data << uint32(RangedAttackRoundBaseTime); } if (changesMask[48]) { - data << float(CombatReach); + data << float(BoundingRadius); } if (changesMask[49]) { - data << float(DisplayScale); + data << float(CombatReach); } if (changesMask[50]) { - data << int32(NativeDisplayID); + data << float(DisplayScale); } if (changesMask[51]) { - data << float(NativeXDisplayScale); + data << int32(CreatureFamily); } if (changesMask[52]) { - data << int32(MountDisplayID); + data << int32(CreatureType); } if (changesMask[53]) { - data << int32(CosmeticMountDisplayID); + data << int32(NativeDisplayID); } if (changesMask[54]) { - data << float(MinDamage); + data << float(NativeXDisplayScale); } if (changesMask[55]) { - data << float(MaxDamage); + data << int32(MountDisplayID); } if (changesMask[56]) { - data << float(MinOffHandDamage); + data << int32(CosmeticMountDisplayID); } if (changesMask[57]) { - data << float(MaxOffHandDamage); + data << float(MinDamage); } if (changesMask[58]) { - data << uint8(StandState); + data << float(MaxDamage); } if (changesMask[59]) { - data << uint8(PetTalentPoints); + data << float(MinOffHandDamage); } if (changesMask[60]) { - data << uint8(VisFlags); + data << float(MaxOffHandDamage); } if (changesMask[61]) { - data << uint8(AnimTier); + data << uint8(StandState); } if (changesMask[62]) { - data << uint32(PetNumber); + data << uint8(PetTalentPoints); } if (changesMask[63]) { - data << uint32(PetNameTimestamp); + data << uint8(VisFlags); } } if (changesMask[64]) { if (changesMask[65]) { - data << uint32(PetExperience); + data << uint8(AnimTier); } if (changesMask[66]) { - data << uint32(PetNextLevelExperience); + data << uint32(PetNumber); } if (changesMask[67]) { - data << float(ModCastingSpeed); + data << uint32(PetNameTimestamp); } if (changesMask[68]) { - data << float(ModSpellHaste); + data << uint32(PetExperience); } if (changesMask[69]) { - data << float(ModHaste); + data << uint32(PetNextLevelExperience); } if (changesMask[70]) { - data << float(ModRangedHaste); + data << float(ModCastingSpeed); } if (changesMask[71]) { - data << float(ModHasteRegen); + data << float(ModCastingSpeedNeg); } if (changesMask[72]) { - data << float(ModTimeRate); + data << float(ModSpellHaste); } if (changesMask[73]) { - data << int32(CreatedBySpell); + data << float(ModHaste); } if (changesMask[74]) { - data << int32(EmoteState); + data << float(ModRangedHaste); } if (changesMask[75]) { - data << int32(BaseMana); + data << float(ModHasteRegen); } if (changesMask[76]) { - data << int32(BaseHealth); + data << float(ModTimeRate); } if (changesMask[77]) { - data << uint8(SheatheState); + data << int32(CreatedBySpell); } if (changesMask[78]) { - data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(PvpFlags, owner, receiver)); + data << int32(EmoteState); } if (changesMask[79]) { - data << uint8(PetFlags); + data << int32(BaseMana); } if (changesMask[80]) { - data << uint8(ShapeshiftForm); + data << int32(BaseHealth); } if (changesMask[81]) { - data << int32(AttackPower); + data << uint8(SheatheState); } if (changesMask[82]) { - data << int32(AttackPowerModPos); + data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(PvpFlags, owner, receiver)); } if (changesMask[83]) { - data << int32(AttackPowerModNeg); + data << uint8(PetFlags); } if (changesMask[84]) { - data << float(AttackPowerMultiplier); + data << uint8(ShapeshiftForm); } if (changesMask[85]) { - data << int32(RangedAttackPower); + data << int32(AttackPower); } if (changesMask[86]) { - data << int32(RangedAttackPowerModPos); + data << int32(AttackPowerModPos); } if (changesMask[87]) { - data << int32(RangedAttackPowerModNeg); + data << int32(AttackPowerModNeg); } if (changesMask[88]) { - data << float(RangedAttackPowerMultiplier); + data << float(AttackPowerMultiplier); } if (changesMask[89]) { - data << int32(MainHandWeaponAttackPower); + data << int32(RangedAttackPower); } if (changesMask[90]) { - data << int32(OffHandWeaponAttackPower); + data << int32(RangedAttackPowerModPos); } if (changesMask[91]) { - data << int32(RangedWeaponAttackPower); + data << int32(RangedAttackPowerModNeg); } if (changesMask[92]) { - data << int32(SetAttackSpeedAura); + data << float(RangedAttackPowerMultiplier); } if (changesMask[93]) { - data << float(Lifesteal); + data << int32(MainHandWeaponAttackPower); } if (changesMask[94]) { - data << float(MinRangedDamage); + data << int32(OffHandWeaponAttackPower); } if (changesMask[95]) { - data << float(MaxRangedDamage); + data << int32(RangedWeaponAttackPower); } } if (changesMask[96]) { if (changesMask[97]) { - data << float(ManaCostModifierModifier); + data << int32(SetAttackSpeedAura); } if (changesMask[98]) { - data << float(MaxHealthModifier); + data << float(Lifesteal); } if (changesMask[99]) { - data << float(HoverHeight); + data << float(MinRangedDamage); } if (changesMask[100]) { - data << int32(MinItemLevelCutoff); + data << float(MaxRangedDamage); } if (changesMask[101]) { - data << int32(MinItemLevel); + data << float(ManaCostModifierModifier); } if (changesMask[102]) { - data << int32(MaxItemLevel); + data << float(MaxHealthModifier); } if (changesMask[103]) { - data << int32(AzeriteItemLevel); + data << float(HoverHeight); } if (changesMask[104]) { - data << int32(WildBattlePetLevel); + data << int32(MinItemLevelCutoff); } if (changesMask[105]) { - data << uint32(BattlePetCompanionNameTimestamp); + data << int32(MinItemLevel); } if (changesMask[106]) { - data << int32(InteractSpellID); + data << int32(MaxItemLevel); } if (changesMask[107]) { - data << int32(ScaleDuration); + data << int32(AzeriteItemLevel); } if (changesMask[108]) { - data << int32(SpellOverrideNameID); + data << int32(WildBattlePetLevel); } if (changesMask[109]) { - data << int32(LooksLikeMountID); + data << uint32(BattlePetCompanionNameTimestamp); } if (changesMask[110]) { - data << int32(LooksLikeCreatureID); + data << int32(InteractSpellID); } if (changesMask[111]) { - data << int32(LookAtControllerID); + data << int32(ScaleDuration); } if (changesMask[112]) { - data << int32(TaxiNodesID); + data << int32(LooksLikeMountID); } if (changesMask[113]) { - data << GuildGUID; + data << int32(LooksLikeCreatureID); } if (changesMask[114]) { + data << int32(LookAtControllerID); + } + if (changesMask[115]) + { + data << int32(TaxiNodesID); + } + if (changesMask[116]) + { + data << GuildGUID; + } + if (changesMask[117]) + { data << SkinningOwnerGUID; } + if (changesMask[118]) + { + data << uint32(SilencedSchoolMask); + } } - if (changesMask[115]) + if (changesMask[119]) { for (std::size_t i = 0; i < 2; ++i) { - if (changesMask[116 + i]) + if (changesMask[120 + i]) { data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(NpcFlags[i], i, owner, receiver)); } } } - if (changesMask[118]) + if (changesMask[122]) { for (std::size_t i = 0; i < 6; ++i) { - if (changesMask[119 + i]) + if (changesMask[123 + i]) { data << int32(Power[i]); } - if (changesMask[125 + i]) + if (changesMask[129 + i]) { data << int32(MaxPower[i]); } - if (changesMask[131 + i]) + if (changesMask[135 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[137 + i]) + if (changesMask[141 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[143]) + if (changesMask[147]) { for (std::size_t i = 0; i < 3; ++i) { - if (changesMask[144 + i]) + if (changesMask[148 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[147]) + if (changesMask[151]) { for (std::size_t i = 0; i < 2; ++i) { - if (changesMask[148 + i]) + if (changesMask[152 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[150]) + if (changesMask[154]) { for (std::size_t i = 0; i < 4; ++i) { - if (changesMask[151 + i]) + if (changesMask[155 + i]) { data << int32(Stats[i]); } - if (changesMask[155 + i]) + if (changesMask[159 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[159 + i]) + if (changesMask[163 + i]) { data << int32(StatNegBuff[i]); } } } - if (changesMask[163]) + if (changesMask[167]) { for (std::size_t i = 0; i < 7; ++i) { - if (changesMask[164 + i]) + if (changesMask[168 + i]) { data << int32(Resistances[i]); } - if (changesMask[171 + i]) + if (changesMask[175 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[178 + i]) + if (changesMask[182 + i]) { data << int32(PowerCostModifier[i]); } - if (changesMask[185 + i]) + if (changesMask[189 + i]) { data << float(PowerCostMultiplier[i]); } @@ -1653,6 +1783,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(StateAnimID); Base::ClearChangesMask(StateAnimKitID); Base::ClearChangesMask(StateWorldEffectsQuestObjectiveID); + Base::ClearChangesMask(SpellOverrideNameID); Base::ClearChangesMask(Charm); Base::ClearChangesMask(Summon); Base::ClearChangesMask(Critter); @@ -1692,6 +1823,8 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(BoundingRadius); Base::ClearChangesMask(CombatReach); Base::ClearChangesMask(DisplayScale); + Base::ClearChangesMask(CreatureFamily); + Base::ClearChangesMask(CreatureType); Base::ClearChangesMask(NativeDisplayID); Base::ClearChangesMask(NativeXDisplayScale); Base::ClearChangesMask(MountDisplayID); @@ -1709,6 +1842,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(PetExperience); Base::ClearChangesMask(PetNextLevelExperience); Base::ClearChangesMask(ModCastingSpeed); + Base::ClearChangesMask(ModCastingSpeedNeg); Base::ClearChangesMask(ModSpellHaste); Base::ClearChangesMask(ModHaste); Base::ClearChangesMask(ModRangedHaste); @@ -1748,13 +1882,13 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(BattlePetCompanionNameTimestamp); Base::ClearChangesMask(InteractSpellID); Base::ClearChangesMask(ScaleDuration); - Base::ClearChangesMask(SpellOverrideNameID); Base::ClearChangesMask(LooksLikeMountID); Base::ClearChangesMask(LooksLikeCreatureID); Base::ClearChangesMask(LookAtControllerID); Base::ClearChangesMask(TaxiNodesID); Base::ClearChangesMask(GuildGUID); Base::ClearChangesMask(SkinningOwnerGUID); + Base::ClearChangesMask(SilencedSchoolMask); Base::ClearChangesMask(NpcFlags); Base::ClearChangesMask(Power); Base::ClearChangesMask(MaxPower); @@ -1772,6 +1906,24 @@ void UnitData::ClearChangesMask() _changesMask.ResetAll(); } +void ChrCustomizationChoice::WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const +{ + data << uint32(ChrCustomizationOptionID); + data << uint32(ChrCustomizationChoiceID); +} + +void ChrCustomizationChoice::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const +{ + data << uint32(ChrCustomizationOptionID); + data << uint32(ChrCustomizationChoiceID); +} + +bool ChrCustomizationChoice::operator==(ChrCustomizationChoice const& right) const +{ + return ChrCustomizationOptionID == right.ChrCustomizationOptionID + && ChrCustomizationChoiceID == right.ChrCustomizationChoiceID; +} + void QuestLog::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(QuestID); @@ -1907,6 +2059,27 @@ void ArenaCooldown::ClearChangesMask() _changesMask.ResetAll(); } +void CTROptions::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(ContentTuningConditionMask); + data << uint32(Field_4); + data << uint32(ExpansionLevelMask); +} + +void CTROptions::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(ContentTuningConditionMask); + data << uint32(Field_4); + data << uint32(ExpansionLevelMask); +} + +bool CTROptions::operator==(CTROptions const& right) const +{ + return ContentTuningConditionMask == right.ContentTuningConditionMask + && Field_4 == right.Field_4 + && ExpansionLevelMask == right.ExpansionLevelMask; +} + void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { data << DuelArbiter; @@ -1917,15 +2090,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(GuildRankID); data << uint32(GuildDeleteDate); data << int32(GuildLevel); - data << uint8(SkinID); - data << uint8(FaceID); - data << uint8(HairStyleID); - data << uint8(HairColorID); - for (std::size_t i = 0; i < 3; ++i) - { - data << uint8(CustomDisplayOption[i]); - } - data << uint8(FacialHairStyleID); + data << uint32(Customizations.size()); data << uint8(PartyType); data << uint8(NativeSex); data << uint8(Inebriation); @@ -1959,8 +2124,13 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(ArenaCooldowns.size()); data << int32(Field_B0); data << int32(Field_B4); - data << Field_F8; - data << int32(Field_108); + CtrOptions->WriteCreate(data, owner, receiver); + data << int32(CovenantID); + data << int32(SoulbindID); + for (std::size_t i = 0; i < Customizations.size(); ++i) + { + Customizations[i].WriteCreate(data, owner, receiver); + } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { for (std::size_t i = 0; i < QuestSessionQuestLog.size(); ++i) @@ -1972,6 +2142,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { ArenaCooldowns[i].WriteCreate(data, owner, receiver); } + data.FlushBits(); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { data.WriteBit(HasQuestSession); @@ -1982,24 +2153,24 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - UpdateMask<192> allowedMaskForTarget({ 0xFFFFFFF5u, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFF80u }); + UpdateMask<185> allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } -void PlayerData::AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void PlayerData::AppendAllowedFieldsMaskForFlag(UpdateMask<185>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x0000000Au, 0xFFFFFE00u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000007Fu }; + allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u }; } -void PlayerData::FilterDisallowedFieldsMaskForFlag(UpdateMask<192>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const +void PlayerData::FilterDisallowedFieldsMaskForFlag(UpdateMask<185>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - changesMask &= { 0xFFFFFFF5u, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFF80u }; + changesMask &= { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFFu }; } -void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const +void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<185> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { data.WriteBits(changesMask.GetBlocksMask(0), 6); for (std::size_t i = 0; i < 6; ++i) @@ -2020,11 +2191,18 @@ void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMas if (changesMask[3]) { if (!ignoreNestedChangesMask) + Customizations.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Customizations.size(), data); + } + if (changesMask[4]) + { + if (!ignoreNestedChangesMask) QuestSessionQuestLog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(QuestSessionQuestLog.size(), data); } - if (changesMask[4]) + if (changesMask[5]) { if (!ignoreNestedChangesMask) ArenaCooldowns.WriteUpdateMask(data); @@ -2037,6 +2215,16 @@ void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMas { if (changesMask[3]) { + for (std::size_t i = 0; i < Customizations.size(); ++i) + { + if (Customizations.HasChanged(i) || ignoreNestedChangesMask) + { + Customizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[4]) + { for (std::size_t i = 0; i < QuestSessionQuestLog.size(); ++i) { if (QuestSessionQuestLog.HasChanged(i) || ignoreNestedChangesMask) @@ -2048,7 +2236,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMas } } } - if (changesMask[4]) + if (changesMask[5]) { for (std::size_t i = 0; i < ArenaCooldowns.size(); ++i) { @@ -2058,149 +2246,123 @@ void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMas } } } - if (changesMask[5]) - { - data << DuelArbiter; - } if (changesMask[6]) { - data << WowAccount; + data << DuelArbiter; } if (changesMask[7]) { - data << LootTargetGUID; + data << WowAccount; } if (changesMask[8]) { - data << uint32(PlayerFlags); + data << LootTargetGUID; } if (changesMask[9]) { - data << uint32(PlayerFlagsEx); + data << uint32(PlayerFlags); } if (changesMask[10]) { - data << uint32(GuildRankID); + data << uint32(PlayerFlagsEx); } if (changesMask[11]) { - data << uint32(GuildDeleteDate); + data << uint32(GuildRankID); } if (changesMask[12]) { - data << int32(GuildLevel); + data << uint32(GuildDeleteDate); } if (changesMask[13]) { - data << uint8(SkinID); + data << int32(GuildLevel); } if (changesMask[14]) { - data << uint8(FaceID); + data << uint8(PartyType); } if (changesMask[15]) { - data << uint8(HairStyleID); + data << uint8(NativeSex); } if (changesMask[16]) { - data << uint8(HairColorID); + data << uint8(Inebriation); } if (changesMask[17]) { - data << uint8(FacialHairStyleID); + data << uint8(PvpTitle); } if (changesMask[18]) { - data << uint8(PartyType); + data << uint8(ArenaFaction); } if (changesMask[19]) { - data << uint8(NativeSex); + data << uint32(DuelTeam); } if (changesMask[20]) { - data << uint8(Inebriation); + data << int32(GuildTimeStamp); } if (changesMask[21]) { - data << uint8(PvpTitle); + data << int32(PlayerTitle); } if (changesMask[22]) { - data << uint8(ArenaFaction); + data << int32(FakeInebriation); } if (changesMask[23]) { - data << uint32(DuelTeam); + data << uint32(VirtualPlayerRealm); } if (changesMask[24]) { - data << int32(GuildTimeStamp); + data << uint32(CurrentSpecID); } if (changesMask[25]) { - data << int32(PlayerTitle); + data << int32(TaxiMountAnimKitID); } if (changesMask[26]) { - data << int32(FakeInebriation); + data << uint8(CurrentBattlePetBreedQuality); } if (changesMask[27]) { - data << uint32(VirtualPlayerRealm); + data << int32(HonorLevel); } if (changesMask[28]) { - data << uint32(CurrentSpecID); + data << int32(Field_B0); } if (changesMask[29]) { - data << int32(TaxiMountAnimKitID); + data << int32(Field_B4); } if (changesMask[30]) { - data << uint8(CurrentBattlePetBreedQuality); + CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[31]) { - data << int32(HonorLevel); + data << int32(CovenantID); } } if (changesMask[32]) { if (changesMask[33]) { - data << int32(Field_B0); - } - if (changesMask[34]) - { - data << int32(Field_B4); - } - if (changesMask[35]) - { - data << Field_F8; - } - if (changesMask[36]) - { - data << int32(Field_108); - } - } - if (changesMask[37]) - { - for (std::size_t i = 0; i < 3; ++i) - { - if (changesMask[38 + i]) - { - data << uint8(CustomDisplayOption[i]); - } + data << int32(SoulbindID); } } - if (changesMask[41]) + if (changesMask[34]) { for (std::size_t i = 0; i < 125; ++i) { - if (changesMask[42 + i]) + if (changesMask[35 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2209,21 +2371,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMas } } } - if (changesMask[167]) + if (changesMask[160]) { for (std::size_t i = 0; i < 19; ++i) { - if (changesMask[168 + i]) + if (changesMask[161 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[187]) + if (changesMask[180]) { for (std::size_t i = 0; i < 4; ++i) { - if (changesMask[188 + i]) + if (changesMask[181 + i]) { data << float(AvgItemLevel[i]); } @@ -2236,6 +2398,7 @@ void PlayerData::ClearChangesMask() { Base::ClearChangesMask(HasQuestSession); Base::ClearChangesMask(HasLevelLink); + Base::ClearChangesMask(Customizations); Base::ClearChangesMask(QuestSessionQuestLog); Base::ClearChangesMask(ArenaCooldowns); Base::ClearChangesMask(DuelArbiter); @@ -2246,11 +2409,6 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(GuildRankID); Base::ClearChangesMask(GuildDeleteDate); Base::ClearChangesMask(GuildLevel); - Base::ClearChangesMask(SkinID); - Base::ClearChangesMask(FaceID); - Base::ClearChangesMask(HairStyleID); - Base::ClearChangesMask(HairColorID); - Base::ClearChangesMask(FacialHairStyleID); Base::ClearChangesMask(PartyType); Base::ClearChangesMask(NativeSex); Base::ClearChangesMask(Inebriation); @@ -2267,9 +2425,9 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(HonorLevel); Base::ClearChangesMask(Field_B0); Base::ClearChangesMask(Field_B4); - Base::ClearChangesMask(Field_F8); - Base::ClearChangesMask(Field_108); - Base::ClearChangesMask(CustomDisplayOption); + Base::ClearChangesMask(CtrOptions); + Base::ClearChangesMask(CovenantID); + Base::ClearChangesMask(SoulbindID); Base::ClearChangesMask(QuestLog); Base::ClearChangesMask(VisibleItems); Base::ClearChangesMask(AvgItemLevel); @@ -2484,6 +2642,14 @@ void CharacterRestriction::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, data.FlushBits(); } +bool CharacterRestriction::operator==(CharacterRestriction const& right) const +{ + return Field_0 == right.Field_0 + && Field_4 == right.Field_4 + && Field_8 == right.Field_8 + && Type == right.Type; +} + void SpellPctModByLabel::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(ModIndex); @@ -2498,6 +2664,13 @@ void SpellPctModByLabel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, P data << int32(LabelID); } +bool SpellPctModByLabel::operator==(SpellPctModByLabel const& right) const +{ + return ModIndex == right.ModIndex + && ModifierValue == right.ModifierValue + && LabelID == right.LabelID; +} + void SpellFlatModByLabel::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(ModIndex); @@ -2512,6 +2685,13 @@ void SpellFlatModByLabel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, data << int32(LabelID); } +bool SpellFlatModByLabel::operator==(SpellFlatModByLabel const& right) const +{ + return ModIndex == right.ModIndex + && ModifierValue == right.ModifierValue + && LabelID == right.LabelID; +} + void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int16(ResearchProjectID); @@ -2522,13 +2702,81 @@ void Research::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons data << int16(ResearchProjectID); } -void ReplayedQuest::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +bool Research::operator==(Research const& right) const { - data << int32(QuestID); - data << uint32(ReplayTime); + return ResearchProjectID == right.ResearchProjectID; } -void ReplayedQuest::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +void MawPower::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(Field_0); + data << int32(Field_4); + data << int32(Field_8); +} + +void MawPower::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(Field_0); + data << int32(Field_4); + data << int32(Field_8); +} + +bool MawPower::operator==(MawPower const& right) const +{ + return Field_0 == right.Field_0 + && Field_4 == right.Field_4 + && Field_8 == right.Field_8; +} + +void MultiFloorExplore::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << uint32(WorldMapOverlayIDs.size()); + for (std::size_t i = 0; i < WorldMapOverlayIDs.size(); ++i) + { + data << int32(WorldMapOverlayIDs[i]); + } +} + +void MultiFloorExplore::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << uint32(WorldMapOverlayIDs.size()); + for (std::size_t i = 0; i < WorldMapOverlayIDs.size(); ++i) + { + data << int32(WorldMapOverlayIDs[i]); + } + data.FlushBits(); +} + +bool MultiFloorExplore::operator==(MultiFloorExplore const& right) const +{ + return WorldMapOverlayIDs == right.WorldMapOverlayIDs; +} + +void RecipeProgressionInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << uint16(RecipeProgressionGroupID); + data << uint16(Experience); +} + +void RecipeProgressionInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << uint16(RecipeProgressionGroupID); + data << uint16(Experience); +} + +bool RecipeProgressionInfo::operator==(RecipeProgressionInfo const& right) const +{ + return RecipeProgressionGroupID == right.RecipeProgressionGroupID + && Experience == right.Experience; +} + +void ActivePlayerUnk901::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << Field_0; + data << int32(Field_10); +} + +void ActivePlayerUnk901::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const { UpdateMask<3> changesMask = _changesMask; if (ignoreChangesMask) @@ -2541,19 +2789,19 @@ void ReplayedQuest::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player { if (changesMask[1]) { - data << int32(QuestID); + data << Field_0; } if (changesMask[2]) { - data << uint32(ReplayTime); + data << int32(Field_10); } } } -void ReplayedQuest::ClearChangesMask() +void ActivePlayerUnk901::ClearChangesMask() { - Base::ClearChangesMask(QuestID); - Base::ClearChangesMask(ReplayTime); + Base::ClearChangesMask(Field_0); + Base::ClearChangesMask(Field_10); _changesMask.ResetAll(); } @@ -2604,6 +2852,41 @@ void QuestSession::ClearChangesMask() _changesMask.ResetAll(); } +void ReplayedQuest::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(QuestID); + data << uint32(ReplayTime); +} + +void ReplayedQuest::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + UpdateMask<3> changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << int32(QuestID); + } + if (changesMask[2]) + { + data << uint32(ReplayTime); + } + } +} + +void ReplayedQuest::ClearChangesMask() +{ + Base::ClearChangesMask(QuestID); + Base::ClearChangesMask(ReplayTime); + _changesMask.ResetAll(); +} + void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { for (std::size_t i = 0; i < 199; ++i) @@ -2661,10 +2944,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << int32(ModDamageDonePos[i]); data << int32(ModDamageDoneNeg[i]); data << float(ModDamageDonePercent[i]); + data << float(ModHealingDonePercent[i]); } data << int32(ModHealingDonePos); data << float(ModHealingPercent); - data << float(ModHealingDonePercent); data << float(ModPeriodicHealingDonePercent); for (std::size_t i = 0; i < 3; ++i) { @@ -2677,7 +2960,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << float(OverrideAPBySpellPowerPercent); data << int32(ModTargetResistance); data << int32(ModTargetPhysicalResistance); - data << int32(LocalFlags); + data << uint32(LocalFlags); data << uint8(GrantableLevels); data << uint8(MultiActionBars); data << uint8(LifetimeMaxRank); @@ -2712,13 +2995,16 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << float(UiSpellHitModifier); data << int32(HomeRealmTimeOffset); data << float(ModPetHaste); + data << int8(JailersTowerLevelMax); + data << int8(JailersTowerLevel); data << uint8(LocalRegenFlags); data << uint8(AuraVision); data << uint8(NumBackpackSlots); data << int32(OverrideSpellsID); - data << int32(LfgBonusFactionID); data << uint16(LootSpecID); data << uint32(OverrideZonePVPType); + data << BnetAccount; + data << uint64(GuildClubMemberID); for (std::size_t i = 0; i < 4; ++i) { data << uint32(BagSlotFlags[i]); @@ -2750,6 +3036,8 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(Transmog.size()); data << uint32(ConditionalTransmog.size()); data << uint32(SelfResSpells.size()); + data << uint32(RuneforgePowers.size()); + data << uint32(TransmogIllusions.size()); data << uint32(CharacterRestrictions.size()); data << uint32(SpellPctModByLabel.size()); data << uint32(SpellFlatModByLabel.size()); @@ -2761,8 +3049,13 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f Research[i][j].WriteCreate(data, owner, receiver); } } + data << uint32(MawPowers.size()); + data << uint32(MultiFloorExploration.size()); + data << uint32(RecipeProgression.size()); data << uint32(ReplayedQuests.size()); data << uint32(DisabledSpells.size()); + data << int32(UiChromieTimeExpansionID); + data << int32(TransportServerTime); for (std::size_t i = 0; i < KnownTitles.size(); ++i) { data << uint64(KnownTitles[i]); @@ -2811,6 +3104,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(SelfResSpells[i]); } + for (std::size_t i = 0; i < RuneforgePowers.size(); ++i) + { + data << uint32(RuneforgePowers[i]); + } + for (std::size_t i = 0; i < TransmogIllusions.size(); ++i) + { + data << uint32(TransmogIllusions[i]); + } for (std::size_t i = 0; i < SpellPctModByLabel.size(); ++i) { SpellPctModByLabel[i].WriteCreate(data, owner, receiver); @@ -2819,6 +3120,18 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { SpellFlatModByLabel[i].WriteCreate(data, owner, receiver); } + for (std::size_t i = 0; i < MawPowers.size(); ++i) + { + MawPowers[i].WriteCreate(data, owner, receiver); + } + for (std::size_t i = 0; i < MultiFloorExploration.size(); ++i) + { + MultiFloorExploration[i].WriteCreate(data, owner, receiver); + } + for (std::size_t i = 0; i < RecipeProgression.size(); ++i) + { + RecipeProgression[i].WriteCreate(data, owner, receiver); + } for (std::size_t i = 0; i < ReplayedQuests.size(); ++i) { ReplayedQuests[i].WriteCreate(data, owner, receiver); @@ -2831,19 +3144,21 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { PvpInfo[i].WriteCreate(data, owner, receiver); } + data.FlushBits(); data.WriteBit(BackpackAutoSortDisabled); data.WriteBit(BankAutoSortDisabled); data.WriteBit(SortBagsRightToLeft); data.WriteBit(InsertItemsLeftToRight); - data.WriteBit(QuestSession.is_initialized()); - for (std::size_t i = 0; i < CharacterRestrictions.size(); ++i) - { - CharacterRestrictions[i].WriteCreate(data, owner, receiver); - } + data.WriteBits(QuestSession.is_initialized(), 1); + Field_1410->WriteCreate(data, owner, receiver); if (QuestSession.is_initialized()) { QuestSession->WriteCreate(data, owner, receiver); } + for (std::size_t i = 0; i < CharacterRestrictions.size(); ++i) + { + CharacterRestrictions[i].WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -2852,12 +3167,12 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f WriteUpdate(data, _changesMask, false, owner, receiver); } -void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const +void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1511> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { for (std::size_t i = 0; i < 1; ++i) data << uint32(changesMask.GetBlocksMask(i)); - data.WriteBits(changesMask.GetBlocksMask(1), 15); - for (std::size_t i = 0; i < 47; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 16); + for (std::size_t i = 0; i < 48; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -2966,18 +3281,32 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha if (changesMask[17]) { if (!ignoreNestedChangesMask) + RuneforgePowers.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data); + } + if (changesMask[18]) + { + if (!ignoreNestedChangesMask) + TransmogIllusions.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data); + } + if (changesMask[19]) + { + if (!ignoreNestedChangesMask) CharacterRestrictions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data); } - if (changesMask[18]) + if (changesMask[20]) { if (!ignoreNestedChangesMask) SpellPctModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data); } - if (changesMask[19]) + if (changesMask[21]) { if (!ignoreNestedChangesMask) SpellFlatModByLabel.WriteUpdateMask(data); @@ -2985,25 +3314,16 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } } - if (changesMask[22]) + if (changesMask[27]) { for (std::size_t i = 0; i < 1; ++i) { - if (changesMask[23 + i]) + if (changesMask[28 + i]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Research[i].size(), data); - } - } - } - if (changesMask[22]) - { - for (std::size_t i = 0; i < 1; ++i) - { - if (changesMask[23 + i]) - { for (std::size_t j = 0; j < Research[i].size(); ++j) { if (Research[i].HasChanged(j) || ignoreNestedChangesMask) @@ -3014,17 +3334,37 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - data.FlushBits(); if (changesMask[0]) { - if (changesMask[20]) + if (changesMask[22]) + { + if (!ignoreNestedChangesMask) + MawPowers.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data); + } + if (changesMask[23]) + { + if (!ignoreNestedChangesMask) + MultiFloorExploration.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data); + } + if (changesMask[24]) + { + if (!ignoreNestedChangesMask) + RecipeProgression.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data); + } + if (changesMask[25]) { if (!ignoreNestedChangesMask) ReplayedQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data); } - if (changesMask[21]) + if (changesMask[26]) { if (!ignoreNestedChangesMask) DisabledSpells.WriteUpdateMask(data); @@ -3155,8 +3495,28 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } + if (changesMask[17]) + { + for (std::size_t i = 0; i < RuneforgePowers.size(); ++i) + { + if (RuneforgePowers.HasChanged(i) || ignoreNestedChangesMask) + { + data << uint32(RuneforgePowers[i]); + } + } + } if (changesMask[18]) { + for (std::size_t i = 0; i < TransmogIllusions.size(); ++i) + { + if (TransmogIllusions.HasChanged(i) || ignoreNestedChangesMask) + { + data << uint32(TransmogIllusions[i]); + } + } + } + if (changesMask[20]) + { for (std::size_t i = 0; i < SpellPctModByLabel.size(); ++i) { if (SpellPctModByLabel.HasChanged(i) || ignoreNestedChangesMask) @@ -3165,7 +3525,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[19]) + if (changesMask[21]) { for (std::size_t i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -3175,7 +3535,37 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[20]) + if (changesMask[22]) + { + for (std::size_t i = 0; i < MawPowers.size(); ++i) + { + if (MawPowers.HasChanged(i) || ignoreNestedChangesMask) + { + MawPowers[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[23]) + { + for (std::size_t i = 0; i < MultiFloorExploration.size(); ++i) + { + if (MultiFloorExploration.HasChanged(i) || ignoreNestedChangesMask) + { + MultiFloorExploration[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[24]) + { + for (std::size_t i = 0; i < RecipeProgression.size(); ++i) + { + if (RecipeProgression.HasChanged(i) || ignoreNestedChangesMask) + { + RecipeProgression[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[25]) { for (std::size_t i = 0; i < ReplayedQuests.size(); ++i) { @@ -3185,7 +3575,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[21]) + if (changesMask[26]) { for (std::size_t i = 0; i < DisabledSpells.size(); ++i) { @@ -3195,7 +3585,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[17]) + if (changesMask[19]) { for (std::size_t i = 0; i < CharacterRestrictions.size(); ++i) { @@ -3205,325 +3595,344 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[24]) - { - data << FarsightObject; - } - if (changesMask[25]) - { - data << SummonedBattlePetGUID; - } - if (changesMask[26]) - { - data << uint64(Coinage); - } - if (changesMask[27]) - { - data << int32(XP); - } - if (changesMask[28]) - { - data << int32(NextLevelXP); - } if (changesMask[29]) { - data << int32(TrialXP); + data << FarsightObject; } if (changesMask[30]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << SummonedBattlePetGUID; } if (changesMask[31]) { - data << int32(CharacterPoints); + data << uint64(Coinage); } if (changesMask[32]) { - data << int32(MaxTalentTiers); + data << int32(XP); } if (changesMask[33]) { - data << int32(TrackCreatureMask); + data << int32(NextLevelXP); } } if (changesMask[34]) { if (changesMask[35]) { - data << float(MainhandExpertise); + data << int32(TrialXP); } if (changesMask[36]) { - data << float(OffhandExpertise); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[37]) { - data << float(RangedExpertise); + data << int32(CharacterPoints); } if (changesMask[38]) { - data << float(CombatRatingExpertise); + data << int32(MaxTalentTiers); } if (changesMask[39]) { - data << float(BlockPercentage); + data << int32(TrackCreatureMask); } if (changesMask[40]) { - data << float(DodgePercentage); + data << float(MainhandExpertise); } if (changesMask[41]) { - data << float(DodgePercentageFromAttribute); + data << float(OffhandExpertise); } if (changesMask[42]) { - data << float(ParryPercentage); + data << float(RangedExpertise); } if (changesMask[43]) { - data << float(ParryPercentageFromAttribute); + data << float(CombatRatingExpertise); } if (changesMask[44]) { - data << float(CritPercentage); + data << float(BlockPercentage); } if (changesMask[45]) { - data << float(RangedCritPercentage); + data << float(DodgePercentage); } if (changesMask[46]) { - data << float(OffhandCritPercentage); + data << float(DodgePercentageFromAttribute); } if (changesMask[47]) { - data << float(SpellCritPercentage); + data << float(ParryPercentage); } if (changesMask[48]) { - data << int32(ShieldBlock); + data << float(ParryPercentageFromAttribute); } if (changesMask[49]) { - data << float(ShieldBlockCritPercentage); + data << float(CritPercentage); } if (changesMask[50]) { - data << float(Mastery); + data << float(RangedCritPercentage); } if (changesMask[51]) { - data << float(Speed); + data << float(OffhandCritPercentage); } if (changesMask[52]) { - data << float(Avoidance); + data << float(SpellCritPercentage); } if (changesMask[53]) { - data << float(Sturdiness); + data << int32(ShieldBlock); } if (changesMask[54]) { - data << int32(Versatility); + data << float(ShieldBlockCritPercentage); } if (changesMask[55]) { - data << float(VersatilityBonus); + data << float(Mastery); } if (changesMask[56]) { - data << float(PvpPowerDamage); + data << float(Speed); } if (changesMask[57]) { - data << float(PvpPowerHealing); + data << float(Avoidance); } if (changesMask[58]) { - data << int32(ModHealingDonePos); + data << float(Sturdiness); } if (changesMask[59]) { - data << float(ModHealingPercent); + data << int32(Versatility); } if (changesMask[60]) { - data << float(ModHealingDonePercent); + data << float(VersatilityBonus); } if (changesMask[61]) { - data << float(ModPeriodicHealingDonePercent); + data << float(PvpPowerDamage); } if (changesMask[62]) { - data << float(ModSpellPowerPercent); + data << float(PvpPowerHealing); } if (changesMask[63]) { - data << float(ModResiliencePercent); + data << int32(ModHealingDonePos); } if (changesMask[64]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModHealingPercent); } if (changesMask[65]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(ModPeriodicHealingDonePercent); } } if (changesMask[66]) { if (changesMask[67]) { - data << int32(ModTargetResistance); + data << float(ModSpellPowerPercent); } if (changesMask[68]) { - data << int32(ModTargetPhysicalResistance); + data << float(ModResiliencePercent); } if (changesMask[69]) { - data << int32(LocalFlags); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[70]) { - data << uint8(GrantableLevels); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[71]) { - data << uint8(MultiActionBars); + data << int32(ModTargetResistance); } if (changesMask[72]) { - data << uint8(LifetimeMaxRank); + data << int32(ModTargetPhysicalResistance); } if (changesMask[73]) { - data << uint8(NumRespecs); + data << uint32(LocalFlags); } if (changesMask[74]) { - data << uint32(PvpMedals); + data << uint8(GrantableLevels); } if (changesMask[75]) { - data << uint16(TodayHonorableKills); + data << uint8(MultiActionBars); } if (changesMask[76]) { - data << uint16(YesterdayHonorableKills); + data << uint8(LifetimeMaxRank); } if (changesMask[77]) { - data << uint32(LifetimeHonorableKills); + data << uint8(NumRespecs); } if (changesMask[78]) { - data << int32(WatchedFactionIndex); + data << uint32(PvpMedals); } if (changesMask[79]) { - data << int32(MaxLevel); + data << uint16(TodayHonorableKills); } if (changesMask[80]) { - data << int32(ScalingPlayerLevelDelta); + data << uint16(YesterdayHonorableKills); } if (changesMask[81]) { - data << int32(MaxCreatureScalingLevel); + data << uint32(LifetimeHonorableKills); } if (changesMask[82]) { - data << int32(PetSpellPower); + data << int32(WatchedFactionIndex); } if (changesMask[83]) { - data << float(UiHitModifier); + data << int32(MaxLevel); } if (changesMask[84]) { - data << float(UiSpellHitModifier); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[85]) { - data << int32(HomeRealmTimeOffset); + data << int32(MaxCreatureScalingLevel); } if (changesMask[86]) { - data << float(ModPetHaste); + data << int32(PetSpellPower); } if (changesMask[87]) { - data << uint8(LocalRegenFlags); + data << float(UiHitModifier); } if (changesMask[88]) { - data << uint8(AuraVision); + data << float(UiSpellHitModifier); } if (changesMask[89]) { - data << uint8(NumBackpackSlots); + data << int32(HomeRealmTimeOffset); } if (changesMask[90]) { - data << int32(OverrideSpellsID); + data << float(ModPetHaste); } if (changesMask[91]) { - data << int32(LfgBonusFactionID); + data << int8(JailersTowerLevelMax); } if (changesMask[92]) { - data << uint16(LootSpecID); + data << int8(JailersTowerLevel); } if (changesMask[93]) { - data << uint32(OverrideZonePVPType); + data << uint8(LocalRegenFlags); } if (changesMask[94]) { - data << int32(Honor); + data << uint8(AuraVision); } if (changesMask[95]) { - data << int32(HonorNextLevel); + data << uint8(NumBackpackSlots); } if (changesMask[96]) { - data << int32(PvpRewardAchieved); + data << int32(OverrideSpellsID); } if (changesMask[97]) { - data << int32(PvpTierMaxFromWins); + data << uint16(LootSpecID); } } if (changesMask[98]) { if (changesMask[99]) { - data << int32(PvpLastWeeksRewardAchieved); + data << uint32(OverrideZonePVPType); } if (changesMask[100]) { - data << int32(PvpLastWeeksTierMaxFromWins); + data << BnetAccount; } if (changesMask[101]) { - data << int32(PvpLastWeeksRewardClaimed); + data << uint64(GuildClubMemberID); } if (changesMask[102]) { + data << int32(Honor); + } + if (changesMask[103]) + { + data << int32(HonorNextLevel); + } + if (changesMask[104]) + { + data << int32(PvpRewardAchieved); + } + if (changesMask[105]) + { + data << int32(PvpTierMaxFromWins); + } + if (changesMask[106]) + { + data << int32(PvpLastWeeksRewardAchieved); + } + if (changesMask[107]) + { + data << int32(PvpLastWeeksTierMaxFromWins); + } + if (changesMask[108]) + { + data << int32(PvpLastWeeksRewardClaimed); + } + if (changesMask[109]) + { data << uint8(NumBankSlots); } + if (changesMask[112]) + { + data << int32(UiChromieTimeExpansionID); + } + if (changesMask[113]) + { + data << int32(TransportServerTime); + } } - data.FlushBits(); if (changesMask[98]) { - data.WriteBit(QuestSession.is_initialized()); - if (changesMask[103]) + data.WriteBits(QuestSession.is_initialized(), 1); + if (changesMask[111]) + { + Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[110]) { if (QuestSession.is_initialized()) { @@ -3531,157 +3940,161 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& cha } } } - if (changesMask[104]) + if (changesMask[114]) { for (std::size_t i = 0; i < 199; ++i) { - if (changesMask[105 + i]) + if (changesMask[115 + i]) { data << InvSlots[i]; } } } - if (changesMask[304]) + if (changesMask[314]) { for (std::size_t i = 0; i < 2; ++i) { - if (changesMask[305 + i]) + if (changesMask[315 + i]) { data << uint32(TrackResourceMask[i]); } } } - if (changesMask[307]) + if (changesMask[317]) { for (std::size_t i = 0; i < 192; ++i) { - if (changesMask[308 + i]) + if (changesMask[318 + i]) { data << uint64(ExploredZones[i]); } } } - if (changesMask[500]) + if (changesMask[510]) { for (std::size_t i = 0; i < 2; ++i) { - if (changesMask[501 + i]) + if (changesMask[511 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[503]) + if (changesMask[513]) { for (std::size_t i = 0; i < 7; ++i) { - if (changesMask[504 + i]) + if (changesMask[514 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[511 + i]) + if (changesMask[521 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[518 + i]) + if (changesMask[528 + i]) { data << float(ModDamageDonePercent[i]); } + if (changesMask[535 + i]) + { + data << float(ModHealingDonePercent[i]); + } } } - if (changesMask[525]) + if (changesMask[542]) { for (std::size_t i = 0; i < 3; ++i) { - if (changesMask[526 + i]) + if (changesMask[543 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[529 + i]) + if (changesMask[546 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[532]) + if (changesMask[549]) { for (std::size_t i = 0; i < 12; ++i) { - if (changesMask[533 + i]) + if (changesMask[550 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[545 + i]) + if (changesMask[562 + i]) { data << uint32(BuybackTimestamp[i]); } } } - if (changesMask[557]) + if (changesMask[574]) { for (std::size_t i = 0; i < 32; ++i) { - if (changesMask[558 + i]) + if (changesMask[575 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[597]) + if (changesMask[614]) { for (std::size_t i = 0; i < 4; ++i) { - if (changesMask[598 + i]) + if (changesMask[615 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[602]) + if (changesMask[619]) { for (std::size_t i = 0; i < 2; ++i) { - if (changesMask[603 + i]) + if (changesMask[620 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[605]) + if (changesMask[622]) { for (std::size_t i = 0; i < 4; ++i) { - if (changesMask[606 + i]) + if (changesMask[623 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[610]) + if (changesMask[627]) { for (std::size_t i = 0; i < 7; ++i) { - if (changesMask[611 + i]) + if (changesMask[628 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[618]) + if (changesMask[635]) { for (std::size_t i = 0; i < 875; ++i) { - if (changesMask[619 + i]) + if (changesMask[636 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[590]) + if (changesMask[607]) { for (std::size_t i = 0; i < 6; ++i) { - if (changesMask[591 + i]) + if (changesMask[608 + i]) { PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -3709,8 +4122,13 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(Transmog); Base::ClearChangesMask(ConditionalTransmog); Base::ClearChangesMask(SelfResSpells); + Base::ClearChangesMask(RuneforgePowers); + Base::ClearChangesMask(TransmogIllusions); Base::ClearChangesMask(SpellPctModByLabel); Base::ClearChangesMask(SpellFlatModByLabel); + Base::ClearChangesMask(MawPowers); + Base::ClearChangesMask(MultiFloorExploration); + Base::ClearChangesMask(RecipeProgression); Base::ClearChangesMask(ReplayedQuests); Base::ClearChangesMask(DisabledSpells); Base::ClearChangesMask(CharacterRestrictions); @@ -3749,7 +4167,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(PvpPowerHealing); Base::ClearChangesMask(ModHealingDonePos); Base::ClearChangesMask(ModHealingPercent); - Base::ClearChangesMask(ModHealingDonePercent); Base::ClearChangesMask(ModPeriodicHealingDonePercent); Base::ClearChangesMask(ModSpellPowerPercent); Base::ClearChangesMask(ModResiliencePercent); @@ -3775,13 +4192,16 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(UiSpellHitModifier); Base::ClearChangesMask(HomeRealmTimeOffset); Base::ClearChangesMask(ModPetHaste); + Base::ClearChangesMask(JailersTowerLevelMax); + Base::ClearChangesMask(JailersTowerLevel); Base::ClearChangesMask(LocalRegenFlags); Base::ClearChangesMask(AuraVision); Base::ClearChangesMask(NumBackpackSlots); Base::ClearChangesMask(OverrideSpellsID); - Base::ClearChangesMask(LfgBonusFactionID); Base::ClearChangesMask(LootSpecID); Base::ClearChangesMask(OverrideZonePVPType); + Base::ClearChangesMask(BnetAccount); + Base::ClearChangesMask(GuildClubMemberID); Base::ClearChangesMask(Honor); Base::ClearChangesMask(HonorNextLevel); Base::ClearChangesMask(PvpRewardAchieved); @@ -3790,7 +4210,10 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(PvpLastWeeksTierMaxFromWins); Base::ClearChangesMask(PvpLastWeeksRewardClaimed); Base::ClearChangesMask(NumBankSlots); + Base::ClearChangesMask(Field_1410); Base::ClearChangesMask(QuestSession); + Base::ClearChangesMask(UiChromieTimeExpansionID); + Base::ClearChangesMask(TransportServerTime); Base::ClearChangesMask(InvSlots); Base::ClearChangesMask(TrackResourceMask); Base::ClearChangesMask(ExploredZones); @@ -3798,6 +4221,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(ModDamageDonePos); Base::ClearChangesMask(ModDamageDoneNeg); Base::ClearChangesMask(ModDamageDonePercent); + Base::ClearChangesMask(ModHealingDonePercent); Base::ClearChangesMask(WeaponDmgMultipliers); Base::ClearChangesMask(WeaponAtkSpeedMultipliers); Base::ClearChangesMask(BuybackPrice); @@ -3833,13 +4257,14 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie data << float(ParentRotation->z); data << float(ParentRotation->w); data << int32(FactionTemplate); - data << int32(ViewerDependentValue<LevelTag>::GetValue(Level, owner, receiver)); data << int8(ViewerDependentValue<StateTag>::GetValue(State, owner, receiver)); data << int8(TypeID); data << uint8(PercentHealth); data << uint32(ArtKit); data << uint32(EnableDoodadSets.size()); data << uint32(CustomParam); + data << int32(ViewerDependentValue<LevelTag>::GetValue(Level, owner, receiver)); + data << uint32(AnimGroupInstance); for (std::size_t i = 0; i < EnableDoodadSets.size(); ++i) { data << int32(EnableDoodadSets[i]); @@ -3851,9 +4276,9 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie WriteUpdate(data, _changesMask, false, owner, receiver); } -void GameObjectData::WriteUpdate(ByteBuffer& data, UpdateMask<20> const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const +void GameObjectData::WriteUpdate(ByteBuffer& data, UpdateMask<21> const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 20); + data.WriteBits(changesMask.GetBlock(0), 21); if (changesMask[0]) { @@ -3939,27 +4364,31 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, UpdateMask<20> const& changes } if (changesMask[14]) { - data << int32(ViewerDependentValue<LevelTag>::GetValue(Level, owner, receiver)); + data << int8(ViewerDependentValue<StateTag>::GetValue(State, owner, receiver)); } if (changesMask[15]) { - data << int8(ViewerDependentValue<StateTag>::GetValue(State, owner, receiver)); + data << int8(TypeID); } if (changesMask[16]) { - data << int8(TypeID); + data << uint8(PercentHealth); } if (changesMask[17]) { - data << uint8(PercentHealth); + data << uint32(ArtKit); } if (changesMask[18]) { - data << uint32(ArtKit); + data << uint32(CustomParam); } if (changesMask[19]) { - data << uint32(CustomParam); + data << int32(ViewerDependentValue<LevelTag>::GetValue(Level, owner, receiver)); + } + if (changesMask[20]) + { + data << uint32(AnimGroupInstance); } } } @@ -3979,19 +4408,20 @@ void GameObjectData::ClearChangesMask() Base::ClearChangesMask(Flags); Base::ClearChangesMask(ParentRotation); Base::ClearChangesMask(FactionTemplate); - Base::ClearChangesMask(Level); Base::ClearChangesMask(State); Base::ClearChangesMask(TypeID); Base::ClearChangesMask(PercentHealth); Base::ClearChangesMask(ArtKit); Base::ClearChangesMask(CustomParam); + Base::ClearChangesMask(Level); + Base::ClearChangesMask(AnimGroupInstance); _changesMask.ResetAll(); } void DynamicObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const { data << Caster; - data << int32(SpellXSpellVisualID); + SpellVisual->WriteCreate(data, owner, receiver); data << int32(SpellID); data << float(Radius); data << uint32(CastTime); @@ -4016,7 +4446,7 @@ void DynamicObjectData::WriteUpdate(ByteBuffer& data, UpdateMask<7> const& chang } if (changesMask[2]) { - data << int32(SpellXSpellVisualID); + SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[3]) { @@ -4040,7 +4470,7 @@ void DynamicObjectData::WriteUpdate(ByteBuffer& data, UpdateMask<7> const& chang void DynamicObjectData::ClearChangesMask() { Base::ClearChangesMask(Caster); - Base::ClearChangesMask(SpellXSpellVisualID); + Base::ClearChangesMask(SpellVisual); Base::ClearChangesMask(SpellID); Base::ClearChangesMask(Radius); Base::ClearChangesMask(CastTime); @@ -4062,16 +4492,13 @@ void CorpseData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint8(Unused); data << uint8(RaceID); data << uint8(Sex); - data << uint8(SkinID); - data << uint8(FaceID); - data << uint8(HairStyleID); - data << uint8(HairColorID); - data << uint8(FacialHairStyleID); + data << uint32(Customizations.size()); data << uint32(Flags); data << int32(FactionTemplate); - for (std::size_t i = 0; i < 3; ++i) + data << uint32(StateSpellVisualKitID); + for (std::size_t i = 0; i < Customizations.size(); ++i) { - data << uint8(CustomDisplayOption[i]); + Customizations[i].WriteCreate(data, owner, receiver); } } @@ -4080,101 +4507,96 @@ void CorpseData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi WriteUpdate(data, _changesMask, false, owner, receiver); } -void CorpseData::WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const +void CorpseData::WriteUpdate(ByteBuffer& data, UpdateMask<33> const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const { data.WriteBits(changesMask.GetBlocksMask(0), 2); for (std::size_t i = 0; i < 2; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreNestedChangesMask) + Customizations.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Customizations.size(), data); + } + } data.FlushBits(); if (changesMask[0]) { if (changesMask[1]) { - data << uint32(DynamicFlags); + for (std::size_t i = 0; i < Customizations.size(); ++i) + { + if (Customizations.HasChanged(i) || ignoreNestedChangesMask) + { + Customizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } if (changesMask[2]) { - data << Owner; + data << uint32(DynamicFlags); } if (changesMask[3]) { - data << PartyGUID; + data << Owner; } if (changesMask[4]) { - data << GuildGUID; + data << PartyGUID; } if (changesMask[5]) { - data << uint32(DisplayID); + data << GuildGUID; } if (changesMask[6]) { - data << uint8(Unused); + data << uint32(DisplayID); } if (changesMask[7]) { - data << uint8(RaceID); + data << uint8(Unused); } if (changesMask[8]) { - data << uint8(Sex); + data << uint8(RaceID); } if (changesMask[9]) { - data << uint8(SkinID); + data << uint8(Sex); } if (changesMask[10]) { - data << uint8(FaceID); + data << uint32(Flags); } if (changesMask[11]) { - data << uint8(HairStyleID); + data << int32(FactionTemplate); } if (changesMask[12]) { - data << uint8(HairColorID); - } - if (changesMask[13]) - { - data << uint8(FacialHairStyleID); - } - if (changesMask[14]) - { - data << uint32(Flags); - } - if (changesMask[15]) - { - data << int32(FactionTemplate); + data << uint32(StateSpellVisualKitID); } } - if (changesMask[16]) + if (changesMask[13]) { for (std::size_t i = 0; i < 19; ++i) { - if (changesMask[17 + i]) + if (changesMask[14 + i]) { data << uint32(Items[i]); } } } - if (changesMask[36]) - { - for (std::size_t i = 0; i < 3; ++i) - { - if (changesMask[37 + i]) - { - data << uint8(CustomDisplayOption[i]); - } - } - } } void CorpseData::ClearChangesMask() { + Base::ClearChangesMask(Customizations); Base::ClearChangesMask(DynamicFlags); Base::ClearChangesMask(Owner); Base::ClearChangesMask(PartyGUID); @@ -4183,15 +4605,10 @@ void CorpseData::ClearChangesMask() Base::ClearChangesMask(Unused); Base::ClearChangesMask(RaceID); Base::ClearChangesMask(Sex); - Base::ClearChangesMask(SkinID); - Base::ClearChangesMask(FaceID); - Base::ClearChangesMask(HairStyleID); - Base::ClearChangesMask(HairColorID); - Base::ClearChangesMask(FacialHairStyleID); Base::ClearChangesMask(Flags); Base::ClearChangesMask(FactionTemplate); + Base::ClearChangesMask(StateSpellVisualKitID); Base::ClearChangesMask(Items); - Base::ClearChangesMask(CustomDisplayOption); _changesMask.ResetAll(); } @@ -4203,6 +4620,7 @@ void ScaleCurve::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player data << Points[i]; } data << uint32(ParameterCurve); + data.FlushBits(); data.WriteBit(OverrideActive); data.FlushBits(); } @@ -4258,7 +4676,6 @@ void ScaleCurve::ClearChangesMask() void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { - OverrideScaleCurve->WriteCreate(data, owner, receiver); data << Caster; data << uint32(Duration); data << uint32(TimeToTarget); @@ -4266,10 +4683,11 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << uint32(TimeToTargetExtraScale); data << int32(SpellID); data << int32(SpellForVisuals); - data << int32(SpellXSpellVisualID); + SpellVisual->WriteCreate(data, owner, receiver); data << float(BoundsRadius2D); data << uint32(DecalPropertiesID); data << CreatingEffectGUID; + OverrideScaleCurve->WriteCreate(data, owner, receiver); ExtraScaleCurve->WriteCreate(data, owner, receiver); } @@ -4319,7 +4737,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, UpdateMask<14> const& change } if (changesMask[10]) { - data << int32(SpellXSpellVisualID); + SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[11]) { @@ -4351,7 +4769,7 @@ void AreaTriggerData::ClearChangesMask() Base::ClearChangesMask(TimeToTargetExtraScale); Base::ClearChangesMask(SpellID); Base::ClearChangesMask(SpellForVisuals); - Base::ClearChangesMask(SpellXSpellVisualID); + Base::ClearChangesMask(SpellVisual); Base::ClearChangesMask(BoundsRadius2D); Base::ClearChangesMask(DecalPropertiesID); Base::ClearChangesMask(CreatingEffectGUID); @@ -4413,6 +4831,7 @@ void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, data << int32(UiCameraID); data << uint8(ActorIndex); data << uint8(Flags); + data << uint8(ChatType); } void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const @@ -4422,6 +4841,17 @@ void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Con data << int32(UiCameraID); data << uint8(ActorIndex); data << uint8(Flags); + data << uint8(ChatType); +} + +bool ConversationLine::operator==(ConversationLine const& right) const +{ + return ConversationLineID == right.ConversationLineID + && StartTime == right.StartTime + && UiCameraID == right.UiCameraID + && ActorIndex == right.ActorIndex + && Flags == right.Flags + && ChatType == right.ChatType; } void ConversationActor::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const @@ -4431,6 +4861,7 @@ void ConversationActor::WriteCreate(ByteBuffer& data, Conversation const* owner, data << ActorGUID; data << int32(Field_18); data.WriteBits(Type, 1); + data.WriteBits(NoActorObject, 1); data.FlushBits(); } @@ -4441,9 +4872,20 @@ void ConversationActor::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Co data << ActorGUID; data << int32(Field_18); data.WriteBits(Type, 1); + data.WriteBits(NoActorObject, 1); data.FlushBits(); } +bool ConversationActor::operator==(ConversationActor const& right) const +{ + return CreatureID == right.CreatureID + && CreatureDisplayInfoID == right.CreatureDisplayInfoID + && ActorGUID == right.ActorGUID + && Field_18 == right.Field_18 + && Type == right.Type + && NoActorObject == right.NoActorObject; +} + void ConversationData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const { data << uint32(Lines->size()); diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index f2faeffd2c5..787742ac021 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -66,6 +66,26 @@ struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask void ClearChangesMask(); }; +struct ItemMod : public IsUpdateFieldStructureTag +{ + int32 Value; + uint8 Type; + + void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; + bool operator==(ItemMod const& right) const; + bool operator!=(ItemMod const& right) const { return !(*this == right); } +}; + +struct ItemModList : public IsUpdateFieldStructureTag, public HasChangesMask<1> +{ + DynamicUpdateField<UF::ItemMod, 0, 0> Values; + + void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + struct ArtifactPower : public IsUpdateFieldStructureTag { int16 ArtifactPowerID; @@ -74,6 +94,8 @@ struct ArtifactPower : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; + bool operator==(ArtifactPower const& right) const; + bool operator!=(ArtifactPower const& right) const { return !(*this == right); } }; struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20> @@ -90,23 +112,23 @@ struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20> struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<40> { UpdateField<std::vector<int32>, 0, 1> BonusListIDs; - DynamicUpdateField<int32, 0, 2> Modifiers; - DynamicUpdateField<UF::ArtifactPower, 0, 3> ArtifactPowers; - DynamicUpdateField<UF::SocketedGem, 0, 4> Gems; - UpdateField<ObjectGuid, 0, 5> Owner; - UpdateField<ObjectGuid, 0, 6> ContainedIn; - UpdateField<ObjectGuid, 0, 7> Creator; - UpdateField<ObjectGuid, 0, 8> GiftCreator; - UpdateField<uint32, 0, 9> StackCount; - UpdateField<uint32, 0, 10> Expiration; - UpdateField<uint32, 0, 11> DynamicFlags; - UpdateField<uint32, 0, 12> Durability; - UpdateField<uint32, 0, 13> MaxDurability; - UpdateField<uint32, 0, 14> CreatePlayedTime; - UpdateField<uint32, 0, 15> ModifiersMask; - UpdateField<int32, 0, 16> Context; - UpdateField<uint64, 0, 17> ArtifactXP; - UpdateField<uint8, 0, 18> ItemAppearanceModID; + DynamicUpdateField<UF::ArtifactPower, 0, 2> ArtifactPowers; + DynamicUpdateField<UF::SocketedGem, 0, 3> Gems; + UpdateField<ObjectGuid, 0, 4> Owner; + UpdateField<ObjectGuid, 0, 5> ContainedIn; + UpdateField<ObjectGuid, 0, 6> Creator; + UpdateField<ObjectGuid, 0, 7> GiftCreator; + UpdateField<uint32, 0, 8> StackCount; + UpdateField<uint32, 0, 9> Expiration; + UpdateField<uint32, 0, 10> DynamicFlags; + UpdateField<uint32, 0, 11> Durability; + UpdateField<uint32, 0, 12> MaxDurability; + UpdateField<uint32, 0, 13> CreatePlayedTime; + UpdateField<int32, 0, 14> Context; + UpdateField<int32, 0, 15> CreateTime; + UpdateField<uint64, 0, 16> ArtifactXP; + UpdateField<uint8, 0, 17> ItemAppearanceModID; + UpdateField<UF::ItemModList, 0, 18> Modifiers; UpdateField<uint32, 0, 19> DynamicFlags2; UpdateFieldArray<int32, 5, 20, 21> SpellCharges; UpdateFieldArray<UF::ItemEnchantment, 13, 26, 27> Enchantment; @@ -147,6 +169,8 @@ struct UnlockedAzeriteEssence : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const; + bool operator==(UnlockedAzeriteEssence const& right) const; + bool operator!=(UnlockedAzeriteEssence const& right) const { return !(*this == right); } }; struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasChangesMask<8> @@ -160,39 +184,54 @@ struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasCha void ClearChangesMask(); }; -struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<9> +struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<10> { - DynamicUpdateField<UF::UnlockedAzeriteEssence, 0, 1> UnlockedEssences; - DynamicUpdateField<uint32, 0, 3> UnlockedEssenceMilestones; - DynamicUpdateField<UF::SelectedAzeriteEssences, 0, 2> SelectedEssences; - UpdateField<uint64, 0, 4> Xp; - UpdateField<uint32, 0, 5> Level; - UpdateField<uint32, 0, 6> AuraLevel; - UpdateField<uint32, 0, 7> KnowledgeLevel; - UpdateField<int32, 0, 8> DEBUGknowledgeWeek; + UpdateField<bool, 0, 1> Enabled; + DynamicUpdateField<UF::UnlockedAzeriteEssence, 0, 2> UnlockedEssences; + DynamicUpdateField<uint32, 0, 4> UnlockedEssenceMilestones; + DynamicUpdateField<UF::SelectedAzeriteEssences, 0, 3> SelectedEssences; + UpdateField<uint64, 0, 5> Xp; + UpdateField<uint32, 0, 6> Level; + UpdateField<uint32, 0, 7> AuraLevel; + UpdateField<uint32, 0, 8> KnowledgeLevel; + UpdateField<int32, 0, 9> DEBUGknowledgeWeek; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const; - void AppendAllowedFieldsMaskForFlag(UpdateMask<9>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; - void FilterDisallowedFieldsMaskForFlag(UpdateMask<9>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<10> const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const; + void AppendAllowedFieldsMaskForFlag(UpdateMask<10>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void FilterDisallowedFieldsMaskForFlag(UpdateMask<10>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; void ClearChangesMask(); }; +struct SpellCastVisual : public IsUpdateFieldStructureTag +{ + int32 SpellXSpellVisualID; + int32 ScriptVisualID; + + void WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const; + bool operator==(SpellCastVisual const& right) const; + bool operator!=(SpellCastVisual const& right) const { return !(*this == right); } +}; + struct UnitChannel : public IsUpdateFieldStructureTag { int32 SpellID; - int32 SpellXSpellVisualID; + UF::SpellCastVisual SpellVisual; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; + bool operator==(UnitChannel const& right) const; + bool operator!=(UnitChannel const& right) const { return !(*this == right); } }; -struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<4> +struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<5> { UpdateField<int32, 0, 1> ItemID; - UpdateField<uint16, 0, 2> ItemAppearanceModID; - UpdateField<uint16, 0, 3> ItemVisual; + UpdateField<int32, 0, 2> ItemModifiedAppearanceID; + UpdateField<uint16, 0, 3> ItemAppearanceModID; + UpdateField<uint16, 0, 4> ItemVisual; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -206,9 +245,11 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; + bool operator==(PassiveSpellHistory const& right) const; + bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<192> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; @@ -220,136 +261,151 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<192> UpdateField<uint32, 0, 7> StateAnimID; UpdateField<uint32, 0, 8> StateAnimKitID; UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID; - UpdateField<ObjectGuid, 0, 10> Charm; - UpdateField<ObjectGuid, 0, 11> Summon; - UpdateField<ObjectGuid, 0, 12> Critter; - UpdateField<ObjectGuid, 0, 13> CharmedBy; - UpdateField<ObjectGuid, 0, 14> SummonedBy; - UpdateField<ObjectGuid, 0, 15> CreatedBy; - UpdateField<ObjectGuid, 0, 16> DemonCreator; - UpdateField<ObjectGuid, 0, 17> LookAtControllerTarget; - UpdateField<ObjectGuid, 0, 18> Target; - UpdateField<ObjectGuid, 0, 19> BattlePetCompanionGUID; - UpdateField<uint64, 0, 20> BattlePetDBID; - UpdateField<UF::UnitChannel, 0, 21> ChannelData; - UpdateField<uint32, 0, 22> SummonedByHomeRealm; - UpdateField<uint8, 0, 23> Race; - UpdateField<uint8, 0, 24> ClassId; - UpdateField<uint8, 0, 25> PlayerClassId; - UpdateField<uint8, 0, 26> Sex; - UpdateField<uint8, 0, 27> DisplayPower; - UpdateField<uint32, 0, 28> OverrideDisplayPowerID; - UpdateField<int64, 0, 29> Health; - UpdateField<int64, 0, 30> MaxHealth; - UpdateField<int32, 0, 31> Level; - UpdateField<int32, 32, 33> EffectiveLevel; - UpdateField<int32, 32, 34> ContentTuningID; - UpdateField<int32, 32, 35> ScalingLevelMin; - UpdateField<int32, 32, 36> ScalingLevelMax; - UpdateField<int32, 32, 37> ScalingLevelDelta; - UpdateField<int32, 32, 38> ScalingFactionGroup; - UpdateField<int32, 32, 39> ScalingHealthItemLevelCurveID; - UpdateField<int32, 32, 40> ScalingDamageItemLevelCurveID; - UpdateField<int32, 32, 41> FactionTemplate; + UpdateField<int32, 0, 10> SpellOverrideNameID; + UpdateField<ObjectGuid, 0, 11> Charm; + UpdateField<ObjectGuid, 0, 12> Summon; + UpdateField<ObjectGuid, 0, 13> Critter; + UpdateField<ObjectGuid, 0, 14> CharmedBy; + UpdateField<ObjectGuid, 0, 15> SummonedBy; + UpdateField<ObjectGuid, 0, 16> CreatedBy; + UpdateField<ObjectGuid, 0, 17> DemonCreator; + UpdateField<ObjectGuid, 0, 18> LookAtControllerTarget; + UpdateField<ObjectGuid, 0, 19> Target; + UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID; + UpdateField<uint64, 0, 21> BattlePetDBID; + UpdateField<UF::UnitChannel, 0, 22> ChannelData; + UpdateField<uint32, 0, 23> SummonedByHomeRealm; + UpdateField<uint8, 0, 24> Race; + UpdateField<uint8, 0, 25> ClassId; + UpdateField<uint8, 0, 26> PlayerClassId; + UpdateField<uint8, 0, 27> Sex; + UpdateField<uint8, 0, 28> DisplayPower; + UpdateField<uint32, 0, 29> OverrideDisplayPowerID; + UpdateField<int64, 0, 30> Health; + UpdateField<int64, 0, 31> MaxHealth; + UpdateField<int32, 32, 33> Level; + UpdateField<int32, 32, 34> EffectiveLevel; + UpdateField<int32, 32, 35> ContentTuningID; + UpdateField<int32, 32, 36> ScalingLevelMin; + UpdateField<int32, 32, 37> ScalingLevelMax; + UpdateField<int32, 32, 38> ScalingLevelDelta; + UpdateField<int32, 32, 39> ScalingFactionGroup; + UpdateField<int32, 32, 40> ScalingHealthItemLevelCurveID; + UpdateField<int32, 32, 41> ScalingDamageItemLevelCurveID; + UpdateField<int32, 32, 42> FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 32, 42> Flags; + UpdateField<uint32, 32, 43> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 43> Flags2; - UpdateField<uint32, 32, 44> Flags3; - UpdateField<uint32, 32, 45> AuraState; + UpdateField<uint32, 32, 44> Flags2; + UpdateField<uint32, 32, 45> Flags3; + UpdateField<uint32, 32, 46> AuraState; struct AuraStateTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 46> RangedAttackRoundBaseTime; - UpdateField<float, 32, 47> BoundingRadius; - UpdateField<float, 32, 48> CombatReach; - UpdateField<float, 32, 49> DisplayScale; - UpdateField<int32, 32, 50> NativeDisplayID; - UpdateField<float, 32, 51> NativeXDisplayScale; - UpdateField<int32, 32, 52> MountDisplayID; - UpdateField<int32, 32, 53> CosmeticMountDisplayID; - UpdateField<float, 32, 54> MinDamage; - UpdateField<float, 32, 55> MaxDamage; - UpdateField<float, 32, 56> MinOffHandDamage; - UpdateField<float, 32, 57> MaxOffHandDamage; - UpdateField<uint8, 32, 58> StandState; - UpdateField<uint8, 32, 59> PetTalentPoints; - UpdateField<uint8, 32, 60> VisFlags; - UpdateField<uint8, 32, 61> AnimTier; - UpdateField<uint32, 32, 62> PetNumber; - UpdateField<uint32, 32, 63> PetNameTimestamp; - UpdateField<uint32, 64, 65> PetExperience; - UpdateField<uint32, 64, 66> PetNextLevelExperience; - UpdateField<float, 64, 67> ModCastingSpeed; - UpdateField<float, 64, 68> ModSpellHaste; - UpdateField<float, 64, 69> ModHaste; - UpdateField<float, 64, 70> ModRangedHaste; - UpdateField<float, 64, 71> ModHasteRegen; - UpdateField<float, 64, 72> ModTimeRate; - UpdateField<int32, 64, 73> CreatedBySpell; - UpdateField<int32, 64, 74> EmoteState; - UpdateField<int32, 64, 75> BaseMana; - UpdateField<int32, 64, 76> BaseHealth; - UpdateField<uint8, 64, 77> SheatheState; - UpdateField<uint8, 64, 78> PvpFlags; + UpdateField<uint32, 32, 47> RangedAttackRoundBaseTime; + UpdateField<float, 32, 48> BoundingRadius; + UpdateField<float, 32, 49> CombatReach; + UpdateField<float, 32, 50> DisplayScale; + UpdateField<int32, 32, 51> CreatureFamily; + UpdateField<int32, 32, 52> CreatureType; + UpdateField<int32, 32, 53> NativeDisplayID; + UpdateField<float, 32, 54> NativeXDisplayScale; + UpdateField<int32, 32, 55> MountDisplayID; + UpdateField<int32, 32, 56> CosmeticMountDisplayID; + UpdateField<float, 32, 57> MinDamage; + UpdateField<float, 32, 58> MaxDamage; + UpdateField<float, 32, 59> MinOffHandDamage; + UpdateField<float, 32, 60> MaxOffHandDamage; + UpdateField<uint8, 32, 61> StandState; + UpdateField<uint8, 32, 62> PetTalentPoints; + UpdateField<uint8, 32, 63> VisFlags; + UpdateField<uint8, 64, 65> AnimTier; + UpdateField<uint32, 64, 66> PetNumber; + UpdateField<uint32, 64, 67> PetNameTimestamp; + UpdateField<uint32, 64, 68> PetExperience; + UpdateField<uint32, 64, 69> PetNextLevelExperience; + UpdateField<float, 64, 70> ModCastingSpeed; + UpdateField<float, 64, 71> ModCastingSpeedNeg; + UpdateField<float, 64, 72> ModSpellHaste; + UpdateField<float, 64, 73> ModHaste; + UpdateField<float, 64, 74> ModRangedHaste; + UpdateField<float, 64, 75> ModHasteRegen; + UpdateField<float, 64, 76> ModTimeRate; + UpdateField<int32, 64, 77> CreatedBySpell; + UpdateField<int32, 64, 78> EmoteState; + UpdateField<int32, 64, 79> BaseMana; + UpdateField<int32, 64, 80> BaseHealth; + UpdateField<uint8, 64, 81> SheatheState; + UpdateField<uint8, 64, 82> PvpFlags; struct PvpFlagsTag : ViewerDependentValueTag<uint8> {}; - UpdateField<uint8, 64, 79> PetFlags; - UpdateField<uint8, 64, 80> ShapeshiftForm; - UpdateField<int32, 64, 81> AttackPower; - UpdateField<int32, 64, 82> AttackPowerModPos; - UpdateField<int32, 64, 83> AttackPowerModNeg; - UpdateField<float, 64, 84> AttackPowerMultiplier; - UpdateField<int32, 64, 85> RangedAttackPower; - UpdateField<int32, 64, 86> RangedAttackPowerModPos; - UpdateField<int32, 64, 87> RangedAttackPowerModNeg; - UpdateField<float, 64, 88> RangedAttackPowerMultiplier; - UpdateField<int32, 64, 89> MainHandWeaponAttackPower; - UpdateField<int32, 64, 90> OffHandWeaponAttackPower; - UpdateField<int32, 64, 91> RangedWeaponAttackPower; - UpdateField<int32, 64, 92> SetAttackSpeedAura; - UpdateField<float, 64, 93> Lifesteal; - UpdateField<float, 64, 94> MinRangedDamage; - UpdateField<float, 64, 95> MaxRangedDamage; - UpdateField<float, 96, 97> ManaCostModifierModifier; - UpdateField<float, 96, 98> MaxHealthModifier; - UpdateField<float, 96, 99> HoverHeight; - UpdateField<int32, 96, 100> MinItemLevelCutoff; - UpdateField<int32, 96, 101> MinItemLevel; - UpdateField<int32, 96, 102> MaxItemLevel; - UpdateField<int32, 96, 103> AzeriteItemLevel; - UpdateField<int32, 96, 104> WildBattlePetLevel; - UpdateField<uint32, 96, 105> BattlePetCompanionNameTimestamp; - UpdateField<int32, 96, 106> InteractSpellID; - UpdateField<int32, 96, 107> ScaleDuration; - UpdateField<int32, 96, 108> SpellOverrideNameID; - UpdateField<int32, 96, 109> LooksLikeMountID; - UpdateField<int32, 96, 110> LooksLikeCreatureID; - UpdateField<int32, 96, 111> LookAtControllerID; - UpdateField<int32, 96, 112> TaxiNodesID; - UpdateField<ObjectGuid, 96, 113> GuildGUID; - UpdateField<ObjectGuid, 96, 114> SkinningOwnerGUID; - UpdateFieldArray<uint32, 2, 115, 116> NpcFlags; + UpdateField<uint8, 64, 83> PetFlags; + UpdateField<uint8, 64, 84> ShapeshiftForm; + UpdateField<int32, 64, 85> AttackPower; + UpdateField<int32, 64, 86> AttackPowerModPos; + UpdateField<int32, 64, 87> AttackPowerModNeg; + UpdateField<float, 64, 88> AttackPowerMultiplier; + UpdateField<int32, 64, 89> RangedAttackPower; + UpdateField<int32, 64, 90> RangedAttackPowerModPos; + UpdateField<int32, 64, 91> RangedAttackPowerModNeg; + UpdateField<float, 64, 92> RangedAttackPowerMultiplier; + UpdateField<int32, 64, 93> MainHandWeaponAttackPower; + UpdateField<int32, 64, 94> OffHandWeaponAttackPower; + UpdateField<int32, 64, 95> RangedWeaponAttackPower; + UpdateField<int32, 96, 97> SetAttackSpeedAura; + UpdateField<float, 96, 98> Lifesteal; + UpdateField<float, 96, 99> MinRangedDamage; + UpdateField<float, 96, 100> MaxRangedDamage; + UpdateField<float, 96, 101> ManaCostModifierModifier; + UpdateField<float, 96, 102> MaxHealthModifier; + UpdateField<float, 96, 103> HoverHeight; + UpdateField<int32, 96, 104> MinItemLevelCutoff; + UpdateField<int32, 96, 105> MinItemLevel; + UpdateField<int32, 96, 106> MaxItemLevel; + UpdateField<int32, 96, 107> AzeriteItemLevel; + UpdateField<int32, 96, 108> WildBattlePetLevel; + UpdateField<uint32, 96, 109> BattlePetCompanionNameTimestamp; + UpdateField<int32, 96, 110> InteractSpellID; + UpdateField<int32, 96, 111> ScaleDuration; + UpdateField<int32, 96, 112> LooksLikeMountID; + UpdateField<int32, 96, 113> LooksLikeCreatureID; + UpdateField<int32, 96, 114> LookAtControllerID; + UpdateField<int32, 96, 115> TaxiNodesID; + UpdateField<ObjectGuid, 96, 116> GuildGUID; + UpdateField<ObjectGuid, 96, 117> SkinningOwnerGUID; + UpdateField<uint32, 96, 118> SilencedSchoolMask; + UpdateFieldArray<uint32, 2, 119, 120> NpcFlags; struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateFieldArray<int32, 6, 118, 119> Power; - UpdateFieldArray<int32, 6, 118, 125> MaxPower; - UpdateFieldArray<float, 6, 118, 131> PowerRegenFlatModifier; - UpdateFieldArray<float, 6, 118, 137> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 143, 144> VirtualItems; - UpdateFieldArray<uint32, 2, 147, 148> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 150, 151> Stats; - UpdateFieldArray<int32, 4, 150, 155> StatPosBuff; - UpdateFieldArray<int32, 4, 150, 159> StatNegBuff; - UpdateFieldArray<int32, 7, 163, 164> Resistances; - UpdateFieldArray<int32, 7, 163, 171> BonusResistanceMods; - UpdateFieldArray<int32, 7, 163, 178> PowerCostModifier; - UpdateFieldArray<float, 7, 163, 185> PowerCostMultiplier; + UpdateFieldArray<int32, 6, 122, 123> Power; + UpdateFieldArray<int32, 6, 122, 129> MaxPower; + UpdateFieldArray<float, 6, 122, 135> PowerRegenFlatModifier; + UpdateFieldArray<float, 6, 122, 141> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<UF::VisibleItem, 3, 147, 148> VirtualItems; + UpdateFieldArray<uint32, 2, 151, 152> AttackRoundBaseTime; + UpdateFieldArray<int32, 4, 154, 155> Stats; + UpdateFieldArray<int32, 4, 154, 159> StatPosBuff; + UpdateFieldArray<int32, 4, 154, 163> StatNegBuff; + UpdateFieldArray<int32, 7, 167, 168> Resistances; + UpdateFieldArray<int32, 7, 167, 175> BonusResistanceMods; + UpdateFieldArray<int32, 7, 167, 182> PowerCostModifier; + UpdateFieldArray<float, 7, 167, 189> PowerCostMultiplier; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const; - void AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; - void FilterDisallowedFieldsMaskForFlag(UpdateMask<192>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<196> const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const; + void AppendAllowedFieldsMaskForFlag(UpdateMask<196>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void FilterDisallowedFieldsMaskForFlag(UpdateMask<196>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; void ClearChangesMask(); }; +struct ChrCustomizationChoice : public IsUpdateFieldStructureTag +{ + uint32 ChrCustomizationOptionID; + uint32 ChrCustomizationChoiceID; + + void WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const; + bool operator==(ChrCustomizationChoice const& right) const; + bool operator!=(ChrCustomizationChoice const& right) const { return !(*this == right); } +}; + struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<31> { UpdateField<int32, 0, 1> QuestID; @@ -379,53 +435,61 @@ struct ArenaCooldown : public IsUpdateFieldStructureTag, public HasChangesMask<8 void ClearChangesMask(); }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<192> +struct CTROptions : public IsUpdateFieldStructureTag +{ + int32 ContentTuningConditionMask; + uint32 Field_4; + uint32 ExpansionLevelMask; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(CTROptions const& right) const; + bool operator!=(CTROptions const& right) const { return !(*this == right); } +}; + +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<185> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; - DynamicUpdateField<UF::QuestLog, 0, 3> QuestSessionQuestLog; - DynamicUpdateField<UF::ArenaCooldown, 0, 4> ArenaCooldowns; - UpdateField<ObjectGuid, 0, 5> DuelArbiter; - UpdateField<ObjectGuid, 0, 6> WowAccount; - UpdateField<ObjectGuid, 0, 7> LootTargetGUID; - UpdateField<uint32, 0, 8> PlayerFlags; - UpdateField<uint32, 0, 9> PlayerFlagsEx; - UpdateField<uint32, 0, 10> GuildRankID; - UpdateField<uint32, 0, 11> GuildDeleteDate; - UpdateField<int32, 0, 12> GuildLevel; - UpdateField<uint8, 0, 13> SkinID; - UpdateField<uint8, 0, 14> FaceID; - UpdateField<uint8, 0, 15> HairStyleID; - UpdateField<uint8, 0, 16> HairColorID; - UpdateField<uint8, 0, 17> FacialHairStyleID; - UpdateField<uint8, 0, 18> PartyType; - UpdateField<uint8, 0, 19> NativeSex; - UpdateField<uint8, 0, 20> Inebriation; - UpdateField<uint8, 0, 21> PvpTitle; - UpdateField<uint8, 0, 22> ArenaFaction; - UpdateField<uint32, 0, 23> DuelTeam; - UpdateField<int32, 0, 24> GuildTimeStamp; - UpdateField<int32, 0, 25> PlayerTitle; - UpdateField<int32, 0, 26> FakeInebriation; - UpdateField<uint32, 0, 27> VirtualPlayerRealm; - UpdateField<uint32, 0, 28> CurrentSpecID; - UpdateField<int32, 0, 29> TaxiMountAnimKitID; - UpdateField<uint8, 0, 30> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 31> HonorLevel; - UpdateField<int32, 32, 33> Field_B0; - UpdateField<int32, 32, 34> Field_B4; - UpdateField<ObjectGuid, 32, 35> Field_F8; - UpdateField<int32, 32, 36> Field_108; - UpdateFieldArray<uint8, 3, 37, 38> CustomDisplayOption; - UpdateFieldArray<UF::QuestLog, 125, 41, 42> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 167, 168> VisibleItems; - UpdateFieldArray<float, 4, 187, 188> AvgItemLevel; + DynamicUpdateField<UF::ChrCustomizationChoice, 0, 3> Customizations; + DynamicUpdateField<UF::QuestLog, 0, 4> QuestSessionQuestLog; + DynamicUpdateField<UF::ArenaCooldown, 0, 5> ArenaCooldowns; + UpdateField<ObjectGuid, 0, 6> DuelArbiter; + UpdateField<ObjectGuid, 0, 7> WowAccount; + UpdateField<ObjectGuid, 0, 8> LootTargetGUID; + UpdateField<uint32, 0, 9> PlayerFlags; + UpdateField<uint32, 0, 10> PlayerFlagsEx; + UpdateField<uint32, 0, 11> GuildRankID; + UpdateField<uint32, 0, 12> GuildDeleteDate; + UpdateField<int32, 0, 13> GuildLevel; + UpdateField<uint8, 0, 14> PartyType; + UpdateField<uint8, 0, 15> NativeSex; + UpdateField<uint8, 0, 16> Inebriation; + UpdateField<uint8, 0, 17> PvpTitle; + UpdateField<uint8, 0, 18> ArenaFaction; + UpdateField<uint32, 0, 19> DuelTeam; + UpdateField<int32, 0, 20> GuildTimeStamp; + UpdateField<int32, 0, 21> PlayerTitle; + UpdateField<int32, 0, 22> FakeInebriation; + UpdateField<uint32, 0, 23> VirtualPlayerRealm; + UpdateField<uint32, 0, 24> CurrentSpecID; + UpdateField<int32, 0, 25> TaxiMountAnimKitID; + UpdateField<uint8, 0, 26> CurrentBattlePetBreedQuality; + UpdateField<int32, 0, 27> HonorLevel; + UpdateField<int32, 0, 28> Field_B0; + UpdateField<int32, 0, 29> Field_B4; + UpdateField<UF::CTROptions, 0, 30> CtrOptions; + UpdateField<int32, 0, 31> CovenantID; + UpdateField<int32, 32, 33> SoulbindID; + UpdateFieldArray<UF::QuestLog, 125, 34, 35> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 160, 161> VisibleItems; + UpdateFieldArray<float, 4, 180, 181> AvgItemLevel; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const; - void AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; - void FilterDisallowedFieldsMaskForFlag(UpdateMask<192>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<185> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const; + void AppendAllowedFieldsMaskForFlag(UpdateMask<185>& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; + void FilterDisallowedFieldsMaskForFlag(UpdateMask<185>& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const; void ClearChangesMask(); bool IsQuestLogChangesMaskSkipped() const { return false; } // bandwidth savings aren't worth the cpu time }; @@ -481,6 +545,8 @@ struct CharacterRestriction : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(CharacterRestriction const& right) const; + bool operator!=(CharacterRestriction const& right) const { return !(*this == right); } }; struct SpellPctModByLabel : public IsUpdateFieldStructureTag @@ -491,6 +557,8 @@ struct SpellPctModByLabel : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(SpellPctModByLabel const& right) const; + bool operator!=(SpellPctModByLabel const& right) const { return !(*this == right); } }; struct SpellFlatModByLabel : public IsUpdateFieldStructureTag @@ -501,6 +569,8 @@ struct SpellFlatModByLabel : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(SpellFlatModByLabel const& right) const; + bool operator!=(SpellFlatModByLabel const& right) const { return !(*this == right); } }; struct Research : public IsUpdateFieldStructureTag @@ -509,12 +579,47 @@ struct Research : public IsUpdateFieldStructureTag void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(Research const& right) const; + bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3> +struct MawPower : public IsUpdateFieldStructureTag { - UpdateField<int32, 0, 1> QuestID; - UpdateField<uint32, 0, 2> ReplayTime; + int32 Field_0; + int32 Field_4; + int32 Field_8; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(MawPower const& right) const; + bool operator!=(MawPower const& right) const { return !(*this == right); } +}; + +struct MultiFloorExplore : public IsUpdateFieldStructureTag +{ + std::vector<int32> WorldMapOverlayIDs; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(MultiFloorExplore const& right) const; + bool operator!=(MultiFloorExplore const& right) const { return !(*this == right); } +}; + +struct RecipeProgressionInfo : public IsUpdateFieldStructureTag +{ + uint16 RecipeProgressionGroupID; + uint16 Experience; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(RecipeProgressionInfo const& right) const; + bool operator!=(RecipeProgressionInfo const& right) const { return !(*this == right); } +}; + +struct ActivePlayerUnk901 : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<ObjectGuid, 0, 1> Field_0; + UpdateField<int32, 0, 2> Field_10; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -531,13 +636,23 @@ struct QuestSession : public IsUpdateFieldStructureTag, public HasChangesMask<87 void ClearChangesMask(); }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1494> +struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<int32, 0, 1> QuestID; + UpdateField<uint32, 0, 2> ReplayTime; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1511> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BankAutoSortDisabled; UpdateField<bool, 0, 3> SortBagsRightToLeft; UpdateField<bool, 0, 4> InsertItemsLeftToRight; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 22, 23> Research; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 27, 28> Research; DynamicUpdateField<uint64, 0, 5> KnownTitles; DynamicUpdateField<uint16, 0, 6> ResearchSites; DynamicUpdateField<uint32, 0, 7> ResearchSiteProgress; @@ -550,114 +665,125 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<uint32, 0, 14> Transmog; DynamicUpdateField<int32, 0, 15> ConditionalTransmog; DynamicUpdateField<int32, 0, 16> SelfResSpells; - DynamicUpdateField<UF::SpellPctModByLabel, 0, 18> SpellPctModByLabel; - DynamicUpdateField<UF::SpellFlatModByLabel, 0, 19> SpellFlatModByLabel; - DynamicUpdateField<UF::ReplayedQuest, 0, 20> ReplayedQuests; - DynamicUpdateField<int32, 0, 21> DisabledSpells; - DynamicUpdateField<UF::CharacterRestriction, 0, 17> CharacterRestrictions; - UpdateField<ObjectGuid, 0, 24> FarsightObject; - UpdateField<ObjectGuid, 0, 25> SummonedBattlePetGUID; - UpdateField<uint64, 0, 26> Coinage; - UpdateField<int32, 0, 27> XP; - UpdateField<int32, 0, 28> NextLevelXP; - UpdateField<int32, 0, 29> TrialXP; - UpdateField<UF::SkillInfo, 0, 30> Skill; - UpdateField<int32, 0, 31> CharacterPoints; - UpdateField<int32, 0, 32> MaxTalentTiers; - UpdateField<int32, 0, 33> TrackCreatureMask; - UpdateField<float, 34, 35> MainhandExpertise; - UpdateField<float, 34, 36> OffhandExpertise; - UpdateField<float, 34, 37> RangedExpertise; - UpdateField<float, 34, 38> CombatRatingExpertise; - UpdateField<float, 34, 39> BlockPercentage; - UpdateField<float, 34, 40> DodgePercentage; - UpdateField<float, 34, 41> DodgePercentageFromAttribute; - UpdateField<float, 34, 42> ParryPercentage; - UpdateField<float, 34, 43> ParryPercentageFromAttribute; - UpdateField<float, 34, 44> CritPercentage; - UpdateField<float, 34, 45> RangedCritPercentage; - UpdateField<float, 34, 46> OffhandCritPercentage; - UpdateField<float, 34, 47> SpellCritPercentage; - UpdateField<int32, 34, 48> ShieldBlock; - UpdateField<float, 34, 49> ShieldBlockCritPercentage; - UpdateField<float, 34, 50> Mastery; - UpdateField<float, 34, 51> Speed; - UpdateField<float, 34, 52> Avoidance; - UpdateField<float, 34, 53> Sturdiness; - UpdateField<int32, 34, 54> Versatility; - UpdateField<float, 34, 55> VersatilityBonus; - UpdateField<float, 34, 56> PvpPowerDamage; - UpdateField<float, 34, 57> PvpPowerHealing; - UpdateField<int32, 34, 58> ModHealingDonePos; - UpdateField<float, 34, 59> ModHealingPercent; - UpdateField<float, 34, 60> ModHealingDonePercent; - UpdateField<float, 34, 61> ModPeriodicHealingDonePercent; - UpdateField<float, 34, 62> ModSpellPowerPercent; - UpdateField<float, 34, 63> ModResiliencePercent; - UpdateField<float, 34, 64> OverrideSpellPowerByAPPercent; - UpdateField<float, 34, 65> OverrideAPBySpellPowerPercent; - UpdateField<int32, 66, 67> ModTargetResistance; - UpdateField<int32, 66, 68> ModTargetPhysicalResistance; - UpdateField<int32, 66, 69> LocalFlags; - UpdateField<uint8, 66, 70> GrantableLevels; - UpdateField<uint8, 66, 71> MultiActionBars; - UpdateField<uint8, 66, 72> LifetimeMaxRank; - UpdateField<uint8, 66, 73> NumRespecs; - UpdateField<uint32, 66, 74> PvpMedals; - UpdateField<uint16, 66, 75> TodayHonorableKills; - UpdateField<uint16, 66, 76> YesterdayHonorableKills; - UpdateField<uint32, 66, 77> LifetimeHonorableKills; - UpdateField<int32, 66, 78> WatchedFactionIndex; - UpdateField<int32, 66, 79> MaxLevel; - UpdateField<int32, 66, 80> ScalingPlayerLevelDelta; - UpdateField<int32, 66, 81> MaxCreatureScalingLevel; - UpdateField<int32, 66, 82> PetSpellPower; - UpdateField<float, 66, 83> UiHitModifier; - UpdateField<float, 66, 84> UiSpellHitModifier; - UpdateField<int32, 66, 85> HomeRealmTimeOffset; - UpdateField<float, 66, 86> ModPetHaste; - UpdateField<uint8, 66, 87> LocalRegenFlags; - UpdateField<uint8, 66, 88> AuraVision; - UpdateField<uint8, 66, 89> NumBackpackSlots; - UpdateField<int32, 66, 90> OverrideSpellsID; - UpdateField<int32, 66, 91> LfgBonusFactionID; - UpdateField<uint16, 66, 92> LootSpecID; - UpdateField<uint32, 66, 93> OverrideZonePVPType; - UpdateField<int32, 66, 94> Honor; - UpdateField<int32, 66, 95> HonorNextLevel; - UpdateField<int32, 66, 96> PvpRewardAchieved; - UpdateField<int32, 66, 97> PvpTierMaxFromWins; - UpdateField<int32, 98, 99> PvpLastWeeksRewardAchieved; - UpdateField<int32, 98, 100> PvpLastWeeksTierMaxFromWins; - UpdateField<int32, 98, 101> PvpLastWeeksRewardClaimed; - UpdateField<uint8, 98, 102> NumBankSlots; - OptionalUpdateField<UF::QuestSession, 98, 103> QuestSession; - UpdateFieldArray<ObjectGuid, 199, 104, 105> InvSlots; - UpdateFieldArray<uint32, 2, 304, 305> TrackResourceMask; - UpdateFieldArray<uint64, 192, 307, 308> ExploredZones; - UpdateFieldArray<UF::RestInfo, 2, 500, 501> RestInfo; - UpdateFieldArray<int32, 7, 503, 504> ModDamageDonePos; - UpdateFieldArray<int32, 7, 503, 511> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 503, 518> ModDamageDonePercent; - UpdateFieldArray<float, 3, 525, 526> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 525, 529> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 532, 533> BuybackPrice; - UpdateFieldArray<uint32, 12, 532, 545> BuybackTimestamp; - UpdateFieldArray<int32, 32, 557, 558> CombatRatings; - UpdateFieldArray<UF::PVPInfo, 6, 590, 591> PvpInfo; - UpdateFieldArray<uint32, 4, 597, 598> NoReagentCostMask; - UpdateFieldArray<int32, 2, 602, 603> ProfessionSkillLine; - UpdateFieldArray<uint32, 4, 605, 606> BagSlotFlags; - UpdateFieldArray<uint32, 7, 610, 611> BankBagSlotFlags; - UpdateFieldArray<uint64, 875, 618, 619> QuestCompleted; + DynamicUpdateField<uint32, 0, 17> RuneforgePowers; + DynamicUpdateField<uint32, 0, 18> TransmogIllusions; + DynamicUpdateField<UF::SpellPctModByLabel, 0, 20> SpellPctModByLabel; + DynamicUpdateField<UF::SpellFlatModByLabel, 0, 21> SpellFlatModByLabel; + DynamicUpdateField<UF::MawPower, 0, 22> MawPowers; + DynamicUpdateField<UF::MultiFloorExplore, 0, 23> MultiFloorExploration; + DynamicUpdateField<UF::RecipeProgressionInfo, 0, 24> RecipeProgression; + DynamicUpdateField<UF::ReplayedQuest, 0, 25> ReplayedQuests; + DynamicUpdateField<int32, 0, 26> DisabledSpells; + DynamicUpdateField<UF::CharacterRestriction, 0, 19> CharacterRestrictions; + UpdateField<ObjectGuid, 0, 29> FarsightObject; + UpdateField<ObjectGuid, 0, 30> SummonedBattlePetGUID; + UpdateField<uint64, 0, 31> Coinage; + UpdateField<int32, 0, 32> XP; + UpdateField<int32, 0, 33> NextLevelXP; + UpdateField<int32, 34, 35> TrialXP; + UpdateField<UF::SkillInfo, 34, 36> Skill; + UpdateField<int32, 34, 37> CharacterPoints; + UpdateField<int32, 34, 38> MaxTalentTiers; + UpdateField<int32, 34, 39> TrackCreatureMask; + UpdateField<float, 34, 40> MainhandExpertise; + UpdateField<float, 34, 41> OffhandExpertise; + UpdateField<float, 34, 42> RangedExpertise; + UpdateField<float, 34, 43> CombatRatingExpertise; + UpdateField<float, 34, 44> BlockPercentage; + UpdateField<float, 34, 45> DodgePercentage; + UpdateField<float, 34, 46> DodgePercentageFromAttribute; + UpdateField<float, 34, 47> ParryPercentage; + UpdateField<float, 34, 48> ParryPercentageFromAttribute; + UpdateField<float, 34, 49> CritPercentage; + UpdateField<float, 34, 50> RangedCritPercentage; + UpdateField<float, 34, 51> OffhandCritPercentage; + UpdateField<float, 34, 52> SpellCritPercentage; + UpdateField<int32, 34, 53> ShieldBlock; + UpdateField<float, 34, 54> ShieldBlockCritPercentage; + UpdateField<float, 34, 55> Mastery; + UpdateField<float, 34, 56> Speed; + UpdateField<float, 34, 57> Avoidance; + UpdateField<float, 34, 58> Sturdiness; + UpdateField<int32, 34, 59> Versatility; + UpdateField<float, 34, 60> VersatilityBonus; + UpdateField<float, 34, 61> PvpPowerDamage; + UpdateField<float, 34, 62> PvpPowerHealing; + UpdateField<int32, 34, 63> ModHealingDonePos; + UpdateField<float, 34, 64> ModHealingPercent; + UpdateField<float, 34, 65> ModPeriodicHealingDonePercent; + UpdateField<float, 66, 67> ModSpellPowerPercent; + UpdateField<float, 66, 68> ModResiliencePercent; + UpdateField<float, 66, 69> OverrideSpellPowerByAPPercent; + UpdateField<float, 66, 70> OverrideAPBySpellPowerPercent; + UpdateField<int32, 66, 71> ModTargetResistance; + UpdateField<int32, 66, 72> ModTargetPhysicalResistance; + UpdateField<uint32, 66, 73> LocalFlags; + UpdateField<uint8, 66, 74> GrantableLevels; + UpdateField<uint8, 66, 75> MultiActionBars; + UpdateField<uint8, 66, 76> LifetimeMaxRank; + UpdateField<uint8, 66, 77> NumRespecs; + UpdateField<uint32, 66, 78> PvpMedals; + UpdateField<uint16, 66, 79> TodayHonorableKills; + UpdateField<uint16, 66, 80> YesterdayHonorableKills; + UpdateField<uint32, 66, 81> LifetimeHonorableKills; + UpdateField<int32, 66, 82> WatchedFactionIndex; + UpdateField<int32, 66, 83> MaxLevel; + UpdateField<int32, 66, 84> ScalingPlayerLevelDelta; + UpdateField<int32, 66, 85> MaxCreatureScalingLevel; + UpdateField<int32, 66, 86> PetSpellPower; + UpdateField<float, 66, 87> UiHitModifier; + UpdateField<float, 66, 88> UiSpellHitModifier; + UpdateField<int32, 66, 89> HomeRealmTimeOffset; + UpdateField<float, 66, 90> ModPetHaste; + UpdateField<int8, 66, 91> JailersTowerLevelMax; + UpdateField<int8, 66, 92> JailersTowerLevel; + UpdateField<uint8, 66, 93> LocalRegenFlags; + UpdateField<uint8, 66, 94> AuraVision; + UpdateField<uint8, 66, 95> NumBackpackSlots; + UpdateField<int32, 66, 96> OverrideSpellsID; + UpdateField<uint16, 66, 97> LootSpecID; + UpdateField<uint32, 98, 99> OverrideZonePVPType; + UpdateField<ObjectGuid, 98, 100> BnetAccount; + UpdateField<uint64, 98, 101> GuildClubMemberID; + UpdateField<int32, 98, 102> Honor; + UpdateField<int32, 98, 103> HonorNextLevel; + UpdateField<int32, 98, 104> PvpRewardAchieved; + UpdateField<int32, 98, 105> PvpTierMaxFromWins; + UpdateField<int32, 98, 106> PvpLastWeeksRewardAchieved; + UpdateField<int32, 98, 107> PvpLastWeeksTierMaxFromWins; + UpdateField<int32, 98, 108> PvpLastWeeksRewardClaimed; + UpdateField<uint8, 98, 109> NumBankSlots; + UpdateField<UF::ActivePlayerUnk901, 98, 111> Field_1410; + OptionalUpdateField<UF::QuestSession, 98, 110> QuestSession; + UpdateField<int32, 98, 112> UiChromieTimeExpansionID; + UpdateField<int32, 98, 113> TransportServerTime; + UpdateFieldArray<ObjectGuid, 199, 114, 115> InvSlots; + UpdateFieldArray<uint32, 2, 314, 315> TrackResourceMask; + UpdateFieldArray<uint64, 192, 317, 318> ExploredZones; + UpdateFieldArray<UF::RestInfo, 2, 510, 511> RestInfo; + UpdateFieldArray<int32, 7, 513, 514> ModDamageDonePos; + UpdateFieldArray<int32, 7, 513, 521> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 513, 528> ModDamageDonePercent; + UpdateFieldArray<float, 7, 513, 535> ModHealingDonePercent; + UpdateFieldArray<float, 3, 542, 543> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 542, 546> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 549, 550> BuybackPrice; + UpdateFieldArray<uint32, 12, 549, 562> BuybackTimestamp; + UpdateFieldArray<int32, 32, 574, 575> CombatRatings; + UpdateFieldArray<UF::PVPInfo, 6, 607, 608> PvpInfo; + UpdateFieldArray<uint32, 4, 614, 615> NoReagentCostMask; + UpdateFieldArray<int32, 2, 619, 620> ProfessionSkillLine; + UpdateFieldArray<uint32, 4, 622, 623> BagSlotFlags; + UpdateFieldArray<uint32, 7, 627, 628> BankBagSlotFlags; + UpdateFieldArray<uint64, 875, 635, 636> QuestCompleted; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<1494> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<1511> const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const; void ClearChangesMask(); }; -struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<20> +struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<21> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<int32, 0, 2> EnableDoodadSets; @@ -673,25 +799,26 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask< struct FlagsTag : ViewerDependentValueTag<uint32> {}; UpdateField<QuaternionData, 0, 12> ParentRotation; UpdateField<int32, 0, 13> FactionTemplate; - UpdateField<int32, 0, 14> Level; - struct LevelTag : ViewerDependentValueTag<int32> {}; - UpdateField<int8, 0, 15> State; + UpdateField<int8, 0, 14> State; struct StateTag : ViewerDependentValueTag<int8> {}; - UpdateField<int8, 0, 16> TypeID; - UpdateField<uint8, 0, 17> PercentHealth; - UpdateField<uint32, 0, 18> ArtKit; - UpdateField<uint32, 0, 19> CustomParam; + UpdateField<int8, 0, 15> TypeID; + UpdateField<uint8, 0, 16> PercentHealth; + UpdateField<uint32, 0, 17> ArtKit; + UpdateField<uint32, 0, 18> CustomParam; + UpdateField<int32, 0, 19> Level; + struct LevelTag : ViewerDependentValueTag<int32> {}; + UpdateField<uint32, 0, 20> AnimGroupInstance; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<20> const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<21> const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const; void ClearChangesMask(); }; struct DynamicObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<7> { UpdateField<ObjectGuid, 0, 1> Caster; - UpdateField<int32, 0, 2> SpellXSpellVisualID; + UpdateField<UF::SpellCastVisual, 0, 2> SpellVisual; UpdateField<int32, 0, 3> SpellID; UpdateField<float, 0, 4> Radius; UpdateField<uint32, 0, 5> CastTime; @@ -703,29 +830,25 @@ struct DynamicObjectData : public IsUpdateFieldStructureTag, public HasChangesMa void ClearChangesMask(); }; -struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<40> -{ - UpdateField<uint32, 0, 1> DynamicFlags; - UpdateField<ObjectGuid, 0, 2> Owner; - UpdateField<ObjectGuid, 0, 3> PartyGUID; - UpdateField<ObjectGuid, 0, 4> GuildGUID; - UpdateField<uint32, 0, 5> DisplayID; - UpdateField<uint8, 0, 6> Unused; - UpdateField<uint8, 0, 7> RaceID; - UpdateField<uint8, 0, 8> Sex; - UpdateField<uint8, 0, 9> SkinID; - UpdateField<uint8, 0, 10> FaceID; - UpdateField<uint8, 0, 11> HairStyleID; - UpdateField<uint8, 0, 12> HairColorID; - UpdateField<uint8, 0, 13> FacialHairStyleID; - UpdateField<uint32, 0, 14> Flags; - UpdateField<int32, 0, 15> FactionTemplate; - UpdateFieldArray<uint32, 19, 16, 17> Items; - UpdateFieldArray<uint8, 3, 36, 37> CustomDisplayOption; +struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<33> +{ + DynamicUpdateField<UF::ChrCustomizationChoice, 0, 1> Customizations; + UpdateField<uint32, 0, 2> DynamicFlags; + UpdateField<ObjectGuid, 0, 3> Owner; + UpdateField<ObjectGuid, 0, 4> PartyGUID; + UpdateField<ObjectGuid, 0, 5> GuildGUID; + UpdateField<uint32, 0, 6> DisplayID; + UpdateField<uint8, 0, 7> Unused; + UpdateField<uint8, 0, 8> RaceID; + UpdateField<uint8, 0, 9> Sex; + UpdateField<uint32, 0, 10> Flags; + UpdateField<int32, 0, 11> FactionTemplate; + UpdateField<uint32, 0, 12> StateSpellVisualKitID; + UpdateFieldArray<uint32, 19, 13, 14> Items; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, UpdateMask<40> const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, UpdateMask<33> const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const; void ClearChangesMask(); }; @@ -752,7 +875,7 @@ struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask UpdateField<uint32, 0, 7> TimeToTargetExtraScale; UpdateField<int32, 0, 8> SpellID; UpdateField<int32, 0, 9> SpellForVisuals; - UpdateField<int32, 0, 10> SpellXSpellVisualID; + UpdateField<UF::SpellCastVisual, 0, 10> SpellVisual; UpdateField<float, 0, 11> BoundsRadius2D; UpdateField<uint32, 0, 12> DecalPropertiesID; UpdateField<ObjectGuid, 0, 13> CreatingEffectGUID; @@ -783,9 +906,12 @@ struct ConversationLine : public IsUpdateFieldStructureTag int32 UiCameraID; uint8 ActorIndex; uint8 Flags; + uint8 ChatType; void WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const; + bool operator==(ConversationLine const& right) const; + bool operator!=(ConversationLine const& right) const { return !(*this == right); } }; struct ConversationActor : public IsUpdateFieldStructureTag @@ -795,9 +921,12 @@ struct ConversationActor : public IsUpdateFieldStructureTag ObjectGuid ActorGUID; int32 Field_18; uint32 Type; + uint32 NoActorObject; void WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const; + bool operator==(ConversationActor const& right) const; + bool operator!=(ConversationActor const& right) const { return !(*this == right); } }; struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<5> diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 446da0feb52..e3af501cb59 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -172,6 +172,7 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) m_team = 0; m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); + m_customizationsChanged = false; memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT); @@ -439,7 +440,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac return false; } - if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Sex, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHairStyle, createInfo->Skin, createInfo->CustomDisplay, true)) + if (!GetSession()->ValidateAppearance(Races(createInfo->Race), Classes(createInfo->Class), Gender(createInfo->Sex), MakeChrCustomizationChoiceRange(createInfo->Customizations))) { TC_LOG_ERROR("entities.player.cheat", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with invalid appearance attributes - refusing to do so", GetSession()->GetAccountId(), m_name.c_str()); @@ -478,13 +479,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac SetWatchedFactionIndex(-1); - SetSkinId(createInfo->Skin); - SetFaceId(createInfo->Face); - SetHairStyleId(createInfo->HairStyle); - SetHairColorId(createInfo->HairColor); - SetFacialHairStyleId(createInfo->FacialHairStyle); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - SetCustomDisplayOption(i, createInfo->CustomDisplay[i]); + SetCustomizations(Trinity::Containers::MakeIteratorPair(createInfo->Customizations.begin(), createInfo->Customizations.end())); SetRestState(REST_TYPE_XP, (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED); SetRestState(REST_TYPE_HONOR, REST_STATE_NOT_RAF_LINKED); SetNativeSex(createInfo->Sex); @@ -559,47 +554,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac } // original items - if (CharStartOutfitEntry const* oEntry = sDB2Manager.GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Sex)) - { - for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) - { - if (oEntry->ItemID[j] <= 0) - continue; - - uint32 itemId = oEntry->ItemID[j]; - - // just skip, reported in ObjectMgr::LoadItemTemplates - ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId); - if (!iProto) - continue; - - // BuyCount by default - uint32 count = iProto->GetBuyCount(); - - // special amount for food/drink - if (iProto->GetClass() == ITEM_CLASS_CONSUMABLE && iProto->GetSubClass() == ITEM_SUBCLASS_FOOD_DRINK) - { - if (iProto->Effects.size() >= 1) - { - switch (iProto->Effects[0]->SpellCategoryID) - { - case SPELL_CATEGORY_FOOD: // food - count = getClass() == CLASS_DEATH_KNIGHT ? 10 : 4; - break; - case SPELL_CATEGORY_DRINK: // drink - count = 2; - break; - } - } - if (iProto->GetMaxStackSize() < count) - count = iProto->GetMaxStackSize(); - } - StoreNewItemInBestSlots(itemId, count); - } - } - - for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr) - StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount); + for (PlayerCreateInfoItem initialItem : info->item) + StoreNewItemInBestSlots(initialItem.item_id, initialItem.item_amount); // bags and main-hand weapon must equipped at this moment // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon) @@ -2532,13 +2488,13 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePos), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingPercent), 1.0f); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent), 1.0f); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModPeriodicHealingDonePercent), 1.0f); for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDoneNeg, i), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDonePos, i), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDonePercent, i), 1.0f); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent, i), 1.0f); } SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModSpellPowerPercent), 1.0f); @@ -3973,6 +3929,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_CUSTOMIZATIONS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4477,12 +4437,8 @@ Corpse* Player::CreateCorpse() flags |= CORPSE_FLAG_FFA_PVP; corpse->SetRace(getRace()); - corpse->SetSex(m_playerData->NativeSex); - corpse->SetSkin(m_playerData->SkinID); - corpse->SetFace(m_playerData->FaceID); - corpse->SetHairStyle(m_playerData->HairStyleID); - corpse->SetHairColor(m_playerData->HairColorID); - corpse->SetFacialHairStyle(m_playerData->FacialHairStyleID); + corpse->SetSex(GetNativeSex()); + corpse->SetCustomizations(Trinity::Containers::MakeIteratorPair(m_playerData->Customizations.begin(), m_playerData->Customizations.end())); corpse->SetFlags(flags); corpse->SetDisplayId(GetNativeDisplayId()); corpse->SetFactionTemplate(sChrRacesStore.AssertEntry(getRace())->FactionID); @@ -4798,6 +4754,9 @@ bool Player::CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, Area if ((channel->Flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId()) return false; + if (channel->Flags & CHANNEL_DBC_FLAG_NO_CLIENT_JOIN) + return false; + return true; } @@ -4850,6 +4809,9 @@ void Player::UpdateLocalChannels(uint32 newZone) if (!channelEntry) continue; + if (!(channelEntry->Flags & CHANNEL_DBC_FLAG_INITIAL)) + continue; + Channel* usedChannel = nullptr; for (Channel* channel : m_channels) { @@ -6153,7 +6115,7 @@ void Player::CheckAreaExploreAndOutdoor() UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA, GetAreaId()); - if (areaEntry->ExplorationLevel > 0) + if (Optional<ContentTuningLevels> areaLevels = sDB2Manager.GetContentTuningData(areaEntry->ContentTuningID, m_playerData->CtrOptions->ContentTuningConditionMask)) { if (getLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { @@ -6161,11 +6123,12 @@ void Player::CheckAreaExploreAndOutdoor() } else { - int32 diff = int32(getLevel()) - areaEntry->ExplorationLevel; + int16 areaLevel = std::min(std::max(int16(getLevel()), areaLevels->MinLevel), areaLevels->MaxLevel); + int32 diff = int32(getLevel()) - areaLevel; uint32 XP; if (diff < -5) { - XP = uint32(sObjectMgr->GetBaseXP(getLevel()+5)*sWorld->getRate(RATE_XP_EXPLORE)); + XP = uint32(sObjectMgr->GetBaseXP(getLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE)); } else if (diff > 5) { @@ -6173,11 +6136,11 @@ void Player::CheckAreaExploreAndOutdoor() if (exploration_percent < 0) exploration_percent = 0; - XP = uint32(sObjectMgr->GetBaseXP(areaEntry->ExplorationLevel)*exploration_percent/100*sWorld->getRate(RATE_XP_EXPLORE)); + XP = uint32(sObjectMgr->GetBaseXP(areaLevel) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE)); } else { - XP = uint32(sObjectMgr->GetBaseXP(areaEntry->ExplorationLevel)*sWorld->getRate(RATE_XP_EXPLORE)); + XP = uint32(sObjectMgr->GetBaseXP(areaLevel) * sWorld->getRate(RATE_XP_EXPLORE)); } GiveXP(XP, nullptr); @@ -6329,8 +6292,9 @@ void Player::RewardReputation(Unit* victim, float rate) Map const* map = GetMap(); if (map->IsNonRaidDungeon()) if (LFGDungeonsEntry const* dungeon = DB2Manager::GetLfgDungeon(map->GetId(), map->GetDifficultyID())) - if (dungeon->TargetLevel == 80) - ChampioningFaction = GetChampioningFaction(); + if (Optional<ContentTuningLevels> dungeonLevels = sDB2Manager.GetContentTuningData(dungeon->ContentTuningID, m_playerData->CtrOptions->ContentTuningConditionMask)) + if (dungeonLevels->TargetLevelMax == int16(GetMaxLevelForExpansion(EXPANSION_WRATH_OF_THE_LICH_KING))) + ChampioningFaction = GetChampioningFaction(); } uint32 team = GetTeam(); @@ -6862,7 +6826,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo // Currency that is immediately converted into reputation with that faction instead if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(currency->FactionID)) { - if (currency->Flags & CURRENCY_FLAG_HIGH_PRECISION) + if (currency->Flags[0] & CURRENCY_FLAG_HIGH_PRECISION) count /= 100; GetReputationMgr().ModifyReputation(factionEntry, count, false, true); return; @@ -7152,6 +7116,8 @@ void Player::UpdateArea(uint32 newArea) _restMgr->SetRestFlag(REST_FLAG_IN_FACTION_AREA); else _restMgr->RemoveRestFlag(REST_FLAG_IN_FACTION_AREA); + + UpdateCriteria(CRITERIA_TYPE_TRAVELLED_TO_AREA, newArea); } void Player::UpdateZone(uint32 newZone, uint32 newArea) @@ -11542,9 +11508,12 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool return EQUIP_ERR_CLIENT_LOCKED_OUT; } - ScalingStatDistributionEntry const* ssd = pItem->GetScalingStatDistribution() ? sScalingStatDistributionStore.LookupEntry(pItem->GetScalingStatDistribution()) : nullptr; + Optional<ContentTuningLevels> requiredLevels; // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items) - if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < getLevel() && !sDB2Manager.GetHeirloomByItemId(pProto->GetId())) + if (pItem->GetQuality() == ITEM_QUALITY_HEIRLOOM) + requiredLevels = sDB2Manager.GetContentTuningData(pItem->GetScalingContentTuningId(), 0, true); + + if (requiredLevels && requiredLevels->MaxLevel < DEFAULT_MAX_LEVEL && requiredLevels->MaxLevel < getLevel() && !sDB2Manager.GetHeirloomByItemId(pProto->GetId())) return EQUIP_ERR_NOT_EQUIPPABLE; uint8 eslot = FindEquipSlot(pProto, slot, swap); @@ -14975,15 +14944,17 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source) int32 Player::GetQuestMinLevel(Quest const* quest) const { - if (quest->GetQuestLevel() == -1 && quest->GetQuestScalingFactionGroup()) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), m_playerData->CtrOptions->ContentTuningConditionMask)) { ChrRacesEntry const* race = sChrRacesStore.AssertEntry(getRace()); FactionTemplateEntry const* raceFaction = sFactionTemplateStore.LookupEntry(race->FactionID); - if (!raceFaction || raceFaction->FactionGroup != quest->GetQuestScalingFactionGroup()) - return quest->GetQuestMaxScalingLevel(); + if (!raceFaction || raceFaction->FactionGroup != sContentTuningStore.AssertEntry(quest->GetContentTuningId())->GetScalingFactionGroup()) + return questLevels->MaxLevel; + + return questLevels->MinLevelWithDelta; } - return quest->GetMinLevel(); + return 0; } int32 Player::GetQuestLevel(Quest const* quest) const @@ -14991,10 +14962,10 @@ int32 Player::GetQuestLevel(Quest const* quest) const if (!quest) return 0; - if (quest->GetQuestLevel() == -1) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), m_playerData->CtrOptions->ContentTuningConditionMask)) { int32 minLevel = GetQuestMinLevel(quest); - int32 maxLevel = quest->GetQuestMaxScalingLevel(); + int32 maxLevel = questLevels->MaxLevel; int32 level = getLevel(); if (level >= minLevel) return std::min(level, maxLevel); @@ -15002,7 +14973,7 @@ int32 Player::GetQuestLevel(Quest const* quest) const return minLevel; } - return quest->GetQuestLevel(); + return 0; } void Player::PrepareQuestMenu(ObjectGuid guid) @@ -15913,6 +15884,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetQuestId()); UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUEST_COUNT); UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId()); + UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUEST_ACCUMULATE, 1); // make full db save SaveToDB(false); @@ -17918,20 +17890,6 @@ bool Player::IsLoading() const bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 - //"SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " - // 22 23 24 25 26 27 28 29 30 31 32 33 34 - //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " - // 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 - //"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " - // 50 51 52 53 54 55 - //"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - // 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 - //"health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishing_steps " - // 72 73 74 75 76 - //"honor, honorLevel, honor_rest_state, honor_rest_bonus, numRespecs " - // - //"FROM characters WHERE guid = ?", CONNECTION_ASYNC); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); if (!result) { @@ -17941,15 +17899,158 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) return false; } - Field* fields = result->Fetch(); - - uint32 dbAccountId = fields[1].GetUInt32(); + struct PlayerLoadData + { + // "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + // "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + // "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + // "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + // "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, " + // "honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + // "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC); + + ObjectGuid::LowType guid; + uint32 account; + std::string name; + uint8 race; + uint8 class_; + Gender gender; + uint8 level; + uint32 xp; + uint64 money; + uint8 inventorySlots; + uint8 bankSlots; + PlayerRestState restState; + PlayerFlags playerFlags; + PlayerFlagsEx playerFlagsEx; + float position_x; + float position_y; + float position_z; + uint16 map; + float orientation; + std::string taximask; + uint8 cinematic; + uint32 totaltime; + uint32 leveltime; + float rest_bonus; + uint32 logout_time; + uint8 is_logout_resting; + uint32 resettalents_cost; + uint32 resettalents_time; + uint32 primarySpecialization; + float trans_x; + float trans_y; + float trans_z; + float trans_o; + ObjectGuid::LowType transguid; + uint16 extra_flags; + uint8 stable_slots; + uint16 at_login; + uint16 zone; + uint8 online; + uint32 death_expire_time; + std::string taxi_path; + Difficulty dungeonDifficulty; + uint32 totalKills; + uint16 todayKills; + uint16 yesterdayKills; + uint32 chosenTitle; + uint32 watchedFaction; + uint8 drunk; + uint32 health; + std::array<uint32, MAX_POWERS_PER_CLASS> powers; + uint32 instance_id; + uint8 activeTalentGroup; + uint32 lootSpecId; + std::string exploredZones; + std::string knownTitles; + uint8 actionBars; + Difficulty raidDifficulty; + Difficulty legacyRaidDifficulty; + uint8 fishingSteps; + uint32 honor; + uint32 honorLevel; + PlayerRestState honorRestState; + float honorRestBonus; + uint8 numRespecs; + + PlayerLoadData(Field* fields) + { + std::size_t i = 0; + guid = fields[i++].GetUInt64(); + account = fields[i++].GetUInt32(); + name = fields[i++].GetString(); + race = fields[i++].GetUInt8(); + class_ = fields[i++].GetUInt8(); + gender = Gender(fields[i++].GetUInt8()); + level = fields[i++].GetUInt8(); + xp = fields[i++].GetUInt32(); + money = fields[i++].GetUInt64(); + inventorySlots = fields[i++].GetUInt8(); + bankSlots = fields[i++].GetUInt8(); + restState = PlayerRestState(fields[i++].GetUInt8()); + playerFlags = PlayerFlags(fields[i++].GetUInt32()); + playerFlagsEx = PlayerFlagsEx(fields[i++].GetUInt32()); + position_x = fields[i++].GetFloat(); + position_y = fields[i++].GetFloat(); + position_z = fields[i++].GetFloat(); + map = fields[i++].GetUInt16(); + orientation = fields[i++].GetFloat(); + taximask = fields[i++].GetString(); + cinematic = fields[i++].GetUInt8(); + totaltime = fields[i++].GetUInt32(); + leveltime = fields[i++].GetUInt32(); + rest_bonus = fields[i++].GetFloat(); + logout_time = fields[i++].GetUInt32(); + is_logout_resting = fields[i++].GetUInt8(); + resettalents_cost = fields[i++].GetUInt32(); + resettalents_time = fields[i++].GetUInt32(); + primarySpecialization = fields[i++].GetUInt32(); + trans_x = fields[i++].GetFloat(); + trans_y = fields[i++].GetFloat(); + trans_z = fields[i++].GetFloat(); + trans_o = fields[i++].GetFloat(); + transguid = fields[i++].GetUInt64(); + extra_flags = fields[i++].GetUInt16(); + stable_slots = fields[i++].GetUInt8(); + at_login = fields[i++].GetUInt16(); + zone = fields[i++].GetUInt16(); + online = fields[i++].GetUInt8(); + death_expire_time = fields[i++].GetUInt32(); + taxi_path = fields[i++].GetString(); + dungeonDifficulty = Difficulty(fields[i++].GetUInt8()); + totalKills = fields[i++].GetUInt32(); + todayKills = fields[i++].GetUInt16(); + yesterdayKills = fields[i++].GetUInt16(); + chosenTitle = fields[i++].GetUInt32(); + watchedFaction = fields[i++].GetUInt32(); + drunk = fields[i++].GetUInt8(); + health = fields[i++].GetUInt32(); + for (uint32& power : powers) + power = fields[i++].GetUInt32(); + instance_id = fields[i++].GetUInt32(); + activeTalentGroup = fields[i++].GetUInt8(); + lootSpecId = fields[i++].GetUInt32(); + exploredZones = fields[i++].GetString(); + knownTitles = fields[i++].GetString(); + actionBars = fields[i++].GetUInt8(); + raidDifficulty = Difficulty(fields[i++].GetUInt8()); + legacyRaidDifficulty = Difficulty(fields[i++].GetUInt8()); + fishingSteps = fields[i++].GetUInt8(); + honor = fields[i++].GetUInt32(); + honorLevel = fields[i++].GetUInt32(); + honorRestState = PlayerRestState(fields[i++].GetUInt8()); + honorRestBonus = fields[i++].GetFloat(); + numRespecs = fields[i++].GetUInt8(); + } + + } fields(result->Fetch()); // check if the character's account in the db and the logged in account match. // player should be able to load/delete character only with correct account! - if (dbAccountId != GetSession()->GetAccountId()) + if (fields.account != GetSession()->GetAccountId()) { - TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) loading from wrong account (is: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), dbAccountId); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) loading from wrong account (is: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), fields.account); return false; } @@ -17961,7 +18062,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) Object::_Create(guid); - m_name = fields[2].GetString(); + m_name = std::move(fields.name); // check name limitations if (ObjectMgr::CheckPlayerName(m_name, GetSession()->GetSessionDbcLocale()) != CHAR_NAME_SUCCESS || @@ -17974,19 +18075,18 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) return false; } - // overwrite possible wrong/corrupted guid SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::WowAccount), GetSession()->GetAccountGUID()); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BnetAccount), GetSession()->GetBattlenetAccountGUID()); - uint8 gender = fields[5].GetUInt8(); - if (!IsValidGender(gender)) + if (!IsValidGender(fields.gender)) { - TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong gender (%u), can't load.", guid.ToString().c_str(), gender); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong gender (%u), can't load.", guid.ToString().c_str(), uint32(fields.gender)); return false; } - SetRace(fields[3].GetUInt8()); - SetClass(fields[4].GetUInt8()); - SetGender(gender); + SetRace(fields.race); + SetClass(fields.class_); + SetGender(fields.gender); // check if race/class combination is valid PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); @@ -17996,16 +18096,16 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) return false; } - SetLevel(fields[6].GetUInt8()); - SetXP(fields[7].GetUInt32()); + SetLevel(fields.level); + SetXP(fields.xp); - Tokenizer exploredZones(fields[66].GetString(), ' '); + Tokenizer exploredZones(fields.exploredZones, ' '); if (exploredZones.size() == PLAYER_EXPLORED_ZONES_SIZE * 2) for (std::size_t i = 0; i < exploredZones.size(); ++i) SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, i / 2), (uint64(atoul(exploredZones[i])) << (32 * (i % 2)))); - Tokenizer knownTitles(fields[67].GetString(), ' '); + Tokenizer knownTitles(fields.knownTitles, ' '); if (!(knownTitles.size() % 2)) { for (std::size_t i = 0; i < knownTitles.size(); ++i) @@ -18020,50 +18120,41 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) m_achievementMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS)); m_questObjectiveCriteriaMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_OBJECTIVES_CRITERIA), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_OBJECTIVES_CRITERIA_PROGRESS)); - uint64 money = fields[8].GetUInt64(); - if (money > MAX_MONEY_AMOUNT) - money = MAX_MONEY_AMOUNT; - SetMoney(money); - - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplay; - customDisplay[0] = fields[14].GetUInt8(); - customDisplay[1] = fields[15].GetUInt8(); - customDisplay[2] = fields[16].GetUInt8(); - - SetSkinId(fields[9].GetUInt8()); - SetFaceId(fields[10].GetUInt8()); - SetHairStyleId(fields[11].GetUInt8()); - SetHairColorId(fields[12].GetUInt8()); - SetFacialHairStyleId(fields[13].GetUInt8()); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - SetCustomDisplayOption(i, customDisplay[i]); - SetInventorySlotCount(fields[17].GetUInt8()); - SetBankBagSlotCount(fields[18].GetUInt8()); - SetNativeSex(gender); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Inebriation), fields[55].GetUInt8()); - SetPlayerFlags(PlayerFlags(fields[20].GetUInt32())); - SetPlayerFlagsEx(PlayerFlagsEx(fields[21].GetUInt32())); - SetWatchedFactionIndex(fields[54].GetUInt32()); - - if (!ValidateAppearance( - fields[3].GetUInt8(), // race - fields[4].GetUInt8(), // class - gender, - m_playerData->HairStyleID, - m_playerData->HairColorID, - m_playerData->FaceID, - m_playerData->FacialHairStyleID, - m_playerData->SkinID, - customDisplay)) + SetMoney(std::min(fields.money, MAX_MONEY_AMOUNT)); + + std::vector<UF::ChrCustomizationChoice> customizations; + if (PreparedQueryResult customizationsResult = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CUSTOMIZATIONS)) + { + do + { + Field* fields = customizationsResult->Fetch(); + customizations.emplace_back(); + UF::ChrCustomizationChoice& choice = customizations.back(); + choice.ChrCustomizationOptionID = fields[0].GetUInt32(); + choice.ChrCustomizationChoiceID = fields[1].GetUInt32(); + + } while (customizationsResult->NextRow()); + } + + SetCustomizations(Trinity::Containers::MakeIteratorPair(customizations.begin(), customizations.end()), false); + SetInventorySlotCount(fields.inventorySlots); + SetBankBagSlotCount(fields.bankSlots); + SetNativeSex(fields.gender); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Inebriation), fields.drunk); + SetPlayerFlags(fields.playerFlags); + SetPlayerFlagsEx(fields.playerFlagsEx); + SetWatchedFactionIndex(fields.watchedFaction); + + if (!GetSession()->ValidateAppearance(Races(getRace()), Classes(getClass()), fields.gender, MakeChrCustomizationChoiceRange(customizations))) { TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong Appearance values (Hair/Skin/Color), can't load.", guid.ToString().c_str()); return false; } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetMultiActionBars(fields[68].GetUInt8()); + SetMultiActionBars(fields.actionBars); - m_fishingSteps = fields[71].GetUInt8(); + m_fishingSteps = fields.fishingSteps; InitDisplayIds(); @@ -18092,27 +18183,23 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic - ObjectGuid::LowType transLowGUID = fields[41].GetUInt64(); - - Relocate(fields[22].GetFloat(), fields[23].GetFloat(), fields[24].GetFloat(), fields[26].GetFloat()); - - uint32 mapId = fields[25].GetUInt16(); - uint32 instanceId = fields[63].GetUInt32(); + Relocate(fields.position_x, fields.position_y, fields.position_z, fields.orientation); - SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[49].GetUInt8()))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[69].GetUInt8()))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[70].GetUInt8()))); + uint32 mapId = fields.map; + uint32 instanceId = fields.instance_id; - std::string taxi_nodes = fields[48].GetString(); + SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(fields.dungeonDifficulty)); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID(fields.raidDifficulty)); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(fields.legacyRaidDifficulty)); #define RelocateToHomebind(){ mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); } _LoadGroup(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GROUP)); _LoadCurrency(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CURRENCY)); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::LifetimeHonorableKills), fields[50].GetUInt32()); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TodayHonorableKills), fields[51].GetUInt16()); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::YesterdayHonorableKills), fields[52].GetUInt16()); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::LifetimeHonorableKills), fields.totalKills); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TodayHonorableKills), fields.totalKills); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::YesterdayHonorableKills), fields.yesterdayKills); _LoadBoundInstances(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES)); _LoadInstanceTimeRestrictions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES)); @@ -18183,9 +18270,9 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) } } // currently we do not support transport in bg - else if (transLowGUID) + else if (fields.transguid) { - ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Transport>(transLowGUID); + ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Transport>(fields.transguid); Transport* transport = nullptr; if (Transport* go = HashMapHolder<Transport>::Find(transGUID)) @@ -18193,7 +18280,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) if (transport) { - float x = fields[37].GetFloat(), y = fields[38].GetFloat(), z = fields[39].GetFloat(), o = fields[40].GetFloat(); + float x = fields.trans_x, y = fields.trans_y, z = fields.trans_z, o = fields.trans_o; m_movementInfo.transport.pos.Relocate(x, y, z, o); transport->CalculatePassengerPosition(x, y, z, &o); @@ -18221,13 +18308,13 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) else { TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has problems with transport guid (" UI64FMTD "). Teleport to bind location.", - guid.ToString().c_str(), transLowGUID); + guid.ToString().c_str(), fields.transguid); RelocateToHomebind(); } } // currently we do not support taxi in instance - else if (!taxi_nodes.empty()) + else if (!fields.taxi_path.empty()) { instanceId = 0; @@ -18237,7 +18324,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) for (int i = 0; i < 2; ++i) m_taxi.AddTaxiDestination(m_bgData.taxiPath[i]); } - else if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeam())) + else if (!m_taxi.LoadTaxiDestinationsFromString(fields.taxi_path, GetTeam())) { // problems with taxi path loading TaxiNodesEntry const* nodeEntry = nullptr; @@ -18388,7 +18475,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) SaveRecallPosition(); time_t now = time(nullptr); - time_t logoutTime = time_t(fields[32].GetUInt32()); + time_t logoutTime = time_t(fields.logout_time); // since last logout (in seconds) uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference. @@ -18401,18 +18488,18 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) SetDrunkValue(newDrunkValue); - m_cinematic = fields[28].GetUInt8(); - m_Played_time[PLAYED_TIME_TOTAL] = fields[29].GetUInt32(); - m_Played_time[PLAYED_TIME_LEVEL] = fields[30].GetUInt32(); + m_cinematic = fields.cinematic; + m_Played_time[PLAYED_TIME_TOTAL] = fields.totaltime; + m_Played_time[PLAYED_TIME_LEVEL] = fields.leveltime; - SetTalentResetCost(fields[34].GetUInt32()); - SetTalentResetTime(time_t(fields[35].GetUInt32())); + SetTalentResetCost(fields.resettalents_cost); + SetTalentResetTime(time_t(fields.resettalents_time)); - m_taxi.LoadTaxiMask(fields[27].GetString()); // must be before InitTaxiNodesForLevel + m_taxi.LoadTaxiMask(fields.taximask); // must be before InitTaxiNodesForLevel - uint32 extraflags = fields[42].GetUInt16(); + uint32 extraflags = fields.extra_flags; - m_stableSlots = fields[43].GetUInt8(); + m_stableSlots = fields.stable_slots; if (m_stableSlots > MAX_PET_STABLES) { TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) can't have more stable slots than %u, but has %u in DB", @@ -18420,7 +18507,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) m_stableSlots = MAX_PET_STABLES; } - m_atLoginFlags = fields[44].GetUInt16(); + m_atLoginFlags = fields.at_login; if (HasAtLoginFlag(AT_LOGIN_RENAME)) { @@ -18433,7 +18520,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) m_lastHonorUpdateTime = logoutTime; UpdateHonorFields(); - m_deathExpireTime = time_t(fields[47].GetUInt32()); + m_deathExpireTime = time_t(fields.death_expire_time); if (m_deathExpireTime > now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP) m_deathExpireTime = now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP - 1; @@ -18449,20 +18536,20 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) InitRunes(); // rest bonus can only be calculated after InitStatsForLevel() - _restMgr->LoadRestBonus(REST_TYPE_XP, PlayerRestState(fields[19].GetUInt8()), fields[31].GetFloat()); + _restMgr->LoadRestBonus(REST_TYPE_XP, fields.restState, fields.rest_bonus); // load skills after InitStatsForLevel because it triggering aura apply also _LoadSkills(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS)); UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load - SetNumRespecs(fields[76].GetUInt8()); - SetPrimarySpecialization(fields[36].GetUInt32()); - SetActiveTalentGroup(fields[64].GetUInt8()); + SetNumRespecs(fields.numRespecs); + SetPrimarySpecialization(fields.primarySpecialization); + SetActiveTalentGroup(fields.activeTalentGroup); ChrSpecializationEntry const* primarySpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()); if (!primarySpec || primarySpec->ClassID != getClass() || GetActiveTalentGroup() >= MAX_SPECIALIZATIONS) ResetTalentSpecialization(); - uint32 lootSpecId = fields[65].GetUInt32(); + uint32 lootSpecId = fields.lootSpecId; if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(lootSpecId)) if (chrSpec->ClassID == getClass()) SetLootSpecId(lootSpecId); @@ -18528,7 +18615,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded - uint32 curTitle = fields[53].GetUInt32(); + uint32 curTitle = fields.chosenTitle; if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -18551,14 +18638,14 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) UpdateAllStats(); // restore remembered power/health values (but not more max values) - uint32 savedHealth = fields[56].GetUInt32(); + uint32 savedHealth = fields.health; SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); uint32 loadedPowers = 0; for (uint32 i = 0; i < MAX_POWERS; ++i) { if (GetPowerIndex(Powers(i)) != MAX_POWERS) { - uint32 savedPower = fields[56 + loadedPowers].GetUInt32(); + uint32 savedPower = fields.powers[loadedPowers]; uint32 maxPower = m_unitData->MaxPower[loadedPowers]; SetPower(Powers(i), (savedPower > maxPower) ? maxPower : savedPower); if (++loadedPowers >= MAX_POWERS_PER_CLASS) @@ -18653,16 +18740,16 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GARRISON_FOLLOWER_ABILITIES))) _garrison = std::move(garrison); - _InitHonorLevelOnLoadFromDB(fields[72].GetUInt32(), fields[73].GetUInt32()); + _InitHonorLevelOnLoadFromDB(fields.honor, fields.honorLevel); - _restMgr->LoadRestBonus(REST_TYPE_HONOR, PlayerRestState(fields[74].GetUInt8()), fields[75].GetFloat()); + _restMgr->LoadRestBonus(REST_TYPE_HONOR, fields.honorRestState, fields.honorRestBonus); if (time_diff > 0) { //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour) float bubble0 = 0.031f; //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour) float bubble1 = 0.125f; - float bubble = fields[33].GetUInt8() > 0 + float bubble = fields.is_logout_resting > 0 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY) : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS); @@ -20361,17 +20448,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setString(index++, GetName()); stmt->setUInt8(index++, getRace()); stmt->setUInt8(index++, getClass()); - stmt->setUInt8(index++, m_playerData->NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect + stmt->setUInt8(index++, GetNativeSex()); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, m_activePlayerData->XP); stmt->setUInt64(index++, GetMoney()); - stmt->setUInt8(index++, m_playerData->SkinID); - stmt->setUInt8(index++, m_playerData->FaceID); - stmt->setUInt8(index++, m_playerData->HairStyleID); - stmt->setUInt8(index++, m_playerData->HairColorID); - stmt->setUInt8(index++, m_playerData->FacialHairStyleID); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - stmt->setUInt8(index++, m_playerData->CustomDisplayOption[i]); stmt->setUInt8(index++, GetInventorySlotCount()); stmt->setUInt8(index++, GetBankBagSlotCount()); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); @@ -20493,17 +20573,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setString(index++, GetName()); stmt->setUInt8(index++, getRace()); stmt->setUInt8(index++, getClass()); - stmt->setUInt8(index++, m_playerData->NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect + stmt->setUInt8(index++, GetNativeSex()); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, m_activePlayerData->XP); stmt->setUInt64(index++, GetMoney()); - stmt->setUInt8(index++, m_playerData->SkinID); - stmt->setUInt8(index++, m_playerData->FaceID); - stmt->setUInt8(index++, m_playerData->HairStyleID); - stmt->setUInt8(index++, m_playerData->HairColorID); - stmt->setUInt8(index++, m_playerData->FacialHairStyleID); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - stmt->setUInt8(index++, m_playerData->CustomDisplayOption[i]); stmt->setUInt8(index++, GetInventorySlotCount()); stmt->setUInt8(index++, GetBankBagSlotCount()); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); @@ -20660,6 +20733,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba if (m_mailsUpdated) //save mails only when needed _SaveMail(trans); + _SaveCustomizations(trans); _SaveBGData(trans); _SaveInventory(trans); _SaveVoidStorage(trans); @@ -20735,6 +20809,39 @@ void Player::SaveGoldToDB(CharacterDatabaseTransaction& trans) const trans->Append(stmt); } +template<typename iterator> +void SavePlayerCustomizations(CharacterDatabaseTransaction trans, ObjectGuid::LowType guid, Trinity::IteratorPair<iterator> customizations) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_CUSTOMIZATIONS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + + for (auto&& customization : customizations) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_CUSTOMIZATION); + stmt->setUInt64(0, guid); + stmt->setUInt32(1, customization.ChrCustomizationOptionID); + stmt->setUInt32(2, customization.ChrCustomizationChoiceID); + trans->Append(stmt); + } +} + +void Player::SaveCustomizations(CharacterDatabaseTransaction trans, ObjectGuid::LowType guid, + Trinity::IteratorPair<UF::ChrCustomizationChoice const*> customizations) +{ + SavePlayerCustomizations(trans, guid, customizations); +} + +void Player::_SaveCustomizations(CharacterDatabaseTransaction trans) +{ + if (!m_customizationsChanged) + return; + + m_customizationsChanged = false; + + SavePlayerCustomizations(trans, GetGUID().GetCounter(), Trinity::Containers::MakeIteratorPair(m_playerData->Customizations.begin(), m_playerData->Customizations.end())); +} + void Player::_SaveActions(CharacterDatabaseTransaction& trans) { CharacterDatabasePreparedStatement* stmt; @@ -22761,7 +22868,7 @@ void Player::InitDisplayIds() return; } - uint8 gender = m_playerData->NativeSex; + Gender gender = GetNativeSex(); switch (gender) { case GENDER_FEMALE: @@ -22773,7 +22880,8 @@ void Player::InitDisplayIds() SetNativeDisplayId(info->displayId_m); break; default: - TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), gender); + TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), uint32(gender)); + break; } SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::StateAnimID), sDB2Manager.GetEmptyAnimStateID()); @@ -23224,6 +23332,8 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (pProto->GetQuality() > ITEM_QUALITY_EPIC || (pProto->GetQuality() == ITEM_QUALITY_EPIC && pProto->GetBaseItemLevel() >= MinNewsItemLevel)) if (Guild* guild = GetGuild()) guild->AddGuildNews(GUILD_NEWS_ITEM_PURCHASED, GetGUID(), 0, item); + + UpdateCriteria(CRITERIA_TYPE_BOUGHT_ITEM_FROM_VENDOR, 1); return true; } @@ -25904,51 +26014,24 @@ bool Player::CanCaptureTowerPoint() const IsAlive()); // live player } -uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin, BarberShopStyleEntry const* newFace, std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> const& newCustomDisplay) const -{ - uint8 hairstyle = m_playerData->HairStyleID; - uint8 haircolor = m_playerData->HairColorID; - uint8 facialhair = m_playerData->FacialHairStyleID; - uint8 skincolor = m_playerData->SkinID; - uint8 face = m_playerData->FaceID; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplay; - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - customDisplay[i] = m_playerData->CustomDisplayOption[i]; - - if ((hairstyle == newHairStyle->Data) && - (haircolor == newHairColor) && - (facialhair == newFacialHair->Data) && - (!newSkin || (newSkin->Data == skincolor)) && - (!newFace || (newFace->Data == face)) && - (!newCustomDisplay[0] || (newCustomDisplay[0]->Data == customDisplay[0])) && - (!newCustomDisplay[1] || (newCustomDisplay[1]->Data == customDisplay[1])) && - (!newCustomDisplay[2] || (newCustomDisplay[2]->Data == customDisplay[2]))) - return 0; - +int64 Player::GetBarberShopCost(Trinity::IteratorPair<UF::ChrCustomizationChoice const*> newCustomizations) const +{ GtBarberShopCostBaseEntry const* bsc = sBarberShopCostBaseGameTable.GetRow(getLevel()); if (!bsc) // shouldn't happen - return 0xFFFFFFFF; - - uint32 cost = 0; - - if (hairstyle != newHairStyle->Data) - cost += uint32(bsc->Cost * newHairStyle->CostModifier); - - if ((haircolor != newHairColor) && (hairstyle == newHairStyle->Data)) - cost += uint32(bsc->Cost * 0.5f); // +1/2 of price - - if (facialhair != newFacialHair->Data) - cost += uint32(bsc->Cost * newFacialHair->CostModifier); - - if (newSkin && skincolor != newSkin->Data) - cost += uint32(bsc->Cost * newSkin->CostModifier); + return 0; - if (newFace && face != newFace->Data) - cost += uint32(bsc->Cost * newFace->CostModifier); + int64 cost = 0; + for (UF::ChrCustomizationChoice const& newChoice : newCustomizations) + { + int32 currentCustomizationIndex = m_playerData->Customizations.FindIndexIf([&](UF::ChrCustomizationChoice const& currentCustomization) + { + return currentCustomization.ChrCustomizationOptionID == newChoice.ChrCustomizationOptionID; + }); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - if (newCustomDisplay[i] && customDisplay[i] != newCustomDisplay[i]->Data) - cost += uint32(bsc->Cost * newCustomDisplay[i]->CostModifier); + if (currentCustomizationIndex == -1 || m_playerData->Customizations[currentCustomizationIndex].ChrCustomizationChoiceID != newChoice.ChrCustomizationChoiceID) + if (ChrCustomizationOptionEntry const* customizationOption = sChrCustomizationOptionStore.LookupEntry(newChoice.ChrCustomizationOptionID)) + cost += bsc->Cost * customizationOption->BarberShopCostModifier; + } return cost; } @@ -28513,139 +28596,6 @@ void Player::RemoveSocial() m_social = nullptr; } -uint32 GetSelectionFromContext(uint32 context, uint32 playerClass) -{ - switch (context) - { - case 1: - if (playerClass == CLASS_DEATH_KNIGHT) - return 1; - if (playerClass == CLASS_DEMON_HUNTER) - return 3; - return 0; - case 2: - if (playerClass == CLASS_DEATH_KNIGHT) - return 5; - if (playerClass == CLASS_DEMON_HUNTER) - return 6; - return 4; - case 3: - return 7; - case 4: - if (playerClass == CLASS_DEATH_KNIGHT) - return 9; - if (playerClass == CLASS_DEMON_HUNTER) - return 10; - return 8; - default: - if (playerClass == CLASS_DEATH_KNIGHT) - return 1; - if (playerClass == CLASS_DEMON_HUNTER) - return 2; - return 0; - } - - return 0; -} - -bool ComponentFlagsMatch(CharSectionsEntry const* entry, uint32 selection) -{ - switch (selection) - { - case 0: - if (!(entry->Flags & 1)) - return false; - return !(entry->Flags & 0x2C); - case 1: - if (!(entry->Flags & 1)) - return false; - if (!(entry->Flags & 0x94)) - return false; - return !(entry->Flags & 8); - case 2: - if (!(entry->Flags & 1)) - return false; - if (!(entry->Flags & 0x70)) - return false; - return !(entry->Flags & 8); - case 3: - if (!(entry->Flags & 1)) - return false; - if (!(entry->Flags & 0x20)) - return false; - return !(entry->Flags & 8); - case 4: - case 8: - if (!(entry->Flags & 3)) - return false; - return !(entry->Flags & 0x2C); - case 5: - case 9: - if (!(entry->Flags & 3)) - return false; - if (!(entry->Flags & 0x94)) - return false; - return !(entry->Flags & 8); - case 6: - case 10: - if (!(entry->Flags & 3)) - return false; - if (!(entry->Flags & 0x70)) - return false; - return !(entry->Flags & 8); - case 7: - return true; - default: - break; - } - - return false; -} - -bool IsSectionFlagValid(CharSectionsEntry const* entry, uint8 class_, bool create) -{ - if (create) - return ComponentFlagsMatch(entry, GetSelectionFromContext(0, class_)); - - return ComponentFlagsMatch(entry, GetSelectionFromContext(2, class_)); -} - -bool IsSectionValid(uint8 race, uint8 class_, uint8 gender, CharBaseSectionVariation variation, uint8 variationIndex, uint8 colorIndex, bool create) -{ - CharSectionsEntry const* section = sDB2Manager.GetCharSectionEntry(race, gender, variation, variationIndex, colorIndex); - if (section) - return IsSectionFlagValid(section, class_, create); - - return false; -} - -bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHairID, uint8 skinColor, std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> const& customDisplay, bool create /*= false*/) -{ - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::Skin, 0, skinColor, create)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::Face, faceID, skinColor, create)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::Hair, hairID, hairColor, create)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::FacialHair, facialHairID, hairColor, create)) - if (sDB2Manager.HasCharSections(race, gender, CharBaseSectionVariation::FacialHair) || !sDB2Manager.HasCharacterFacialHairStyle(race, gender, facialHairID)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::CustomDisplay1, customDisplay[0], 0, create)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::CustomDisplay2, customDisplay[1], 0, create)) - return false; - - if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation::CustomDisplay3, customDisplay[2], 0, create)) - return false; - - return true; -} - uint32 Player::GetDefaultSpecId() const { return ASSERT_NOTNULL(sDB2Manager.GetDefaultChrSpecializationForClass(getClass()))->ID; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 66cf959b9b5..8ffe328ef5a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -757,6 +757,7 @@ enum PlayedTimeIndex enum PlayerLoginQueryIndex { PLAYER_LOGIN_QUERY_LOAD_FROM, + PLAYER_LOGIN_QUERY_LOAD_CUSTOMIZATIONS, PLAYER_LOGIN_QUERY_LOAD_GROUP, PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES, PLAYER_LOGIN_QUERY_LOAD_AURAS, @@ -1064,7 +1065,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint8 GetChatFlags() const; std::string autoReplyMsg; - uint32 GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin, BarberShopStyleEntry const* newFace, std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> const& newCustomDisplay) const; + int64 GetBarberShopCost(Trinity::IteratorPair<UF::ChrCustomizationChoice const*> newCustomizations) const; PlayerSocial* GetSocial() const { return m_social; } void RemoveSocial(); @@ -1484,7 +1485,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; } static bool IsValidClass(uint8 Class) { return ((1 << (Class - 1)) & CLASSMASK_ALL_PLAYABLE) != 0; } static bool IsValidRace(uint8 Race) { return Trinity::RaceMask<uint64>{ RACEMASK_ALL_PLAYABLE }.HasRace(Race); } - static bool ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> const& customDisplay, bool create = false); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -1495,6 +1495,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction& trans); // fast save function for item/money cheating preventing void SaveGoldToDB(CharacterDatabaseTransaction& trans) const; + static void SaveCustomizations(CharacterDatabaseTransaction trans, ObjectGuid::LowType guid, + Trinity::IteratorPair<UF::ChrCustomizationChoice const*> customizations); static void SetUInt32ValueInArray(Tokenizer& data, uint16 index, uint32 value); static void SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction& trans); @@ -2438,17 +2440,39 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PlayerFlagsEx), flags); } void SetPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PlayerFlagsEx), flags); } - void SetSkinId(uint8 skinId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::SkinID), skinId); } - void SetFaceId(uint8 faceId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::FaceID), faceId); } - void SetHairStyleId(uint8 hairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::HairStyleID), hairStyleId); } - void SetHairColorId(uint8 hairColorId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::HairColorID), hairColorId); } - void SetFacialHairStyleId(uint8 facialHairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::FacialHairStyleID), facialHairStyleId); } + uint32 GetCustomizationChoice(uint32 chrCustomizationOptionId) const + { + int32 choiceIndex = m_playerData->Customizations.FindIndexIf([chrCustomizationOptionId](UF::ChrCustomizationChoice choice) + { + return choice.ChrCustomizationOptionID == chrCustomizationOptionId; + }); + + if (choiceIndex >= 0) + return m_playerData->Customizations[choiceIndex].ChrCustomizationChoiceID; + + return 0; + } + + template<typename Iter> + void SetCustomizations(Trinity::IteratorPair<Iter> customizations, bool markChanged = true) + { + if (markChanged) + m_customizationsChanged = true; + + ClearDynamicUpdateFieldValues(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Customizations)); + for (auto&& customization : customizations) + { + UF::ChrCustomizationChoice& newChoice = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Customizations)); + newChoice.ChrCustomizationOptionID = customization.ChrCustomizationOptionID; + newChoice.ChrCustomizationChoiceID = customization.ChrCustomizationChoiceID; + } + } + Gender GetNativeSex() const { return Gender(*m_playerData->NativeSex); } void SetNativeSex(uint8 sex) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::NativeSex), sex); } void SetPvpTitle(uint8 pvpTitle) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PvpTitle), pvpTitle); } void SetArenaFaction(uint8 arenaFaction) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::ArenaFaction), arenaFaction); } void ApplyModFakeInebriation(int32 mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::FakeInebriation), mod, apply); } void SetVirtualPlayerRealm(uint32 virtualRealmAddress) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::VirtualPlayerRealm), virtualRealmAddress); } - void SetCustomDisplayOption(uint32 slot, uint8 customDisplayOption) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::CustomDisplayOption, slot), customDisplayOption); } void AddHeirloom(int32 itemId, uint32 flags) { @@ -2600,6 +2624,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** SAVE SYSTEM ***/ /*********************************************************/ + void _SaveCustomizations(CharacterDatabaseTransaction trans); void _SaveActions(CharacterDatabaseTransaction& trans); void _SaveAuras(CharacterDatabaseTransaction& trans); void _SaveInventory(CharacterDatabaseTransaction& trans); @@ -2639,6 +2664,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 m_team; uint32 m_nextSave; + bool m_customizationsChanged; time_t m_speakTime; uint32 m_speakCount; Difficulty m_dungeonDifficulty; @@ -2872,4 +2898,15 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> TC_GAME_API void AddItemsSetItem(Player* player, Item* item); TC_GAME_API void RemoveItemsSetItem(Player* player, ItemTemplate const* proto); +// Transforms a container of customization choices with continuous storage into iterator pair that does not depend on container +// and doesn't force implementations in header files +template<typename Container> +Trinity::IteratorPair<UF::ChrCustomizationChoice const*> MakeChrCustomizationChoiceRange(Container const& container) +{ + static_assert(std::is_same<typename Container::value_type, UF::ChrCustomizationChoice>::value, + "MakeChrCustomizationChoiceRange must be used with containers of UF::ChrCustomizationChoice"); + + return { container.data(), container.data() + container.size() }; +} + #endif diff --git a/src/server/game/Entities/Player/RestMgr.cpp b/src/server/game/Entities/Player/RestMgr.cpp index 123e09a108d..13083a0a74a 100644 --- a/src/server/game/Entities/Player/RestMgr.cpp +++ b/src/server/game/Entities/Player/RestMgr.cpp @@ -127,7 +127,11 @@ uint32 RestMgr::GetRestBonusFor(RestTypes restType, uint32 xp) if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp rested_bonus = xp; - SetRestBonus(restType, GetRestBonus(restType) - rested_bonus); + uint32 rested_loss = rested_bonus; + if (restType == REST_TYPE_XP) + AddPct(rested_loss, _player->GetTotalAuraModifier(SPELL_AURA_MOD_RESTED_XP_CONSUMPTION)); + + SetRestBonus(restType, GetRestBonus(restType) - rested_loss); TC_LOG_DEBUG("entities.player", "RestMgr::GetRestBonus: Player '%s' (%s) gain %u xp (+%u Rested Bonus). Rested points=%f", _player->GetGUID().ToString().c_str(), _player->GetName().c_str(), xp + rested_bonus, rested_bonus, GetRestBonus(restType)); return rested_bonus; diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index 5be8dac7af0..b5822d11f8a 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -74,7 +74,7 @@ void Totem::InitStats(uint32 duration) // Get spell cast by totem if (SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(GetSpell(), GetMap()->GetDifficultyID())) - if (totemSpell->CalcCastTime(getLevel())) // If spell has cast time -> its an active totem + if (totemSpell->CalcCastTime()) // If spell has cast time -> its an active totem m_type = TOTEM_ACTIVE; m_duration = duration; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index fc19f60d77d..a312228ffc0 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -573,7 +573,8 @@ void Player::UpdateHealingDonePercentMod() for (AuraEffect const* auraEffect : GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT)) AddPct(value, auraEffect->GetAmount()); - SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent), value); + for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) + SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent, i), value); } float const m_diminishing_k[MAX_CLASSES] = diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b8e9166bbe5..a09f5bb6032 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7080,29 +7080,22 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto return std::max(crit_chance, 0.0f); } -uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* /*victim*/) +uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* victim) { // Calculate critical bonus - int32 crit_bonus = damage; + int32 crit_bonus = damage * 2; float crit_mod = 0.0f; - switch (spellProto->DmgClass) - { - case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100% - case SPELL_DAMAGE_CLASS_RANGED: - /// @todo write here full calculation for melee/ranged spells - crit_bonus += damage; - break; - default: - crit_bonus += damage / 2; // for spells is 50% - break; - } - crit_mod += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask()) - 1.0f) * 100; if (crit_bonus != 0) AddPct(crit_bonus, crit_mod); + AddPct(crit_bonus, victim->GetTotalAuraModifier(SPELL_AURA_MOD_CRITICAL_DAMAGE_TAKEN_FROM_CASTER, [&](AuraEffect const* aurEff) + { + return aurEff->GetCasterGUID() == GetGUID(); + })); + crit_bonus -= damage; if (damage > uint32(crit_bonus)) @@ -7230,7 +7223,14 @@ float Unit::SpellHealingPctDone(Unit* /*victim*/, SpellInfo const* spellProto) c return 1.0f; if (Player const* thisPlayer = ToPlayer()) - return thisPlayer->m_activePlayerData->ModHealingDonePercent; + { + float maxModDamagePercentSchool = 0.0f; + for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) + if (spellProto->GetSchoolMask() & (1 << i)) + maxModDamagePercentSchool = std::max(maxModDamagePercentSchool, thisPlayer->m_activePlayerData->ModHealingDonePercent[i]); + + return maxModDamagePercentSchool; + } float DoneTotalMod = 1.0f; @@ -11081,7 +11081,7 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp if (overTime > 0 && CastingTime > 0 && DirectDamage) { // mainly for DoTs which are 3500 here otherwise - uint32 OriginalCastTime = spellProto->CalcCastTime(getLevel()); + uint32 OriginalCastTime = spellProto->CalcCastTime(); if (OriginalCastTime > 7000) OriginalCastTime = 7000; if (OriginalCastTime < 1500) OriginalCastTime = 1500; // Portion to Over Time @@ -11160,7 +11160,7 @@ float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffect DotFactor /= DotTicks; } - int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime(getLevel()); + int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime(); // Distribute Damage over multiple effects, reduce by AoE CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime); @@ -12634,396 +12634,56 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const if (ShapeshiftForm(artifactAppearance->OverrideShapeshiftFormID) == form) return artifactAppearance->OverrideShapeshiftDisplayID; - switch (form) + if (ShapeshiftFormModelData const* formModelData = sDB2Manager.GetShapeshiftFormModelData(getRace(), thisPlayer->GetNativeSex(), form)) { - case FORM_CAT_FORM: - // Based on Hair color - if (getRace() == RACE_NIGHTELF) - { - uint8 hairColor = thisPlayer->m_playerData->HairColorID; - if (HasAura(210333)) // Glyph of the Feral Chameleon - hairColor = urand(0, 10); - - switch (hairColor) - { - case 7: // Violet - case 8: - return 29405; - case 3: // Light Blue - return 29406; - case 0: // Green - case 1: // Light Green - case 2: // Dark Green - return 29407; - case 4: // White - return 29408; - default: // Original - Dark Blue - return 892; - } - } - else if (getRace() == RACE_TROLL) - { - uint8 hairColor = thisPlayer->m_playerData->HairColorID; - if (HasAura(210333)) // Glyph of the Feral Chameleon - hairColor = urand(0, 12); - - switch (hairColor) - { - case 0: // Red - case 1: - return 33668; - case 2: // Yellow - case 3: - return 33667; - case 4: // Blue - case 5: - case 6: - return 33666; - case 7: // Purple - case 10: - return 33665; - default: // Original - White - return 33669; - } - } - else if (getRace() == RACE_WORGEN) - { - // Based on Skin color - uint8 skinColor = thisPlayer->m_playerData->SkinID; - if (HasAura(210333)) // Glyph of the Feral Chameleon - skinColor = urand(0, 9); - - // Male - if (getGender() == GENDER_MALE) - { - switch (skinColor) - { - case 1: // Brown - return 33662; - case 2: // Black - case 7: - return 33661; - case 4: // Yellow - return 33664; - case 3: // White - case 5: - return 33663; - default: // Original - Gray - return 33660; - } - } - // Female - else - { - switch (skinColor) - { - case 5: // Brown - case 6: - return 33662; - case 7: // Black - case 8: - return 33661; - case 3: // yellow - case 4: - return 33664; - case 2: // White - return 33663; - default: // Original - Gray - return 33660; - } - } - } - // Based on Skin color - else if (getRace() == RACE_TAUREN) - { - uint8 skinColor = thisPlayer->m_playerData->SkinID; - if (HasAura(210333)) // Glyph of the Feral Chameleon - skinColor = urand(0, 20); - - // Male - if (getGender() == GENDER_MALE) - { - switch (skinColor) - { - case 12: // White - case 13: - case 14: - case 18: // Completly White - return 29409; - case 9: // Light Brown - case 10: - case 11: - return 29410; - case 6: // Brown - case 7: - case 8: - return 29411; - case 0: // Dark - case 1: - case 2: - case 3: // Dark Grey - case 4: - case 5: - return 29412; - default: // Original - Grey - return 8571; - } - } - // Female - else - { - switch (skinColor) - { - case 10: // White - return 29409; - case 6: // Light Brown - case 7: - return 29410; - case 4: // Brown - case 5: - return 29411; - case 0: // Dark - case 1: - case 2: - case 3: - return 29412; - default: // Original - Grey - return 8571; - } - } - } - else if (Player::TeamForRace(getRace()) == ALLIANCE) - return 892; - else - return 8571; - case FORM_BEAR_FORM: - // Based on Hair color - if (getRace() == RACE_NIGHTELF) - { - uint8 hairColor = thisPlayer->m_playerData->HairColorID; - if (HasAura(107059)) // Glyph of the Ursol Chameleon - hairColor = urand(0, 8); + bool useRandom = false; + switch (form) + { + case FORM_CAT_FORM: useRandom = HasAura(210333); break; // Glyph of the Feral Chameleon + case FORM_TRAVEL_FORM: useRandom = HasAura(344336); break; // Glyph of the Swift Chameleon + case FORM_AQUATIC_FORM: useRandom = HasAura(344338); break; // Glyph of the Aquatic Chameleon + case FORM_BEAR_FORM: useRandom = HasAura(107059); break; // Glyph of the Ursol Chameleon + case FORM_FLIGHT_FORM: useRandom = HasAura(344342); break; // Glyph of the Aerial Chameleon + default: + break; + } - switch (hairColor) - { - case 0: // Green - case 1: // Light Green - case 2: // Dark Green - return 29413; // 29415? - case 6: // Dark Blue - return 29414; - case 4: // White - return 29416; - case 3: // Light Blue - return 29417; - default: // Original - Violet - return 29415; - } - } - else if (getRace() == RACE_TROLL) - { - uint8 hairColor = thisPlayer->m_playerData->HairColorID; - if (HasAura(107059)) // Glyph of the Ursol Chameleon - hairColor = urand(0, 14); + if (useRandom) + { + std::vector<uint32> displayIds; + displayIds.reserve(formModelData->Choices->size()); - switch (hairColor) - { - case 0: // Red - case 1: - return 33657; - case 2: // Yellow - case 3: - return 33659; - case 7: // Purple - case 10: - return 33656; - case 8: // White - case 9: - case 11: - case 12: - return 33658; - default: // Original - Blue - return 33655; - } - } - else if (getRace() == RACE_WORGEN) + for (std::size_t i = 0; i < formModelData->Choices->size(); ++i) { - // Based on Skin color - uint8 skinColor = thisPlayer->m_playerData->SkinID; - if (HasAura(107059)) // Glyph of the Ursol Chameleon - skinColor = urand(0, 8); - - // Male - if (getGender() == GENDER_MALE) + if (ChrCustomizationDisplayInfoEntry const* displayInfo = formModelData->Displays[i]) { - switch (skinColor) - { - case 1: // Brown - return 33652; - case 2: // Black - case 7: - return 33651; - case 4: // Yellow - return 33653; - case 3: // White - case 5: - return 33654; - default: // Original - Gray - return 33650; - } - } - // Female - else - { - switch (skinColor) - { - case 5: // Brown - case 6: - return 33652; - case 7: // Black - case 8: - return 33651; - case 3: // yellow - case 4: - return 33654; - case 2: // White - return 33653; - default: // Original - Gray - return 33650; - } + ChrCustomizationReqEntry const* choiceReq = sChrCustomizationReqStore.LookupEntry((*formModelData->Choices)[i]->ChrCustomizationReqID); + if (!choiceReq || thisPlayer->GetSession()->MeetsChrCustomizationReq(choiceReq, Classes(getClass()), false, + MakeChrCustomizationChoiceRange(thisPlayer->m_playerData->Customizations))) + displayIds.push_back(displayInfo->DisplayID); } } - // Based on Skin color - else if (getRace() == RACE_TAUREN) - { - uint8 skinColor = thisPlayer->m_playerData->SkinID; - if (HasAura(107059)) // Glyph of the Ursol Chameleon - skinColor = urand(0, 20); - // Male - if (getGender() == GENDER_MALE) - { - switch (skinColor) - { - case 0: // Dark (Black) - case 1: - case 2: - return 29418; - case 3: // White - case 4: - case 5: - case 12: - case 13: - case 14: - return 29419; - case 9: // Light Brown/Grey - case 10: - case 11: - case 15: - case 16: - case 17: - return 29420; - case 18: // Completly White - return 29421; - default: // Original - Brown - return 2289; - } - } - // Female - else - { - switch (skinColor) - { - case 0: // Dark (Black) - case 1: - return 29418; - case 2: // White - case 3: - return 29419; - case 6: // Light Brown/Grey - case 7: - case 8: - case 9: - return 29420; - case 10: // Completly White - return 29421; - default: // Original - Brown - return 2289; - } - } - } - else if (Player::TeamForRace(getRace()) == ALLIANCE) - return 29415; - else - return 2289; - case FORM_FLIGHT_FORM: - if (Player::TeamForRace(getRace()) == ALLIANCE) - return 20857; - return 20872; - case FORM_FLIGHT_FORM_EPIC: - if (HasAura(219062)) // Glyph of the Sentinel - { - switch (getRace()) - { - case RACE_NIGHTELF: // Blue - return 64328; - case RACE_TAUREN: // Brown - return 64329; - case RACE_WORGEN: // Purple - return 64330; - case RACE_TROLL: // White - return 64331; - default: - break; - } - } - if (Player::TeamForRace(getRace()) == ALLIANCE) - return (getRace() == RACE_WORGEN ? 37729 : 21243); - if (getRace() == RACE_TROLL) - return 37730; - return 21244; - case FORM_MOONKIN_FORM: - { - switch (getRace()) - { - case RACE_NIGHTELF: - return 15374; - case RACE_TAUREN: - return 15375; - case RACE_WORGEN: - return 37173; - case RACE_TROLL: - return 37174; - default: - break; - } - break; + if (!displayIds.empty()) + return Trinity::Containers::SelectRandomContainerElement(displayIds); } - case FORM_AQUATIC_FORM: - if (HasAura(114333)) // Glyph of the Orca - return 4591; - return 2428; - case FORM_TRAVEL_FORM: + else { - if (HasAura(131113)) // Glyph of the Cheetah - return 1043; - - if (HasAura(224122)) // Glyph of the Doe - return 70450; - - switch (getRace()) + if (uint32 formChoice = thisPlayer->GetCustomizationChoice(formModelData->OptionID)) { - case RACE_NIGHTELF: - case RACE_WORGEN: - return 40816; - case RACE_TROLL: - case RACE_TAUREN: - return 45339; - default: - break; + auto choiceItr = std::find_if(formModelData->Choices->begin(), formModelData->Choices->end(), [formChoice](ChrCustomizationChoiceEntry const* choice) + { + return choice->ID == formChoice; + }); + + if (choiceItr != formModelData->Choices->end()) + if (ChrCustomizationDisplayInfoEntry const* displayInfo = formModelData->Displays[std::distance(formModelData->Choices->begin(), choiceItr)]) + return displayInfo->DisplayID; } - break; } + } + switch (form) + { case FORM_GHOST_WOLF: { if (HasAura(58135)) // Glyph of Spectral Wolf diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1c32fc3ff8b..9480942eea5 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1646,13 +1646,14 @@ class TC_GAME_API Unit : public WorldObject .ModifyValue(&UF::UnitData::ChannelData) .ModifyValue(&UF::UnitChannel::SpellID), channelSpellId); } - uint32 GetChannelSpellXSpellVisualId() const { return m_unitData->ChannelData->SpellXSpellVisualID; } - void SetChannelSpellXSpellVisualId(SpellCastVisual channelVisual) + uint32 GetChannelSpellXSpellVisualId() const { return m_unitData->ChannelData->SpellVisual.SpellXSpellVisualID; } + uint32 GetChannelScriptVisualId() const { return m_unitData->ChannelData->SpellVisual.ScriptVisualID; } + void SetChannelVisual(SpellCastVisual channelVisual) { SetUpdateFieldValue(m_values .ModifyValue(&Unit::m_unitData) .ModifyValue(&UF::UnitData::ChannelData) - .ModifyValue(&UF::UnitChannel::SpellXSpellVisualID), channelVisual.SpellXSpellVisualID); + .ModifyValue(&UF::UnitChannel::SpellVisual), channelVisual); } void AddChannelObject(ObjectGuid guid) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelObjects)) = guid; } void SetChannelObject(uint32 slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelObjects, slot), guid); } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6831a01a1f7..2b5be2e3fd5 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3122,25 +3122,6 @@ void ObjectMgr::LoadItemTemplates() itemItr->second.Effects.push_back(effectEntry); } - // Check if item templates for DBC referenced character start outfit are present - std::set<uint32> notFoundOutfit; - for (CharStartOutfitEntry const* entry : sCharStartOutfitStore) - { - for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) - { - if (entry->ItemID[j] <= 0) - continue; - - uint32 item_id = entry->ItemID[j]; - - if (!GetItemTemplate(item_id)) - notFoundOutfit.insert(item_id); - } - } - - for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr) - TC_LOG_ERROR("sql.sql", "Item (Entry: %u) does not exist but is referenced in `CharStartOutfit.dbc`", *itr); - TC_LOG_INFO("server.loading", ">> Loaded %u item templates in %u ms", sparseCount, GetMSTimeDiffToNow(oldMSTime)); } @@ -3422,31 +3403,22 @@ void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint3 return; if (count > 0) - _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count)); + _playerInfo[race_][class_]->item.emplace_back(itemId, count); else { if (count < -1) TC_LOG_ERROR("sql.sql", "Invalid count %i specified on item %u be removed from original player create info (use -1)!", count, itemId); - for (uint32 gender = 0; gender < GENDER_NONE; ++gender) - { - if (CharStartOutfitEntry const* entry = sDB2Manager.GetCharStartOutfitEntry(race_, class_, gender)) - { - bool found = false; - for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x) - { - if (entry->ItemID[x] > 0 && uint32(entry->ItemID[x]) == itemId) - { - found = true; - const_cast<CharStartOutfitEntry*>(entry)->ItemID[x] = 0; - break; - } - } + PlayerCreateInfoItems& items = _playerInfo[race_][class_]->item; - if (!found) - TC_LOG_ERROR("sql.sql", "Item %u specified to be removed from original create info not found in dbc!", itemId); - } + auto erased = std::remove_if(items.begin(), items.end(), [itemId](PlayerCreateInfoItem const& item) { return item.item_id == itemId; }); + if (erased == items.end()) + { + TC_LOG_ERROR("sql.sql", "Item %u specified to be removed from original create info not found in db2!", itemId); + return; } + + items.erase(erased, items.end()); } } @@ -3480,41 +3452,42 @@ void ObjectMgr::LoadPlayerInfo() float positionZ = fields[6].GetFloat(); float orientation = fields[7].GetFloat(); - if (current_race >= MAX_RACES) + if (!sChrRacesStore.LookupEntry(current_race)) { TC_LOG_ERROR("sql.sql", "Wrong race %u in `playercreateinfo` table, ignoring.", current_race); continue; } - ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); - if (!rEntry) + if (!sChrClassesStore.LookupEntry(current_class)) { - TC_LOG_ERROR("sql.sql", "Wrong race %u in `playercreateinfo` table, ignoring.", current_race); + TC_LOG_ERROR("sql.sql", "Wrong class %u in `playercreateinfo` table, ignoring.", current_class); continue; } - if (current_class >= MAX_CLASSES) + // accept DB data only for valid position (and non instanceable) + if (!MapManager::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation)) { - TC_LOG_ERROR("sql.sql", "Wrong class %u in `playercreateinfo` table, ignoring.", current_class); + TC_LOG_ERROR("sql.sql", "Wrong home position for class %u race %u pair in `playercreateinfo` table, ignoring.", current_class, current_race); continue; } - if (!sChrClassesStore.LookupEntry(current_class)) + if (sMapStore.LookupEntry(mapId)->Instanceable()) { - TC_LOG_ERROR("sql.sql", "Wrong class %u in `playercreateinfo` table, ignoring.", current_class); + TC_LOG_ERROR("sql.sql", "Home position in instanceable map for class %u race %u pair in `playercreateinfo` table, ignoring.", current_class, current_race); continue; } - // accept DB data only for valid position (and non instanceable) - if (!MapManager::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation)) + ChrModelEntry const* maleModel = sDB2Manager.GetChrModel(current_race, GENDER_MALE); + if (!maleModel) { - TC_LOG_ERROR("sql.sql", "Wrong home position for class %u race %u pair in `playercreateinfo` table, ignoring.", current_class, current_race); + TC_LOG_ERROR("sql.sql", "Missing male model for race %u, ignoring.", current_race); continue; } - if (sMapStore.LookupEntry(mapId)->Instanceable()) + ChrModelEntry const* femaleModel = sDB2Manager.GetChrModel(current_race, GENDER_FEMALE); + if (!femaleModel) { - TC_LOG_ERROR("sql.sql", "Home position in instanceable map for class %u race %u pair in `playercreateinfo` table, ignoring.", current_class, current_race); + TC_LOG_ERROR("sql.sql", "Missing female model for race %u, ignoring.", current_race); continue; } @@ -3525,8 +3498,8 @@ void ObjectMgr::LoadPlayerInfo() info->positionY = positionY; info->positionZ = positionZ; info->orientation = orientation; - info->displayId_m = rEntry->MaleDisplayId; - info->displayId_f = rEntry->FemaleDisplayId; + info->displayId_m = maleModel->DisplayID; + info->displayId_f = femaleModel->DisplayID; _playerInfo[current_race][current_class] = info; ++count; @@ -3540,6 +3513,60 @@ void ObjectMgr::LoadPlayerInfo() // Load playercreate items TC_LOG_INFO("server.loading", "Loading Player Create Items Data..."); { + std::unordered_map<uint32, std::vector<ItemTemplate const*>> itemsByCharacterLoadout; + for (CharacterLoadoutItemEntry const* characterLoadoutItem : sCharacterLoadoutItemStore) + if (ItemTemplate const* itemTemplate = GetItemTemplate(characterLoadoutItem->ItemID)) + itemsByCharacterLoadout[characterLoadoutItem->CharacterLoadoutID].push_back(itemTemplate); + + for (CharacterLoadoutEntry const* characterLoadout : sCharacterLoadoutStore) + { + if (!characterLoadout->IsForNewCharacter()) + continue; + + std::vector<ItemTemplate const*> const* items = Trinity::Containers::MapGetValuePtr(itemsByCharacterLoadout, characterLoadout->ID); + if (!items) + continue; + + for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) + { + if (!characterLoadout->RaceMask.HasRace(raceIndex)) + continue; + + if (PlayerInfo* playerInfo = _playerInfo[raceIndex][characterLoadout->ChrClassID]) + { + for (ItemTemplate const* itemTemplate : *items) + { + // BuyCount by default + uint32 count = itemTemplate->GetBuyCount(); + + // special amount for food/drink + if (itemTemplate->GetClass() == ITEM_CLASS_CONSUMABLE && itemTemplate->GetSubClass() == ITEM_SUBCLASS_FOOD_DRINK) + { + if (!itemTemplate->Effects.empty()) + { + switch (itemTemplate->Effects[0]->SpellCategoryID) + { + case SPELL_CATEGORY_FOOD: // food + count = characterLoadout->ChrClassID == CLASS_DEATH_KNIGHT ? 10 : 4; + break; + case SPELL_CATEGORY_DRINK: // drink + count = 2; + break; + } + } + if (itemTemplate->GetMaxStackSize() < count) + count = itemTemplate->GetMaxStackSize(); + } + + playerInfo->item.emplace_back(itemTemplate->GetId(), count); + } + } + } + } + } + + TC_LOG_INFO("server.loading", "Loading Player Create Items Override Data..."); + { uint32 oldMSTime = getMSTime(); // 0 1 2 3 QueryResult result = WorldDatabase.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item"); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 56d2e458474..487ac491966 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -535,7 +535,7 @@ void Guild::Member::SetStats(Player* player) m_name = player->GetName(); m_level = player->getLevel(); m_class = player->getClass(); - _gender = player->m_playerData->NativeSex; + _gender = player->GetNativeSex(); m_zoneId = player->GetZoneId(); m_accountId = player->GetSession()->GetAccountId(); m_achievementPoints = player->GetAchievementPoints(); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 49283ac0c26..9b4b8f41f97 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -31,6 +31,7 @@ #include "Chat.h" #include "ClientConfigPackets.h" #include "Common.h" +#include "Containers.h" #include "DatabaseEnv.h" #include "DB2Stores.h" #include "EquipmentSetPackets.h" @@ -88,6 +89,10 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_FROM, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_CUSTOMIZATIONS); + stmt->setUInt64(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_CUSTOMIZATIONS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_GROUP, stmt); @@ -307,16 +312,78 @@ bool LoginQueryHolder::Initialize() return res; } -void WorldSession::HandleCharEnum(PreparedQueryResult result) +class EnumCharactersQueryHolder : public CharacterDatabaseQueryHolder +{ +public: + enum + { + CHARACTERS, + CUSTOMIZATIONS, + + MAX + }; + + EnumCharactersQueryHolder() + { + SetSize(MAX); + } + + bool Initialize(uint32 accountId, bool withDeclinedNames, bool isDeletedCharacters) + { + _isDeletedCharacters = isDeletedCharacters; + + constexpr CharacterDatabaseStatements statements[2][3] = + { + { CHAR_SEL_ENUM, CHAR_SEL_ENUM_DECLINED_NAME, CHAR_SEL_ENUM_CUSTOMIZATIONS }, + { CHAR_SEL_UNDELETE_ENUM, CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, CHAR_SEL_UNDELETE_ENUM_CUSTOMIZATIONS } + }; + + bool result = true; + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(statements[isDeletedCharacters ? 1 : 0][withDeclinedNames ? 1 : 0]); + stmt->setUInt8(0, PET_SAVE_AS_CURRENT); + stmt->setUInt32(1, accountId); + result &= SetPreparedQuery(CHARACTERS, stmt); + + stmt = CharacterDatabase.GetPreparedStatement(statements[isDeletedCharacters ? 1 : 0][2]); + stmt->setUInt32(0, accountId); + result &= SetPreparedQuery(CUSTOMIZATIONS, stmt); + + return result; + } + + bool IsDeletedCharacters() const { return _isDeletedCharacters; } + +private: + bool _isDeletedCharacters = false; +}; + +void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder* holder) { WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; - charEnum.IsDeletedCharacters = false; + charEnum.IsDeletedCharacters = static_cast<EnumCharactersQueryHolder*>(holder)->IsDeletedCharacters(); charEnum.DisabledClassesMask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK); - _legitCharacters.clear(); + if (!charEnum.IsDeletedCharacters) + _legitCharacters.clear(); - if (result) + std::unordered_map<ObjectGuid::LowType, std::vector<UF::ChrCustomizationChoice>> customizations; + if (PreparedQueryResult customizationsResult = holder->GetPreparedResult(EnumCharactersQueryHolder::CUSTOMIZATIONS)) + { + do + { + Field* fields = customizationsResult->Fetch(); + std::vector<UF::ChrCustomizationChoice>& customizationsForCharacter = customizations[fields[0].GetUInt64()]; + + customizationsForCharacter.emplace_back(); + UF::ChrCustomizationChoice& choice = customizationsForCharacter.back(); + choice.ChrCustomizationOptionID = fields[1].GetUInt32(); + choice.ChrCustomizationChoiceID = fields[2].GetUInt32(); + + } while (customizationsResult->NextRow()); + } + + if (PreparedQueryResult result = holder->GetPreparedResult(EnumCharactersQueryHolder::CHARACTERS)) { do { @@ -324,32 +391,33 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) WorldPackets::Character::EnumCharactersResult::CharacterInfo& charInfo = charEnum.Characters.back(); + if (std::vector<UF::ChrCustomizationChoice>* customizationsForChar = Trinity::Containers::MapGetValuePtr(customizations, charInfo.Guid.GetCounter())) + charInfo.Customizations = std::move(*customizationsForChar); + TC_LOG_INFO("network", "Loading char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); - if (!Player::ValidateAppearance(charInfo.RaceID, charInfo.ClassID, charInfo.SexID, charInfo.HairStyle, charInfo.HairColor, charInfo.FaceID, charInfo.FacialHair, charInfo.SkinID, charInfo.CustomDisplay)) + if (!charEnum.IsDeletedCharacters) { - TC_LOG_ERROR("entities.player.loading", "Player %s has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString().c_str()); + if (!ValidateAppearance(Races(charInfo.RaceID), Classes(charInfo.ClassID), Gender(charInfo.SexID), MakeChrCustomizationChoiceRange(charInfo.Customizations))) + { + TC_LOG_ERROR("entities.player.loading", "Player %s has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString().c_str()); - // Make sure customization always works properly - send all zeroes instead - charInfo.SkinID = 0; - charInfo.FaceID = 0; - charInfo.HairStyle = 0; - charInfo.HairColor = 0; - charInfo.FacialHair = 0; + charInfo.Customizations.clear(); - if (!(charInfo.Flags2 == CHAR_CUSTOMIZE_FLAG_CUSTOMIZE)) - { - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); - stmt->setUInt16(0, uint16(AT_LOGIN_CUSTOMIZE)); - stmt->setUInt64(1, charInfo.Guid.GetCounter()); - CharacterDatabase.Execute(stmt); - charInfo.Flags2 = CHAR_CUSTOMIZE_FLAG_CUSTOMIZE; + if (!(charInfo.Flags2 == CHAR_CUSTOMIZE_FLAG_CUSTOMIZE)) + { + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); + stmt->setUInt16(0, uint16(AT_LOGIN_CUSTOMIZE)); + stmt->setUInt64(1, charInfo.Guid.GetCounter()); + CharacterDatabase.Execute(stmt); + charInfo.Flags2 = CHAR_CUSTOMIZE_FLAG_CUSTOMIZE; + } } - } - // Do not allow locked characters to login - if (!(charInfo.Flags & (CHARACTER_FLAG_LOCKED_FOR_TRANSFER | CHARACTER_FLAG_LOCKED_BY_BILLING))) - _legitCharacters.insert(charInfo.Guid); + // Do not allow locked characters to login + if (!(charInfo.Flags & (CHARACTER_FLAG_LOCKED_FOR_TRANSFER | CHARACTER_FLAG_LOCKED_BY_BILLING))) + _legitCharacters.insert(charInfo.Guid); + } if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexID, charInfo.RaceID, charInfo.ClassID, charInfo.ExperienceLevel, false); @@ -370,6 +438,8 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) } SendPacket(charEnum.Write()); + + delete holder; } void WorldSession::HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/) @@ -379,58 +449,123 @@ void WorldSession::HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& CharacterDatabase.Execute(stmt); /// get all the data necessary for loading all characters (along with their pets) on the account + EnumCharactersQueryHolder* holder = new EnumCharactersQueryHolder(); + if (!holder->Initialize(GetAccountId(), sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED), false)) + { + HandleCharEnum(holder); + return; + } - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED)) - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ENUM_DECLINED_NAME); - else - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ENUM); + _charEnumCallback = CharacterDatabase.DelayQueryHolder(holder); +} - stmt->setUInt8(0, PET_SAVE_AS_CURRENT); - stmt->setUInt32(1, GetAccountId()); +void WorldSession::HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/) +{ + /// get all the data necessary for loading all undeleted characters (along with their pets) on the account + EnumCharactersQueryHolder* holder = new EnumCharactersQueryHolder(); + if (!holder->Initialize(GetAccountId(), sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED), true)) + { + HandleCharEnum(holder); + return; + } - _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSession::HandleCharEnum, this, std::placeholders::_1))); + _charEnumCallback = CharacterDatabase.DelayQueryHolder(holder); } -void WorldSession::HandleCharUndeleteEnum(PreparedQueryResult result) +bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, Classes playerClass, + bool checkRequiredDependentChoices, Trinity::IteratorPair<UF::ChrCustomizationChoice const*> selectedChoices) const { - WorldPackets::Character::EnumCharactersResult charEnum; - charEnum.Success = true; - charEnum.IsDeletedCharacters = true; - charEnum.DisabledClassesMask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK); + if (!req->GetFlags().HasFlag(ChrCustomizationReqFlag::HasRequirements)) + return true; - if (result) + if (req->ClassMask && !(req->ClassMask & (1 << (playerClass - 1)))) + return false; + + if (req->AchievementID /*&& !HasAchieved(req->AchievementID)*/) + return false; + + if (req->ItemModifiedAppearanceID && !GetCollectionMgr()->HasItemAppearance(req->ItemModifiedAppearanceID).first) + return false; + + if (checkRequiredDependentChoices) { - do + if (std::unordered_map<uint32, std::vector<uint32>> const* requiredChoices = sDB2Manager.GetRequiredCustomizationChoices(req->ID)) { - Field* fields = result->Fetch(); - WorldPackets::Character::EnumCharactersResult::CharacterInfo charInfo(fields); - - TC_LOG_INFO("network", "Loading undeleted char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); + for (std::pair<uint32 const /*chrCustomizationOptionId*/, std::vector<uint32>> const& requiredChoicesForOption : *requiredChoices) + { + bool hasRequiredChoiceForOption = false; + for (uint32 requiredChoice : requiredChoicesForOption.second) + { + auto choiceItr = std::find_if(selectedChoices.begin(), selectedChoices.end(), [requiredChoice](UF::ChrCustomizationChoice const& choice) + { + return choice.ChrCustomizationChoiceID == requiredChoice; + }); - if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. - sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexID, charInfo.RaceID, charInfo.ClassID, charInfo.ExperienceLevel, true); + if (choiceItr != selectedChoices.end()) + { + hasRequiredChoiceForOption = true; + break; + } + } - charEnum.Characters.emplace_back(charInfo); + if (!hasRequiredChoiceForOption) + return false; + } } - while (result->NextRow()); } - SendPacket(charEnum.Write()); + return true; } -void WorldSession::HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/) +bool WorldSession::ValidateAppearance(Races race, Classes playerClass, Gender gender, Trinity::IteratorPair<UF::ChrCustomizationChoice const*> customizations) { - /// get all the data necessary for loading all undeleted characters (along with their pets) on the account - CharacterDatabasePreparedStatement* stmt = nullptr; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED)) - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME); - else - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_UNDELETE_ENUM); + std::vector<ChrCustomizationOptionEntry const*> const* options = sDB2Manager.GetCustomiztionOptions(race, gender); + if (!options) + return false; + + uint32 previousOption = 0; + + for (UF::ChrCustomizationChoice playerChoice : customizations) + { + // check uniqueness of options + if (playerChoice.ChrCustomizationOptionID == previousOption) + return false; + + previousOption = playerChoice.ChrCustomizationOptionID; + + // check if we can use this option + auto customizationOptionDataItr = std::find_if(options->begin(), options->end(), [&](ChrCustomizationOptionEntry const* option) + { + return option->ID == playerChoice.ChrCustomizationOptionID; + }); - stmt->setUInt8(0, PET_SAVE_AS_CURRENT); - stmt->setUInt32(1, GetAccountId()); + // option not found for race/gender combination + if (customizationOptionDataItr == options->end()) + return false; - _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSession::HandleCharUndeleteEnum, this, std::placeholders::_1))); + if (ChrCustomizationReqEntry const* req = sChrCustomizationReqStore.LookupEntry((*customizationOptionDataItr)->ChrCustomizationReqID)) + if (!MeetsChrCustomizationReq(req, playerClass, false, customizations)) + return false; + + std::vector<ChrCustomizationChoiceEntry const*> const* choicesForOption = sDB2Manager.GetCustomiztionChoices(playerChoice.ChrCustomizationOptionID); + if (!choicesForOption) + return false; + + auto customizationChoiceDataItr = std::find_if(choicesForOption->begin(), choicesForOption->end(), [&](ChrCustomizationChoiceEntry const* choice) + { + return choice->ID == playerChoice.ChrCustomizationChoiceID; + }); + + // choice not found for option + if (customizationChoiceDataItr == choicesForOption->end()) + return false; + + if (ChrCustomizationReqEntry const* req = sChrCustomizationReqStore.LookupEntry((*customizationChoiceDataItr)->ChrCustomizationReqID)) + if (!MeetsChrCustomizationReq(req, playerClass, true, customizations)) + return false; + } + + return true; } void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharacter& charCreate) @@ -673,19 +808,6 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact if (checkDemonHunterReqs) { - uint8 accClass = field[2].GetUInt8(); - if (accClass == CLASS_DEMON_HUNTER) - { - if (freeDemonHunterSlots > 0) - --freeDemonHunterSlots; - - if (freeDemonHunterSlots == 0) - { - SendCharCreate(CHAR_CREATE_FAILED); - return; - } - } - if (!hasDemonHunterReqLevel) { uint8 accLevel = field[0].GetUInt8(); @@ -746,7 +868,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact { TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Create Character: %s %s", GetAccountId(), GetRemoteAddress().c_str(), newChar->GetName().c_str(), newChar->GetGUID().ToString().c_str()); sScriptMgr->OnPlayerCreate(newChar.get()); - sCharacterCache->AddCharacterCacheEntry(newChar->GetGUID(), GetAccountId(), newChar->GetName(), newChar->m_playerData->NativeSex, newChar->getRace(), newChar->getClass(), newChar->getLevel(), false); + sCharacterCache->AddCharacterCacheEntry(newChar->GetGUID(), GetAccountId(), newChar->GetName(), newChar->GetNativeSex(), newChar->getRace(), newChar->getClass(), newChar->getLevel(), false); SendCharCreate(CHAR_CREATE_SUCCESS, newChar->GetGUID()); } @@ -763,7 +885,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_CREATE_INFO); stmt->setUInt32(0, GetAccountId()); - stmt->setUInt32(1, (skipCinematics == 1 || createInfo->Class == CLASS_DEMON_HUNTER) ? 12 : 1); + stmt->setUInt32(1, (skipCinematics == 1 || createInfo->Class == CLASS_DEMON_HUNTER) ? 1200 : 1); // 200 (max chars per realm) + 1000 (max deleted chars per realm) queryCallback.WithPreparedCallback(std::move(finalizeCharacterCreation)).SetNextQuery(CharacterDatabase.AsyncQuery(stmt)); })); } @@ -1532,41 +1654,7 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPackets::Character::SetPlay void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance& packet) { - BarberShopStyleEntry const* bs_hair = sBarberShopStyleStore.LookupEntry(packet.NewHairStyle); - if (!bs_hair || bs_hair->Type != 0 || bs_hair->Race != _player->getRace() || bs_hair->Sex != _player->m_playerData->NativeSex) - return; - - BarberShopStyleEntry const* bs_facialHair = sBarberShopStyleStore.LookupEntry(packet.NewFacialHair); - if (!bs_facialHair || bs_facialHair->Type != 2 || bs_facialHair->Race != _player->getRace() || bs_facialHair->Sex != _player->m_playerData->NativeSex) - return; - - BarberShopStyleEntry const* bs_skinColor = sBarberShopStyleStore.LookupEntry(packet.NewSkinColor); - if (bs_skinColor && (bs_skinColor->Type != 3 || bs_skinColor->Race != _player->getRace() || bs_skinColor->Sex != _player->m_playerData->NativeSex)) - return; - - BarberShopStyleEntry const* bs_face = sBarberShopStyleStore.LookupEntry(packet.NewFace); - if (bs_face && (bs_face->Type != 4 || bs_face->Race != _player->getRace() || bs_face->Sex != _player->m_playerData->NativeSex)) - return; - - std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplayEntries; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplay; - for (std::size_t i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - { - BarberShopStyleEntry const* bs_customDisplay = sBarberShopStyleStore.LookupEntry(packet.NewCustomDisplay[i]); - if (bs_customDisplay && (bs_customDisplay->Type != 5 + i || bs_customDisplay->Race != _player->getRace() || bs_customDisplay->Sex != _player->m_playerData->NativeSex)) - return; - - customDisplayEntries[i] = bs_customDisplay; - customDisplay[i] = bs_customDisplay ? bs_customDisplay->Data : 0; - } - - if (!Player::ValidateAppearance(_player->getRace(), _player->getClass(), _player->m_playerData->NativeSex, - bs_hair->Data, - packet.NewHairColor, - bs_face ? bs_face->Data : _player->m_playerData->FaceID, - bs_facialHair->Data, - bs_skinColor ? bs_skinColor->Data : _player->m_playerData->SkinID, - customDisplay)) + if (!ValidateAppearance(Races(_player->getRace()), Classes(_player->getClass()), Gender(packet.NewSex), MakeChrCustomizationChoiceRange(packet.Customizations))) return; GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f); @@ -1582,12 +1670,12 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance return; } - uint32 cost = _player->GetBarberShopCost(bs_hair, packet.NewHairColor, bs_facialHair, bs_skinColor, bs_face, customDisplayEntries); + int64 cost = _player->GetBarberShopCost(MakeChrCustomizationChoiceRange(packet.Customizations)); // 0 - ok // 1, 3 - not enough money // 2 - you have to sit on barber chair - if (!_player->HasEnoughMoney((uint64)cost)) + if (!_player->HasEnoughMoney(cost)) { SendPacket(WorldPackets::Character::BarberShopResult(WorldPackets::Character::BarberShopResult::ResultEnum::NoMoney).Write()); return; @@ -1595,23 +1683,17 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance SendPacket(WorldPackets::Character::BarberShopResult(WorldPackets::Character::BarberShopResult::ResultEnum::Success).Write()); - _player->ModifyMoney(-int64(cost)); // it isn't free + _player->ModifyMoney(-cost); // it isn't free _player->UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, cost); - _player->SetHairStyleId(bs_hair->Data); - _player->SetHairColorId(packet.NewHairColor); - _player->SetFacialHairStyleId(bs_facialHair->Data); - if (bs_skinColor) - _player->SetSkinId(bs_skinColor->Data); - if (bs_face) - _player->SetFaceId(bs_face->Data); - - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - _player->SetCustomDisplayOption(i, customDisplay[i]); + _player->SetNativeSex(packet.NewSex); + _player->SetCustomizations(Trinity::Containers::MakeIteratorPair(packet.Customizations.begin(), packet.Customizations.end())); _player->UpdateCriteria(CRITERIA_TYPE_VISIT_BARBER_SHOP, 1); _player->SetStandState(UNIT_STAND_STATE_STAND); + + sCharacterCache->UpdateCharacterGender(_player->GetGUID(), packet.NewSex); } void WorldSession::HandleCharCustomizeOpcode(WorldPackets::Character::CharCustomize& packet) @@ -1642,13 +1724,12 @@ void WorldSession::HandleCharCustomizeCallback(std::shared_ptr<WorldPackets::Cha Field* fields = result->Fetch(); std::string oldName = fields[0].GetString(); - uint8 plrRace = fields[1].GetUInt8(); - uint8 plrClass = fields[2].GetUInt8(); - uint8 plrGender = fields[3].GetUInt8(); + Races plrRace = Races(fields[1].GetUInt8()); + Classes plrClass = Classes(fields[2].GetUInt8()); + Gender plrGender = Gender(fields[3].GetUInt8()); uint16 atLoginFlags = fields[4].GetUInt16(); - if (!Player::ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo->HairStyleID, customizeInfo->HairColorID, customizeInfo->FaceID, - customizeInfo->FacialHairStyleID, customizeInfo->SkinID, customizeInfo->CustomDisplay)) + if (!ValidateAppearance(plrRace, plrClass, plrGender, MakeChrCustomizationChoiceRange(customizeInfo->Customizations))) { SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo.get()); return; @@ -1708,22 +1789,7 @@ void WorldSession::HandleCharCustomizeCallback(std::shared_ptr<WorldPackets::Cha ObjectGuid::LowType lowGuid = customizeInfo->CharGUID.GetCounter(); /// Customize - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_AND_APPEARANCE); - - stmt->setUInt8(0, customizeInfo->SexID); - stmt->setUInt8(1, customizeInfo->SkinID); - stmt->setUInt8(2, customizeInfo->FaceID); - stmt->setUInt8(3, customizeInfo->HairStyleID); - stmt->setUInt8(4, customizeInfo->HairColorID); - stmt->setUInt8(5, customizeInfo->FacialHairStyleID); - stmt->setUInt8(6, customizeInfo->CustomDisplay[0]); - stmt->setUInt8(7, customizeInfo->CustomDisplay[1]); - stmt->setUInt8(8, customizeInfo->CustomDisplay[2]); - stmt->setUInt64(9, lowGuid); - - trans->Append(stmt); - } + Player::SaveCustomizations(trans, lowGuid, MakeChrCustomizationChoiceRange(customizeInfo->Customizations)); /// Name Change and update atLogin flags { @@ -1823,7 +1889,7 @@ void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipm if (!illusion->ItemVisual || !(illusion->Flags & ENCHANTMENT_COLLECTABLE)) return false; - if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->TransmogPlayerConditionID)) + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->TransmogUseConditionID)) if (!sConditionMgr->IsPlayerMeetingCondition(_player, condition)) return false; @@ -2055,21 +2121,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa } // Customize - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_AND_APPEARANCE); - stmt->setUInt8(0, factionChangeInfo->SexID); - stmt->setUInt8(1, factionChangeInfo->SkinID); - stmt->setUInt8(2, factionChangeInfo->FaceID); - stmt->setUInt8(3, factionChangeInfo->HairStyleID); - stmt->setUInt8(4, factionChangeInfo->HairColorID); - stmt->setUInt8(5, factionChangeInfo->FacialHairStyleID); - stmt->setUInt8(6, factionChangeInfo->CustomDisplay[0]); - stmt->setUInt8(7, factionChangeInfo->CustomDisplay[1]); - stmt->setUInt8(8, factionChangeInfo->CustomDisplay[2]); - stmt->setUInt64(9, lowGuid); - - trans->Append(stmt); - } + Player::SaveCustomizations(trans, lowGuid, MakeChrCustomizationChoiceRange(factionChangeInfo->Customizations)); // Race Change { diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index d2822839f8a..dd9646d8dd2 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -459,6 +459,7 @@ void WorldSession::HandleSellItemOpcode(WorldPackets::Item::SellItem& packet) } _player->UpdateCriteria(CRITERIA_TYPE_MONEY_FROM_VENDORS, money); + _player->UpdateCriteria(CRITERIA_TYPE_SOLD_ITEM_TO_VENDOR, 1); if (packet.Amount < pItem->GetCount()) // need split items { diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index b2982d5c36d..f84ebc3d67e 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -145,7 +145,8 @@ void WorldSession::SendLfgPlayerLockInfo() // Get Random dungeons that can be done at a certain level and expansion uint8 level = GetPlayer()->getLevel(); - lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion()); + uint32 contentTuningReplacementConditionMask = GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask; + lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion(), contentTuningReplacementConditionMask); WorldPackets::LFG::LfgPlayerInfo lfgPlayerInfo; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index b888816666a..c26aa694795 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -290,7 +290,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != packet.Choice.Item.ItemID) + if (uint32(questPackageItem->ItemID) != packet.Choice.Item.ItemID) continue; if (_player->CanSelectQuestPackageItem(questPackageItem)) @@ -307,7 +307,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != packet.Choice.Item.ItemID) + if (uint32(questPackageItem->ItemID) != packet.Choice.Item.ItemID) continue; itemValid = true; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 8ccfd1c29c3..94c3c73147e 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -539,10 +539,11 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI mirrorImageComponentedData.Gender = creator->getGender(); mirrorImageComponentedData.ClassID = creator->getClass(); - Guild* guild = player->GetGuild(); - for (UF::ChrCustomizationChoice customization : player->m_playerData->Customizations) - mirrorImageComponentedData.Customizations.push_back({ customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID }); + for (UF::ChrCustomizationChoice const& customization : player->m_playerData->Customizations) + mirrorImageComponentedData.Customizations.push_back(customization); + + Guild* guild = player->GetGuild(); mirrorImageComponentedData.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); mirrorImageComponentedData.ItemDisplayID.reserve(11); diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp index 37e3d3228de..b7faf646a82 100644 --- a/src/server/game/Handlers/TransmogrificationHandler.cpp +++ b/src/server/game/Handlers/TransmogrificationHandler.cpp @@ -141,11 +141,11 @@ void WorldSession::HandleTransmogrifyItems(WorldPackets::Transmogrification::Tra return; } - if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->TransmogPlayerConditionID)) + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->TransmogUseConditionID)) { if (!sConditionMgr->IsPlayerMeetingCondition(player, condition)) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not collected enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not allowed enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); return; } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b96fb726d50..bd844ac6329 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -18,6 +18,7 @@ #include "Map.h" #include "Battleground.h" #include "CellImpl.h" +#include "CharacterPackets.h" #include "Conversation.h" #include "DatabaseEnv.h" #include "DisableMgr.h" @@ -4777,16 +4778,26 @@ time_t Map::GetLinkedRespawnTime(ObjectGuid guid) const void Map::LoadCorpseData() { + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSES); + stmt->setUInt32(0, GetId()); + stmt->setUInt32(1, GetInstanceId()); + + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) + return; + std::unordered_map<ObjectGuid::LowType, std::unordered_set<uint32>> phases; + std::unordered_map<ObjectGuid::LowType, std::vector<UF::ChrCustomizationChoice>> customizations; - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSE_PHASES); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSE_PHASES); stmt->setUInt32(0, GetId()); stmt->setUInt32(1, GetInstanceId()); // 0 1 // SELECT OwnerGuid, PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? - PreparedQueryResult phaseResult = CharacterDatabase.Query(stmt); - if (phaseResult) + if (PreparedQueryResult phaseResult = CharacterDatabase.Query(stmt)) { do { @@ -4799,15 +4810,23 @@ void Map::LoadCorpseData() } while (phaseResult->NextRow()); } - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSES); - stmt->setUInt32(0, GetId()); - stmt->setUInt32(1, GetInstanceId()); + // 0 1 2 + // SELECT cc.ownerGuid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM corpse_customizations cc LEFT JOIN corpse c ON cc.ownerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? + if (PreparedQueryResult customizationResult = CharacterDatabase.Query(stmt)) + { + do + { + Field* fields = customizationResult->Fetch(); + ObjectGuid::LowType guid = fields[0].GetUInt64(); + std::vector<UF::ChrCustomizationChoice>& customizationsForCorpse = customizations[guid]; - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - return; + customizationsForCorpse.emplace_back(); + UF::ChrCustomizationChoice& choice = customizationsForCorpse.back(); + choice.ChrCustomizationOptionID = fields[1].GetUInt32(); + choice.ChrCustomizationChoiceID = fields[2].GetUInt32(); + + } while (customizationResult->NextRow()); + } do { @@ -4830,6 +4849,8 @@ void Map::LoadCorpseData() for (uint32 phaseId : phases[guid]) PhasingHandler::AddPhase(corpse, phaseId, false); + corpse->SetCustomizations(Trinity::Containers::MakeIteratorPair(customizations[guid].begin(), customizations[guid].end())); + AddCorpse(corpse); } while (result->NextRow()); @@ -4907,19 +4928,12 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*= bones->SetDisplayId(corpse->m_corpseData->DisplayID); bones->SetRace(corpse->m_corpseData->RaceID); bones->SetSex(corpse->m_corpseData->Sex); - bones->SetSkin(corpse->m_corpseData->SkinID); - bones->SetFace(corpse->m_corpseData->FaceID); - bones->SetHairStyle(corpse->m_corpseData->HairStyleID); - bones->SetHairColor(corpse->m_corpseData->HairColorID); - bones->SetFacialHairStyle(corpse->m_corpseData->FacialHairStyleID); + bones->SetCustomizations(Trinity::Containers::MakeIteratorPair(corpse->m_corpseData->Customizations.begin(), corpse->m_corpseData->Customizations.end())); bones->SetFlags(corpse->m_corpseData->Flags | CORPSE_FLAG_BONES); bones->SetFactionTemplate(corpse->m_corpseData->FactionTemplate); for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) bones->SetItem(i, corpse->m_corpseData->Items[i]); - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - bones->SetCustomDisplayOption(i, corpse->m_corpseData->CustomDisplayOption[i]); - bones->SetCellCoord(corpse->GetCellCoord()); bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation()); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 9c87ab14765..8fbbe27d99b 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -72,7 +72,7 @@ enum LootModes LOOT_MODE_JUNK_FISH = 0x8000 }; -#define MAX_CHARACTERS_PER_REALM 16 +#define MAX_CHARACTERS_PER_REALM 200 enum Expansions { @@ -85,34 +85,36 @@ enum Expansions EXPANSION_WARLORDS_OF_DRAENOR = 5, EXPANSION_LEGION = 6, EXPANSION_BATTLE_FOR_AZEROTH = 7, - MAX_EXPANSIONS, EXPANSION_SHADOWLANDS = 8, + MAX_EXPANSIONS, MAX_ACCOUNT_EXPANSIONS }; -#define CURRENT_EXPANSION EXPANSION_BATTLE_FOR_AZEROTH +#define CURRENT_EXPANSION EXPANSION_SHADOWLANDS -inline uint32 GetMaxLevelForExpansion(uint32 expansion) +constexpr uint32 GetMaxLevelForExpansion(uint32 expansion) { switch (expansion) { case EXPANSION_CLASSIC: - return 60; + return 30; case EXPANSION_THE_BURNING_CRUSADE: - return 70; + return 30; case EXPANSION_WRATH_OF_THE_LICH_KING: - return 80; + return 30; case EXPANSION_CATACLYSM: - return 85; + return 35; case EXPANSION_MISTS_OF_PANDARIA: - return 90; + return 35; case EXPANSION_WARLORDS_OF_DRAENOR: - return 100; + return 40; case EXPANSION_LEGION: - return 110; + return 45; case EXPANSION_BATTLE_FOR_AZEROTH: - return 120; + return 50; + case EXPANSION_SHADOWLANDS: + return 60; default: break; } @@ -864,9 +866,14 @@ enum SpellAttr13 SPELL_ATTR13_UNK23 = 0x00800000 // 23 }; +enum SpellAttr14 +{ +}; + #define MIN_SPECIALIZATION_LEVEL 10 -#define MAX_SPECIALIZATIONS 4 +#define MAX_SPECIALIZATIONS 5 #define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES +#define INITIAL_SPECIALIZATION_INDEX 4 // Custom values enum SpellClickUserTypes @@ -1313,6 +1320,18 @@ enum SpellEffectName SPELL_EFFECT_UPGRADE_ITEM = 269, SPELL_EFFECT_270 = 270, SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM = 271, + SPELL_EFFECT_SET_COVENANT = 272, + SPELL_EFFECT_CRAFT_RUNEFORGE_LEGENDARY = 273, + SPELL_EFFECT_274 = 274, + SPELL_EFFECT_275 = 275, + SPELL_EFFECT_LEARN_TRANSMOG_ILLUSION = 276, + SPELL_EFFECT_SET_CHROMIE_TIME = 277, + SPELL_EFFECT_278 = 278, + SPELL_EFFECT_LEARN_GARR_TALENT = 279, + SPELL_EFFECT_280 = 280, + SPELL_EFFECT_LEARN_SOULBIND_CONDUIT = 281, + SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY = 282, + SPELL_EFFECT_283 = 283, TOTAL_SPELL_EFFECTS }; @@ -2380,6 +2399,7 @@ enum Targets TARGET_UNK_148 = 148, TARGET_UNK_149 = 149, TARGET_UNIT_OWN_CRITTER = 150, // own battle pet from UNIT_FIELD_CRITTER + TARGET_UNK_151 = 151, TOTAL_SPELL_TARGETS }; diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 55285fe0394..a1d8520c8dd 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -26,6 +26,7 @@ #include "QuestPackets.h" #include "SpellMgr.h" #include "World.h" +#include "WorldSession.h" Quest::Quest(Field* questRecord) { @@ -280,17 +281,16 @@ uint32 Quest::XPValue(Player const* player) const if (!questXp || _rewardXPDifficulty >= 10) return 0; - float multiplier = 1.0f; - if (questLevel != player->getLevel()) - multiplier = sXpGameTable.GetRow(std::min<int32>(player->getLevel(), questLevel))->Divisor / sXpGameTable.GetRow(player->getLevel())->Divisor; - - int32 diffFactor = 2 * (questLevel + (GetQuestLevel() == -1 ? 0 : 5) - player->getLevel()) + 10; + int32 diffFactor = 2 * (questLevel - player->getLevel()) + 12; if (diffFactor < 1) diffFactor = 1; else if (diffFactor > 10) diffFactor = 10; - uint32 xp = diffFactor * questXp->Difficulty[_rewardXPDifficulty] * _rewardXPMultiplier / 10 * multiplier; + uint32 xp = diffFactor * questXp->Difficulty[_rewardXPDifficulty] * _rewardXPMultiplier / 10; + if (player->getLevel() >= GetMaxLevelForExpansion(CURRENT_EXPANSION - 1) && player->GetSession()->GetExpansion() == CURRENT_EXPANSION && _expansion < CURRENT_EXPANSION) + xp = uint32(xp / 9.0f); + if (xp <= 100) xp = 5 * ((xp + 2) / 5); else if (xp <= 500) diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 3312aa5f89b..1a2e5fe6c50 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -404,12 +404,6 @@ class TC_GAME_API Quest bool HasSpecialFlag(uint32 flag) const { return (_specialFlags & flag) != 0; } void SetSpecialFlag(uint32 flag) { _specialFlags |= flag; } - // DEPRECATED - int32 GetMinLevel() const { return 0; } - int32 GetQuestLevel() const { return 0; } - int32 GetQuestScalingFactionGroup() const { return 0; } - int32 GetQuestMaxScalingLevel() const { return 0; } - // table data accessors: uint32 GetQuestId() const { return _id; } uint32 GetQuestType() const { return _type; } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 86ebe42cb7f..4353e10d403 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -22,9 +22,7 @@ #include "Player.h" #include "World.h" -namespace WorldPackets -{ -namespace Character +namespace UF { ByteBuffer& operator<<(ByteBuffer& data, ChrCustomizationChoice const& customizationChoice) { @@ -41,6 +39,25 @@ ByteBuffer& operator>>(ByteBuffer& data, ChrCustomizationChoice& customizationCh return data; } +} + +namespace WorldPackets +{ +namespace Character +{ +void SortCustomizations(Array<ChrCustomizationChoice, 50>& customizations) +{ + auto first = customizations.begin(); + auto last = customizations.end(); + for (auto itr = first; itr != last; ++itr) + { + auto insertion = std::upper_bound(first, itr, *itr, [](ChrCustomizationChoice const& left, ChrCustomizationChoice const& right) + { + return left.ChrCustomizationOptionID < right.ChrCustomizationOptionID; + }); + std::rotate(insertion, itr, std::next(itr)); + } +} EnumCharacters::EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(packet)) { @@ -49,15 +66,13 @@ EnumCharacters::EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(pa EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) { - // 0 1 2 3 4 5 6 7 - // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle, " - // 8 9 10 11 12 13 - // "characters.hairColor, characters.facialStyle, characters.customDisplay1, characters.customDisplay2, characters.customDisplay3, characters.level, " - // 14 15 16 17 18 + // 0 1 2 3 4 5 + // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.level, " + // 6 7 8 9 10 // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " - // 19 20 21 22 23 24 25 + // 11 12 13 14 15 16 17 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 26 27 28 29 30 31 + // 18 19 20 21 22 23 // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive" Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); @@ -65,24 +80,16 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) RaceID = fields[2].GetUInt8(); ClassID = fields[3].GetUInt8(); SexID = fields[4].GetUInt8(); - SkinID = fields[5].GetUInt8(); - FaceID = fields[6].GetUInt8(); - HairStyle = fields[7].GetUInt8(); - HairColor = fields[8].GetUInt8(); - FacialHair = fields[9].GetUInt8(); - CustomDisplay[0] = fields[10].GetUInt8(); - CustomDisplay[1] = fields[11].GetUInt8(); - CustomDisplay[2] = fields[12].GetUInt8(); - ExperienceLevel = fields[13].GetUInt8(); - ZoneID = int32(fields[14].GetUInt16()); - MapID = int32(fields[15].GetUInt16()); - PreloadPos = Position(fields[16].GetFloat(), fields[17].GetFloat(), fields[18].GetFloat()); - - if (ObjectGuid::LowType guildId = fields[19].GetUInt64()) + ExperienceLevel = fields[5].GetUInt8(); + ZoneID = int32(fields[6].GetUInt16()); + MapID = int32(fields[7].GetUInt16()); + PreloadPos = Position(fields[8].GetFloat(), fields[8].GetFloat(), fields[10].GetFloat()); + + if (ObjectGuid::LowType guildId = fields[11].GetUInt64()) GuildGUID = ObjectGuid::Create<HighGuid::Guild>(guildId); - uint32 playerFlags = fields[20].GetUInt32(); - uint32 atLoginFlags = fields[21].GetUInt16(); + uint32 playerFlags = fields[12].GetUInt32(); + uint32 atLoginFlags = fields[13].GetUInt16(); if (atLoginFlags & AT_LOGIN_RESURRECT) playerFlags &= ~PLAYER_FLAGS_GHOST; @@ -93,10 +100,10 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) if (atLoginFlags & AT_LOGIN_RENAME) Flags |= CHARACTER_FLAG_RENAME; - if (fields[26].GetUInt64()) + if (fields[18].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[31].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[23].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -113,10 +120,10 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) // show pet at selection character in character list only for non-ghost character if (!(playerFlags & PLAYER_FLAGS_GHOST) && (ClassID == CLASS_WARLOCK || ClassID == CLASS_HUNTER || ClassID == CLASS_DEATH_KNIGHT)) { - if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(fields[22].GetUInt32())) + if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(fields[14].GetUInt32())) { - PetCreatureDisplayID = fields[23].GetUInt32(); - PetExperienceLevel = fields[24].GetUInt16(); + PetCreatureDisplayID = fields[15].GetUInt32(); + PetExperienceLevel = fields[16].GetUInt16(); PetCreatureFamilyID = creatureInfo->family; } } @@ -125,13 +132,13 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) ProfessionIds[0] = 0; ProfessionIds[1] = 0; - Tokenizer equipment(fields[25].GetString(), ' '); - ListPosition = fields[27].GetUInt8(); - LastPlayedTime = fields[28].GetUInt32(); - if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(ClassID, fields[29].GetUInt8())) + Tokenizer equipment(fields[17].GetString(), ' '); + ListPosition = fields[19].GetUInt8(); + LastPlayedTime = fields[20].GetUInt32(); + if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(ClassID, fields[21].GetUInt8())) SpecID = spec->ID; - LastLoginVersion = fields[30].GetUInt32(); + LastLoginVersion = fields[22].GetUInt32(); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -292,6 +299,8 @@ void CreateCharacter::Read() for (ChrCustomizationChoice& customization : CreateInfo->Customizations) _worldPacket >> customization; + + SortCustomizations(CreateInfo->Customizations); } WorldPacket const* CreateChar::Write() @@ -343,6 +352,8 @@ void CharCustomize::Read() for (ChrCustomizationChoice& customization : CustomizeInfo->Customizations) _worldPacket >> customization; + SortCustomizations(CustomizeInfo->Customizations); + CustomizeInfo->CharName = _worldPacket.ReadString(_worldPacket.ReadBits(6)); } @@ -361,6 +372,8 @@ void CharRaceOrFactionChange::Read() RaceOrFactionChangeInfo->Name = _worldPacket.ReadString(nameLength); for (ChrCustomizationChoice& customization : RaceOrFactionChangeInfo->Customizations) _worldPacket >> customization; + + SortCustomizations(RaceOrFactionChangeInfo->Customizations); } WorldPacket const* CharFactionChangeResult::Write() @@ -516,6 +529,8 @@ void AlterApperance::Read() _worldPacket >> NewSex; for (ChrCustomizationChoice& customization : Customizations) _worldPacket >> customization; + + SortCustomizations(Customizations); } WorldPacket const* BarberShopResult::Write() diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index d34e5d7e301..2cfc28b3e09 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -26,23 +26,25 @@ #include "RaceMask.h" #include "SharedDefines.h" #include "UnitDefines.h" +#include "UpdateFields.h" #include <array> #include <memory> class Field; +namespace UF +{ + struct ChrCustomizationChoice; + + ByteBuffer& operator<<(ByteBuffer& data, ChrCustomizationChoice const& customizationChoice); + ByteBuffer& operator>>(ByteBuffer& data, ChrCustomizationChoice& customizationChoice); +} + namespace WorldPackets { namespace Character { - struct ChrCustomizationChoice - { - uint32 ChrCustomizationOptionID = 0; - uint32 ChrCustomizationChoiceID = 0; - }; - - ByteBuffer& operator<<(ByteBuffer& data, ChrCustomizationChoice const& customizationChoice); - ByteBuffer& operator>>(ByteBuffer& data, ChrCustomizationChoice& customizationChoice); + using ChrCustomizationChoice = UF::ChrCustomizationChoice; class EnumCharacters final : public ClientPacket { diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 0abe35115fe..7143abbf655 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -77,12 +77,12 @@ void WorldPackets::Inspect::PlayerModelDisplayInfo::Initialize(Player const* pla GUID = player->GetGUID(); SpecializationID = player->GetPrimarySpecialization(); Name = player->GetName(); - GenderID = player->m_playerData->NativeSex; + GenderID = player->GetNativeSex(); Race = player->getRace(); ClassID = player->getClass(); - for (UF::ChrCustomizationChoice customization : player->m_playerData->Customizations) - Customizations.push_back({ customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID }); + for (UF::ChrCustomizationChoice const& customization : player->m_playerData->Customizations) + Customizations.push_back(customization); for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) if (::Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i)) diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index e6cdb28ee60..d1a113b9ed6 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -133,7 +133,7 @@ bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& gui BnetAccountID = player->GetSession()->GetBattlenetAccountGUID(); Name = player->GetName(); Race = player->getRace(); - Sex = player->m_playerData->NativeSex; + Sex = player->GetNativeSex(); ClassID = player->getClass(); Level = player->getLevel(); diff --git a/src/server/game/Server/Packets/ScenarioPackets.h b/src/server/game/Server/Packets/ScenarioPackets.h index 1322b2922e3..7e58d9bb502 100644 --- a/src/server/game/Server/Packets/ScenarioPackets.h +++ b/src/server/game/Server/Packets/ScenarioPackets.h @@ -22,7 +22,7 @@ #include "PacketUtilities.h" #include "AchievementPackets.h" -#define MAX_ALLOWED_SCENARIO_POI_QUERY_SIZE 50 +#define MAX_ALLOWED_SCENARIO_POI_QUERY_SIZE 66 struct ScenarioPOI; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 74119b46016..a9bb542d0ca 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -899,6 +899,9 @@ void WorldSession::ProcessQueryCallbacks() //! HandlePlayerLoginOpcode if (_charLoginCallback.valid() && _charLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready) HandlePlayerLogin(reinterpret_cast<LoginQueryHolder*>(_charLoginCallback.get())); + + if (_charEnumCallback.valid() && _charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + HandleCharEnum(static_cast<CharacterDatabaseQueryHolder*>(_charEnumCallback.get())); } TransactionCallback& WorldSession::AddTransactionCallback(TransactionCallback&& callback) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5f990c35e52..423d83d582e 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -27,9 +27,11 @@ #include "AuthDefines.h" #include "DatabaseEnvFwd.h" #include "Duration.h" +#include "IteratorPair.h" #include "LockedQueue.h" #include "ObjectGuid.h" #include "Packet.h" +#include "RaceMask.h" #include "SharedDefines.h" #include <array> #include <unordered_map> @@ -49,6 +51,7 @@ class WorldSession; class WorldSocket; struct AuctionPosting; struct BlackMarketTemplate; +struct ChrCustomizationReqEntry; struct DeclinedName; struct ItemTemplate; struct MovementInfo; @@ -76,6 +79,11 @@ namespace rbac class RBACData; } +namespace UF +{ + struct ChrCustomizationChoice; +} + namespace WorldPackets { namespace Achievement @@ -1117,9 +1125,8 @@ class TC_GAME_API WorldSession void Handle_EarlyProccess(WorldPackets::Null& null); // just mark packets processed in WorldSocket::OnRead void LogUnprocessedTail(WorldPacket const* packet); - void HandleCharEnum(PreparedQueryResult result); + void HandleCharEnum(CharacterDatabaseQueryHolder* holder); void HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/); - void HandleCharUndeleteEnum(PreparedQueryResult result); void HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/); void HandleCharDeleteOpcode(WorldPackets::Character::CharDelete& charDelete); void HandleCharCreateOpcode(WorldPackets::Character::CreateCharacter& charCreate); @@ -1145,6 +1152,10 @@ class TC_GAME_API WorldSession void HandleGetUndeleteCooldownStatus(WorldPackets::Character::GetUndeleteCharacterCooldownStatus& /*getCooldown*/); void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result); void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo); + bool MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, Classes playerClass, + bool checkRequiredDependentChoices, Trinity::IteratorPair<UF::ChrCustomizationChoice const*> selectedChoices) const; + bool ValidateAppearance(Races race, Classes playerClass, Gender gender, + Trinity::IteratorPair<UF::ChrCustomizationChoice const*> customizations); // customizations must be sorted void SendCharCreate(ResponseCodes result, ObjectGuid const& guid = ObjectGuid::Empty); void SendCharDelete(ResponseCodes result); @@ -1768,6 +1779,7 @@ class TC_GAME_API WorldSession QueryResultHolderFuture _realmAccountLoginCallback; QueryResultHolderFuture _accountLoginCallback; QueryResultHolderFuture _charLoginCallback; + QueryResultHolderFuture _charEnumCallback; QueryCallbackProcessor _queryProcessor; AsyncCallbackProcessor<TransactionCallback> _transactionCallbacks; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 51762d02c43..7c471793585 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -558,11 +558,21 @@ enum AuraType : uint32 SPELL_AURA_486 = 486, SPELL_AURA_487 = 487, SPELL_AURA_488 = 488, - SPELL_AURA_489 = 489, + SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE = 489, SPELL_AURA_490 = 490, SPELL_AURA_491 = 491, SPELL_AURA_492 = 492, SPELL_AURA_493 = 493, // 1 spell, 267116 - Animal Companion (modifies Call Pet) + SPELL_AURA_SET_POWER_POINT_CHARGE = 494, // NYI + SPELL_AURA_TRIGGER_SPELL_ON_EXPIRE = 495, // NYI + SPELL_AURA_ALLOW_CHANGING_EQUIPMENT_IN_TORGHAST = 496, // NYI + SPELL_AURA_MOD_ANIMA_GAIN = 497, // NYI + SPELL_AURA_CURRENCY_LOSS_PCT_ON_DEATH = 498, // NYI + SPELL_AURA_MOD_RESTED_XP_CONSUMPTION = 499, + SPELL_AURA_IGNORE_SPELL_CHARGE_COOLDOWN = 500, // NYI + SPELL_AURA_MOD_CRITICAL_DAMAGE_TAKEN_FROM_CASTER = 501, + SPELL_AURA_MOD_VERSATILITY_DAMAGE_DONE_BENEFIT = 502, // NYI + SPELL_AURA_MOD_VERSATILITY_HEALING_DONE_BENEFIT = 503, // NYI TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f41173573e6..b01003763d2 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -555,11 +555,21 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //486 &AuraEffect::HandleNULL, //487 &AuraEffect::HandleNULL, //488 - &AuraEffect::HandleNULL, //489 + &AuraEffect::HandleNULL, //489 SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE &AuraEffect::HandleNULL, //490 &AuraEffect::HandleNULL, //491 &AuraEffect::HandleNULL, //492 &AuraEffect::HandleNULL, //493 + &AuraEffect::HandleNULL, //494 SPELL_AURA_SET_POWER_POINT_CHARGE + &AuraEffect::HandleNULL, //495 SPELL_AURA_TRIGGER_SPELL_ON_EXPIRE + &AuraEffect::HandleNULL, //496 SPELL_AURA_ALLOW_CHANGING_EQUIPMENT_IN_TORGHAST + &AuraEffect::HandleNULL, //497 SPELL_AURA_MOD_ANIMA_GAIN + &AuraEffect::HandleNULL, //498 SPELL_AURA_CURRENCY_LOSS_PCT_ON_DEATH + &AuraEffect::HandleNULL, //499 SPELL_AURA_MOD_RESTED_XP_CONSUMPTION + &AuraEffect::HandleNULL, //500 SPELL_AURA_IGNORE_SPELL_CHARGE_COOLDOWN + &AuraEffect::HandleNULL, //501 SPELL_AURA_MOD_CRITICAL_DAMAGE_TAKEN_FROM_CASTER + &AuraEffect::HandleNULL, //502 SPELL_AURA_MOD_VERSATILITY_DAMAGE_DONE_BENEFIT + &AuraEffect::HandleNULL, //503 SPELL_AURA_MOD_VERSATILITY_HEALING_DONE_BENEFIT }; AuraEffect::AuraEffect(Aura* base, uint32 effIndex, int32 *baseAmount, Unit* caster) : diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 8cf98594710..d6217551d25 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3003,13 +3003,13 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered if (!player->GetCommandStatus(CHEAT_CASTTIME)) { // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail) - m_casttime = m_spellInfo->CalcCastTime(player->getLevel(), this); + m_casttime = m_spellInfo->CalcCastTime(this); } else m_casttime = 0; // Set cast time to 0 if .cheat casttime is enabled. } else - m_casttime = m_spellInfo->CalcCastTime(m_caster->getLevel(), this); + m_casttime = m_spellInfo->CalcCastTime(this); // don't allow channeled spells / spells with cast time to be cast while moving // exception are only channeled spells that have no casttime and SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING @@ -4495,7 +4495,7 @@ void Spell::SendChannelUpdate(uint32 time) { m_caster->ClearChannelObjects(); m_caster->SetChannelSpellId(0); - m_caster->SetChannelSpellXSpellVisualId({}); + m_caster->SetChannelVisual({}); } WorldPackets::Spells::SpellChannelUpdate spellChannelUpdate; @@ -4539,7 +4539,7 @@ void Spell::SendChannelStart(uint32 duration) m_caster->AddChannelObject(target.targetGUID); m_caster->SetChannelSpellId(m_spellInfo->Id); - m_caster->SetChannelSpellXSpellVisualId(m_SpellVisual); + m_caster->SetChannelVisual(m_SpellVisual); } void Spell::SendResurrectRequest(Player* target) @@ -8049,6 +8049,14 @@ bool WorldObjectSpellTrajTargetCheck::operator()(WorldObject* target) } //namespace Trinity +SpellCastVisual::operator UF::SpellCastVisual() const +{ + UF::SpellCastVisual visual; + visual.SpellXSpellVisualID = SpellXSpellVisualID; + visual.ScriptVisualID = ScriptVisualID; + return visual; +} + SpellCastVisual::operator WorldPackets::Spells::SpellCastVisual() const { return { int32(SpellXSpellVisualID), int32(ScriptVisualID) }; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index aa273c977de..11a196d2ed4 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -23,6 +23,7 @@ #include "ObjectGuid.h" #include "Position.h" #include "SharedDefines.h" +#include "SpellDefines.h" #include <memory> namespace WorldPackets diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index 0df1fbe0e6b..30eb419f53f 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -20,6 +20,11 @@ #include "Define.h" +namespace UF +{ + struct SpellCastVisual; +} + namespace WorldPackets { namespace Spells @@ -33,6 +38,7 @@ struct SpellCastVisual uint32 SpellXSpellVisualID = 0; uint32 ScriptVisualID = 0; + operator UF::SpellCastVisual() const; operator WorldPackets::Spells::SpellCastVisual() const; }; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 27343ea9689..7db4fc958d5 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -350,6 +350,18 @@ NonDefaultConstructible<pEffect> SpellEffects[TOTAL_SPELL_EFFECTS] = &Spell::EffectNULL, //269 SPELL_EFFECT_UPGRADE_ITEM &Spell::EffectNULL, //270 SPELL_EFFECT_270 &Spell::EffectApplyAreaAura, //271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM + &Spell::EffectNULL, //272 SPELL_EFFECT_SET_COVENANT + &Spell::EffectNULL, //273 SPELL_EFFECT_CRAFT_RUNEFORGE_LEGENDARY + &Spell::EffectNULL, //274 SPELL_EFFECT_274 + &Spell::EffectNULL, //275 SPELL_EFFECT_275 + &Spell::EffectNULL, //276 SPELL_EFFECT_LEARN_TRANSMOG_ILLUSION + &Spell::EffectNULL, //277 SPELL_EFFECT_SET_CHROMIE_TIME + &Spell::EffectNULL, //278 SPELL_EFFECT_270 + &Spell::EffectNULL, //279 SPELL_EFFECT_LEARN_GARR_TALENT + &Spell::EffectNULL, //280 SPELL_EFFECT_270 + &Spell::EffectNULL, //281 SPELL_EFFECT_LEARN_SOULBIND_CONDUIT + &Spell::EffectNULL, //282 SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY + &Spell::EffectNULL, //283 SPELL_EFFECT_283 }; void Spell::EffectNULL(SpellEffIndex /*effIndex*/) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 3c2ea638171..b0864d5b5d7 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -368,6 +368,7 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 148 {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_RANDOM}, // 149 {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 150 TARGET_UNIT_OWN_CRITTER + {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_ENEMY, TARGET_DIR_NONE}, // 151 }; SpellEffectInfo::SpellEffectInfo(SpellInfo const* spellInfo, SpellEffectEntry const* _effect) @@ -1062,6 +1063,18 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 269 SPELL_EFFECT_UPGRADE_ITEM {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 270 SPELL_EFFECT_270 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 272 SPELL_EFFECT_SET_COVENANT + {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 273 SPELL_EFFECT_CRAFT_RUNEFORGE_LEGENDARY + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 274 SPELL_EFFECT_274 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 275 SPELL_EFFECT_275 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 276 SPELL_EFFECT_LEARN_TRANSMOG_ILLUSION + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 277 SPELL_EFFECT_SET_CHROMIE_TIME + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 278 SPELL_EFFECT_270 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 279 SPELL_EFFECT_LEARN_GARR_TALENT + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 280 SPELL_EFFECT_270 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 281 SPELL_EFFECT_LEARN_SOULBIND_CONDUIT + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 282 SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 283 SPELL_EFFECT_283 }; SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, SpellInfoLoadHelper const& data, SpellVisualVector&& visuals) @@ -1100,6 +1113,7 @@ SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, S AttributesEx11 = _misc ? _misc->Attributes[11] : 0; AttributesEx12 = _misc ? _misc->Attributes[12] : 0; AttributesEx13 = _misc ? _misc->Attributes[13] : 0; + AttributesEx14 = _misc ? _misc->Attributes[14] : 0; CastTimeEntry = _misc ? (_misc->CastingTimeIndex ? sSpellCastTimesStore.LookupEntry(_misc->CastingTimeIndex) : nullptr) : nullptr; DurationEntry = _misc ? (_misc->DurationIndex ? sSpellDurationStore.LookupEntry(_misc->DurationIndex) : nullptr) : nullptr; RangeIndex = _misc ? _misc->RangeIndex : 0; @@ -3655,31 +3669,11 @@ int32 SpellInfo::GetMaxDuration() const return (DurationEntry->MaxDuration == -1) ? -1 : abs(DurationEntry->MaxDuration); } -uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= nullptr*/) const +uint32 SpellInfo::CalcCastTime(Spell* spell /*= nullptr*/) const { int32 castTime = 0; if (CastTimeEntry) - { - int32 calcLevel = spell ? spell->GetCaster()->getLevel() : 0; - if (MaxLevel && uint32(calcLevel) > MaxLevel) - calcLevel = MaxLevel; - - if (HasAttribute(SPELL_ATTR13_UNK17)) - calcLevel *= 5; - - if (MaxLevel && uint32(calcLevel) > MaxLevel) - calcLevel = MaxLevel; - - if (BaseLevel) - calcLevel -= BaseLevel; - - if (calcLevel < 0) - calcLevel = 0; - - castTime = CastTimeEntry->Base + CastTimeEntry->PerLevel * level; - if (castTime < CastTimeEntry->Minimum) - castTime = CastTimeEntry->Minimum; - } + castTime = std::max(CastTimeEntry->Base, CastTimeEntry->Minimum); if (castTime <= 0) return 0; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 81fb91fe020..b208ffdbc94 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -456,6 +456,7 @@ class TC_GAME_API SpellInfo uint32 AttributesEx11; uint32 AttributesEx12; uint32 AttributesEx13; + uint32 AttributesEx14; uint32 AttributesCu; std::bitset<MAX_SPELL_EFFECTS> NegativeEffects; uint64 Stances; @@ -555,6 +556,7 @@ class TC_GAME_API SpellInfo bool HasAttribute(SpellAttr11 attribute) const { return !!(AttributesEx11 & attribute); } bool HasAttribute(SpellAttr12 attribute) const { return !!(AttributesEx12 & attribute); } bool HasAttribute(SpellAttr13 attribute) const { return !!(AttributesEx13 & attribute); } + bool HasAttribute(SpellAttr14 attribute) const { return !!(AttributesEx14 & attribute); } bool HasAttribute(SpellCustomAttributes customAttribute) const { return !!(AttributesCu & customAttribute); } bool HasAnyAuraInterruptFlag() const; @@ -645,7 +647,7 @@ class TC_GAME_API SpellInfo uint32 GetMaxTicks() const; - uint32 CalcCastTime(uint8 level = 0, Spell* spell = nullptr) const; + uint32 CalcCastTime(Spell* spell = nullptr) const; uint32 GetRecoveryTime() const; std::vector<SpellPowerCost> CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask, Spell* spell = nullptr) const; diff --git a/src/server/game/Storages/WhoListStorage.cpp b/src/server/game/Storages/WhoListStorage.cpp index 6b42c0bd71e..7638d9c19ac 100644 --- a/src/server/game/Storages/WhoListStorage.cpp +++ b/src/server/game/Storages/WhoListStorage.cpp @@ -62,7 +62,7 @@ void WhoListStorageMgr::Update() guildGuid = guild->GetGUID(); _whoListStorage.emplace_back(itr->second->GetGUID(), itr->second->GetTeam(), itr->second->GetSession()->GetSecurity(), itr->second->getLevel(), - itr->second->getClass(), itr->second->getRace(), itr->second->GetZoneId(), itr->second->m_playerData->NativeSex, itr->second->IsVisible(), + itr->second->getClass(), itr->second->getRace(), itr->second->GetZoneId(), itr->second->GetNativeSex(), itr->second->IsVisible(), itr->second->IsGameMaster(), widePlayerName, wideGuildName, playerName, guildName, guildGuid); } } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 21d8258278a..b182464c063 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -877,10 +877,11 @@ void World::LoadConfigSettings(bool reload) m_int64_configs[CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK] = sConfigMgr->GetInt64Default("CharacterCreating.Disabled.RaceMask", 0); m_int_configs[CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK] = sConfigMgr->GetIntDefault("CharacterCreating.Disabled.ClassMask", 0); - m_int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetIntDefault("CharactersPerRealm", MAX_CHARACTERS_PER_REALM); + m_int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetIntDefault("CharactersPerRealm", 50); if (m_int_configs[CONFIG_CHARACTERS_PER_REALM] < 1 || m_int_configs[CONFIG_CHARACTERS_PER_REALM] > MAX_CHARACTERS_PER_REALM) { - TC_LOG_ERROR("server.loading", "CharactersPerRealm (%i) must be in range 1..10. Set to 10.", m_int_configs[CONFIG_CHARACTERS_PER_REALM]); + TC_LOG_ERROR("server.loading", "CharactersPerRealm (%i) must be in range 1..%d. Set to %d.", + m_int_configs[CONFIG_CHARACTERS_PER_REALM], MAX_CHARACTERS_PER_REALM, MAX_CHARACTERS_PER_REALM); m_int_configs[CONFIG_CHARACTERS_PER_REALM] = MAX_CHARACTERS_PER_REALM; } @@ -892,14 +893,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = m_int_configs[CONFIG_CHARACTERS_PER_REALM]; } - m_int_configs[CONFIG_DEMON_HUNTERS_PER_REALM] = sConfigMgr->GetIntDefault("DemonHuntersPerRealm", 1); - if (int32(m_int_configs[CONFIG_DEMON_HUNTERS_PER_REALM]) < 0 || m_int_configs[CONFIG_DEMON_HUNTERS_PER_REALM] > 16) - { - TC_LOG_ERROR("server.loading", "DemonHuntersPerRealm (%i) must be in range 0..16. Set to 1.", m_int_configs[CONFIG_DEMON_HUNTERS_PER_REALM]); - m_int_configs[CONFIG_DEMON_HUNTERS_PER_REALM] = 1; - } - - m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForDemonHunter", 70); + m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForDemonHunter", 0); m_int_configs[CONFIG_SKIP_CINEMATICS] = sConfigMgr->GetIntDefault("SkipCinematics", 0); if (int32(m_int_configs[CONFIG_SKIP_CINEMATICS]) < 0 || m_int_configs[CONFIG_SKIP_CINEMATICS] > 2) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 5b5551fbacc..693ae1f39d3 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -244,7 +244,6 @@ enum WorldIntConfigs CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK, CONFIG_CHARACTERS_PER_ACCOUNT, CONFIG_CHARACTERS_PER_REALM, - CONFIG_DEMON_HUNTERS_PER_REALM, CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER, CONFIG_SKIP_CINEMATICS, CONFIG_MAX_PLAYER_LEVEL, diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 3c46311d182..8b45a06e9cc 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -659,11 +659,22 @@ public: } if (handler->GetSession()) + { + int32 maxLevel = 0; + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(qInfo->GetContentTuningId(), + handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask)) + maxLevel = questLevels->MaxLevel; + + int32 scalingFactionGroup = 0; + if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(qInfo->GetContentTuningId())) + scalingFactionGroup = contentTuning->GetScalingFactionGroup(); + handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, qInfo->GetQuestId(), qInfo->GetQuestId(), handler->GetSession()->GetPlayer()->GetQuestLevel(qInfo), handler->GetSession()->GetPlayer()->GetQuestMinLevel(qInfo), - qInfo->GetQuestMaxScalingLevel(), qInfo->GetQuestScalingFactionGroup(), + maxLevel, scalingFactionGroup, title.c_str(), statusStr); + } else handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, qInfo->GetQuestId(), title.c_str(), statusStr); @@ -711,11 +722,22 @@ public: } if (handler->GetSession()) + { + int32 maxLevel = 0; + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(qInfo->GetContentTuningId(), + handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask)) + maxLevel = questLevels->MaxLevel; + + int32 scalingFactionGroup = 0; + if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(qInfo->GetContentTuningId())) + scalingFactionGroup = contentTuning->GetScalingFactionGroup(); + handler->PSendSysMessage(LANG_QUEST_LIST_CHAT, qInfo->GetQuestId(), qInfo->GetQuestId(), handler->GetSession()->GetPlayer()->GetQuestLevel(qInfo), handler->GetSession()->GetPlayer()->GetQuestMinLevel(qInfo), - qInfo->GetQuestMaxScalingLevel(), qInfo->GetQuestScalingFactionGroup(), + maxLevel, scalingFactionGroup, title.c_str(), statusStr); + } else handler->PSendSysMessage(LANG_QUEST_LIST_CONSOLE, qInfo->GetQuestId(), title.c_str(), statusStr); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 3db136674be..086b72be892 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1029,7 +1029,7 @@ public: if (Player* caster = handler->GetSession()->GetPlayer()) { ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), SPELL_UNSTUCK_ID, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); - Spell::SendCastResult(caster, spellInfo, SPELL_UNSTUCK_VISUAL, castId, SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + Spell::SendCastResult(caster, spellInfo, { SPELL_UNSTUCK_VISUAL, 0 }, castId, SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); } return false; @@ -1700,7 +1700,7 @@ public: mapId = target->GetMapId(); areaId = target->GetAreaId(); alive = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO); - gender = target->m_playerData->NativeSex; + gender = target->GetNativeSex(); } // get additional information from DB else @@ -2431,7 +2431,7 @@ public: if (!spellInfo) return false; - SpellNonMeleeDamage damageInfo(attacker, target, spellInfo, spellInfo->GetSpellXSpellVisualId(handler->GetSession()->GetPlayer()), spellInfo->SchoolMask); + SpellNonMeleeDamage damageInfo(attacker, target, spellInfo, { spellInfo->GetSpellXSpellVisualId(handler->GetSession()->GetPlayer()),0 }, spellInfo->SchoolMask); damageInfo.damage = damage; attacker->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); target->DealSpellDamage(&damageInfo, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 67e665862ff..a8b928996a1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -64,7 +64,7 @@ class icecrown_citadel_teleport : public GameObjectScript if (player->IsInCombat()) { ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), spell->Id, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); - Spell::SendCastResult(player, spell, 0, castId, SPELL_FAILED_AFFECTING_COMBAT); + Spell::SendCastResult(player, spell, {}, castId, SPELL_FAILED_AFFECTING_COMBAT); return true; } @@ -91,7 +91,7 @@ class at_frozen_throne_teleport : public AreaTriggerScript if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(FROZEN_THRONE_TELEPORT, DIFFICULTY_NONE)) { ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), spell->Id, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); - Spell::SendCastResult(player, spell, 0, castId, SPELL_FAILED_AFFECTING_COMBAT); + Spell::SendCastResult(player, spell, {}, castId, SPELL_FAILED_AFFECTING_COMBAT); } return true; } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index dd7cd8504c4..fa4afb32583 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -330,7 +330,7 @@ class spell_dk_dancing_rune_weapon : public SpellScriptLoader return; int32 amount = static_cast<int32>(damageInfo->GetDamage()) / 2; - SpellNonMeleeDamage log(drw, drw->GetVictim(), spellInfo, spellInfo->GetSpellXSpellVisualId(drw), spellInfo->GetSchoolMask()); + SpellNonMeleeDamage log(drw, drw->GetVictim(), spellInfo, { spellInfo->GetSpellXSpellVisualId(drw), 0 }, spellInfo->GetSchoolMask()); log.damage = amount; drw->DealDamage(drw->GetVictim(), amount, nullptr, SPELL_DIRECT_DAMAGE, spellInfo->GetSchoolMask(), spellInfo, true); drw->SendSpellNonMeleeDamageLog(&log); diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 21e852b1f8f..b06f1aae0f7 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -71,7 +71,7 @@ public: break; case 34475: if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES, player->GetMap()->GetDifficultyID())) - Spell::SendCastResult(player, spellInfo, 0, castId, SPELL_FAILED_NOT_ON_GROUND); + Spell::SendCastResult(player, spellInfo, {}, castId, SPELL_FAILED_NOT_ON_GROUND); break; } @@ -280,7 +280,7 @@ public: if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB, DIFFICULTY_NONE)) - Spell::SendCastResult(player, spellInfo, 0, castId, SPELL_FAILED_NOT_HERE); + Spell::SendCastResult(player, spellInfo, {}, castId, SPELL_FAILED_NOT_HERE); return true; } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index e6a500076c7..d7dc0d6cdf7 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -840,28 +840,19 @@ CharactersPerAccount = 50 # # CharactersPerRealm # Description: Limit number of characters per account on this realm. -# Range: 1-16 -# Default: 16 - (Client limitation) - -CharactersPerRealm = 16 - -# -# DemonHuntersPerRealm -# Description: Limit number of demon hunter characters per account on this realm. -# Range: 1-16 -# Default: 1 +# Range: 1-200 +# Default: 50 -DemonHuntersPerRealm = 1 +CharactersPerRealm = 50 # # CharacterCreating.MinLevelForDemonHunter # Description: Limit creating demon hunters only for account with another # character of specific level. -# Default: 70 - (Enabled, Requires at least another level 70 character) -# 0 - (Disabled) +# Default: 0 - (Disabled, No requirement) # 1 - (Enabled, Requires at least another level 1 character) -CharacterCreating.MinLevelForDemonHunter = 70 +CharacterCreating.MinLevelForDemonHunter = 0 # # SkipCinematics @@ -878,9 +869,9 @@ SkipCinematics = 0 # Description: Maximum level that can be reached by players. # Important: Levels beyond 110 are not recommended at all. # Range: 1-255 -# Default: 120 +# Default: 60 -MaxPlayerLevel = 120 +MaxPlayerLevel = 60 # # MinDualSpecLevel diff --git a/src/tools/extractor_common/ExtractorDB2LoadInfo.h b/src/tools/extractor_common/ExtractorDB2LoadInfo.h index a45e14f0ad0..f4161e836be 100644 --- a/src/tools/extractor_common/ExtractorDB2LoadInfo.h +++ b/src/tools/extractor_common/ExtractorDB2LoadInfo.h @@ -231,6 +231,7 @@ struct MapLoadInfo { false, FT_INT, "ID" }, { false, FT_STRING_NOT_LOCALIZED, "Directory" }, { false, FT_STRING, "MapName" }, + { false, FT_STRING_NOT_LOCALIZED, "InternalName" }, { false, FT_STRING, "MapDescription0" }, { false, FT_STRING, "MapDescription1" }, { false, FT_STRING, "PvpShortDescription" }, @@ -255,10 +256,11 @@ struct MapLoadInfo { true, FT_INT, "Flags1" }, { true, FT_INT, "Flags2" }, }; - static DB2MetaField const fields[23] = + static DB2MetaField const fields[24] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, { FT_STRING, 1, true }, @@ -281,7 +283,7 @@ struct MapLoadInfo { FT_INT, 1, true }, { FT_INT, 2, true }, }; - static DB2Meta meta(1349477, -1, 23, 23, 0xDA9493AF, fields, -1); + static DB2Meta meta(1349477, -1, 24, 24, 0x793F4E8E, fields, -1); static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta); return &loadInfo; } diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 74e3c604b8b..8e557095c45 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -1371,9 +1371,6 @@ void ExtractGameTables() { { 1582086, "ArtifactKnowledgeMultiplier.txt" }, { 1391662, "ArtifactLevelXP.txt" }, - { 1892815, "AzeriteBaseExperiencePerLevel.txt" }, - { 1892816, "AzeriteKnowledgeMultiplier.txt" }, - { 1859377, "AzeriteLevelToItemLevel.txt" }, { 1391663, "BarberShopCostBase.txt" }, { 1391664, "BaseMp.txt" }, { 1391665, "BattlePetTypeDamageMod.txt" }, @@ -1391,7 +1388,7 @@ void ExtractGameTables() { 1391659, "SandboxScaling.txt" }, { 1391660, "SpellScaling.txt" }, { 1980632, "StaminaMultByILvl.txt" }, - { 1391661, "xp.txt" }, + { 1391661, "xp.txt" } }; uint32 count = 0; diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h index 3f95c20e85b..e1711ff9db8 100644 --- a/src/tools/map_extractor/loadlib/DBFilesClientList.h +++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h @@ -31,7 +31,6 @@ DB2FileInfo const DBFilesClientList[] = { 1115949, "AdventureJournal.db2" }, { 1267070, "AdventureMapPOI.db2" }, { 1710672, "AlliedRace.db2" }, - { 1720145, "AlliedRaceRacialAbility.db2" }, { 1304323, "AnimKit.db2" }, { 1375433, "AnimKitBoneSet.db2" }, { 1266937, "AnimKitBoneSetAlias.db2" }, @@ -42,6 +41,9 @@ DB2FileInfo const DBFilesClientList[] = { 1304324, "AnimKitSegment.db2" }, { 1301100, "AnimReplacement.db2" }, { 1284817, "AnimReplacementSet.db2" }, + { 3286805, "AnimaCable.db2" }, + { 3286804, "AnimaCylinder.db2" }, + { 3153990, "AnimaMaterial.db2" }, { 1375431, "AnimationData.db2" }, { 2123730, "AreaConditionalData.db2" }, { 1537162, "AreaFarClipOverride.db2" }, @@ -55,6 +57,7 @@ DB2FileInfo const DBFilesClientList[] = { 1937227, "AreaTriggerCreateProperties.db2" }, { 1121943, "AreaTriggerCylinder.db2" }, { 1315630, "AreaTriggerSphere.db2" }, + { 3849793, "ArenaCcItem.db2" }, { 1284818, "ArmorLocation.db2" }, { 1007934, "Artifact.db2" }, { 1116407, "ArtifactAppearance.db2" }, @@ -97,6 +100,7 @@ DB2FileInfo const DBFilesClientList[] = { 841622, "BattlePetSpecies.db2" }, { 801581, "BattlePetSpeciesState.db2" }, { 801582, "BattlePetSpeciesXAbility.db2" }, + { 3669304, "BattlePetSpeciesXCovenant.db2" }, { 801583, "BattlePetState.db2" }, { 801584, "BattlePetVisual.db2" }, { 1360265, "BattlemasterList.db2" }, @@ -129,22 +133,45 @@ DB2FileInfo const DBFilesClientList[] = { 1365366, "CharSections.db2" }, { 972425, "CharShipment.db2" }, { 972405, "CharShipmentContainer.db2" }, - { 1237591, "CharStartOutfit.db2" }, + { 3055696, "CharStartKit.db2" }, { 1349054, "CharTitles.db2" }, - { 1028733, "CharacterFaceBoneSet.db2" }, { 1369752, "CharacterFacialHairStyles.db2" }, { 1344281, "CharacterLoadout.db2" }, { 1302846, "CharacterLoadoutItem.db2" }, + { 3724843, "CharacterLoadoutPet.db2" }, { 1815417, "CharacterServiceInfo.db2" }, { 1345278, "ChatChannels.db2" }, { 1117084, "ChatProfanity.db2" }, { 1306188, "ChrClassRaceSex.db2" }, { 1267497, "ChrClassTitle.db2" }, + { 3754770, "ChrClassUIChrModelInfo.db2" }, { 1316515, "ChrClassUIDisplay.db2" }, { 1267498, "ChrClassVillain.db2" }, { 1361031, "ChrClasses.db2" }, { 1121420, "ChrClassesXPowerTypes.db2" }, + { 3671168, "ChrCreateClassAnimTarget.db2" }, + { 3671169, "ChrCreateClassAnimTargetInfo.db2" }, + { 3590348, "ChrCustClientChoiceConversion.db2" }, { 1611874, "ChrCustomization.db2" }, + { 3460181, "ChrCustomizationBoneSet.db2" }, + { 3526439, "ChrCustomizationCategory.db2" }, + { 3450554, "ChrCustomizationChoice.db2" }, + { 3460182, "ChrCustomizationCondModel.db2" }, + { 3463337, "ChrCustomizationConversion.db2" }, + { 3593032, "ChrCustomizationDisplayInfo.db2" }, + { 3512765, "ChrCustomizationElement.db2" }, + { 3456171, "ChrCustomizationGeoset.db2" }, + { 3459652, "ChrCustomizationMaterial.db2" }, + { 3384247, "ChrCustomizationOption.db2" }, + { 3450453, "ChrCustomizationReq.db2" }, + { 3580359, "ChrCustomizationReqChoice.db2" }, + { 3460183, "ChrCustomizationSkinnedModel.db2" }, + { 3384313, "ChrModel.db2" }, + { 3566562, "ChrModelMaterial.db2" }, + { 3548976, "ChrModelTextureLayer.db2" }, + { 3536417, "ChrModelTextureTarget.db2" }, + { 3507821, "ChrRaceRacialAbility.db2" }, + { 3490304, "ChrRaceXChrModel.db2" }, { 1305311, "ChrRaces.db2" }, { 1343390, "ChrSpecialization.db2" }, { 984529, "ChrUpgradeBucket.db2" }, @@ -162,6 +189,7 @@ DB2FileInfo const DBFilesClientList[] = { 2098645, "CommunityIcon.db2" }, { 1349053, "ComponentModelFileData.db2" }, { 1278239, "ComponentTextureFileData.db2" }, + { 3501965, "ConditionalContentTuning.db2" }, { 1709409, "ConfigurationWarning.db2" }, { 1962930, "ContentTuning.db2" }, { 2976765, "ContentTuningXExpected.db2" }, @@ -170,14 +198,17 @@ DB2FileInfo const DBFilesClientList[] = { 2143634, "ContributionStyleContainer.db2" }, { 1260801, "ConversationLine.db2" }, { 3220711, "CorruptionEffects.db2" }, + { 3384973, "Covenant.db2" }, { 841631, "Creature.db2" }, { 879282, "CreatureDifficulty.db2" }, { 1146692, "CreatureDispXUiCamera.db2" }, { 1108759, "CreatureDisplayInfo.db2" }, { 1332686, "CreatureDisplayInfoCond.db2" }, + { 3670439, "CreatureDisplayInfoCondXChoice.db2" }, { 1586882, "CreatureDisplayInfoEvt.db2" }, { 1264997, "CreatureDisplayInfoExtra.db2" }, { 1720141, "CreatureDisplayInfoGeosetData.db2" }, + { 3692043, "CreatureDisplayInfoOption.db2" }, { 1146698, "CreatureDisplayInfoTrn.db2" }, { 1351351, "CreatureFamily.db2" }, { 1131322, "CreatureImmunities.db2" }, @@ -187,6 +218,7 @@ DB2FileInfo const DBFilesClientList[] = { 1131315, "CreatureType.db2" }, { 1587158, "CreatureXContribution.db2" }, { 1864302, "CreatureXDisplayInfo.db2" }, + { 3055738, "CreatureXUiWidgetSet.db2" }, { 1263817, "Criteria.db2" }, { 1263818, "CriteriaTree.db2" }, { 1345969, "CriteriaTreeXEffect.db2" }, @@ -217,6 +249,7 @@ DB2FileInfo const DBFilesClientList[] = { 1343313, "Exhaustion.db2" }, { 1937326, "ExpectedStat.db2" }, { 1969773, "ExpectedStatMod.db2" }, + { 3527889, "ExtraAbilityInfo.db2" }, { 1361972, "Faction.db2" }, { 1343595, "FactionGroup.db2" }, { 1361579, "FactionTemplate.db2" }, @@ -230,15 +263,20 @@ DB2FileInfo const DBFilesClientList[] = { 1278178, "GMSurveyQuestions.db2" }, { 1283020, "GMSurveySurveys.db2" }, { 2922072, "GameClockDebug.db2" }, + { 3565753, "GameObjectAnimGroupMember.db2" }, { 1266737, "GameObjectArtKit.db2" }, { 1302847, "GameObjectDiffAnimMap.db2" }, { 1266277, "GameObjectDisplayInfo.db2" }, { 1345272, "GameObjectDisplayInfoXSoundKit.db2" }, { 841620, "GameObjects.db2" }, + { 3405438, "GameParameter.db2" }, { 1368021, "GameTips.db2" }, { 966238, "GarrAbility.db2" }, { 1020248, "GarrAbilityCategory.db2" }, { 966241, "GarrAbilityEffect.db2" }, + { 3305399, "GarrAutoCombatant.db2" }, + { 3305400, "GarrAutoSpell.db2" }, + { 3307335, "GarrAutoSpellEffect.db2" }, { 929747, "GarrBuilding.db2" }, { 943937, "GarrBuildingDoodadSet.db2" }, { 983298, "GarrBuildingPlotInst.db2" }, @@ -261,6 +299,7 @@ DB2FileInfo const DBFilesClientList[] = { 1391531, "GarrMechanicSetXMechanic.db2" }, { 967964, "GarrMechanicType.db2" }, { 967962, "GarrMission.db2" }, + { 3055759, "GarrMissionSet.db2" }, { 1125220, "GarrMissionTexture.db2" }, { 984174, "GarrMissionType.db2" }, { 967960, "GarrMissionXEncounter.db2" }, @@ -276,18 +315,25 @@ DB2FileInfo const DBFilesClientList[] = { 1416758, "GarrString.db2" }, { 3195601, "GarrTalTreeXGarrTalResearch.db2" }, { 1361032, "GarrTalent.db2" }, + { 3514438, "GarrTalentCost.db2" }, + { 3534056, "GarrTalentMapPOI.db2" }, { 3069763, "GarrTalentRank.db2" }, { 3195518, "GarrTalentResearch.db2" }, + { 3612617, "GarrTalentSocketProperties.db2" }, { 1361030, "GarrTalentTree.db2" }, { 1333161, "GarrType.db2" }, { 976037, "GarrUiAnimClassInfo.db2" }, { 976035, "GarrUiAnimRaceInfo.db2" }, { 1343604, "GemProperties.db2" }, + { 3752002, "GlobalCurve.db2" }, + { 3756368, "GlobalGameContentTuning.db2" }, { 1394440, "GlobalStrings.db2" }, + { 3476011, "GlobalTable_PlayerCondition.db2" }, { 1270147, "GlyphBindableSpell.db2" }, { 948546, "GlyphExclusiveCategory.db2" }, { 1345274, "GlyphProperties.db2" }, { 948496, "GlyphRequiredSpec.db2" }, + { 3622253, "GossipXUIDisplayInfo.db2" }, { 2433582, "GradientEffect.db2" }, { 1308057, "GroundEffectDoodad.db2" }, { 1308499, "GroundEffectTexture.db2" }, @@ -326,15 +372,18 @@ DB2FileInfo const DBFilesClientList[] = { 1278179, "ItemBagFamily.db2" }, { 959070, "ItemBonus.db2" }, { 1805807, "ItemBonusList.db2" }, + { 3755382, "ItemBonusListGroup.db2" }, { 3025306, "ItemBonusListGroupEntry.db2" }, { 1320358, "ItemBonusListLevelDelta.db2" }, { 2924997, "ItemBonusListWarforgeLevelDelta.db2" }, { 3026822, "ItemBonusSequenceSpell.db2" }, + { 3055768, "ItemBonusTree.db2" }, { 987134, "ItemBonusTreeNode.db2" }, { 1247926, "ItemChildEquipment.db2" }, { 1140189, "ItemClass.db2" }, { 1405665, "ItemContextPickerEntry.db2" }, { 801670, "ItemCurrencyCost.db2" }, + { 3755770, "ItemCurrencyValue.db2" }, { 1277740, "ItemDamageAmmo.db2" }, { 1277743, "ItemDamageOneHand.db2" }, { 1277739, "ItemDamageOneHandCaster.db2" }, @@ -356,6 +405,7 @@ DB2FileInfo const DBFilesClientList[] = { 982457, "ItemModifiedAppearance.db2" }, { 1278399, "ItemModifiedAppearanceExtra.db2" }, { 1332559, "ItemNameDescription.db2" }, + { 3723474, "ItemNameSlotOverride.db2" }, { 1302240, "ItemPetFood.db2" }, { 1121231, "ItemPriceBase.db2" }, { 1270315, "ItemRangedDisplayInfo.db2" }, @@ -370,6 +420,7 @@ DB2FileInfo const DBFilesClientList[] = { 1343605, "ItemVisuals.db2" }, { 3043873, "ItemVisualsXEffect.db2" }, { 987133, "ItemXBonusTree.db2" }, + { 3177687, "ItemXItemEffect.db2" }, { 1240336, "JournalEncounter.db2" }, { 1301155, "JournalEncounterCreature.db2" }, { 1344467, "JournalEncounterItem.db2" }, @@ -383,7 +434,6 @@ DB2FileInfo const DBFilesClientList[] = { 1285009, "JournalTierXInstance.db2" }, { 801693, "Keychain.db2" }, { 1344761, "KeystoneAffix.db2" }, - { 1343606, "LFGDungeonExpansion.db2" }, { 1135058, "LFGDungeonGroup.db2" }, { 1361033, "LFGDungeons.db2" }, { 982805, "LFGRoleRequirement.db2" }, @@ -407,6 +457,9 @@ DB2FileInfo const DBFilesClientList[] = { 1343608, "Lock.db2" }, { 1284823, "LockType.db2" }, { 1098785, "LookAtController.db2" }, + { 3311370, "LoreText.db2" }, + { 3479846, "LoreTextPublic.db2" }, + { 3390955, "MCRSlotXMCRCategory.db2" }, { 1240344, "MailTemplate.db2" }, { 1587159, "ManagedWorldState.db2" }, { 1587155, "ManagedWorldStateBuff.db2" }, @@ -424,11 +477,18 @@ DB2FileInfo const DBFilesClientList[] = { 1719707, "MapLoadingScreen.db2" }, { 801710, "MarketingPromotionsXLocale.db2" }, { 1294217, "Material.db2" }, + { 2991315, "MawPower.db2" }, + { 2997952, "MawPowerRarity.db2" }, { 1347274, "MinorTalent.db2" }, { 1710117, "MissileTargeting.db2" }, { 1465904, "ModelAnimCloakDampening.db2" }, { 1337833, "ModelFileData.db2" }, { 1399953, "ModelRibbonQuality.db2" }, + { 3386486, "ModifiedCraftingCategory.db2" }, + { 3386487, "ModifiedCraftingReagentItem.db2" }, + { 3386488, "ModifiedCraftingReagentSlot.db2" }, + { 3390956, "ModifiedCraftingSpellSlot.db2" }, + { 3386490, "ModifiedReagentItem.db2" }, { 1267645, "ModifierTree.db2" }, { 921760, "Mount.db2" }, { 1114709, "MountCapability.db2" }, @@ -468,6 +528,7 @@ DB2FileInfo const DBFilesClientList[] = { 1252503, "PaperDollItemFrame.db2" }, { 1581183, "ParagonReputation.db2" }, { 1284820, "ParticleColor.db2" }, + { 3396285, "Particulate.db2" }, { 2053913, "ParticulateSound.db2" }, { 801732, "Path.db2" }, { 2428705, "PathEdge.db2" }, @@ -508,10 +569,16 @@ DB2FileInfo const DBFilesClientList[] = { 1028735, "QuestV2CliTask.db2" }, { 1573634, "QuestXGroupActivity.db2" }, { 1139378, "QuestXP.db2" }, + { 3448517, "QuestXUIQuestDetailsTheme.db2" }, + { 3923421, "QuestXUiWidgetSet.db2" }, + { 3405439, "RTPC.db2" }, + { 3405440, "RTPCData.db2" }, { 3081207, "RafActivity.db2" }, { 1310245, "RandPropPoints.db2" }, + { 3671785, "RecipeProgressionGroupEntry.db2" }, { 1716803, "RelicSlotTierRequirement.db2" }, { 1671256, "RelicTalent.db2" }, + { 3743117, "RenownRewards.db2" }, { 1133729, "ResearchBranch.db2" }, { 1133711, "ResearchField.db2" }, { 1134090, "ResearchProject.db2" }, @@ -522,9 +589,9 @@ DB2FileInfo const DBFilesClientList[] = { 1307155, "RewardPackXItem.db2" }, { 1398908, "RibbonQuality.db2" }, { 3256786, "RopeEffect.db2" }, + { 3500241, "RuneforgeLegendaryAbility.db2" }, { 1712172, "SDReplacementModel.db2" }, { 2056369, "SSAOSettings.db2" }, - { 1141728, "ScalingStatDistribution.db2" }, { 1139062, "Scenario.db2" }, { 1141065, "ScenarioEventEntry.db2" }, { 1132761, "ScenarioStep.db2" }, @@ -534,10 +601,8 @@ DB2FileInfo const DBFilesClientList[] = { 801756, "SceneScriptPackageMember.db2" }, { 1758037, "SceneScriptText.db2" }, { 1327082, "ScheduledInterval.db2" }, - { 1327083, "ScheduledWorldState.db2" }, - { 1327084, "ScheduledWorldStateGroup.db2" }, - { 1388724, "ScheduledWorldStateXUniqCat.db2" }, { 1302849, "ScreenEffect.db2" }, + { 3063174, "ScreenEffectType.db2" }, { 1279416, "ScreenLocation.db2" }, { 1328719, "SeamlessSite.db2" }, { 1301141, "ServerMessages.db2" }, @@ -546,6 +611,13 @@ DB2FileInfo const DBFilesClientList[] = { 1240935, "SkillLine.db2" }, { 1266278, "SkillLineAbility.db2" }, { 1240406, "SkillRaceClassInfo.db2" }, + { 3581893, "SkySceneXPlayerCondition.db2" }, + { 3488583, "Soulbind.db2" }, + { 3594380, "SoulbindConduit.db2" }, + { 3604984, "SoulbindConduitItem.db2" }, + { 3620681, "SoulbindConduitRank.db2" }, + { 3858895, "SoulbindConduitRankProperties.db2" }, + { 3490472, "SoulbindUIDisplayInfo.db2" }, { 1310628, "SoundAmbience.db2" }, { 1267065, "SoundAmbienceFlavor.db2" }, { 1310246, "SoundBus.db2" }, @@ -561,6 +633,7 @@ DB2FileInfo const DBFilesClientList[] = { 1237435, "SoundKitEntry.db2" }, { 1307288, "SoundKitFallback.db2" }, { 1266542, "SoundOverride.db2" }, + { 3405441, "SoundParameter.db2" }, { 1279417, "SoundProviderPreferences.db2" }, { 1313612, "SourceInfo.db2" }, { 1117088, "SpamMessages.db2" }, @@ -620,6 +693,8 @@ DB2FileInfo const DBFilesClientList[] = { 841946, "SpellReagents.db2" }, { 1135239, "SpellReagentsCurrency.db2" }, { 1139940, "SpellScaling.db2" }, + { 3055899, "SpellScript.db2" }, + { 3055901, "SpellScriptText.db2" }, { 1139929, "SpellShapeshift.db2" }, { 1280618, "SpellShapeshiftForm.db2" }, { 1268903, "SpellSpecialUnitEffect.db2" }, @@ -635,6 +710,7 @@ DB2FileInfo const DBFilesClientList[] = { 1140480, "SpellVisualKitEffect.db2" }, { 897953, "SpellVisualKitModelAttach.db2" }, { 897954, "SpellVisualMissile.db2" }, + { 3607312, "SpellVisualScreenEffect.db2" }, { 1724949, "SpellXDescriptionVariables.db2" }, { 1101657, "SpellXSpellVisual.db2" }, { 1604265, "StartupFiles.db2" }, @@ -647,11 +723,13 @@ DB2FileInfo const DBFilesClientList[] = { 1068100, "TaxiNodes.db2" }, { 1067802, "TaxiPath.db2" }, { 1000437, "TaxiPathNode.db2" }, + { 3501705, "TerrainColorGradingRamp.db2" }, { 1307290, "TerrainMaterial.db2" }, { 1310249, "TerrainType.db2" }, { 1284822, "TerrainTypeSounds.db2" }, { 1328721, "TextureBlendSet.db2" }, { 982459, "TextureFileData.db2" }, + { 3076928, "TierTransition.db2" }, { 1134586, "TotemCategory.db2" }, { 988200, "Toy.db2" }, { 1301101, "TradeSkillCategory.db2" }, @@ -659,6 +737,7 @@ DB2FileInfo const DBFilesClientList[] = { 1338702, "TransformMatrix.db2" }, { 2399695, "TransmogDefaultLevel.db2" }, { 1589454, "TransmogHoliday.db2" }, + { 3580450, "TransmogIllusion.db2" }, { 1376213, "TransmogSet.db2" }, { 1576116, "TransmogSetGroup.db2" }, { 1376212, "TransmogSetItem.db2" }, @@ -666,13 +745,19 @@ DB2FileInfo const DBFilesClientList[] = { 1121973, "TransportPhysics.db2" }, { 1140687, "TransportRotation.db2" }, { 975024, "Trophy.db2" }, + { 3488582, "UIChromieTimeExpansionInfo.db2" }, + { 3502042, "UICovenantAbility.db2" }, + { 3502043, "UICovenantPreview.db2" }, { 1729547, "UIExpansionDisplayInfo.db2" }, { 1729546, "UIExpansionDisplayInfoIcon.db2" }, + { 3556601, "UIScriptedAnimationEffect.db2" }, + { 2960122, "UISplashScreen.db2" }, { 1261406, "UiCamFbackTransmogChrRace.db2" }, { 1261407, "UiCamFbackTransmogWeapon.db2" }, { 1120287, "UiCamera.db2" }, { 1120288, "UiCameraType.db2" }, { 1989363, "UiCanvas.db2" }, + { 3509132, "UiCovenantDisplayInfo.db2" }, { 3182424, "UiItemInteraction.db2" }, { 1957206, "UiMap.db2" }, { 1957202, "UiMapArt.db2" }, @@ -689,22 +774,27 @@ DB2FileInfo const DBFilesClientList[] = { 1548216, "UiModelSceneActorDisplay.db2" }, { 1548213, "UiModelSceneCamera.db2" }, { 1993323, "UiPartyPose.db2" }, + { 3448518, "UiQuestDetailsTheme.db2" }, { 897470, "UiTextureAtlas.db2" }, { 1989276, "UiTextureAtlasElement.db2" }, + { 3765186, "UiTextureAtlasElementOverride.db2" }, { 897532, "UiTextureAtlasMember.db2" }, { 939159, "UiTextureKit.db2" }, { 1983278, "UiWidget.db2" }, { 1983639, "UiWidgetConstantSource.db2" }, { 1983640, "UiWidgetDataSource.db2" }, { 2322531, "UiWidgetMap.db2" }, + { 3055925, "UiWidgetSet.db2" }, { 1983641, "UiWidgetStringSource.db2" }, { 2740907, "UiWidgetVisTypeDataReq.db2" }, { 1983276, "UiWidgetVisualization.db2" }, + { 3386363, "UiWidgetXWidgetSet.db2" }, { 1284821, "UnitBlood.db2" }, { 1268904, "UnitBloodLevels.db2" }, { 1120959, "UnitCondition.db2" }, { 1237753, "UnitPowerBar.db2" }, { 1368621, "Vehicle.db2" }, + { 3311405, "VehiclePOIType.db2" }, { 1345447, "VehicleSeat.db2" }, { 1279741, "VehicleUIIndSeat.db2" }, { 1279740, "VehicleUIIndicator.db2" }, @@ -712,6 +802,7 @@ DB2FileInfo const DBFilesClientList[] = { 1634482, "VirtualAttachment.db2" }, { 1634480, "VirtualAttachmentCustomization.db2" }, { 1267067, "VocalUISounds.db2" }, + { 3587230, "VolumeFogCondition.db2" }, { 1355528, "WMOAreaTable.db2" }, { 1323241, "WMOMinimapTexture.db2" }, { 2565222, "WaterfallData.db2" }, @@ -727,6 +818,7 @@ DB2FileInfo const DBFilesClientList[] = { 1239842, "WeaponTrailParam.db2" }, { 1343311, "Weather.db2" }, { 1965591, "WeatherXParticulate.db2" }, + { 3580962, "WeeklyRewardChestThreshold.db2" }, { 943871, "WindSettings.db2" }, { 975279, "WorldBossLockout.db2" }, { 1267069, "WorldChunkSounds.db2" }, |