From 91753a94b33b73185ebb0ef551c02bae422b1a46 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 5 Jan 2016 23:29:36 +0100 Subject: Core/PacketIO: Updated character list packets for 7.x --- .../Database/Implementation/CharacterDatabase.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/server/database') diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index a7e7394fc87..6450946aaa4 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -44,20 +44,20 @@ 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.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.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, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " "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.level, c.zone, c.map, " + 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, " "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, 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.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + 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, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " "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.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.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, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, c.slot, c.logout_time, 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 " @@ -75,7 +75,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 guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, " + PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, talentTree, 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, " @@ -386,7 +386,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, bankSlots, restState, playerFlags, " + PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " "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, talentTree, " @@ -394,8 +394,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " "power4, power5, power6, latency, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,bankSlots=?,restState=?,playerFlags=?," + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,bankSlots=?,restState=?,playerFlags=?," "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=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," @@ -443,7 +443,7 @@ 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 = ? WHERE guid = ?", 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); @@ -466,7 +466,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_CUSTOMIZE_INFO, "SELECT name, race, class, gender, at_login FROM characters WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT at_login, knownTitles, skin, face, hairStyle, hairColor, facialStyle FROM characters WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE, "SELECT guid FROM character_instance WHERE instance = ? and permanent = 1", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH); -- cgit v1.2.3 From 5c2c9a684f1458da0cea1f3536622add77ef1324 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 24 Jan 2016 15:56:10 +0100 Subject: Core/DataStores: Updated dbc/db2 to 7.0.1.20810 --- sql/base/characters_database.sql | 28 + .../2016_xx_xx_xx_characters_legion_02.sql | 1293 +++++++++++ .../hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql | 2433 ++++++++++++++++++++ src/common/Define.h | 1 + .../Database/Implementation/CharacterDatabase.cpp | 13 +- .../Database/Implementation/CharacterDatabase.h | 3 + .../Database/Implementation/HotfixDatabase.cpp | 517 +++-- .../Database/Implementation/HotfixDatabase.h | 108 +- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 2 +- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 2 +- src/server/game/Achievements/AchievementMgr.cpp | 6 + src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 7 +- src/server/game/AuctionHouse/AuctionHouseMgr.h | 5 +- .../game/AuctionHouseBot/AuctionHouseBotSeller.cpp | 1 + src/server/game/Chat/ChatLink.cpp | 21 +- src/server/game/Conditions/ConditionMgr.cpp | 12 +- src/server/game/DataStores/DB2Stores.cpp | 268 ++- src/server/game/DataStores/DB2Stores.h | 65 +- src/server/game/DataStores/DB2Structure.h | 2024 +++++++++------- src/server/game/DataStores/DB2fmt.h | 257 ++- src/server/game/DataStores/DBCEnums.h | 1 + src/server/game/DataStores/DBCStores.cpp | 401 +--- src/server/game/DataStores/DBCStores.h | 81 +- src/server/game/DataStores/DBCStructure.h | 596 +---- src/server/game/DataStores/DBCfmt.h | 72 +- src/server/game/Entities/GameObject/GameObject.cpp | 12 +- src/server/game/Entities/Item/Item.cpp | 184 +- .../game/Entities/Item/ItemEnchantmentMgr.cpp | 2 +- src/server/game/Entities/Item/ItemTemplate.cpp | 52 +- src/server/game/Entities/Item/ItemTemplate.h | 37 +- src/server/game/Entities/Object/Object.cpp | 7 + src/server/game/Entities/Object/Object.h | 1 + src/server/game/Entities/Player/Player.cpp | 306 ++- src/server/game/Entities/Player/Player.h | 59 +- src/server/game/Entities/Taxi/TaxiPathGraph.cpp | 4 +- src/server/game/Entities/Unit/StatSystem.cpp | 27 +- src/server/game/Entities/Unit/Unit.cpp | 78 +- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Garrison/Garrison.cpp | 34 +- src/server/game/Garrison/Garrison.h | 1 + src/server/game/Garrison/GarrisonMgr.cpp | 34 +- src/server/game/Garrison/GarrisonMgr.h | 12 +- src/server/game/Globals/ObjectMgr.cpp | 45 +- src/server/game/Guilds/Guild.cpp | 4 +- src/server/game/Guilds/GuildMgr.cpp | 6 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 5 +- src/server/game/Handlers/CharacterHandler.cpp | 8 +- src/server/game/Handlers/ItemHandler.cpp | 69 +- src/server/game/Handlers/SkillHandler.cpp | 2 +- src/server/game/Loot/LootMgr.cpp | 2 +- src/server/game/Miscellaneous/SharedDefines.h | 27 +- src/server/game/Server/Packets/SpellPackets.cpp | 15 +- src/server/game/Server/Packets/SpellPackets.h | 19 +- src/server/game/Server/Protocol/Opcodes.cpp | 1 - src/server/game/Server/Protocol/Opcodes.h | 1 - src/server/game/Spells/Auras/SpellAuraEffects.cpp | 48 +- src/server/game/Spells/Auras/SpellAuraEffects.h | 1 - src/server/game/Spells/Auras/SpellAuras.cpp | 15 - src/server/game/Spells/Spell.cpp | 138 +- src/server/game/Spells/Spell.h | 2 +- src/server/game/Spells/SpellEffects.cpp | 56 +- src/server/game/Spells/SpellHistory.cpp | 52 +- src/server/game/Spells/SpellHistory.h | 12 +- src/server/game/Spells/SpellInfo.cpp | 207 +- src/server/game/Spells/SpellInfo.h | 53 +- src/server/game/Spells/SpellMgr.cpp | 77 +- src/server/game/Spells/SpellMgr.h | 21 + src/server/game/Texts/CreatureTextMgr.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- src/server/scripts/Commands/cs_learn.cpp | 37 +- src/server/scripts/Commands/cs_list.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 242 +- src/server/scripts/Commands/cs_misc.cpp | 18 +- src/server/scripts/Spells/spell_druid.cpp | 14 +- src/server/scripts/Spells/spell_item.cpp | 2 +- .../shared/DataStores/DB2SparseStorageLoader.cpp | 683 ++++++ .../shared/DataStores/DB2SparseStorageLoader.h | 117 + src/server/shared/DataStores/DB2StorageLoader.cpp | 180 +- src/server/shared/DataStores/DB2StorageLoader.h | 40 +- src/server/shared/DataStores/DB2Store.h | 226 +- src/server/shared/DataStores/DBCFileLoader.cpp | 20 +- src/server/shared/DataStores/DBStorageIterator.h | 7 +- 82 files changed, 8041 insertions(+), 3506 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql create mode 100644 src/server/shared/DataStores/DB2SparseStorageLoader.cpp create mode 100644 src/server/shared/DataStores/DB2SparseStorageLoader.h (limited to 'src/server/database') diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index bccc4176530..1d9fc2dcfcc 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1619,6 +1619,9 @@ CREATE TABLE `characters` ( `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', `bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0', `restState` tinyint(3) unsigned NOT NULL DEFAULT '0', `playerFlags` int(10) unsigned NOT NULL DEFAULT '0', @@ -2577,6 +2580,31 @@ LOCK TABLES `item_instance` WRITE; /*!40000 ALTER TABLE `item_instance` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `item_instance_gems` +-- + +DROP TABLE IF EXISTS `item_instance_gems`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `item_instance_gems` ( + `itemGuid` bigint(20) unsigned NOT NULL, + `gemItemId1` int(10) unsigned DEFAULT NULL, + `gemItemId2` int(10) unsigned DEFAULT NULL, + `gemItemId3` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`itemGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `item_instance_gems` +-- + +LOCK TABLES `item_instance_gems` WRITE; +/*!40000 ALTER TABLE `item_instance_gems` DISABLE KEYS */; +/*!40000 ALTER TABLE `item_instance_gems` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `item_loot_items` -- diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql new file mode 100644 index 00000000000..a2a74c11cb2 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql @@ -0,0 +1,1293 @@ +-- +-- Table structure for table `item_instance_gems` +-- + +DROP TABLE IF EXISTS `item_instance_gems`; +CREATE TABLE `item_instance_gems` ( + `itemGuid` bigint(20) unsigned NOT NULL, + `gemItemId1` int(10) unsigned DEFAULT '0', + `gemItemId2` int(10) unsigned DEFAULT '0', + `gemItemId3` int(10) unsigned DEFAULT '0', + PRIMARY KEY (`itemGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `item_instance_gems` +SELECT +`guid`, +SUBSTRING_INDEX(CONCAT('0 0 ', SUBSTRING_INDEX(enchantments,' ',7)), ' ', -1) AS gemEnchantId1, +SUBSTRING_INDEX(CONCAT('0 0 ', SUBSTRING_INDEX(enchantments,' ',10)), ' ', -1) AS gemEnchantId2, +SUBSTRING_INDEX(CONCAT('0 0 ',SUBSTRING_INDEX(enchantments,' ',13)), ' ', -1) AS gemEnchantId3 +FROM `item_instance` +HAVING gemEnchantId1 != 0 OR gemEnchantId1 != 0 OR gemEnchantId3 != 0; + +DROP TABLE IF EXISTS `enchant_gem_ids`; +CREATE TABLE `enchant_gem_ids` ( + `enchantId` int(11) unsigned NOT NULL DEFAULT '0', + `gemItemId` int(11) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`enchantId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Export of SpellItemEnchantment.dbc'; + +INSERT INTO `enchant_gem_ids` (`enchantId`,`gemItemId`) VALUES +(2686,23233), +(2687,23234), +(2688,23235), +(2689,23359), +(2690,23094), +(2691,23095), +(2692,23096), +(2693,23097), +(2694,23113), +(2695,23114), +(2696,23115), +(2697,23116), +(2698,23118), +(2699,23119), +(2700,23120), +(2701,23121), +(2703,23364), +(2704,23366), +(2705,23099), +(2706,23105), +(2707,23106), +(2708,23108), +(2709,23109), +(2710,23110), +(2711,23111), +(2725,24027), +(2726,24028), +(2727,24029), +(2728,24030), +(2729,24031), +(2730,24032), +(2731,24033), +(2732,24035), +(2733,24037), +(2734,24047), +(2735,24048), +(2736,24050), +(2737,24052), +(2738,24054), +(2739,24055), +(2740,24056), +(2741,24057), +(2742,24060), +(2743,24062), +(2744,24065), +(2752,23098), +(2753,24058), +(2754,24036), +(2755,23100), +(2756,24061), +(2757,23104), +(2758,24067), +(2759,24053), +(2760,23101), +(2761,24059), +(2762,23103), +(2763,24066), +(2764,24051), +(2765,24039), +(2827,25890), +(2828,25893), +(2829,25894), +(2830,25895), +(2831,25896), +(2832,25897), +(2833,25898), +(2834,25899), +(2835,25901), +(2891,27679), +(2894,27774), +(2896,27777), +(2897,27782), +(2898,27785), +(2899,27786), +(2911,28117), +(2912,28118), +(2913,28119), +(2914,28120), +(2915,28122), +(2916,28123), +(2917,27864), +(2918,27786), +(2921,27809), +(2922,27811), +(2923,27820), +(2924,27812), +(2942,28290), +(2943,28360), +(2944,28361), +(2945,28362), +(2946,28363), +(2947,22460), +(2948,22459), +(2949,28388), +(2950,28389), +(2956,28458), +(2957,28459), +(2958,28460), +(2959,28461), +(2960,28462), +(2961,28463), +(2962,28464), +(2963,28465), +(2964,28466), +(2965,28467), +(2966,28468), +(2967,28469), +(2968,28470), +(2969,28556), +(2970,28557), +(2971,28595), +(3045,30546), +(3046,30547), +(3047,30548), +(3048,30549), +(3049,30550), +(3050,30551), +(3051,30552), +(3052,30553), +(3053,30554), +(3054,30555), +(3055,30556), +(3056,30558), +(3057,30559), +(3058,30560), +(3059,30562), +(3060,30563), +(3061,30564), +(3062,30565), +(3063,30566), +(3064,30572), +(3065,30571), +(3066,30573), +(3067,30574), +(3068,30575), +(3069,30581), +(3070,30582), +(3071,30583), +(3072,30584), +(3073,30585), +(3074,30586), +(3075,30587), +(3076,30588), +(3077,30589), +(3078,30590), +(3079,30591), +(3080,30592), +(3081,30593), +(3082,30594), +(3083,30600), +(3084,30601), +(3085,30602), +(3086,30603), +(3087,30604), +(3088,30605), +(3089,30606), +(3090,30607), +(3091,30608), +(3099,31116), +(3100,31117), +(3101,31118), +(3103,30598), +(3104,31860), +(3105,31861), +(3106,31862), +(3107,31863), +(3108,31864), +(3109,31865), +(3110,31866), +(3111,31867), +(3112,31868), +(3113,31869), +(3115,32193), +(3116,32194), +(3117,32195), +(3118,32196), +(3119,32197), +(3120,32198), +(3121,32199), +(3122,32200), +(3123,32201), +(3124,32202), +(3125,32203), +(3126,32204), +(3127,32205), +(3128,32206), +(3129,32207), +(3130,32208), +(3131,32209), +(3132,32210), +(3133,32211), +(3134,32212), +(3135,32213), +(3136,32214), +(3137,32215), +(3138,32216), +(3139,32217), +(3140,32218), +(3141,32219), +(3142,32220), +(3143,32221), +(3144,32222), +(3145,32223), +(3146,32224), +(3147,32225), +(3148,32226), +(3154,32409), +(3155,32410), +(3156,32634), +(3157,32635), +(3158,32636), +(3159,32637), +(3160,32638), +(3161,32639), +(3162,32640), +(3163,32641), +(3197,32735), +(3201,32833), +(3202,32836), +(3206,33060), +(3207,33130), +(3208,33131), +(3209,33132), +(3210,33133), +(3211,33134), +(3212,33135), +(3213,33136), +(3214,33137), +(3215,33138), +(3216,33139), +(3217,33140), +(3218,33141), +(3219,33142), +(3220,33143), +(3221,33144), +(3226,33782), +(3242,34142), +(3254,34143), +(3261,34220), +(3262,34256), +(3264,34627), +(3268,34831), +(3270,35315), +(3271,35316), +(3272,35318), +(3274,35501), +(3275,35503), +(3276,35487), +(3277,35488), +(3278,35489), +(3280,35707), +(3281,35487), +(3282,35488), +(3283,35489), +(3284,35758), +(3285,35759), +(3286,35760), +(3287,35761), +(3292,36766), +(3293,36767), +(3317,37430), +(3318,37503), +(3321,38292), +(3324,34835), +(3333,38498), +(3334,38538), +(3335,38545), +(3336,38546), +(3337,38547), +(3338,38548), +(3339,38549), +(3340,38550), +(3371,39900), +(3374,39905), +(3375,39906), +(3376,39907), +(3377,39908), +(3378,39909), +(3379,39910), +(3380,39911), +(3381,39912), +(3382,39914), +(3383,39915), +(3384,39916), +(3385,39917), +(3386,39918), +(3387,39919), +(3388,39920), +(3389,39927), +(3390,39932), +(3391,39933), +(3392,39934), +(3393,39935), +(3394,39936), +(3395,39937), +(3396,39938), +(3397,39939), +(3398,39940), +(3399,39941), +(3400,39942), +(3401,39943), +(3402,39944), +(3403,39945), +(3404,39946), +(3405,39947), +(3406,39953), +(3407,39949), +(3408,39950), +(3409,39951), +(3410,39952), +(3411,39948), +(3412,39954), +(3413,39955), +(3414,39956), +(3415,39957), +(3416,39958), +(3417,39959), +(3418,39964), +(3419,39965), +(3420,39966), +(3421,39967), +(3422,39960), +(3423,39961), +(3424,39962), +(3426,39963), +(3427,39968), +(3428,39974), +(3429,39975), +(3430,39976), +(3431,39977), +(3432,39978), +(3433,39979), +(3434,39980), +(3435,39981), +(3436,39982), +(3437,39983), +(3438,39984), +(3439,39985), +(3440,39986), +(3441,39988), +(3442,39989), +(3443,39990), +(3444,39991), +(3445,39992), +(3446,39996), +(3447,39997), +(3448,39998), +(3449,39999), +(3450,40000), +(3451,40001), +(3452,40002), +(3453,40003), +(3454,40008), +(3455,40009), +(3456,40010), +(3457,40011), +(3458,40012), +(3459,40013), +(3460,40014), +(3461,40015), +(3462,40016), +(3463,40017), +(3464,40022), +(3465,40023), +(3466,40025), +(3467,40029), +(3468,40031), +(3469,40032), +(3470,40033), +(3471,40034), +(3472,40026), +(3473,40027), +(3474,40024), +(3475,40030), +(3476,40028), +(3477,40037), +(3478,40038), +(3479,40039), +(3480,40040), +(3481,40041), +(3482,40043), +(3483,40044), +(3484,40045), +(3485,40046), +(3486,40047), +(3487,40048), +(3488,40049), +(3489,40050), +(3490,40051), +(3491,40052), +(3492,40053), +(3493,40054), +(3494,40055), +(3495,40056), +(3496,40057), +(3497,40058), +(3498,40059), +(3499,40085), +(3500,40086), +(3501,40088), +(3502,40089), +(3503,40090), +(3504,40091), +(3505,40092), +(3506,40095), +(3507,40099), +(3508,40102), +(3509,40104), +(3510,40094), +(3511,40096), +(3512,40100), +(3513,40103), +(3514,40105), +(3515,40098), +(3516,40101), +(3517,40106), +(3518,40111), +(3519,40112), +(3520,40113), +(3521,40114), +(3522,40115), +(3523,40116), +(3524,40118), +(3525,40117), +(3526,40123), +(3527,40124), +(3528,40125), +(3529,40126), +(3530,40127), +(3531,40128), +(3532,40119), +(3533,40120), +(3534,40121), +(3535,40122), +(3536,40129), +(3537,40130), +(3538,40132), +(3539,40136), +(3540,40138), +(3541,40139), +(3542,40141), +(3543,40140), +(3544,40131), +(3545,40133), +(3546,40134), +(3547,40137), +(3548,40135), +(3549,40142), +(3550,40143), +(3551,40144), +(3552,40145), +(3553,40146), +(3554,40147), +(3555,40148), +(3556,40149), +(3557,40150), +(3558,40151), +(3559,40152), +(3560,40153), +(3561,40154), +(3563,40155), +(3564,40156), +(3565,40157), +(3566,40158), +(3567,40159), +(3568,40160), +(3569,40161), +(3570,40162), +(3571,40163), +(3572,40164), +(3573,40165), +(3574,40166), +(3575,40167), +(3576,40168), +(3577,40169), +(3578,40170), +(3579,40171), +(3580,40172), +(3581,40173), +(3582,40174), +(3583,40175), +(3584,40176), +(3585,40177), +(3586,40178), +(3587,40179), +(3588,40180), +(3589,40181), +(3590,40182), +(3591,40232), +(3621,41285), +(3622,41307), +(3623,41333), +(3624,41335), +(3625,41339), +(3626,41395), +(3627,41401), +(3628,41398), +(3631,41396), +(3632,41375), +(3633,41376), +(3634,41377), +(3635,41378), +(3636,41379), +(3637,41380), +(3638,41381), +(3639,41382), +(3640,41385), +(3641,41389), +(3642,41397), +(3643,41400), +(3644,41434), +(3646,41439), +(3647,41437), +(3648,41435), +(3649,41432), +(3650,41438), +(3651,41433), +(3652,41436), +(3653,41442), +(3654,41440), +(3655,41441), +(3656,41443), +(3657,41448), +(3658,41449), +(3659,41446), +(3660,41447), +(3661,41444), +(3662,41445), +(3663,41454), +(3664,41450), +(3665,41456), +(3666,41462), +(3667,41460), +(3668,41458), +(3669,41453), +(3670,41451), +(3671,41461), +(3672,41459), +(3673,41457), +(3674,41455), +(3675,41452), +(3677,41485), +(3678,41501), +(3679,41496), +(3680,41487), +(3681,41492), +(3682,41488), +(3683,41483), +(3684,41499), +(3685,41489), +(3686,41484), +(3687,41491), +(3688,41493), +(3689,41494), +(3690,41495), +(3691,41502), +(3692,41486), +(3693,41497), +(3694,41500), +(3695,41490), +(3696,41482), +(3697,41498), +(3698,41470), +(3699,41468), +(3700,41464), +(3701,41467), +(3702,41466), +(3703,41475), +(3704,41481), +(3705,41473), +(3706,41479), +(3707,41480), +(3708,41476), +(3709,41472), +(3710,41477), +(3711,41463), +(3712,41469), +(3713,41471), +(3714,41465), +(3715,41478), +(3716,41474), +(3732,42142), +(3733,42143), +(3734,42144), +(3735,42145), +(3736,42146), +(3737,42148), +(3738,42149), +(3739,42150), +(3740,42151), +(3741,42152), +(3742,42156), +(3743,42157), +(3744,42158), +(3745,42153), +(3746,42154), +(3747,42155), +(3749,42701), +(3750,42702), +(3767,41429), +(3792,44066), +(3798,44076), +(3799,44078), +(3800,44082), +(3801,44081), +(3802,44084), +(3803,44087), +(3804,44088), +(3805,44089), +(3861,45862), +(3862,45879), +(3863,45880), +(3864,45881), +(3865,45882), +(3866,45883), +(3867,45987), +(3879,49110), +(3884,52070), +(3885,52127), +(3886,52128), +(3887,52130), +(3888,52129), +(3889,52081), +(3890,52082), +(3891,52083), +(3892,52084), +(3893,52085), +(3894,52086), +(3895,52087), +(3896,52088), +(3897,52089), +(3898,52090), +(3899,52092), +(3900,52093), +(3901,52094), +(3902,52095), +(3903,52097), +(3904,52096), +(3905,52098), +(3906,52099), +(3907,52100), +(3908,52101), +(3909,52102), +(3910,52103), +(3911,52104), +(3912,52105), +(3913,52106), +(3914,52107), +(3915,52108), +(3916,52109), +(3917,52110), +(3918,52111), +(3919,52112), +(3920,52113), +(3921,52114), +(3922,52115), +(3923,52116), +(3924,52117), +(3925,52118), +(3926,52119), +(3927,52120), +(3928,52121), +(3929,52122), +(3930,52123), +(3931,52124), +(3932,52125), +(3933,52126), +(3936,52091), +(3937,52156), +(3938,52157), +(3939,52158), +(3940,52159), +(3941,52160), +(3942,52161), +(3943,52162), +(3944,52163), +(3945,52164), +(3946,52165), +(3947,52166), +(3948,52167), +(3949,52168), +(3950,52169), +(3951,52170), +(3952,52171), +(3953,52172), +(3954,52173), +(3955,52174), +(3956,52175), +(3957,52176), +(3958,52131), +(3959,52132), +(3960,52133), +(3961,52134), +(3962,52135), +(3963,52136), +(3964,52137), +(3965,52138), +(3966,52139), +(3967,52140), +(3968,52141), +(3969,52142), +(3970,52143), +(3971,52144), +(3972,52145), +(3973,52146), +(3974,52147), +(3975,52148), +(3976,52149), +(3977,52150), +(3978,52151), +(3979,52152), +(3980,52153), +(3981,52154), +(3982,52155), +(3983,52203), +(3984,52210), +(3985,52213), +(3986,52217), +(3987,52220), +(3988,52221), +(3989,52234), +(3990,52236), +(3991,52238), +(3992,52243), +(3993,52248), +(3994,52206), +(3995,52207), +(3996,52212), +(3997,52216), +(3998,52230), +(3999,52219), +(4000,52226), +(4001,52232), +(4002,52241), +(4003,52247), +(4004,52235), +(4005,52242), +(4006,52244), +(4007,52246), +(4008,52204), +(4009,52205), +(4010,52208), +(4011,52209), +(4012,52211), +(4013,52214), +(4014,52215), +(4015,52222), +(4016,52224), +(4017,52229), +(4018,52239), +(4019,52240), +(4020,52249), +(4021,52218), +(4022,52223), +(4023,52225), +(4024,52227), +(4025,52228), +(4026,52231), +(4027,52233), +(4028,52237), +(4029,52245), +(4030,52250), +(4031,52255), +(4032,52257), +(4033,52258), +(4034,52259), +(4035,52269), +(4036,52267), +(4037,52260), +(4038,52268), +(4039,52264), +(4040,52266), +(4041,52261), +(4042,52262), +(4043,52263), +(4044,52265), +(4045,52289), +(4046,52291), +(4047,52292), +(4048,52293), +(4049,52294), +(4050,52295), +(4051,52296), +(4052,52297), +(4053,52298), +(4054,52299), +(4055,52300), +(4056,52301), +(4057,52302), +(4119,54616), +(4166,59477), +(4167,59478), +(4168,59479), +(4169,59480), +(4170,59489), +(4171,59491), +(4172,59493), +(4173,59496), +(4212,63696), +(4213,63697), +(4236,68356), +(4237,68357), +(4238,68358), +(4239,68660), +(4244,68741), +(4251,68778), +(4252,68779), +(4253,68780), +(4265,69922), +(4266,69923), +(4273,71817), +(4274,71818), +(4275,71819), +(4276,71820), +(4277,71822), +(4278,71823), +(4279,71824), +(4280,71825), +(4281,71826), +(4282,71827), +(4283,71828), +(4284,71829), +(4285,71830), +(4286,71831), +(4287,71832), +(4288,71833), +(4289,71834), +(4290,71835), +(4291,71836), +(4292,71837), +(4293,71838), +(4294,71839), +(4295,71840), +(4296,71841), +(4297,71842), +(4298,71843), +(4299,71844), +(4300,71845), +(4301,71846), +(4302,71847), +(4303,71848), +(4304,71849), +(4305,71850), +(4306,71851), +(4307,71852), +(4308,71853), +(4309,71854), +(4310,71855), +(4311,71856), +(4312,71857), +(4313,71858), +(4314,71859), +(4315,71860), +(4316,71861), +(4317,71862), +(4318,71863), +(4319,71864), +(4320,71865), +(4321,71866), +(4322,71867), +(4323,71868), +(4324,71869), +(4325,71870), +(4326,71871), +(4327,71872), +(4328,71873), +(4329,71879), +(4330,71880), +(4331,71881), +(4332,71882), +(4333,71883), +(4334,71874), +(4335,71875), +(4336,71876), +(4337,71877), +(4338,71878), +(4453,76502), +(4454,76504), +(4455,76505), +(4456,76506), +(4457,76507), +(4458,76508), +(4459,76509), +(4460,76510), +(4461,76511), +(4462,76512), +(4463,76513), +(4464,76514), +(4465,76515), +(4466,76517), +(4467,76518), +(4468,76519), +(4469,76520), +(4470,76521), +(4471,76522), +(4472,76523), +(4473,76524), +(4474,76525), +(4475,76526), +(4476,76527), +(4477,76528), +(4478,76529), +(4479,76530), +(4480,76531), +(4481,76532), +(4482,76533), +(4483,76534), +(4484,76535), +(4485,76536), +(4486,76537), +(4487,76538), +(4488,76539), +(4489,76540), +(4490,76541), +(4491,76542), +(4492,76543), +(4493,76544), +(4494,76545), +(4495,76546), +(4496,76547), +(4497,76548), +(4498,76549), +(4499,76550), +(4500,76551), +(4501,76552), +(4502,76553), +(4503,76554), +(4504,76555), +(4505,76556), +(4506,76557), +(4507,76558), +(4508,76559), +(4509,76560), +(4511,76561), +(4512,76562), +(4513,76563), +(4514,76564), +(4515,76565), +(4516,76566), +(4517,76567), +(4518,76568), +(4519,76569), +(4520,76570), +(4521,76571), +(4522,76572), +(4523,76573), +(4524,76574), +(4525,76575), +(4526,76576), +(4527,76577), +(4528,76578), +(4529,76579), +(4530,76580), +(4531,76581), +(4532,76582), +(4533,76583), +(4535,76584), +(4536,76585), +(4537,76586), +(4538,76587), +(4539,76588), +(4540,76589), +(4541,76590), +(4542,76591), +(4543,76592), +(4544,76593), +(4545,76594), +(4546,76595), +(4547,76596), +(4548,76597), +(4549,76598), +(4550,76599), +(4551,76600), +(4552,76601), +(4553,76602), +(4554,76603), +(4555,76604), +(4556,76605), +(4557,76606), +(4558,76607), +(4559,76608), +(4560,76609), +(4561,76610), +(4562,76611), +(4563,76612), +(4564,76613), +(4565,76614), +(4566,76615), +(4567,76616), +(4568,76617), +(4569,76618), +(4570,76619), +(4571,76620), +(4572,76621), +(4573,76622), +(4574,76623), +(4575,76624), +(4576,76625), +(4577,76626), +(4578,76627), +(4579,76628), +(4580,76629), +(4581,76630), +(4582,76631), +(4583,76632), +(4584,76633), +(4585,76634), +(4586,76635), +(4587,76636), +(4588,76637), +(4589,76638), +(4590,76639), +(4591,76640), +(4592,76641), +(4593,76642), +(4594,76643), +(4595,76644), +(4596,76645), +(4597,76646), +(4598,76647), +(4599,76648), +(4600,76649), +(4601,76650), +(4602,76651), +(4603,76652), +(4604,76653), +(4605,76654), +(4606,76655), +(4607,76656), +(4608,76657), +(4609,76658), +(4610,76659), +(4611,76660), +(4612,76661), +(4613,76662), +(4614,76663), +(4615,76664), +(4616,76665), +(4617,76666), +(4618,76667), +(4619,76668), +(4620,76669), +(4621,76670), +(4622,76671), +(4623,76672), +(4624,76673), +(4625,76674), +(4626,76675), +(4627,76676), +(4628,76677), +(4629,76678), +(4630,76679), +(4631,76680), +(4632,76681), +(4633,76682), +(4634,76683), +(4635,76684), +(4636,76685), +(4637,76686), +(4638,76687), +(4640,76689), +(4641,76690), +(4642,76691), +(4643,76692), +(4644,76694), +(4645,76695), +(4646,76696), +(4647,76697), +(4648,76698), +(4649,76699), +(4650,76700), +(4651,76701), +(4652,76688), +(4653,76693), +(4654,76714), +(4655,76879), +(4656,76884), +(4657,76886), +(4658,76885), +(4659,76887), +(4660,76888), +(4661,76890), +(4662,76891), +(4664,76892), +(4665,76893), +(4666,76894), +(4667,76895), +(4668,76896), +(4669,76897), +(4672,77130), +(4673,77131), +(4674,77132), +(4675,77133), +(4676,77134), +(4677,77154), +(4678,77136), +(4679,77137), +(4680,77138), +(4681,77139), +(4682,77140), +(4683,77141), +(4684,77142), +(4685,77143), +(4686,77144), +(4810,83141), +(4811,83150), +(4812,83151), +(4813,83152), +(4814,83143), +(4815,83147), +(4816,83142), +(4817,83144), +(4818,83146), +(4819,83145), +(4820,83148), +(4821,83149), +(4899,77544), +(4900,77547), +(4901,77543), +(4902,77542), +(4903,77545), +(4904,77541), +(4905,77546), +(4906,77540), +(4921,88952), +(4922,88953), +(4923,88954), +(4924,88955), +(4925,88956), +(4926,88958), +(4927,88959), +(4928,88960), +(4929,88961), +(4930,88962), +(4931,88963), +(4932,88911), +(4933,88912), +(4934,88913), +(4936,88914), +(4937,88915), +(4938,88916), +(4939,88917), +(4940,88918), +(4941,88919), +(4942,88920), +(4943,88921), +(4944,88922), +(4945,88923), +(4946,88924), +(4947,88925), +(4948,88926), +(4949,88927), +(4950,88928), +(4951,88930), +(4952,88931), +(4953,88932), +(4954,88933), +(4955,88934), +(4956,88935), +(4957,88936), +(4958,88937), +(4959,88938), +(4960,88939), +(4961,88940), +(4962,88941), +(4963,88942), +(4964,88943), +(4965,88944), +(4966,88945), +(4967,88946), +(4968,88947), +(4969,88948), +(4970,88949), +(4971,88950), +(4972,88951), +(4973,88987), +(4984,89674), +(4985,89675), +(4986,89676), +(4987,89677), +(4988,89678), +(4989,89679), +(4990,89680), +(4991,89681), +(4996,89873), +(4997,89881), +(4998,89882), +(5011,93364), +(5012,93366), +(5013,93365), +(5016,93404), +(5017,93405), +(5018,93406), +(5019,93408), +(5020,93409), +(5021,93410), +(5024,93705), +(5025,93706), +(5026,93707), +(5027,93708), +(5030,95344), +(5031,95345), +(5032,95346), +(5033,95347), +(5034,95348), +(5047,97306), +(5048,97307), +(5049,97308), +(5050,97309), +(5051,97310), +(5052,97311), +(5053,97312), +(5054,97313), +(5070,97534), +(5071,97535), +(5072,97536), +(5073,97537), +(5074,97538), +(5075,97547), +(5085,97937), +(5086,97938), +(5088,97939), +(5089,97941), +(5090,97943), +(5106,98025), +(5107,98026), +(5108,98027), +(5109,98028), +(5114,98051), +(5115,98056), +(5117,98088), +(5118,98089), +(5119,98090), +(5120,98094), +(5147,100942), +(5333,111294), +(5339,115803), +(5340,115804), +(5342,115805), +(5343,115806), +(5344,115807), +(5345,115808), +(5346,115809), +(5347,115811), +(5348,115812), +(5349,115813), +(5350,115814), +(5351,115815), +(5413,127760), +(5414,127761), +(5415,127762), +(5416,127763), +(5417,127764), +(5418,127765), +(5419,127414), +(5420,127415), +(5421,127416); + +UPDATE `item_instance_gems` SET `gemItemId1`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId1`), 0); +UPDATE `item_instance_gems` SET `gemItemId2`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId2`), 0); +UPDATE `item_instance_gems` SET `gemItemId3`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId3`), 0); + +DROP TABLE IF EXISTS `enchant_gem_ids`; diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql new file mode 100644 index 00000000000..f90c81333a9 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql @@ -0,0 +1,2433 @@ +-- +-- Table structure for table `achievement` +-- +ALTER TABLE `achievement` + MODIFY `Title` text AFTER `ID`, + MODIFY `Description` text AFTER `Title`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Reward` text AFTER `Flags`, + MODIFY `MapID` smallint(6) NOT NULL DEFAULT '0' AFTER `Reward`, + MODIFY `Supercedes` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `Category` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Supercedes`, + MODIFY `UIOrder` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Category`, + MODIFY `IconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UIOrder`, + MODIFY `SharesCriteria` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconID`, + MODIFY `CriteriaTree` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SharesCriteria`, + MODIFY `Faction` tinyint(4) NOT NULL DEFAULT '0' AFTER `CriteriaTree`, + MODIFY `Points` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Faction`, + MODIFY `MinimumCriteria` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Points`; + +-- +-- Table structure for table `anim_kit` +-- +DROP TABLE IF EXISTS `anim_kit`; +CREATE TABLE `anim_kit` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `OneShotDuration` int(10) unsigned NOT NULL DEFAULT '0', + `OneShotStopAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LowDefAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `area_group_member` +-- +ALTER TABLE `area_group_member` + MODIFY `AreaGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `AreaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaGroupID`; + +-- +-- Table structure for table `armor_location` +-- +DROP TABLE IF EXISTS `armor_location`; +CREATE TABLE `armor_location` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Modifier1` float NOT NULL DEFAULT '0', + `Modifier2` float NOT NULL DEFAULT '0', + `Modifier3` float NOT NULL DEFAULT '0', + `Modifier4` float NOT NULL DEFAULT '0', + `Modifier5` float NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `auction_house` +-- +ALTER TABLE `auction_house` + MODIFY `Name` text AFTER `ID`, + MODIFY `FactionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `DepositRate` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FactionID`, + MODIFY `ConsignmentRate` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepositRate`; + +-- +-- Table structure for table `bank_bag_slot_prices` +-- +DROP TABLE IF EXISTS `bank_bag_slot_prices`; +CREATE TABLE `bank_bag_slot_prices` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Cost` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `barber_shop_style` +-- +ALTER TABLE `barber_shop_style` + MODIFY `DisplayName` text AFTER `ID`, + MODIFY `Description` text AFTER `DisplayName`, + MODIFY `CostModifier` float NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostModifier`, + MODIFY `Race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Sex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Race`, + MODIFY `Data` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sex`; + +-- +-- Table structure for table `battle_pet_breed_quality` +-- +ALTER TABLE `battle_pet_breed_quality` + MODIFY `Modifier` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Modifier`; + +-- +-- Table structure for table `battle_pet_breed_state` +-- +ALTER TABLE `battle_pet_breed_state` + MODIFY `Value` smallint(6) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `BreedID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Value`, + MODIFY `State` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BreedID`; + +-- +-- Table structure for table `battle_pet_species` +-- +ALTER TABLE `battle_pet_species` + MODIFY `SourceText` text AFTER `SummonSpellID`, + MODIFY `Description` text AFTER `SourceText`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `PetType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(4) NOT NULL DEFAULT '0' AFTER `PetType`; + +-- +-- Table structure for table `battle_pet_species_locale` +-- +ALTER TABLE `battle_pet_species_locale` + CHANGE `SourceText` `SourceText_lang` text AFTER `locale`, + CHANGE `Description` `Description_lang` text AFTER `SourceText_lang`; + +-- +-- Table structure for table `battle_pet_species_state` +-- +ALTER TABLE `battle_pet_species_state` + MODIFY `Value` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SpeciesID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Value`, + MODIFY `State` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpeciesID`; + +-- +-- Table structure for table `broadcast_text` +-- +ALTER TABLE `broadcast_text` + MODIFY `MaleText` text AFTER `ID`, + MODIFY `FemaleText` text AFTER `MaleText`, + MODIFY `EmoteID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FemaleText`, + MODIFY `EmoteID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID1`, + MODIFY `EmoteID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID2`, + MODIFY `EmoteDelay1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID3`, + MODIFY `EmoteDelay2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay1`, + MODIFY `EmoteDelay3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay2`, + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay3`, + MODIFY `UnkEmoteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `Language` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UnkEmoteID`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Language`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `char_start_outfit` +-- +ALTER TABLE `char_start_outfit` + MODIFY `ItemID1` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `ItemID2` int(11) NOT NULL DEFAULT '0' AFTER `ItemID1`, + MODIFY `ItemID3` int(11) NOT NULL DEFAULT '0' AFTER `ItemID2`, + MODIFY `ItemID4` int(11) NOT NULL DEFAULT '0' AFTER `ItemID3`, + MODIFY `ItemID5` int(11) NOT NULL DEFAULT '0' AFTER `ItemID4`, + MODIFY `ItemID6` int(11) NOT NULL DEFAULT '0' AFTER `ItemID5`, + MODIFY `ItemID7` int(11) NOT NULL DEFAULT '0' AFTER `ItemID6`, + MODIFY `ItemID8` int(11) NOT NULL DEFAULT '0' AFTER `ItemID7`, + MODIFY `ItemID9` int(11) NOT NULL DEFAULT '0' AFTER `ItemID8`, + MODIFY `ItemID10` int(11) NOT NULL DEFAULT '0' AFTER `ItemID9`, + MODIFY `ItemID11` int(11) NOT NULL DEFAULT '0' AFTER `ItemID10`, + MODIFY `ItemID12` int(11) NOT NULL DEFAULT '0' AFTER `ItemID11`, + MODIFY `ItemID13` int(11) NOT NULL DEFAULT '0' AFTER `ItemID12`, + MODIFY `ItemID14` int(11) NOT NULL DEFAULT '0' AFTER `ItemID13`, + MODIFY `ItemID15` int(11) NOT NULL DEFAULT '0' AFTER `ItemID14`, + MODIFY `ItemID16` int(11) NOT NULL DEFAULT '0' AFTER `ItemID15`, + MODIFY `ItemID17` int(11) NOT NULL DEFAULT '0' AFTER `ItemID16`, + MODIFY `ItemID18` int(11) NOT NULL DEFAULT '0' AFTER `ItemID17`, + MODIFY `ItemID19` int(11) NOT NULL DEFAULT '0' AFTER `ItemID18`, + MODIFY `ItemID20` int(11) NOT NULL DEFAULT '0' AFTER `ItemID19`, + MODIFY `ItemID21` int(11) NOT NULL DEFAULT '0' AFTER `ItemID20`, + MODIFY `ItemID22` int(11) NOT NULL DEFAULT '0' AFTER `ItemID21`, + MODIFY `ItemID23` int(11) NOT NULL DEFAULT '0' AFTER `ItemID22`, + MODIFY `ItemID24` int(11) NOT NULL DEFAULT '0' AFTER `ItemID23`, + MODIFY `PetDisplayID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID24`, + MODIFY `PetFamilyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OutfitID`; + +-- +-- Table structure for table `chr_classes_x_power_types` +-- +ALTER TABLE `chr_classes_x_power_types` + MODIFY `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassID`; + +-- +-- Table structure for table `chr_races` +-- +DROP TABLE IF EXISTS `chr_races`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `chr_races` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `ClientPrefix` text, + `ClientFileString` text, + `Name` text, + `NameFemale` text, + `NameMale` text, + `FacialHairCustomization1` text, + `FacialHairCustomization2` text, + `HairCustomization` text, + `CreateScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `SelectScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `MaleCustomizeOffset1` float NOT NULL DEFAULT '0', + `MaleCustomizeOffset2` float NOT NULL DEFAULT '0', + `MaleCustomizeOffset3` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset1` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset2` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset3` float NOT NULL DEFAULT '0', + `LowResScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `FactionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ExplorationSoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `FemaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ResSicknessSpellID` smallint(5) unsigned NOT NULL DEFAULT '0', + `SplashSoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CinematicSequenceID` smallint(5) unsigned NOT NULL DEFAULT '0', + `UAMaleCreatureSoundDataID` smallint(5) unsigned NOT NULL DEFAULT '0', + `UAFemaleCreatureSoundDataID` smallint(5) unsigned NOT NULL DEFAULT '0', + `HighResMaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `HighResFemaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Unk` smallint(5) unsigned NOT NULL DEFAULT '0', + `BaseLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CreatureType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TeamID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RaceRelated` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UnalteredVisualRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CharComponentTextureLayoutID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DefaultClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `NeutralRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CharComponentTexLayoutHiResID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_races_locale` +-- +DROP TABLE IF EXISTS `chr_races_locale`; +CREATE TABLE `chr_races_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `NameFemale_lang` text, + `NameMale_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `cinematic_sequences` +-- +ALTER TABLE `cinematic_sequences` + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Camera1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `Camera2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera1`, + MODIFY `Camera3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera2`, + MODIFY `Camera4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera3`, + MODIFY `Camera5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera4`, + MODIFY `Camera6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera5`, + MODIFY `Camera7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera6`, + MODIFY `Camera8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera7`; + +-- +-- Table structure for table `creature_display_info` +-- +ALTER TABLE `creature_display_info` + MODIFY `ExtendedDisplayInfoID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `CreatureModelScale` float NOT NULL DEFAULT '0' AFTER `ExtendedDisplayInfoID`, + MODIFY `Unknown620` float NOT NULL DEFAULT '0' AFTER `CreatureModelScale`, + DROP `TextureVariation1`, + DROP `TextureVariation2`, + DROP `TextureVariation3`, + MODIFY `PortraitTextureName` text AFTER `Unknown620`, + MODIFY `PortraitCreatureDisplayInfoID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PortraitTextureName`, + MODIFY `CreatureGeosetData` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PortraitCreatureDisplayInfoID`, + MODIFY `StateSpellVisualKitID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CreatureGeosetData`, + MODIFY `ModelID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateSpellVisualKitID`, + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ModelID`, + MODIFY `NPCSoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `ParticleColorID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `NPCSoundID`, + MODIFY `ObjectEffectPackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ParticleColorID`, + MODIFY `AnimReplacementSetID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ObjectEffectPackageID`, + MODIFY `CreatureModelAlpha` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AnimReplacementSetID`, + MODIFY `SizeClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CreatureModelAlpha`, + MODIFY `BloodID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SizeClass`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BloodID`, + MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + ADD `Unk700` tinyint(4) NOT NULL DEFAULT '0' AFTER `Gender`; + +ALTER TABLE `creature_display_info` + ADD `TextureVariation1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown620`, + ADD `TextureVariation2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TextureVariation1`, + ADD `TextureVariation3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TextureVariation2`; + +-- +-- Table structure for table `creature_display_info_extra` +-- +DROP TABLE IF EXISTS `creature_display_info_extra`; +CREATE TABLE `creature_display_info_extra` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay1` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay2` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay3` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay4` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay5` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay6` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay7` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay8` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay9` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay10` int(10) unsigned NOT NULL DEFAULT '0', + `FileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `HDFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `DisplayRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DisplaySexID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DisplayClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SkinID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `HairStyleID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `HairColorID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FacialHairID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `creature_type` +-- +ALTER TABLE `creature_type` MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `criteria` +-- +ALTER TABLE `criteria` + MODIFY `Asset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `StartAsset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Asset`, + MODIFY `FailAsset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `StartAsset`, + MODIFY `StartTimer` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FailAsset`, + MODIFY `ModifierTreeId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartTimer`, + MODIFY `EligibilityWorldStateID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ModifierTreeId`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EligibilityWorldStateID`, + MODIFY `StartEvent` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `FailEvent` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StartEvent`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FailEvent`, + MODIFY `EligibilityWorldStateValue` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `criteria_tree` +-- +ALTER TABLE `criteria_tree` + MODIFY `Amount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Description` text AFTER `Amount`, + MODIFY `CriteriaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Parent` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CriteriaID`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Parent`, + MODIFY `OrderIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Operator` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`; + +-- +-- Table structure for table `currency_types` +-- +ALTER TABLE `currency_types` + MODIFY `Name` text AFTER `ID`, + MODIFY `InventoryIcon1` text AFTER `Name`, + MODIFY `InventoryIcon2` text AFTER `InventoryIcon1`, + MODIFY `MaxQty` int(10) unsigned NOT NULL DEFAULT '0' AFTER `InventoryIcon2`, + MODIFY `MaxEarnablePerWeek` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxQty`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxEarnablePerWeek`, + MODIFY `Description` text AFTER `Flags`, + MODIFY `CategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `SpellWeight` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CategoryID`, + MODIFY `SpellCategory` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellWeight`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellCategory`; + +-- +-- Table structure for table `currency_types_locale` +-- +ALTER TABLE `currency_types_locale` DROP `InventoryIcon1_lang`; +ALTER TABLE `currency_types_locale` DROP `InventoryIcon2_lang`; + +-- +-- Table structure for table `curve_point` +-- +ALTER TABLE `curve_point` + MODIFY `X` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Y` float NOT NULL DEFAULT '0' AFTER `X`, + MODIFY `CurveID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Y`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurveID`; + +-- +-- Table structure for table `destructible_model_data` +-- +ALTER TABLE `destructible_model_data` + MODIFY `StateDamagedDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `StateDestroyedDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedDisplayID`, + MODIFY `StateRebuildingDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedDisplayID`, + MODIFY `StateSmokeDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingDisplayID`, + MODIFY `HealEffectSpeed` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeDisplayID`, + MODIFY `StateDamagedImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HealEffectSpeed`, + MODIFY `StateDamagedAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedImpactEffectDoodadSet`, + MODIFY `StateDamagedNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedAmbientDoodadSet`, + MODIFY `StateDestroyedDestructionDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedNameSet`, + MODIFY `StateDestroyedImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedDestructionDoodadSet`, + MODIFY `StateDestroyedAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedImpactEffectDoodadSet`, + MODIFY `StateDestroyedNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedAmbientDoodadSet`, + MODIFY `StateRebuildingDestructionDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedNameSet`, + MODIFY `StateRebuildingImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingDestructionDoodadSet`, + MODIFY `StateRebuildingAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingImpactEffectDoodadSet`, + MODIFY `StateRebuildingNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingAmbientDoodadSet`, + MODIFY `StateSmokeInitDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingNameSet`, + MODIFY `StateSmokeAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeInitDoodadSet`, + MODIFY `StateSmokeNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeAmbientDoodadSet`, + MODIFY `EjectDirection` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeNameSet`, + MODIFY `DoNotHighlight` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EjectDirection`, + MODIFY `HealEffect` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DoNotHighlight`, + DROP `RepairGroundFx`; + +-- +-- Table structure for table `durability_costs` +-- +DROP TABLE IF EXISTS `durability_costs`; +CREATE TABLE `durability_costs` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost1` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost2` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost3` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost4` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost5` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost6` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost7` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost8` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost9` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost10` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost11` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost12` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost13` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost14` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost15` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost16` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost17` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost18` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost19` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost20` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost21` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost5` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost6` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost7` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `emotes_text_sound` +-- +DROP TABLE IF EXISTS `emotes_text_sound`; +CREATE TABLE `emotes_text_sound` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EmotesTextId` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundId` smallint(5) unsigned NOT NULL DEFAULT '0', + `RaceId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SexId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ClassId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `gameobjects` +-- +ALTER TABLE `gameobjects` + MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST , + MODIFY `PositionX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PositionY` float NOT NULL DEFAULT '0' AFTER `PositionX`, + MODIFY `PositionZ` float NOT NULL DEFAULT '0' AFTER `PositionY`, + MODIFY `RotationX` float NOT NULL DEFAULT '0' AFTER `PositionZ`, + MODIFY `RotationY` float NOT NULL DEFAULT '0' AFTER `RotationX`, + MODIFY `RotationZ` float NOT NULL DEFAULT '0' AFTER `RotationY`, + MODIFY `RotationW` float NOT NULL DEFAULT '0' AFTER `RotationZ`, + MODIFY `Size` float NOT NULL DEFAULT '0' AFTER `RotationW`, + MODIFY `Data0` int(10) NOT NULL DEFAULT '0' AFTER `Size`, + MODIFY `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Data0`, + MODIFY `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data1`, + MODIFY `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data2`, + MODIFY `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data3`, + MODIFY `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data4`, + MODIFY `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data5`, + MODIFY `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data6`, + MODIFY `Name` text AFTER `Data7`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `DisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DisplayID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `Type`; + +ALTER TABLE `gameobjects` CHANGE `Data7` `Data8` int(10) NOT NULL DEFAULT '0' AFTER `Data6`; +ALTER TABLE `gameobjects` CHANGE `Data6` `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data5`; +ALTER TABLE `gameobjects` CHANGE `Data5` `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data4`; +ALTER TABLE `gameobjects` CHANGE `Data4` `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data3`; +ALTER TABLE `gameobjects` CHANGE `Data3` `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data2`; +ALTER TABLE `gameobjects` CHANGE `Data2` `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data1`; +ALTER TABLE `gameobjects` CHANGE `Data1` `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data0`; +ALTER TABLE `gameobjects` CHANGE `Data0` `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Size`; + +-- +-- Table structure for table `gameobject_display_info` +-- +DROP TABLE IF EXISTS `gameobject_display_info`; +CREATE TABLE `gameobject_display_info` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `FileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `GeoBoxMinX` float NOT NULL DEFAULT '0', + `GeoBoxMinY` float NOT NULL DEFAULT '0', + `GeoBoxMinZ` float NOT NULL DEFAULT '0', + `GeoBoxMaxX` float NOT NULL DEFAULT '0', + `GeoBoxMaxY` float NOT NULL DEFAULT '0', + `GeoBoxMaxZ` float NOT NULL DEFAULT '0', + `OverrideLootEffectScale` float NOT NULL DEFAULT '0', + `OverrideNameScale` float NOT NULL DEFAULT '0', + `Sound1` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound2` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound3` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound4` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound5` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound6` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound7` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound8` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound9` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound10` smallint(5) unsigned NOT NULL DEFAULT '0', + `ObjectEffectPackageID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `game_tables` +-- +ALTER TABLE `game_tables` ENGINE=MyISAM, DEFAULT CHARSET=utf8; +ALTER TABLE `game_tables` + MODIFY `Name` text AFTER `ID`, + MODIFY `NumRows` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `NumColumns` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NumRows`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `NumColumns`; + +-- +-- Table structure for table `game_tables_locale` +-- +ALTER TABLE `game_tables_locale` MODIFY `Name_lang` text AFTER `locale`; + +-- +-- Table structure for table `garr_ability` +-- +ALTER TABLE `garr_ability` + MODIFY `Name` text AFTER `ID`, + MODIFY `Description` text AFTER `Name`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `OtherFactionGarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OtherFactionGarrAbilityID`, + MODIFY `GarrAbilityCategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrAbilityCategoryID`; + +-- +-- Table structure for table `garr_building` +-- +ALTER TABLE `garr_building` + MODIFY `NameAlliance` text AFTER `AllianceGameObjectID`, + MODIFY `NameHorde` text AFTER `NameAlliance`, + MODIFY `Description` text AFTER `NameHorde`, + MODIFY `Tooltip` text AFTER `Description`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Tooltip`, + MODIFY `BuildDuration` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `CostCurrencyID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BuildDuration`, + MODIFY `CostCurrencyAmount` smallint(6) NOT NULL DEFAULT '0' AFTER `CostCurrencyID`, + MODIFY `AllianceActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CostCurrencyAmount`, + MODIFY `HordeActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceActivationScenePackageID`, + MODIFY `CostMoney` smallint(6) NOT NULL DEFAULT '0' AFTER `HordeActivationScenePackageID`, + MODIFY `Unknown` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostMoney`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `HordeTexPrefixKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `AllianceTexPrefixKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeTexPrefixKitID`, + MODIFY `BonusAmount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceTexPrefixKitID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusAmount`, + MODIFY `MaxShipments` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `FollowerRequiredGarrAbilityID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxShipments`, + MODIFY `FollowerGarrAbilityEffectID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerRequiredGarrAbilityID`, + ADD `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerGarrAbilityEffectID`; + +-- +-- Table structure for table `garr_building_plot_inst` +-- +ALTER TABLE `garr_building_plot_inst` + MODIFY `LandmarkOffsetX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LandmarkOffsetY` float NOT NULL DEFAULT '0' AFTER `LandmarkOffsetX`, + MODIFY `UiTextureAtlasMemberID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LandmarkOffsetY`, + MODIFY `GarrSiteLevelPlotInstID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UiTextureAtlasMemberID`, + MODIFY `GarrBuildingID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrSiteLevelPlotInstID`; + +-- +-- Table structure for table `garr_class_spec` +-- +ALTER TABLE `garr_class_spec` + MODIFY `ClassAtlasID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `NameGenderless`, + MODIFY `GarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassAtlasID`; + +-- +-- Table structure for table `garr_follower` +-- +ALTER TABLE `garr_follower` + MODIFY `HordeCreatureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `AllianceCreatureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeCreatureID`, + MODIFY `HordeSourceText` text AFTER `AllianceCreatureID`, + MODIFY `AllianceSourceText` text AFTER `HordeSourceText`, + MODIFY `HordePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllianceSourceText`, + MODIFY `AlliancePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordePortraitIconID`, + MODIFY `ItemLevelWeapon` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AlliancePortraitIconID`, + MODIFY `ItemLevelArmor` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelWeapon`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelArmor`, + MODIFY `HordeUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerTypeID`, + MODIFY `AllianceUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeUiAnimRaceInfoID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceUiAnimRaceInfoID`, + MODIFY `HordeGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quality`, + MODIFY `AllianceGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrClassSpecID`, + MODIFY `HordeGarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrClassSpecID`, + MODIFY `AllianceGarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrFollItemSetID`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrFollItemSetID`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `Unknown2` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Unknown3` tinyint(4) NOT NULL DEFAULT '0' AFTER `Unknown2`, + MODIFY `HordeListPortraitTextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown3`, + MODIFY `AllianceListPortraitTextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeListPortraitTextureKitID`, + ADD `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceListPortraitTextureKitID`; + +-- +-- Table structure for table `garr_follower_x_ability` +-- +ALTER TABLE `garr_follower_x_ability` + MODIFY `GarrFollowerID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollowerID`, + MODIFY `FactionIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrAbilityID`; + +-- +-- Table structure for table `garr_plot` +-- +ALTER TABLE `garr_plot` + MODIFY `Name` text AFTER `ID`, + MODIFY `AllianceConstructionGameObjectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `HordeConstructionGameObjectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllianceConstructionGameObjectID`, + MODIFY `GarrPlotUICategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeConstructionGameObjectID`, + MODIFY `PlotType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotUICategoryID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlotType`, + MODIFY `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinCount`; + +-- +-- Table structure for table `garr_plot_building` +-- +ALTER TABLE `garr_plot_building` + MODIFY `GarrPlotID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GarrBuildingID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotID`; + +-- +-- Table structure for table `garr_plot_instance` +-- +ALTER TABLE `garr_plot_instance` + MODIFY `Name` text AFTER `ID`, + MODIFY `GarrPlotID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `garr_site_level` +-- +ALTER TABLE `garr_site_level` + MODIFY `TownHallX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `TownHallY` float NOT NULL DEFAULT '0' AFTER `TownHallX`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TownHallY`, + MODIFY `UpgradeResourceCost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `UpgradeMoneyCost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeResourceCost`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeMoneyCost`, + MODIFY `SiteID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `UITextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SiteID`, + MODIFY `MovieID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UITextureKitID`, + MODIFY `Level2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MovieID`; + +-- +-- Table structure for table `garr_site_level_plot_inst` +-- +ALTER TABLE `garr_site_level_plot_inst` + MODIFY `LandmarkX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LandmarkY` float NOT NULL DEFAULT '0' AFTER `LandmarkX`, + MODIFY `GarrSiteLevelID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LandmarkY`, + MODIFY `GarrPlotInstanceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrSiteLevelID`, + MODIFY `Unknown` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotInstanceID`; + +-- +-- Table structure for table `glyph_slot` +-- +ALTER TABLE `glyph_slot` + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Tooltip` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `guild_color_background` +-- +DROP TABLE IF EXISTS `guild_color_background`; +CREATE TABLE `guild_color_background` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `guild_color_border` +-- +DROP TABLE IF EXISTS `guild_color_border`; +CREATE TABLE `guild_color_border` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `guild_color_emblem` +-- +DROP TABLE IF EXISTS `guild_color_emblem`; +CREATE TABLE `guild_color_emblem` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `guild_perk_spells` +-- +ALTER TABLE `guild_perk_spells` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`; + +-- +-- Table structure for table `heirloom` +-- +ALTER TABLE `heirloom` + MODIFY `SourceText` text AFTER `ItemID`, + MODIFY `OldItem1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SourceText`, + MODIFY `OldItem2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem1`, + MODIFY `NextDifficultyItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem2`, + MODIFY `UpgradeItemID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `NextDifficultyItemID`, + MODIFY `UpgradeItemID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID1`, + MODIFY `ItemBonusListID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID2`, + MODIFY `ItemBonusListID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID1`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID2`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `holidays` +-- +ALTER TABLE `holidays` + MODIFY `Date1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Date2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date1`, + MODIFY `Date3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date2`, + MODIFY `Date4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date3`, + MODIFY `Date5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date4`, + MODIFY `Date6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date5`, + MODIFY `Date7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date6`, + MODIFY `Date8` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date7`, + MODIFY `Date9` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date8`, + MODIFY `Date10` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date9`, + MODIFY `Date11` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date10`, + MODIFY `Date12` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date11`, + MODIFY `Date13` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date12`, + MODIFY `Date14` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date13`, + MODIFY `Date15` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date14`, + MODIFY `Date16` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date15`, + MODIFY `TextureFilename` text AFTER `Date16`, + MODIFY `Duration1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureFilename`, + MODIFY `Duration2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration1`, + MODIFY `Duration3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration2`, + MODIFY `Duration4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration3`, + MODIFY `Duration5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration4`, + MODIFY `Duration6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration5`, + MODIFY `Duration7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration6`, + MODIFY `Duration8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration7`, + MODIFY `Duration9` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration8`, + MODIFY `Duration10` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration9`, + MODIFY `Region` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration10`, + MODIFY `Looping` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Region`, + MODIFY `CalendarFlags1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Looping`, + MODIFY `CalendarFlags2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags1`, + MODIFY `CalendarFlags3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags2`, + MODIFY `CalendarFlags4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags3`, + MODIFY `CalendarFlags5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags4`, + MODIFY `CalendarFlags6` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags5`, + MODIFY `CalendarFlags7` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags6`, + MODIFY `CalendarFlags8` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags7`, + MODIFY `CalendarFlags9` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags8`, + MODIFY `CalendarFlags10` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags9`, + MODIFY `HolidayNameID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags10`, + MODIFY `HolidayDescriptionID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HolidayNameID`, + MODIFY `Priority` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HolidayDescriptionID`, + MODIFY `CalendarFilterType` tinyint(4) NOT NULL DEFAULT '0' AFTER `Priority`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFilterType`; + +-- +-- Table structure for table `item` +-- +ALTER TABLE `item` + MODIFY `FileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID`, + MODIFY `SubClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Class`, + MODIFY `SoundOverrideSubclass` tinyint(4) NOT NULL DEFAULT '0' AFTER `SubClass`, + MODIFY `Material` tinyint(4) NOT NULL DEFAULT '0' AFTER `SoundOverrideSubclass`, + MODIFY `InventoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Material`, + MODIFY `Sheath` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `InventoryType`, + MODIFY `GroupSoundsID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sheath`; + +-- +-- Table structure for table `item_appearance` +-- +ALTER TABLE `item_appearance` ADD `ObjectComponentSlot` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +-- +-- Table structure for table `item_armor_quality` +-- +DROP TABLE IF EXISTS `item_armor_quality`; +CREATE TABLE `item_armor_quality` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `QualityMod1` float NOT NULL DEFAULT '0', + `QualityMod2` float NOT NULL DEFAULT '0', + `QualityMod3` float NOT NULL DEFAULT '0', + `QualityMod4` float NOT NULL DEFAULT '0', + `QualityMod5` float NOT NULL DEFAULT '0', + `QualityMod6` float NOT NULL DEFAULT '0', + `QualityMod7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_armor_shield` +-- +DROP TABLE IF EXISTS `item_armor_shield`; +CREATE TABLE `item_armor_shield` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Quality1` float NOT NULL DEFAULT '0', + `Quality2` float NOT NULL DEFAULT '0', + `Quality3` float NOT NULL DEFAULT '0', + `Quality4` float NOT NULL DEFAULT '0', + `Quality5` float NOT NULL DEFAULT '0', + `Quality6` float NOT NULL DEFAULT '0', + `Quality7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_armor_total` +-- +DROP TABLE IF EXISTS `item_armor_total`; +CREATE TABLE `item_armor_total` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Value1` float NOT NULL DEFAULT '0', + `Value2` float NOT NULL DEFAULT '0', + `Value3` float NOT NULL DEFAULT '0', + `Value4` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bag_family` +-- +DROP TABLE IF EXISTS `item_bag_family`; +CREATE TABLE `item_bag_family` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bag_family_locale` +-- +DROP TABLE IF EXISTS `item_bag_family_locale`; +CREATE TABLE `item_bag_family_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bonus` +-- +ALTER TABLE `item_bonus` + MODIFY `Value1` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Value2` int(11) NOT NULL DEFAULT '0' AFTER `Value1`, + MODIFY `BonusListID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Value2`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusListID`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `item_bonus_tree_node` +-- +ALTER TABLE `item_bonus_tree_node` + MODIFY `BonusTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SubTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BonusTreeID`, + MODIFY `BonusListID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SubTreeID`, + MODIFY `BonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusListID`; + +-- +-- Table structure for table `item_class` +-- +ALTER TABLE `item_class` + MODIFY `PriceMod` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Name` text AFTER `PriceMod`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `item_currency_cost` +-- +ALTER TABLE `item_currency_cost` DROP INDEX `idx_itemId`; + +-- +-- Table structure for table `item_damage_ammo` +-- +DROP TABLE IF EXISTS `item_damage_ammo`; +CREATE TABLE `item_damage_ammo` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_one_hand` +-- +DROP TABLE IF EXISTS `item_damage_one_hand`; +CREATE TABLE `item_damage_one_hand` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_one_hand_caster` +-- +DROP TABLE IF EXISTS `item_damage_one_hand_caster`; +CREATE TABLE `item_damage_one_hand_caster` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_two_hand` +-- +DROP TABLE IF EXISTS `item_damage_two_hand`; +CREATE TABLE `item_damage_two_hand` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_two_hand_caster` +-- +DROP TABLE IF EXISTS `item_damage_two_hand_caster`; +CREATE TABLE `item_damage_two_hand_caster` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_disenchant_loot` +-- +ALTER TABLE `item_disenchant_loot` + MODIFY `MinItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MaxItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinItemLevel`, + MODIFY `RequiredDisenchantSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxItemLevel`, + MODIFY `ItemClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredDisenchantSkill`, + MODIFY `ItemSubClass` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemClass`, + MODIFY `ItemQuality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemSubClass`; + +-- +-- Table structure for table `item_effect` +-- +ALTER TABLE `item_effect` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `Cooldown` int(11) NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `CategoryCooldown` int(11) NOT NULL DEFAULT '0' AFTER `Cooldown`, + MODIFY `Charges` smallint(6) NOT NULL DEFAULT '0' AFTER `CategoryCooldown`, + MODIFY `Category` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Charges`, + MODIFY `ChrSpecializationID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Category`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChrSpecializationID`, + MODIFY `Trigger` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`; + +-- +-- Table structure for table `item_extended_cost` +-- +ALTER TABLE `item_extended_cost` + MODIFY `RequiredItem1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `RequiredItem2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem1`, + MODIFY `RequiredItem3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem2`, + MODIFY `RequiredItem4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem3`, + MODIFY `RequiredItem5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem4`, + MODIFY `RequiredCurrencyCount1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem5`, + MODIFY `RequiredCurrencyCount2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount1`, + MODIFY `RequiredCurrencyCount3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount2`, + MODIFY `RequiredCurrencyCount4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount3`, + MODIFY `RequiredCurrencyCount5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount4`, + MODIFY `RequiredMoney` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount5`, + MODIFY `RequiredItemCount1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredMoney`, + MODIFY `RequiredItemCount2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount1`, + MODIFY `RequiredItemCount3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount2`, + MODIFY `RequiredItemCount4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount3`, + MODIFY `RequiredItemCount5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount4`, + MODIFY `RequiredPersonalArenaRating` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount5`, + MODIFY `RequiredCurrency1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredPersonalArenaRating`, + MODIFY `RequiredCurrency2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency1`, + MODIFY `RequiredCurrency3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency2`, + MODIFY `RequiredCurrency4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency3`, + MODIFY `RequiredCurrency5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency4`, + MODIFY `RequiredArenaSlot` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency5`, + MODIFY `RequiredFactionId` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredArenaSlot`, + MODIFY `RequiredFactionStanding` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredFactionId`, + MODIFY `RequirementFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredFactionStanding`, + MODIFY `RequiredAchievement` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequirementFlags`, + DROP `ItemPurchaseGroup`; + +-- +-- Table structure for table `item_limit_category` +-- +ALTER TABLE `item_limit_category` + MODIFY `Quantity` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quantity`; + +-- +-- Table structure for table `item_modified_appearance` +-- +ALTER TABLE `item_modified_appearance` + MODIFY `AppearanceID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `AppearanceModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceID`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID`, + DROP `IconFileDataID`; + +-- +-- Table structure for table `item_price_base` +-- +ALTER TABLE `item_price_base` + MODIFY `ArmorFactor` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `WeaponFactor` float NOT NULL DEFAULT '0' AFTER `ArmorFactor`, + MODIFY `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WeaponFactor`; + +-- +-- Table structure for table `item_random_properties` +-- +ALTER TABLE `item_random_properties` + MODIFY `Name` text AFTER `ID`, + MODIFY `Enchantment1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Enchantment2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment1`, + MODIFY `Enchantment3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment2`, + MODIFY `Enchantment4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment3`, + MODIFY `Enchantment5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment4`, + DROP `InternalName`; + +-- +-- Table structure for table `item_random_properties_locale` +-- +ALTER TABLE `item_random_properties_locale` DROP `InternalName_lang`; + +-- +-- Table structure for table `item_random_suffix` +-- +ALTER TABLE `item_random_suffix` + MODIFY `Enchantment1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `InternalName`, + MODIFY `Enchantment2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment1`, + MODIFY `Enchantment3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment2`, + MODIFY `Enchantment4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment3`, + MODIFY `Enchantment5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment4`, + MODIFY `AllocationPct1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment5`, + MODIFY `AllocationPct2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct1`, + MODIFY `AllocationPct3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct2`, + MODIFY `AllocationPct4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct3`, + MODIFY `AllocationPct5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct4`; + +-- +-- Table structure for table `item_set_spell` +-- +DROP TABLE IF EXISTS `item_set_spell`; +CREATE TABLE `item_set_spell` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ItemSetID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ChrSpecID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Threshold` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_sparse` +-- +ALTER TABLE `item_sparse` + MODIFY `Flags1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Flags2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags1`, + MODIFY `Flags3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags2`, + MODIFY `Unk1` float NOT NULL DEFAULT '0' AFTER `Flags3`, + MODIFY `Unk2` float NOT NULL DEFAULT '0' AFTER `Unk1`, + MODIFY `BuyPrice` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unk2`, + MODIFY `SellPrice` int(10) unsigned NOT NULL DEFAULT '0' AFTER `BuyPrice`, + MODIFY `AllowableClass` int(11) NOT NULL DEFAULT '0' AFTER `SellPrice`, + MODIFY `AllowableRace` int(11) NOT NULL DEFAULT '0' AFTER `AllowableClass`, + MODIFY `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllowableRace`, + MODIFY `MaxCount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSpell`, + MODIFY `Stackable` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxCount`, + MODIFY `ItemStatAllocation1` int(11) NOT NULL DEFAULT '0' AFTER `Stackable`, + MODIFY `ItemStatAllocation2` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation1`, + MODIFY `ItemStatAllocation3` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation2`, + MODIFY `ItemStatAllocation4` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation3`, + MODIFY `ItemStatAllocation5` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation4`, + MODIFY `ItemStatAllocation6` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation5`, + MODIFY `ItemStatAllocation7` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation6`, + MODIFY `ItemStatAllocation8` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation7`, + MODIFY `ItemStatAllocation9` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation8`, + MODIFY `ItemStatAllocation10` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation9`, + MODIFY `ItemStatSocketCostMultiplier1` float NOT NULL DEFAULT '0' AFTER `ItemStatAllocation10`, + MODIFY `ItemStatSocketCostMultiplier2` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier1`, + MODIFY `ItemStatSocketCostMultiplier3` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier2`, + MODIFY `ItemStatSocketCostMultiplier4` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier3`, + MODIFY `ItemStatSocketCostMultiplier5` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier4`, + MODIFY `ItemStatSocketCostMultiplier6` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier5`, + MODIFY `ItemStatSocketCostMultiplier7` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier6`, + MODIFY `ItemStatSocketCostMultiplier8` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier7`, + MODIFY `ItemStatSocketCostMultiplier9` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier8`, + MODIFY `ItemStatSocketCostMultiplier10` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier9`, + MODIFY `RangedModRange` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier10`, + MODIFY `Name` text AFTER `RangedModRange`, + MODIFY `Name2` text AFTER `Name`, + MODIFY `Name3` text AFTER `Name2`, + MODIFY `Name4` text AFTER `Name3`, + MODIFY `Description` text AFTER `Name4`, + MODIFY `BagFamily` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `ArmorDamageModifier` float NOT NULL DEFAULT '0' AFTER `BagFamily`, + MODIFY `Duration` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ArmorDamageModifier`, + MODIFY `StatScalingFactor` float NOT NULL DEFAULT '0' AFTER `Duration`, + MODIFY `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StatScalingFactor`, + MODIFY `RequiredSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevel`, + MODIFY `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkill`, + MODIFY `RequiredReputationFaction` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkillRank`, + MODIFY `ItemStatValue1` smallint(6) NOT NULL DEFAULT '0' AFTER `RequiredReputationFaction`, + MODIFY `ItemStatValue2` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue1`, + MODIFY `ItemStatValue3` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue2`, + MODIFY `ItemStatValue4` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue3`, + MODIFY `ItemStatValue5` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue4`, + MODIFY `ItemStatValue6` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue5`, + MODIFY `ItemStatValue7` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue6`, + MODIFY `ItemStatValue8` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue7`, + MODIFY `ItemStatValue9` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue8`, + MODIFY `ItemStatValue10` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue9`, + MODIFY `ScalingStatDistribution` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemStatValue10`, + MODIFY `Delay` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ScalingStatDistribution`, + MODIFY `PageText` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Delay`, + MODIFY `StartQuest` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PageText`, + MODIFY `LockID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartQuest`, + MODIFY `RandomProperty` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LockID`, + MODIFY `RandomSuffix` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RandomProperty`, + MODIFY `ItemSet` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RandomSuffix`, + MODIFY `Area` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemSet`, + MODIFY `Map` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Area`, + MODIFY `SocketBonus` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Map`, + MODIFY `GemProperties` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SocketBonus`, + MODIFY `ItemLimitCategory` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `GemProperties`, + MODIFY `HolidayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLimitCategory`, + MODIFY `ItemNameDescriptionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HolidayID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemNameDescriptionID`, + MODIFY `BuyCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quality`, + MODIFY `InventoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BuyCount`, + MODIFY `RequiredLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `InventoryType`, + MODIFY `RequiredHonorRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredLevel`, + MODIFY `RequiredCityRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredHonorRank`, + MODIFY `RequiredReputationRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCityRank`, + MODIFY `ContainerSlots` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredReputationRank`, + MODIFY `ItemStatType1` tinyint(4) NOT NULL DEFAULT '0' AFTER `ContainerSlots`, + MODIFY `ItemStatType2` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType1`, + MODIFY `ItemStatType3` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType2`, + MODIFY `ItemStatType4` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType3`, + MODIFY `ItemStatType5` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType4`, + MODIFY `ItemStatType6` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType5`, + MODIFY `ItemStatType7` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType6`, + MODIFY `ItemStatType8` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType7`, + MODIFY `ItemStatType9` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType8`, + MODIFY `ItemStatType10` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType9`, + MODIFY `DamageType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemStatType10`, + MODIFY `Bonding` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DamageType`, + MODIFY `LanguageID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Bonding`, + MODIFY `PageMaterial` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LanguageID`, + MODIFY `Material` tinyint(4) NOT NULL DEFAULT '0' AFTER `PageMaterial`, + MODIFY `Sheath` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Material`, + MODIFY `TotemCategory` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sheath`, + MODIFY `SocketColor1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TotemCategory`, + MODIFY `SocketColor2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor1`, + MODIFY `SocketColor3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor2`, + MODIFY `CurrencySubstitutionID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor3`, + MODIFY `CurrencySubstitutionCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencySubstitutionID`, + ADD `ArtifactID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencySubstitutionCount`; + +-- +-- Table structure for table `item_spec` +-- +ALTER TABLE `item_spec` + MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpecID`, + MODIFY `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `ItemType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `PrimaryStat` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemType`, + MODIFY `SecondaryStat` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PrimaryStat`; + +-- +-- Table structure for table `item_spec_override` +-- +ALTER TABLE `item_spec_override` MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`; + +-- +-- Table structure for table `item_to_battle_pet_species` +-- +ALTER TABLE `item_to_battle_pet_species` + MODIFY `BattlePetSpeciesID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + ADD `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `BattlePetSpeciesID`; + +ALTER TABLE `item_to_battle_pet_species` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `item_x_bonus_tree` +-- +ALTER TABLE `item_x_bonus_tree` MODIFY `BonusTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`; + +-- +-- Table structure for table `key_chain` +-- +ALTER TABLE `key_chain` DROP PRIMARY KEY; +ALTER TABLE `key_chain` CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `key_chain` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `modifier_tree` +-- +ALTER TABLE `modifier_tree` + MODIFY `Asset1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Asset2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Asset1`, + MODIFY `Parent` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Asset2`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Parent`, + ADD `Unk700` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Operator` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unk700`, + MODIFY `Amount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator`; + +-- +-- Table structure for table `mount` +-- +ALTER TABLE `mount` DROP PRIMARY KEY; +ALTER TABLE `mount` + CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST , + MODIFY `SpellId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `DisplayId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellId`, + MODIFY `Name` text AFTER `DisplayId`, + MODIFY `Description` text AFTER `Name`, + MODIFY `SourceDescription` text AFTER `Description`, + MODIFY `MountTypeId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SourceDescription`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MountTypeId`, + MODIFY `PlayerConditionId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionId`; +ALTER TABLE `mount` ADD PRIMARY KEY (`ID`); + +-- +-- Dumping data for table `mount` +-- +ALTER TABLE `mount_locale` DROP PRIMARY KEY; +ALTER TABLE `mount_locale` CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `mount_locale` ADD PRIMARY KEY (`ID`, `locale`); + +-- +-- Table structure for table `mount_capability` +-- +ALTER TABLE `mount_capability` + MODIFY `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SpeedModSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSpell`, + MODIFY `RequiredRidingSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpeedModSpell`, + MODIFY `RequiredArea` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredRidingSkill`, + MODIFY `RequiredMap` smallint(6) NOT NULL DEFAULT '0' AFTER `RequiredArea`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredMap`, + MODIFY `RequiredAura` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `mount_type_x_capability` +-- +ALTER TABLE `mount_type_x_capability` + MODIFY `MountTypeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MountCapabilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MountTypeID`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MountCapabilityID`; + +-- +-- Table structure for table `movie` +-- +DROP TABLE IF EXISTS `movie`; +CREATE TABLE `movie` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `AudioFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `SubtitleFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `Volume` tinyint(3) unsigned NOT NULL DEFAULT '0', + `KeyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `names_profanity` +-- +ALTER TABLE `names_profanity` MODIFY `Language` tinyint(4) NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `names_reserved_locale` +-- +ALTER TABLE `names_reserved_locale` MODIFY `LocaleMask` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `name_gen` +-- +ALTER TABLE `name_gen` + MODIFY `Race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Sex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Race`; + +-- +-- Table structure for table `override_spell_data` +-- +ALTER TABLE `override_spell_data` + MODIFY `PlayerActionbarFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID10`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerActionbarFileDataID`; + +-- +-- Table structure for table `phase_x_phase_group` +-- +ALTER TABLE `phase_group` + RENAME `phase_x_phase_group`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`; + +-- +-- Table structure for table `player_condition` +-- +ALTER TABLE `player_condition` + MODIFY `RaceMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SkillLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RaceMask`, + MODIFY `ReputationLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SkillLogic`, + MODIFY `PrevQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ReputationLogic`, + MODIFY `CurrQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestLogic`, + MODIFY `CurrentCompletedQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestLogic`, + MODIFY `SpellLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestLogic`, + MODIFY `SpellID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellLogic`, + MODIFY `SpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID1`, + MODIFY `SpellID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID2`, + MODIFY `SpellID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID3`, + MODIFY `ItemLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID4`, + MODIFY `ItemID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemLogic`, + MODIFY `ItemID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID1`, + MODIFY `ItemID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID2`, + MODIFY `ItemID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID3`, + MODIFY `Time1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID4`, + MODIFY `Time2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time1`, + MODIFY `AuraSpellLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time2`, + MODIFY `AuraSpellID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellLogic`, + MODIFY `AuraSpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID1`, + MODIFY `AuraSpellID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID2`, + MODIFY `AuraSpellID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID3`, + MODIFY `AchievementLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID4`, + MODIFY `AreaLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AchievementLogic`, + MODIFY `QuestKillLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaLogic`, + MODIFY `QuestKillMonster1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillLogic`, + MODIFY `QuestKillMonster2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster1`, + MODIFY `QuestKillMonster3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster2`, + MODIFY `QuestKillMonster4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster3`, + ADD `QuestKillMonster5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster4`, + ADD `QuestKillMonster6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster5`, + MODIFY `FailureDescription` text AFTER `QuestKillMonster6`, + ADD `Unknown700_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FailureDescription`, + ADD `Unknown700_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown700_1`, + MODIFY `MinLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unknown700_2`, + MODIFY `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `ClassMask` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `SkillID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ClassMask`, + MODIFY `SkillID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID1`, + MODIFY `SkillID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID2`, + MODIFY `SkillID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID3`, + MODIFY `MinSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `SkillID4`, + MODIFY `MinSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill1`, + MODIFY `MinSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill2`, + MODIFY `MinSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill3`, + MODIFY `MaxSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill4`, + MODIFY `MaxSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill1`, + MODIFY `MaxSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill2`, + MODIFY `MaxSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill3`, + MODIFY `MinFactionID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxSkill4`, + MODIFY `MinFactionID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID1`, + MODIFY `MinFactionID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID2`, + MODIFY `MaxFactionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID3`, + MODIFY `PrevQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxFactionID`, + MODIFY `PrevQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID1`, + MODIFY `PrevQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID2`, + MODIFY `PrevQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID3`, + MODIFY `CurrQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID4`, + MODIFY `CurrQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID1`, + MODIFY `CurrQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID2`, + MODIFY `CurrQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID3`, + MODIFY `CurrentCompletedQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID4`, + MODIFY `CurrentCompletedQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID1`, + MODIFY `CurrentCompletedQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID2`, + MODIFY `CurrentCompletedQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID3`, + MODIFY `Explored1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID4`, + MODIFY `Explored2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored1`, + MODIFY `WorldStateExpressionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored2`, + MODIFY `Achievement1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WorldStateExpressionID`, + MODIFY `Achievement2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement1`, + MODIFY `Achievement3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement2`, + MODIFY `Achievement4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement3`, + MODIFY `AreaID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement4`, + MODIFY `AreaID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `QuestKillID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillID`, + MODIFY `MinAvgItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `MaxAvgItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgItemLevel`, + MODIFY `MinAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgItemLevel`, + MODIFY `MaxAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgEquippedItemLevel`, + ADD `ModifierTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgEquippedItemLevel`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ModifierTreeID`, + MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `NativeGender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Gender`, + MODIFY `LanguageID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NativeGender`, + MODIFY `MinLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LanguageID`, + MODIFY `MaxLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLanguage`, + MODIFY `MinReputation1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLanguage`, + MODIFY `MinReputation2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation1`, + MODIFY `MinReputation3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation2`, + MODIFY `MaxReputation` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation3`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxReputation`, + MODIFY `MinPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `MaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinPVPRank`, + MODIFY `PvpMedal` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxPVPRank`, + MODIFY `ItemCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PvpMedal`, + MODIFY `ItemCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount1`, + MODIFY `ItemCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount2`, + MODIFY `ItemCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount3`, + MODIFY `ItemFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount4`, + ADD `AuraCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemFlags`, + ADD `AuraCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount1`, + ADD `AuraCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount2`, + ADD `AuraCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount3`, + MODIFY `WeatherID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount4`, + MODIFY `PartyStatus` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `WeatherID`, + MODIFY `LifetimeMaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PartyStatus`, + MODIFY `LfgLogic` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LifetimeMaxPVPRank`, + MODIFY `LfgStatus1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgLogic`, + MODIFY `LfgStatus2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus1`, + MODIFY `LfgStatus3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus2`, + MODIFY `LfgStatus4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus3`, + MODIFY `LfgCompare1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus4`, + MODIFY `LfgCompare2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare1`, + MODIFY `LfgCompare3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare2`, + MODIFY `LfgCompare4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare3`, + MODIFY `LfgValue1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare4`, + MODIFY `LfgValue2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue1`, + MODIFY `LfgValue3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue2`, + MODIFY `LfgValue4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue3`, + MODIFY `CurrencyLogic` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue4`, + MODIFY `CurrencyID1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyLogic`, + MODIFY `CurrencyID2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID1`, + MODIFY `CurrencyID3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID2`, + MODIFY `CurrencyID4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID3`, + MODIFY `CurrencyCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID4`, + MODIFY `CurrencyCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount1`, + MODIFY `CurrencyCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount2`, + MODIFY `CurrencyCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount3`, + MODIFY `MinExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `CurrencyCount4`, + MODIFY `MaxExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionLevel`, + MODIFY `MinExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MaxExpansionLevel`, + MODIFY `MaxExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionTier`, + MODIFY `MinGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxExpansionTier`, + MODIFY `MaxGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinGuildLevel`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxGuildLevel`, + MODIFY `PhaseGroupID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `ChrSpecializationIndex` tinyint(4) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `ChrSpecializationRole` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationIndex`, + MODIFY `PowerType` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationRole`, + MODIFY `PowerTypeComp` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerType`, + MODIFY `PowerTypeValue` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerTypeComp`; + +-- +-- Table structure for table `power_display` +-- +DROP TABLE IF EXISTS `power_display`; +CREATE TABLE `power_display` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `GlobalStringBaseTag` text, + `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `quest_faction_reward` +-- +DROP TABLE IF EXISTS `quest_faction_reward`; +CREATE TABLE `quest_faction_reward` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `QuestRewFactionValue1` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue2` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue3` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue4` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue5` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue6` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue7` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue8` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue9` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue10` smallint(6) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `quest_money_reward` +-- +ALTER TABLE `quest_money_reward` DROP PRIMARY KEY; +ALTER TABLE `quest_money_reward` CHANGE `Level` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `quest_money_reward` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `quest_package_item` +-- +ALTER TABLE `quest_package_item` + MODIFY `ItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `QuestPackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `ItemCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `QuestPackageID`, + MODIFY `FilterType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount`; + +-- +-- Table structure for table `quest_v2` +-- +ALTER TABLE `quest_v2` MODIFY `UniqueBitFlag` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +-- +-- Table structure for table `quest_x_p` +-- +ALTER TABLE `quest_xp` + MODIFY `Exp1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Exp2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp1`, + MODIFY `Exp3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp2`, + MODIFY `Exp4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp3`, + MODIFY `Exp5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp4`, + MODIFY `Exp6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp5`, + MODIFY `Exp7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp6`, + MODIFY `Exp8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp7`, + MODIFY `Exp9` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp8`, + MODIFY `Exp10` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp9`; + +-- +-- Table structure for table `rand_prop_points` +-- +DROP TABLE IF EXISTS `rand_prop_points`; +CREATE TABLE `rand_prop_points` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `scaling_stat_distribution` +-- +ALTER TABLE `scaling_stat_distribution` + MODIFY `ItemLevelCurveID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelCurveID`, + MODIFY `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`; + +-- +-- Table structure for table `skill_line` +-- +DROP TABLE IF EXISTS `skill_line`; +CREATE TABLE `skill_line` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DisplayName` text, + `Description` text, + `AlternateVerb` text, + `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `CategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CanLink` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ParentSkillLineID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_line_locale` +-- + +DROP TABLE IF EXISTS `skill_line_locale`; +CREATE TABLE `skill_line_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `DisplayName_lang` text, + `Description_lang` text, + `AlternateVerb_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_line_ability` +-- +DROP TABLE IF EXISTS `skill_line_ability`; +CREATE TABLE `skill_line_ability` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `RaceMask` int(10) unsigned NOT NULL DEFAULT '0', + `ClassMask` int(10) unsigned NOT NULL DEFAULT '0', + `SupercedesSpell` int(10) unsigned NOT NULL DEFAULT '0', + `SkillLine` smallint(5) unsigned NOT NULL DEFAULT '0', + `MinSkillLineRank` smallint(5) unsigned NOT NULL DEFAULT '0', + `TrivialSkillLineRankHigh` smallint(5) unsigned NOT NULL DEFAULT '0', + `TrivialSkillLineRankLow` smallint(5) unsigned NOT NULL DEFAULT '0', + `UniqueBit` smallint(5) unsigned NOT NULL DEFAULT '0', + `TradeSkillCategoryID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AquireMethod` tinyint(3) unsigned NOT NULL DEFAULT '0', + `NumSkillUps` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_race_class_info` +-- +DROP TABLE IF EXISTS `skill_race_class_info`; +CREATE TABLE `skill_race_class_info` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `RaceMask` int(11) NOT NULL DEFAULT '0', + `SkillID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ClassMask` smallint(6) NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `SkillTierID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Availability` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `sound_kit` +-- +DROP TABLE IF EXISTS `sound_kit`; +CREATE TABLE `sound_kit` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SoundType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VolumeFloat` float NOT NULL DEFAULT '0', + `MinDistance` float NOT NULL DEFAULT '0', + `DistanceCutoff` float NOT NULL DEFAULT '0', + `VolumeVariationPlus` float NOT NULL DEFAULT '0', + `VolumeVariationMinus` float NOT NULL DEFAULT '0', + `PitchVariationPlus` float NOT NULL DEFAULT '0', + `PitchVariationMinus` float NOT NULL DEFAULT '0', + `PitchAdjust` float NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundEntriesAdvancedID` smallint(5) unsigned NOT NULL DEFAULT '0', + `EAXDef` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DialogType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BusOverwriteID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Unk700` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `sound_kit_locale` +-- +DROP TABLE IF EXISTS `sound_kit_locale`; +CREATE TABLE `sound_kit_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `specialization_spells` +-- +ALTER TABLE `specialization_spells` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `OverridesSpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `Description` text AFTER `OverridesSpellID`, + MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpecID`; + +-- +-- Table structure for table `spell` +-- +DROP TABLE IF EXISTS `spell`; +CREATE TABLE `spell` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `NameSubtext` text, + `Description` text, + `AuraDescription` text, + `MiscID` int(10) unsigned NOT NULL DEFAULT '0', + `DescriptionVariablesID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_locale` +-- +DROP TABLE IF EXISTS `spell_locale`; +CREATE TABLE `spell_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `NameSubtext_lang` text, + `Description_lang` text, + `AuraDescription_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_aura_options` +-- +DROP TABLE IF EXISTS `spell_aura_options`; +CREATE TABLE `spell_aura_options` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ProcCharges` int(10) unsigned NOT NULL DEFAULT '0', + `ProcTypeMask` int(10) unsigned NOT NULL DEFAULT '0', + `ProcCategoryRecovery` int(10) unsigned NOT NULL DEFAULT '0', + `CumulativeAura` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ProcChance` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SpellProcsPerMinuteID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_aura_restrictions` +-- +DROP TABLE IF EXISTS `spell_aura_restrictions`; +CREATE TABLE `spell_aura_restrictions` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `CasterAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `TargetAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `ExcludeCasterAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `ExcludeTargetAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CasterAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TargetAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExcludeCasterAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExcludeTargetAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_casting_requirements` +-- +DROP TABLE IF EXISTS `spell_casting_requirements`; +CREATE TABLE `spell_casting_requirements` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `MinFactionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredAreasID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiresSpellFocus` smallint(5) unsigned NOT NULL DEFAULT '0', + `FacingCasterFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinReputation` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredAuraVision` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_cast_times` +-- +ALTER TABLE `spell_cast_times` + MODIFY `MinCastTime` int(11) NOT NULL DEFAULT '0' AFTER `CastTime`, + MODIFY `CastTimePerLevel` smallint(6) NOT NULL DEFAULT '0' AFTER `MinCastTime`; + +-- +-- Table structure for table `spell_categories` +-- +DROP TABLE IF EXISTS `spell_categories`; +CREATE TABLE `spell_categories` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Category` smallint(5) unsigned NOT NULL DEFAULT '0', + `StartRecoveryCategory` smallint(5) unsigned NOT NULL DEFAULT '0', + `ChargeCategory` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DefenseType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DispelType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Mechanic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PreventionType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_category` +-- +DROP TABLE IF EXISTS `spell_category`; +CREATE TABLE `spell_category` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `ChargeRecoveryTime` int(11) NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UsesPerWeek` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxCharges` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_category_locale` +-- +DROP TABLE IF EXISTS `spell_category_locale`; +CREATE TABLE `spell_category_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_class_options` +-- +DROP TABLE IF EXISTS `spell_class_options`; +CREATE TABLE `spell_class_options` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask1` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask2` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask3` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask4` int(10) unsigned NOT NULL DEFAULT '0', + `ModalNextSpell` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_cooldowns` +-- +DROP TABLE IF EXISTS `spell_cooldowns`; +CREATE TABLE `spell_cooldowns` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `CategoryRecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `RecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `StartRecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_duration` +-- +ALTER TABLE `spell_duration` + CHANGE `Duration1` `Duration` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + CHANGE `Duration3` `MaxDuration` int(11) NOT NULL DEFAULT '0' AFTER `Duration`, + CHANGE `Duration2` `DurationPerLevel` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxDuration`; + +-- +-- Table structure for table `spell_effect` +-- +DROP TABLE IF EXISTS `spell_effect`; +CREATE TABLE `spell_effect` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectAmplitude` float NOT NULL DEFAULT '0', + `EffectAuraPeriod` int(10) unsigned NOT NULL DEFAULT '0', + `EffectBasePoints` int(10) unsigned NOT NULL DEFAULT '0', + `EffectBonusCoefficient` float NOT NULL DEFAULT '0', + `EffectChainAmplitude` float NOT NULL DEFAULT '0', + `EffectDieSides` int(10) unsigned NOT NULL DEFAULT '0', + `EffectItemType` int(10) unsigned NOT NULL DEFAULT '0', + `EffectMiscValue` int(11) NOT NULL DEFAULT '0', + `EffectMiscValueB` int(11) NOT NULL DEFAULT '0', + `EffectPointsPerResource` float NOT NULL DEFAULT '0', + `EffectRealPointsPerLevel` float NOT NULL DEFAULT '0', + `EffectSpellClassMask1` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask2` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask3` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask4` int(10) unsigned NOT NULL DEFAULT '0', + `EffectTriggerSpell` int(10) unsigned NOT NULL DEFAULT '0', + `EffectPosFacing` float NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectAttributes` int(10) unsigned NOT NULL DEFAULT '0', + `BonusCoefficientFromAP` float NOT NULL DEFAULT '0', + `EffectAura` smallint(5) unsigned NOT NULL DEFAULT '0', + `EffectChainTargets` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Effect` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectMechanic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectRadiusIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectRadiusMaxIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ImplicitTarget1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ImplicitTarget2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_effect_scaling` +-- +DROP TABLE IF EXISTS `spell_effect_scaling`; +CREATE TABLE `spell_effect_scaling` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Coefficient` float NOT NULL DEFAULT '0', + `Variance` float NOT NULL DEFAULT '0', + `ResourceCoefficient` float NOT NULL DEFAULT '0', + `SpellEffectID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_equipped_items` +-- +DROP TABLE IF EXISTS `spell_equipped_items`; +CREATE TABLE `spell_equipped_items` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `EquippedItemInventoryTypeMask` int(11) NOT NULL DEFAULT '0', + `EquippedItemSubClassMask` int(11) NOT NULL DEFAULT '0', + `EquippedItemClass` tinyint(4) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_focus_object` +-- +DROP TABLE IF EXISTS `spell_focus_object`; +CREATE TABLE `spell_focus_object` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_focus_object_locale` +-- +DROP TABLE IF EXISTS `spell_focus_object_locale`; +CREATE TABLE `spell_focus_object_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_interrupts` +-- +DROP TABLE IF EXISTS `spell_interrupts`; +CREATE TABLE `spell_interrupts` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `AuraInterruptFlags1` int(10) unsigned NOT NULL DEFAULT '0', + `AuraInterruptFlags2` int(10) unsigned NOT NULL DEFAULT '0', + `ChannelInterruptFlags1` int(10) unsigned NOT NULL DEFAULT '0', + `ChannelInterruptFlags2` int(10) unsigned NOT NULL DEFAULT '0', + `InterruptFlags` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_item_enchantment_condition` +-- +ALTER TABLE `spell_item_enchantment_condition` + MODIFY `LTOperand1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperandType5`, + MODIFY `LTOperand2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand1`, + MODIFY `LTOperand3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand2`, + MODIFY `LTOperand4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand3`, + MODIFY `LTOperand5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand4`, + MODIFY `RTOperand1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType5`, + MODIFY `RTOperand2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand1`, + MODIFY `RTOperand3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand2`, + MODIFY `RTOperand4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand3`, + MODIFY `RTOperand5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand4`; + +-- +-- Table structure for table `spell_levels` +-- +DROP TABLE IF EXISTS `spell_levels`; +CREATE TABLE `spell_levels` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `BaseLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_misc` +-- +ALTER TABLE `spell_misc` + MODIFY `Speed` float NOT NULL DEFAULT '0' AFTER `AttributesExM`, + MODIFY `MultistrikeSpeedMod` float NOT NULL DEFAULT '0' AFTER `Speed`, + MODIFY `CastingTimeIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MultistrikeSpeedMod`, + MODIFY `DurationIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CastingTimeIndex`, + MODIFY `RangeIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DurationIndex`, + MODIFY `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RangeIndex`, + MODIFY `ActiveIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellIconID`, + MODIFY `SchoolMask` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ActiveIconID`; + +-- +-- Table structure for table `spell_power` +-- +ALTER TABLE `spell_power` + MODIFY `ManaCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `ManaCostPercentage` float NOT NULL DEFAULT '0' AFTER `ManaCost`, + MODIFY `ManaCostPercentagePerSecond` float NOT NULL DEFAULT '0' AFTER `ManaCostPercentage`, + MODIFY `RequiredAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPercentagePerSecond`, + MODIFY `HealthCostPercentage` float NOT NULL DEFAULT '0' AFTER `RequiredAura`, + MODIFY `ManaCostPerSecond` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HealthCostPercentage`, + MODIFY `ManaCostAdditional` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPerSecond`, + MODIFY `PowerDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostAdditional`, + MODIFY `UnitPowerBarID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PowerDisplayID`, + MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UnitPowerBarID`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerIndex`, + MODIFY `ManaCostPerLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerType`; + +-- +-- Table structure for table `spell_power_difficulty` +-- +ALTER TABLE `spell_power_difficulty` DROP PRIMARY KEY; +ALTER TABLE `spell_power_difficulty` ADD `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellPowerID`, + MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; +ALTER TABLE `spell_power_difficulty` ADD PRIMARY KEY (`ID`); + +ALTER TABLE `spell_range` + MODIFY `DisplayName` text AFTER `MaxRangeFriend`, + MODIFY `DisplayNameShort` text AFTER `DisplayName`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DisplayNameShort`; + +-- +-- Table structure for table `spell_reagents` +-- +DROP TABLE IF EXISTS `spell_reagents`; +CREATE TABLE `spell_reagents` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Reagent1` int(11) NOT NULL DEFAULT '0', + `Reagent2` int(11) NOT NULL DEFAULT '0', + `Reagent3` int(11) NOT NULL DEFAULT '0', + `Reagent4` int(11) NOT NULL DEFAULT '0', + `Reagent5` int(11) NOT NULL DEFAULT '0', + `Reagent6` int(11) NOT NULL DEFAULT '0', + `Reagent7` int(11) NOT NULL DEFAULT '0', + `Reagent8` int(11) NOT NULL DEFAULT '0', + `ReagentCount1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount5` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount6` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount7` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_scaling` +-- +DROP TABLE IF EXISTS `spell_scaling`; +CREATE TABLE `spell_scaling` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ScalesFromItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `ScalingClass` tinyint(4) NOT NULL DEFAULT '0', + `MaxScalingLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift` +-- +DROP TABLE IF EXISTS `spell_shapeshift`; +CREATE TABLE `spell_shapeshift` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftExclude1` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftExclude2` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftMask1` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftMask2` int(10) unsigned NOT NULL DEFAULT '0', + `StanceBarOrder` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift_form` +-- +DROP TABLE IF EXISTS `spell_shapeshift_form`; +CREATE TABLE `spell_shapeshift_form` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `WeaponDamageVariance` float NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `AttackIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CombatRoundTime` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID5` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID6` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID7` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID8` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureType` tinyint(4) NOT NULL DEFAULT '0', + `MountTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BonusActionBar` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift_form_locale` +-- +DROP TABLE IF EXISTS `spell_shapeshift_form_locale`; +CREATE TABLE `spell_shapeshift_form_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_target_restrictions` +-- +DROP TABLE IF EXISTS `spell_target_restrictions`; +CREATE TABLE `spell_target_restrictions` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ConeAngle` float NOT NULL DEFAULT '0', + `Width` float NOT NULL DEFAULT '0', + `Targets` int(10) unsigned NOT NULL DEFAULT '0', + `MaxTargetLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `TargetCreatureType` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxAffectedTargets` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_totems` +-- +DROP TABLE IF EXISTS `spell_totems`; +CREATE TABLE `spell_totems` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Totem1` int(10) unsigned NOT NULL DEFAULT '0', + `Totem2` int(10) unsigned NOT NULL DEFAULT '0', + `RequiredTotemCategoryID1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredTotemCategoryID2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_x_spell_visual` +-- +ALTER TABLE `spell_x_spell_visual` + MODIFY `Unk620` float NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `SpellVisualID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unk620`, + MODIFY `SpellVisualID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID1`, + MODIFY `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID2`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; + +-- +-- Table structure for table `taxi_nodes` +-- +ALTER TABLE `taxi_nodes` + MODIFY `PosX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PosY` float NOT NULL DEFAULT '0' AFTER `PosX`, + MODIFY `PosZ` float NOT NULL DEFAULT '0' AFTER `PosY`, + MODIFY `Name` text AFTER `PosZ`, + MODIFY `MountCreatureID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `MountCreatureID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MountCreatureID1`, + MODIFY `MapOffsetX` float NOT NULL DEFAULT '0' AFTER `MountCreatureID2`, + MODIFY `MapOffsetY` float NOT NULL DEFAULT '0' AFTER `MapOffsetX`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapOffsetY`, + MODIFY `ConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `LearnableIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LearnableIndex`; + +-- +-- Table structure for table `taxi_path` +-- +ALTER TABLE `taxi_path` + MODIFY `From` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `To` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `From`, + MODIFY `Cost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `To`; + +-- +-- Table structure for table `taxi_path_node` +-- +ALTER TABLE `taxi_path_node` + MODIFY `LocX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LocY` float NOT NULL DEFAULT '0' AFTER `LocX`, + MODIFY `LocZ` float NOT NULL DEFAULT '0' AFTER `LocY`, + MODIFY `Delay` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LocZ`, + MODIFY `PathID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Delay`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PathID`, + MODIFY `ArrivalEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `DepartureEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ArrivalEventID`, + MODIFY `NodeIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepartureEventID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NodeIndex`; + +-- +-- Table structure for table `totem_category` +-- +ALTER TABLE `totem_category` + MODIFY `CategoryMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `CategoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CategoryMask`; + +-- +-- Table structure for table `toy` +-- +ALTER TABLE `toy` + MODIFY `Description` text AFTER `ItemID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `CategoryFilter` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `toy_locale` +-- +ALTER TABLE `toy_locale` MODIFY `Description_lang` text AFTER `locale`; + +-- +-- Table structure for table `transport_animation` +-- +ALTER TABLE `transport_animation` MODIFY `SequenceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PosZ`; + +-- +-- Table structure for table `unit_power_bar` +-- +ALTER TABLE `unit_power_bar` + MODIFY `MaxPower` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `RegenerationPeace` float NOT NULL DEFAULT '0' AFTER `MaxPower`, + MODIFY `RegenerationCombat` float NOT NULL DEFAULT '0' AFTER `RegenerationPeace`, + MODIFY `FileDataID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RegenerationCombat`, + MODIFY `FileDataID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID1`, + MODIFY `FileDataID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID2`, + MODIFY `FileDataID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID3`, + MODIFY `FileDataID5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID4`, + MODIFY `FileDataID6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID5`, + MODIFY `Color1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID6`, + MODIFY `Color2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color1`, + MODIFY `Color3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color2`, + MODIFY `Color4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color3`, + MODIFY `Color5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color4`, + MODIFY `Color6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color5`, + MODIFY `Name` text AFTER `Color6`, + MODIFY `Cost` text AFTER `Name`, + MODIFY `OutOfError` text AFTER `Cost`, + MODIFY `ToolTip` text AFTER `OutOfError`, + MODIFY `StartInset` float NOT NULL DEFAULT '0' AFTER `ToolTip`, + MODIFY `EndInset` float NOT NULL DEFAULT '0' AFTER `StartInset`, + MODIFY `StartPower` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EndInset`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartPower`, + MODIFY `MinPower` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `CenterPower` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinPower`, + MODIFY `BarType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CenterPower`; + +-- +-- Table structure for table `world_map_overlay` +-- +ALTER TABLE `world_map_overlay` + MODIFY `TextureName` text AFTER `ID`, + MODIFY `MapAreaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureName`, + MODIFY `AreaID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapAreaID`, + MODIFY `AreaID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `TextureWidth` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `TextureHeight` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureWidth`, + MODIFY `OffsetX` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureHeight`, + MODIFY `OffsetY` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `OffsetX`, + MODIFY `HitRectTop` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `OffsetY`, + MODIFY `HitRectLeft` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectTop`, + MODIFY `HitRectBottom` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectLeft`, + MODIFY `HitRectRight` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectBottom`, + MODIFY `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectRight`; + +-- +-- Table structure for table `world_map_transforms` +-- +DROP TABLE IF EXISTS `world_map_transforms`; +CREATE TABLE `world_map_transforms` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `RegionMinX` float NOT NULL DEFAULT '0', + `RegionMinY` float NOT NULL DEFAULT '0', + `RegionMinZ` float NOT NULL DEFAULT '0', + `RegionMaxX` float NOT NULL DEFAULT '0', + `RegionMaxY` float NOT NULL DEFAULT '0', + `RegionMaxZ` float NOT NULL DEFAULT '0', + `RegionOffsetX` float NOT NULL DEFAULT '0', + `RegionOffsetY` float NOT NULL DEFAULT '0', + `RegionScale` float NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewDungeonMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewAreaID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +DROP TABLE `creature_display_info_locale`; +DROP TABLE `holidays_locale`; +DROP TABLE `sound_entries`; +DROP TABLE `sound_entries_locale`; +DROP TABLE `spell_rune_cost`; +DROP TABLE `world_map_overlay_locale`; diff --git a/src/common/Define.h b/src/common/Define.h index 35a4dad3e1b..c9eb42791e9 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -167,6 +167,7 @@ enum DBCFormer FT_INT = 'i', //uint32 FT_BYTE = 'b', //uint8 FT_LONG = 'l', //uint64 + FT_SHORT = 'h', //uint16 FT_SORT = 'd', //sorted by this field, field is not included FT_IND = 'n', //the same, but parsed to data FT_SQL_PRESENT = 'p', //Used in sql format to mark column present in sql dbc diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6450946aaa4..6399b588b5d 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -22,7 +22,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); -#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs" +#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -108,7 +108,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_SEASONAL_BY_EVENT, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC); @@ -136,8 +136,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE mail_id = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC); @@ -164,6 +164,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH); @@ -195,7 +198,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8 - PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) " diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 18faea4c5b0..e35bedfd587 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -144,6 +144,9 @@ enum CharacterDatabaseStatements CHAR_UPD_ITEM_INSTANCE_ON_LOAD, CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, + CHAR_INS_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, CHAR_SEL_CHARACTER_GIFT_BY_ITEM, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 6749300000b..666b697a4c3 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -31,120 +31,158 @@ void HotfixDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS); // Achievement.db2 - PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Faction, MapID, Supercedes, Title, Description, Category, Points, UIOrder, Flags, IconID, " - "Reward, MinimumCriteria, SharesCriteria, CriteriaTree FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, IconID, " + "SharesCriteria, CriteriaTree, Faction, Points, MinimumCriteria FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); + // AnimKit.db2 + PrepareStatement(HOTFIX_SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC", CONNECTION_SYNCH); + // AreaGroupMember.db2 PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaGroupID, AreaID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH); + // ArmorLocation.db2 + PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Modifier1, Modifier2, Modifier3, Modifier4, Modifier5 FROM armor_location ORDER BY ID DESC", CONNECTION_SYNCH); + // AuctionHouse.db2 - PrepareStatement(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, FactionID, DepositRate, ConsignmentRate, Name FROM auction_house ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, Name, FactionID, DepositRate, ConsignmentRate FROM auction_house ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, Name_lang FROM auction_house_locale WHERE locale = ?", CONNECTION_SYNCH); + // BankBagSlotPrices.db2 + PrepareStatement(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices ORDER BY ID DESC", CONNECTION_SYNCH); + // BarberShopStyle.db2 - PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, Type, DisplayName, Description, CostModifier, Race, Sex, Data FROM barber_shop_style" + PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, CostModifier, Type, Race, Sex, Data FROM barber_shop_style" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetBreedQuality.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, Quality, Modifier FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, Modifier, Quality FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetBreedState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BreedID, State, Value FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, Value, BreedID, State FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetSpecies.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, PetType, Source, Flags, SourceText, " - "Description FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, SourceText, Description, Flags, PetType, " + "Source FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText_lang, Description_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetSpeciesState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, SpeciesID, State, Value FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, SpeciesID, State FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); // BroadcastText.db2 - PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " - "EmoteDelay3, SoundID, UnkEmoteID, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " + "EmoteDelay3, SoundID, UnkEmoteID, Language, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); // CharStartOutfit.db2 - PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, RaceID, ClassID, GenderID, OutfitID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " - "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, " - "ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, PetDisplayID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " + "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " + "ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); + // ChrRaces.db2 + PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ID, Flags, ClientPrefix, ClientFileString, Name, NameFemale, NameMale, FacialHairCustomization1, " + "FacialHairCustomization2, HairCustomization, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, " + "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, " + "ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, " + "UAFemaleCreatureSoundDataID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, " + "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, CharComponentTexLayoutHiResID FROM chr_races" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); + // CinematicSequences.db2 PrepareStatement(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" " FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfo.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, " - "CreatureModelAlpha, TextureVariation1, TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, SizeClass, " - "BloodID, NPCSoundID, ParticleColorID, CreatureGeosetData, ObjectEffectPackageID, AnimReplacementSetID, Flags, Gender, StateSpellVisualKitID" - " FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, TextureVariation1_lang, TextureVariation2_lang, TextureVariation3_lang, " - "PortraitTextureName_lang FROM creature_display_info_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, TextureVariation1, " + "TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, CreatureGeosetData, StateSpellVisualKitID, " + "ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, SizeClass, BloodID, Flags, " + "Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + + // CreatureDisplayInfoExtra.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, NPCItemDisplay1, NPCItemDisplay2, NPCItemDisplay3, NPCItemDisplay4, " + "NPCItemDisplay5, NPCItemDisplay6, NPCItemDisplay7, NPCItemDisplay8, NPCItemDisplay9, NPCItemDisplay10, FileDataID, HDFileDataID, " + "DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, " + "CustomDisplayOption2, CustomDisplayOption3, Flags FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Criteria.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Type, Asset, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, ModifierTreeId, Flags, " - "EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Asset, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, " + "StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); // CriteriaTree.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Amount, Operator, Parent, Flags, Description, OrderIndex FROM criteria_tree" + PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Amount, Description, CriteriaID, Parent, Flags, OrderIndex, Operator FROM criteria_tree" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH); // CurrencyTypes.db2 - PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, CategoryID, Name, InventoryIcon1, InventoryIcon2, SpellWeight, SpellCategory, MaxQty, " - "MaxEarnablePerWeek, Flags, Quality, Description FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, InventoryIcon1_lang, InventoryIcon2_lang, Description_lang" - " FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, InventoryIcon1, InventoryIcon2, MaxQty, MaxEarnablePerWeek, Flags, Description, " + "CategoryID, SpellWeight, SpellCategory, Quality FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); // CurvePoint.db2 - PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, CurveID, `Index`, X, Y FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, X, Y, CurveID, `Index` FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); // DestructibleModelData.db2 - PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, StateDamagedDisplayID, StateDamagedImpactEffectDoodadSet, " - "StateDamagedAmbientDoodadSet, StateDamagedNameSet, StateDestroyedDisplayID, StateDestroyedDestructionDoodadSet, " - "StateDestroyedImpactEffectDoodadSet, StateDestroyedAmbientDoodadSet, StateDestroyedNameSet, StateRebuildingDisplayID, " + PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, StateDamagedDisplayID, StateDestroyedDisplayID, StateRebuildingDisplayID, " + "StateSmokeDisplayID, HealEffectSpeed, StateDamagedImpactEffectDoodadSet, StateDamagedAmbientDoodadSet, StateDamagedNameSet, " + "StateDestroyedDestructionDoodadSet, StateDestroyedImpactEffectDoodadSet, StateDestroyedAmbientDoodadSet, StateDestroyedNameSet, " "StateRebuildingDestructionDoodadSet, StateRebuildingImpactEffectDoodadSet, StateRebuildingAmbientDoodadSet, StateRebuildingNameSet, " - "StateSmokeDisplayID, StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, RepairGroundFx, DoNotHighlight, " - "HealEffect, HealEffectSpeed FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + "StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, DoNotHighlight, HealEffect" + " FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + + // DurabilityCosts.db2 + PrepareStatement(HOTFIX_SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, " + "WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, " + "WeaponSubClassCost11, WeaponSubClassCost12, WeaponSubClassCost13, WeaponSubClassCost14, WeaponSubClassCost15, WeaponSubClassCost16, " + "WeaponSubClassCost17, WeaponSubClassCost18, WeaponSubClassCost19, WeaponSubClassCost20, WeaponSubClassCost21, ArmorSubClassCost1, " + "ArmorSubClassCost2, ArmorSubClassCost3, ArmorSubClassCost4, ArmorSubClassCost5, ArmorSubClassCost6, ArmorSubClassCost7, ArmorSubClassCost8" + " FROM durability_costs ORDER BY ID DESC", CONNECTION_SYNCH); // DurabilityQuality.db2 PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); + // EmotesTextSound.db2 + PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + // Gameobjects.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, MapID, DisplayID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, " - "RotationW, Size, PhaseUseFlags, PhaseID, PhaseGroupID, Type, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name FROM gameobjects" + PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, " + "Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type FROM gameobjects" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?", CONNECTION_SYNCH); + // GameobjectDisplayInfo.db2 + PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, " + "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, Sound1, Sound2, Sound3, Sound4, Sound5, Sound6, Sound7, Sound8, Sound9, Sound10, " + "ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + // GameTables.db2 PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name_lang FROM game_tables_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Flags, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, Flags, GarrAbilityCategoryID, " "FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuilding.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, Unknown, Type, Level, NameAlliance, NameHorde, " - "Description, Tooltip, BuildDuration, CostCurrencyID, CostCurrencyAmount, HordeTexPrefixKitID, AllianceTexPrefixKitID, IconFileDataID, " - "BonusAmount, Flags, AllianceActivationScenePackageID, HordeActivationScenePackageID, MaxShipments, FollowerRequiredGarrAbilityID, " - "FollowerGarrAbilityEffectID, CostMoney FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, NameAlliance, NameHorde, Description, Tooltip, " + "IconFileDataID, BuildDuration, CostCurrencyID, CostCurrencyAmount, AllianceActivationScenePackageID, HordeActivationScenePackageID, " + "CostMoney, Unknown, Type, Level, HordeTexPrefixKitID, AllianceTexPrefixKitID, BonusAmount, Flags, MaxShipments, " + "FollowerRequiredGarrAbilityID, FollowerGarrAbilityEffectID, GarrTypeID FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, NameAlliance_lang, NameHorde_lang, Description_lang, Tooltip_lang" " FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuildingPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, GarrBuildingID, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " - "LandmarkOffsetX, LandmarkOffsetY FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, LandmarkOffsetX, LandmarkOffsetY, UiTextureAtlasMemberID, " + "GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID" @@ -153,10 +191,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollower.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, FollowerTypeID, HordeCreatureID, AllianceCreatureID, HordeUiAnimRaceInfoID, " + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, " + "HordePortraitIconID, AlliancePortraitIconID, ItemLevelWeapon, ItemLevelArmor, FollowerTypeID, HordeUiAnimRaceInfoID, " "AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, " - "ItemLevelWeapon, ItemLevelArmor, Unknown1, Flags, HordeSourceText, AllianceSourceText, Unknown2, Unknown3, HordePortraitIconID, " - "AlliancePortraitIconID, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); + "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID FROM garr_follower" + " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 @@ -164,43 +203,51 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, GarrPlotUICategoryID, PlotType, Flags, Name, MinCount, MaxCount, " - "AllianceConstructionGameObjectID, HordeConstructionGameObjectID FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, GarrPlotUICategoryID, " + "PlotType, Flags, MinCount, MaxCount FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrPlotBuilding.db2 PrepareStatement(HOTFIX_SEL_GARR_PLOT_BUILDING, "SELECT ID, GarrPlotID, GarrBuildingID FROM garr_plot_building ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlotInstance.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, GarrPlotID, Name FROM garr_plot_instance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name, GarrPlotID FROM garr_plot_instance ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name_lang FROM garr_plot_instance_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrSiteLevel.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, Level, MapID, SiteID, UITextureKitID, TownHallX, TownHallY, MovieID, Level2, " - "UpgradeResourceCost, UpgradeMoneyCost FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, UpgradeResourceCost, UpgradeMoneyCost, Level, SiteID, " + "UITextureKitID, MovieID, Level2 FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevelPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, GarrSiteLevelID, GarrPlotInstanceID, LandmarkX, LandmarkY, Unknown" + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, LandmarkX, LandmarkY, GarrSiteLevelID, GarrPlotInstanceID, Unknown" " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GlyphSlot.db2 PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); + // GuildColorBackground.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); + + // GuildColorBorder.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BORDER, "SELECT ID, Red, Green, Blue FROM guild_color_border ORDER BY ID DESC", CONNECTION_SYNCH); + + // GuildColorEmblem.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Green, Blue FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH); + // GuildPerkSpells.db2 - PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, GuildLevel, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID, GuildLevel FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Heirloom.db2 - PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, Flags, SourceText, Source, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, " - "UpgradeItemID2, ItemBonusListID1, ItemBonusListID2 FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, " + "ItemBonusListID1, ItemBonusListID2, Flags, Source FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_HEIRLOOM, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?", CONNECTION_SYNCH); // Holidays.db2 - PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, " - "Duration9, Duration10, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, " - "Date16, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " - "CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, TextureFilename, Priority, CalendarFilterType, Flags" - " FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_HOLIDAYS, "SELECT ID, TextureFilename_lang FROM holidays_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, " + "Date14, Date15, Date16, TextureFilename, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, " + "Duration10, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " + "CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags FROM holidays" + " ORDER BY ID DESC", CONNECTION_SYNCH); // ImportPriceArmor.db2 PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothFactor, LeatherFactor, MailFactor, PlateFactor FROM import_price_armor" @@ -215,83 +262,120 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ImportPriceWeapon.db2 PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Factor FROM import_price_weapon ORDER BY ID DESC", CONNECTION_SYNCH); + // Item.db2 + PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, FileDataID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, GroupSoundsID" + " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, ObjectComponentSlot FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorQuality.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, QualityMod1, QualityMod2, QualityMod3, QualityMod4, QualityMod5, QualityMod6, " + "QualityMod7, ItemLevel FROM item_armor_quality ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorShield.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_SHIELD, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + " FROM item_armor_shield ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorTotal.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_TOTAL, "SELECT ID, Value1, Value2, Value3, Value4, ItemLevel FROM item_armor_total ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemBagFamily.db2 + PrepareStatement(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name FROM item_bag_family ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemBonus.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, BonusListID, Type, Value1, Value2, `Index` FROM item_bonus ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, BonusListID, Type, `Index` FROM item_bonus ORDER BY ID DESC", CONNECTION_SYNCH); // ItemBonusTreeNode.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, BonusTreeModID, SubTreeID, BonusListID FROM item_bonus_tree_node" + PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, SubTreeID, BonusListID, BonusTreeModID FROM item_bonus_tree_node" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemClass.db2 - PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Flags, PriceMod, Name FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, PriceMod, Name, Flags FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Name_lang FROM item_class_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemCurrencyCost.db2 PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemId FROM item_currency_cost ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemDamageAmmo.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_AMMO, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_ammo" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageOneHand.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_one_hand" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageOneHandCaster.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel" + " FROM item_damage_one_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageTwoHand.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_two_hand" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageTwoHandCaster.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel" + " FROM item_damage_two_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemDisenchantLoot.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, ItemClass, ItemSubClass, ItemQuality, MinItemLevel, MaxItemLevel, " - "RequiredDisenchantSkill FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, MinItemLevel, MaxItemLevel, RequiredDisenchantSkill, ItemClass, ItemSubClass, " + "ItemQuality FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); // ItemEffect.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, OrderIndex, SpellID, `Trigger`, Charges, Cooldown, Category, CategoryCooldown, " - "ChrSpecializationID FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); - - // Item.db2 - PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, FileDataID, GroupSoundsID" - " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, SpellID, Cooldown, CategoryCooldown, Charges, Category, ChrSpecializationID, " + "OrderIndex, `Trigger` FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); // ItemExtendedCost.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaSlot, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, " - "RequiredItem5, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, " - "RequiredPersonalArenaRating, ItemPurchaseGroup, RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, " - "RequiredCurrency5, RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, " - "RequiredFactionId, RequiredFactionStanding, RequirementFlags, RequiredAchievement, RequiredMoney FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, RequiredItem5, " + "RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, RequiredMoney, " + "RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredPersonalArenaRating, " + "RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, " + "RequiredFactionStanding, RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); // ItemLimitCategory.db2 PrepareStatement(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceModID, AppearanceID, IconFileDataID, `Index`" - " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index` FROM item_modified_appearance" + " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemPriceBase.db2 - PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, ArmorFactor, WeaponFactor FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ArmorFactor, WeaponFactor, ItemLevel FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); // ItemRandomProperties.db2 - PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " - "Enchantment5, Name FROM item_random_properties ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName_lang, Name_lang FROM item_random_properties_locale" - " WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5" + " FROM item_random_properties ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemRandomSuffix.db2 PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang, InternalName_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSetSpell.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, SpellID, ItemSetID, ChrSpecID, Threshold FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemSparse.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Quality, Flags1, Flags2, Flags3, Unk1, Unk2, BuyCount, BuyPrice, SellPrice, InventoryType, " - "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredSpell, RequiredHonorRank, " - "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, MaxCount, Stackable, ContainerSlots, ItemStatType1, ItemStatType2, " - "ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, ItemStatValue1, " - "ItemStatValue2, ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, " - "ItemStatValue10, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " + PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Flags1, Flags2, Flags3, Unk1, Unk2, BuyPrice, SellPrice, AllowableClass, AllowableRace, " + "RequiredSpell, MaxCount, Stackable, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " "ItemStatAllocation6, ItemStatAllocation7, ItemStatAllocation8, ItemStatAllocation9, ItemStatAllocation10, ItemStatSocketCostMultiplier1, " "ItemStatSocketCostMultiplier2, ItemStatSocketCostMultiplier3, ItemStatSocketCostMultiplier4, ItemStatSocketCostMultiplier5, " "ItemStatSocketCostMultiplier6, ItemStatSocketCostMultiplier7, ItemStatSocketCostMultiplier8, ItemStatSocketCostMultiplier9, " - "ItemStatSocketCostMultiplier10, ScalingStatDistribution, DamageType, Delay, RangedModRange, Bonding, Name, Name2, Name3, Name4, Description, " - "PageText, LanguageID, PageMaterial, StartQuest, LockID, Material, Sheath, RandomProperty, RandomSuffix, ItemSet, Area, Map, BagFamily, " - "TotemCategory, SocketColor1, SocketColor2, SocketColor3, SocketBonus, GemProperties, ArmorDamageModifier, Duration, ItemLimitCategory, " - "HolidayID, StatScalingFactor, CurrencySubstitutionID, CurrencySubstitutionCount, ItemNameDescriptionID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); + "ItemStatSocketCostMultiplier10, RangedModRange, Name, Name2, Name3, Name4, Description, BagFamily, ArmorDamageModifier, Duration, " + "StatScalingFactor, ItemLevel, RequiredSkill, RequiredSkillRank, RequiredReputationFaction, ItemStatValue1, ItemStatValue2, ItemStatValue3, " + "ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, ScalingStatDistribution, " + "Delay, PageText, StartQuest, LockID, RandomProperty, RandomSuffix, ItemSet, Area, Map, SocketBonus, GemProperties, ItemLimitCategory, " + "HolidayID, ItemNameDescriptionID, Quality, BuyCount, InventoryType, RequiredLevel, RequiredHonorRank, RequiredCityRank, " + "RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, " + "ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, Material, Sheath, TotemCategory, " + "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale" " WHERE locale = ?", CONNECTION_SYNCH); // ItemSpec.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecID FROM item_spec" + PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, SpecID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat FROM item_spec" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemSpecOverride.db2 @@ -304,30 +388,33 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH); // KeyChain.db2 - PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT Id, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, " + PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, " "Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain" - " ORDER BY Id DESC", CONNECTION_SYNCH); + " ORDER BY ID DESC", CONNECTION_SYNCH); // MailTemplate.db2 PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); // ModifierTree.db2 - PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Type, Asset1, Asset2, Operator, Amount, Parent FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, SpellId, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, Source, " - "PlayerConditionId FROM mount ORDER BY Id DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT Id, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT ID, SpellId, DisplayId, Name, Description, SourceDescription, MountTypeId, Flags, PlayerConditionId, " + "Source FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); // MountCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, RequiredRidingSkill, RequiredArea, RequiredAura, RequiredSpell, SpeedModSpell, " - "RequiredMap FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, RequiredMap, Flags, " + "RequiredAura FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); // MountTypeXCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, OrderIndex, MountCapabilityID FROM mount_type_x_capability" + PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" " ORDER BY ID DESC", CONNECTION_SYNCH); + // Movie.db2 + PrepareStatement(HOTFIX_SEL_MOVIE, "SELECT ID, AudioFileDataID, SubtitleFileDataID, Volume, KeyID FROM movie ORDER BY ID DESC", CONNECTION_SYNCH); + // NameGen.db2 PrepareStatement(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name, Race, Sex FROM name_gen ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name_lang FROM name_gen_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -343,35 +430,44 @@ void HotfixDatabaseConnection::DoPrepareStatements() // OverrideSpellData.db2 PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, " - "SpellID9, SpellID10, Flags, PlayerActionbarFileDataID FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); + "SpellID9, SpellID10, PlayerActionbarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); // PhaseXPhaseGroup.db2 PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC", CONNECTION_SYNCH); // PlayerCondition.db2 - PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, Flags, MinLevel, MaxLevel, RaceMask, ClassMask, Gender, NativeGender, SkillID1, " - "SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, SkillLogic, " - "LanguageID, MinLanguage, MaxLanguage, MinFactionID1, MinFactionID2, MinFactionID3, MaxFactionID, MinReputation1, MinReputation2, " - "MinReputation3, MaxReputation, ReputationLogic, Unknown1, MinPVPRank, MaxPVPRank, PvpMedal, PrevQuestLogic, PrevQuestID1, PrevQuestID2, " - "PrevQuestID3, PrevQuestID4, CurrQuestLogic, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestLogic, " - "CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellLogic, SpellID1, SpellID2, " - "SpellID3, SpellID4, ItemLogic, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemFlags, Explored1, " - "Explored2, Time1, Time2, AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, WorldStateExpressionID, WeatherID, " - "PartyStatus, LifetimeMaxPVPRank, AchievementLogic, Achievement1, Achievement2, Achievement3, Achievement4, LfgLogic, LfgStatus1, LfgStatus2, " - "LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, AreaLogic, AreaID1, " - "AreaID2, AreaID3, AreaID4, CurrencyLogic, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, " - "CurrencyCount3, CurrencyCount4, QuestKillID, QuestKillLogic, QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, " - "MinExpansionLevel, MaxExpansionLevel, MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, PhaseID, " - "PhaseGroupID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, ChrSpecializationIndex, " - "ChrSpecializationRole, FailureDescription, PowerType, PowerTypeComp, PowerTypeValue FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, RaceMask, SkillLogic, ReputationLogic, PrevQuestLogic, CurrQuestLogic, " + "CurrentCompletedQuestLogic, SpellLogic, SpellID1, SpellID2, SpellID3, SpellID4, ItemLogic, ItemID1, ItemID2, ItemID3, ItemID4, Time1, Time2, " + "AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AchievementLogic, AreaLogic, QuestKillLogic, QuestKillMonster1, " + "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, FailureDescription, Unknown700_1, " + "Unknown700_2, MinLevel, MaxLevel, ClassMask, SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, " + "MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, MinFactionID3, MaxFactionID, PrevQuestID1, PrevQuestID2, PrevQuestID3, " + "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " + "CurrentCompletedQuestID3, CurrentCompletedQuestID4, Explored1, Explored2, WorldStateExpressionID, Achievement1, Achievement2, Achievement3, " + "Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, QuestKillID, PhaseID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, " + "MaxAvgEquippedItemLevel, ModifierTreeID, Flags, Gender, NativeGender, LanguageID, MinLanguage, MaxLanguage, MinReputation1, MinReputation2, " + "MinReputation3, MaxReputation, Unknown1, MinPVPRank, MaxPVPRank, PvpMedal, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemFlags, " + "AuraCount1, AuraCount2, AuraCount3, AuraCount4, WeatherID, PartyStatus, LifetimeMaxPVPRank, LfgLogic, LfgStatus1, LfgStatus2, LfgStatus3, " + "LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, " + "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, MinExpansionLevel, MaxExpansionLevel, " + "MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, PhaseGroupID, ChrSpecializationIndex, " + "ChrSpecializationRole, PowerType, PowerTypeComp, PowerTypeValue FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH); + // PowerDisplay.db2 + PrepareStatement(HOTFIX_SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, PowerType, Red, Green, Blue FROM power_display ORDER BY ID DESC", CONNECTION_SYNCH); + + // QuestFactionReward.db2 + PrepareStatement(HOTFIX_SEL_QUEST_FACTION_REWARD, "SELECT ID, QuestRewFactionValue1, QuestRewFactionValue2, QuestRewFactionValue3, " + "QuestRewFactionValue4, QuestRewFactionValue5, QuestRewFactionValue6, QuestRewFactionValue7, QuestRewFactionValue8, QuestRewFactionValue9, " + "QuestRewFactionValue10 FROM quest_faction_reward ORDER BY ID DESC", CONNECTION_SYNCH); + // QuestMoneyReward.db2 - PrepareStatement(HOTFIX_SEL_QUEST_MONEY_REWARD, "SELECT Level, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9, Money10" - " FROM quest_money_reward ORDER BY Level DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_MONEY_REWARD, "SELECT ID, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9, Money10" + " FROM quest_money_reward ORDER BY ID DESC", CONNECTION_SYNCH); // QuestPackageItem.db2 - PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, QuestPackageID, ItemID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); // QuestSort.db2 PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); @@ -383,42 +479,106 @@ void HotfixDatabaseConnection::DoPrepareStatements() // QuestXp.db2 PrepareStatement(HOTFIX_SEL_QUEST_XP, "SELECT ID, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8, Exp9, Exp10 FROM quest_xp ORDER BY ID DESC", CONNECTION_SYNCH); + // RandPropPoints.db2 + PrepareStatement(HOTFIX_SEL_RAND_PROP_POINTS, "SELECT ID, EpicPropertiesPoints1, EpicPropertiesPoints2, EpicPropertiesPoints3, " + "EpicPropertiesPoints4, EpicPropertiesPoints5, RarePropertiesPoints1, RarePropertiesPoints2, RarePropertiesPoints3, RarePropertiesPoints4, " + "RarePropertiesPoints5, UncommonPropertiesPoints1, UncommonPropertiesPoints2, UncommonPropertiesPoints3, UncommonPropertiesPoints4, " + "UncommonPropertiesPoints5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH); + // ScalingStatDistribution.db2 - PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, MinLevel, MaxLevel, ItemLevelCurveID FROM scaling_stat_distribution" + PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, ItemLevelCurveID, MinLevel, MaxLevel FROM scaling_stat_distribution" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SkillLine.db2 + PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName, Description, AlternateVerb, SpellIconID, Flags, CategoryID, CanLink, " + "ParentSkillLineID FROM skill_line ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, Description_lang, AlternateVerb_lang FROM skill_line_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + + // SkillLineAbility.db2 + PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, ClassMask, SupercedesSpell, SkillLine, MinSkillLineRank, " + "TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AquireMethod, NumSkillUps FROM skill_line_ability" " ORDER BY ID DESC", CONNECTION_SYNCH); - // SoundEntries.db2 - PrepareStatement(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, SoundType, Name, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, " - "FileDataID6, FileDataID7, FileDataID8, FileDataID9, FileDataID10, FileDataID11, FileDataID12, FileDataID13, FileDataID14, FileDataID15, " - "FileDataID16, FileDataID17, FileDataID18, FileDataID19, FileDataID20, Freq1, Freq2, Freq3, Freq4, Freq5, Freq6, Freq7, Freq8, Freq9, Freq10, " - "Freq11, Freq12, Freq13, Freq14, Freq15, Freq16, Freq17, Freq18, Freq19, Freq20, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, " - "SoundEntriesAdvancedID, VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, DialogType, " - "BusOverwriteID FROM sound_entries ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, Name_lang FROM sound_entries_locale WHERE locale = ?", CONNECTION_SYNCH); + // SkillRaceClassInfo.db2 + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, SkillTierID, Availability, MinLevel" + " FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH); + + // SoundKit.db2 + PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, " + "VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, EAXDef, DialogType, " + "BusOverwriteID, Unk700 FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name_lang FROM sound_kit_locale WHERE locale = ?", CONNECTION_SYNCH); // SpecializationSpells.db2 - PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpecID, OrderIndex, SpellID, OverridesSpellID, Description" + PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpellID, OverridesSpellID, Description, SpecID, OrderIndex" " FROM specialization_spells ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?", CONNECTION_SYNCH); - // SpellAuraRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " - "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell FROM spell_aura_restrictions" + // Spell.db2 + PrepareStatement(HOTFIX_SEL_SPELL, "SELECT ID, Name, NameSubtext, Description, AuraDescription, MiscID, DescriptionVariablesID FROM spell" " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL, "SELECT ID, Name_lang, NameSubtext_lang, Description_lang, AuraDescription_lang FROM spell_locale" + " WHERE locale = ?", CONNECTION_SYNCH); - // SpellCastingRequirements.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " - "RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellAuraOptions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_AURA_OPTIONS, "SELECT ID, SpellID, ProcCharges, ProcTypeMask, ProcCategoryRecovery, CumulativeAura, " + "DifficultyID, ProcChance, SpellProcsPerMinuteID FROM spell_aura_options ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellAuraRestrictions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, SpellID, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, " + "ExcludeTargetAuraSpell, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, ExcludeTargetAuraState" + " FROM spell_aura_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCastTimes.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, CastTime, CastTimePerLevel, MinCastTime FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, CastTime, MinCastTime, CastTimePerLevel FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCastingRequirements.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, MinFactionID, RequiredAreasID, RequiresSpellFocus, " + "FacingCasterFlags, MinReputation, RequiredAuraVision FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCategories.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORIES, "SELECT ID, SpellID, Category, StartRecoveryCategory, ChargeCategory, DifficultyID, DefenseType, " + "DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCategory.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges FROM spell_category" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellClassOptions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, ModalNextSpell, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " - "SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " + "ModalNextSpell, SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCooldowns.db2 + PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, SpellID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, DifficultyID" + " FROM spell_cooldowns ORDER BY ID DESC", CONNECTION_SYNCH); // SpellDuration.db2 - PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration1, Duration2, Duration3 FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerLevel FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEffect.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, EffectAmplitude, EffectAuraPeriod, EffectBasePoints, EffectBonusCoefficient, " + "EffectChainAmplitude, EffectDieSides, EffectItemType, EffectMiscValue, EffectMiscValueB, EffectPointsPerResource, EffectRealPointsPerLevel, " + "EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, EffectTriggerSpell, EffectPosFacing, SpellID, " + "EffectAttributes, BonusCoefficientFromAP, EffectAura, EffectChainTargets, DifficultyID, Effect, EffectMechanic, EffectRadiusIndex, " + "EffectRadiusMaxIndex, ImplicitTarget1, ImplicitTarget2, EffectIndex FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEffectScaling.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT_SCALING, "SELECT ID, Coefficient, Variance, ResourceCoefficient, SpellEffectID FROM spell_effect_scaling" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEquippedItems.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemInventoryTypeMask, EquippedItemSubClassMask, " + "EquippedItemClass FROM spell_equipped_items ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellFocusObject.db2 + PrepareStatement(HOTFIX_SEL_SPELL_FOCUS_OBJECT, "SELECT ID, Name FROM spell_focus_object ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_FOCUS_OBJECT, "SELECT ID, Name_lang FROM spell_focus_object_locale WHERE locale = ?", CONNECTION_SYNCH); + + // SpellInterrupts.db2 + PrepareStatement(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT ID, SpellID, AuraInterruptFlags1, AuraInterruptFlags2, ChannelInterruptFlags1, " + "ChannelInterruptFlags2, InterruptFlags, DifficultyID FROM spell_interrupts ORDER BY ID DESC", CONNECTION_SYNCH); // SpellItemEnchantmentCondition.db2 PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, " @@ -429,19 +589,22 @@ void HotfixDatabaseConnection::DoPrepareStatements() // SpellLearnSpell.db2 PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, LearnSpellID, SpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellLevels.db2 + PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, SpellID, BaseLevel, MaxLevel, SpellLevel, DifficultyID FROM spell_levels ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellMisc.db2 PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes, AttributesEx, AttributesExB, AttributesExC, AttributesExD, AttributesExE, " - "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, CastingTimeIndex, " - "DurationIndex, RangeIndex, Speed, SpellIconID, ActiveIconID, SchoolMask, MultistrikeSpeedMod FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); + "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, Speed, " + "MultistrikeSpeedMod, CastingTimeIndex, DurationIndex, RangeIndex, SpellIconID, ActiveIconID, SchoolMask FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPower.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, PowerIndex, PowerType, ManaCost, ManaCostPerLevel, ManaCostPerSecond, " - "ManaCostAdditional, PowerDisplayID, UnitPowerBarID, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, HealthCostPercentage" + PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, ManaCost, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, " + "HealthCostPercentage, ManaCostPerSecond, ManaCostAdditional, PowerDisplayID, UnitPowerBarID, PowerIndex, PowerType, ManaCostPerLevel" " FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" - " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT ID, SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinute.db2 PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); @@ -454,45 +617,60 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRange.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, MinRangeHostile, MinRangeFriend, MaxRangeHostile, MaxRangeFriend, Flags, DisplayName, " - "DisplayNameShort FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, MinRangeHostile, MinRangeFriend, MaxRangeHostile, MaxRangeFriend, DisplayName, " + "DisplayNameShort, Flags FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName_lang, DisplayNameShort_lang FROM spell_range_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellReagents.db2 - PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " + PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" " ORDER BY ID DESC", CONNECTION_SYNCH); - // SpellRuneCost.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RUNE_COST, "SELECT ID, Blood, Unholy, Frost, Chromatic, RunicPower FROM spell_rune_cost" + // SpellScaling.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MaxScalingLevel FROM spell_scaling" " ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellShapeshift.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, ShapeshiftMask2, " + "StanceBarOrder FROM spell_shapeshift ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellShapeshiftForm.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, WeaponDamageVariance, Flags, AttackIconID, CombatRoundTime, " + "CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, PresetSpellID3, " + "PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8, CreatureType, MountTypeID, BonusActionBar" + " FROM spell_shapeshift_form ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?", CONNECTION_SYNCH); + + // SpellTargetRestrictions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, SpellID, ConeAngle, Width, Targets, MaxTargetLevel, TargetCreatureType, " + "DifficultyID, MaxAffectedTargets FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellTotems.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2 FROM spell_totems" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, SpellID, Totem1, Totem2, RequiredTotemCategoryID1, RequiredTotemCategoryID2" + " FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH); // SpellXSpellVisual.db2 - PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, DifficultyID, SpellVisualID1, SpellVisualID2, Unk620, PlayerConditionID, " + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, Unk620, SpellVisualID1, SpellVisualID2, PlayerConditionID, DifficultyID, " "Flags FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiNodes.db2 - PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, MapID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, ConditionID, " - "LearnableIndex, Flags, MapOffsetX, MapOffsetY FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " + "ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TAXI_NODES, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiPath.db2 PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT ID, `From`, `To`, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiPathNode.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, PathID, NodeIndex, MapID, LocX, LocY, LocZ, Flags, Delay, ArrivalEventID, " - "DepartureEventID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, LocX, LocY, LocZ, Delay, PathID, MapID, ArrivalEventID, DepartureEventID, NodeIndex, " + "Flags FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); // TotemCategory.db2 - PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryType, CategoryMask FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryMask, CategoryType FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); // Toy.db2 - PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Flags, Description, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Description, Flags, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, Description_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH); // TransportAnimation.db2 @@ -503,15 +681,18 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, TransportID, TimeIndex, X, Y, Z, W FROM transport_rotation ORDER BY ID DESC", CONNECTION_SYNCH); // UnitPowerBar.db2 - PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MinPower, MaxPower, StartPower, CenterPower, RegenerationPeace, RegenerationCombat, " - "BarType, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, " - "Flags, Name, Cost, OutOfError, ToolTip, StartInset, EndInset FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MaxPower, RegenerationPeace, RegenerationCombat, FileDataID1, FileDataID2, FileDataID3, " + "FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, Name, Cost, OutOfError, ToolTip, StartInset, " + "EndInset, StartPower, Flags, MinPower, CenterPower, BarType FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); // WorldMapOverlay.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureName, TextureWidth, " + PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, " "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay" " ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName_lang FROM world_map_overlay_locale WHERE locale = ?", CONNECTION_SYNCH); + + // WorldMapTransforms.db2 + PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, " + "RegionOffsetX, RegionOffsetY, RegionScale, MapID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms ORDER BY ID DESC", CONNECTION_SYNCH); } diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 999c9316dad..322df76d74d 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -35,11 +35,17 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ACHIEVEMENT, HOTFIX_SEL_ACHIEVEMENT_LOCALE, + HOTFIX_SEL_ANIM_KIT, + HOTFIX_SEL_AREA_GROUP_MEMBER, + HOTFIX_SEL_ARMOR_LOCATION, + HOTFIX_SEL_AUCTION_HOUSE, HOTFIX_SEL_AUCTION_HOUSE_LOCALE, + HOTFIX_SEL_BANK_BAG_SLOT_PRICES, + HOTFIX_SEL_BARBER_SHOP_STYLE, HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, @@ -59,10 +65,14 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, + HOTFIX_SEL_CHR_RACES, + HOTFIX_SEL_CHR_RACES_LOCALE, + HOTFIX_SEL_CINEMATIC_SEQUENCES, HOTFIX_SEL_CREATURE_DISPLAY_INFO, - HOTFIX_SEL_CREATURE_DISPLAY_INFO_LOCALE, + + HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, @@ -79,11 +89,17 @@ enum HotfixDatabaseStatements HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, + HOTFIX_SEL_DURABILITY_COSTS, + HOTFIX_SEL_DURABILITY_QUALITY, + HOTFIX_SEL_EMOTES_TEXT_SOUND, + HOTFIX_SEL_GAMEOBJECTS, HOTFIX_SEL_GAMEOBJECTS_LOCALE, + HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, + HOTFIX_SEL_GAME_TABLES, HOTFIX_SEL_GAME_TABLES_LOCALE, @@ -117,13 +133,18 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GLYPH_SLOT, + HOTFIX_SEL_GUILD_COLOR_BACKGROUND, + + HOTFIX_SEL_GUILD_COLOR_BORDER, + + HOTFIX_SEL_GUILD_COLOR_EMBLEM, + HOTFIX_SEL_GUILD_PERK_SPELLS, HOTFIX_SEL_HEIRLOOM, HOTFIX_SEL_HEIRLOOM_LOCALE, HOTFIX_SEL_HOLIDAYS, - HOTFIX_SEL_HOLIDAYS_LOCALE, HOTFIX_SEL_IMPORT_PRICE_ARMOR, @@ -133,8 +154,19 @@ enum HotfixDatabaseStatements HOTFIX_SEL_IMPORT_PRICE_WEAPON, + HOTFIX_SEL_ITEM, + HOTFIX_SEL_ITEM_APPEARANCE, + HOTFIX_SEL_ITEM_ARMOR_QUALITY, + + HOTFIX_SEL_ITEM_ARMOR_SHIELD, + + HOTFIX_SEL_ITEM_ARMOR_TOTAL, + + HOTFIX_SEL_ITEM_BAG_FAMILY, + HOTFIX_SEL_ITEM_BAG_FAMILY_LOCALE, + HOTFIX_SEL_ITEM_BONUS, HOTFIX_SEL_ITEM_BONUS_TREE_NODE, @@ -144,12 +176,20 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_CURRENCY_COST, + HOTFIX_SEL_ITEM_DAMAGE_AMMO, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, + HOTFIX_SEL_ITEM_DISENCHANT_LOOT, HOTFIX_SEL_ITEM_EFFECT, - HOTFIX_SEL_ITEM, - HOTFIX_SEL_ITEM_EXTENDED_COST, HOTFIX_SEL_ITEM_LIMIT_CATEGORY, @@ -165,6 +205,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_RANDOM_SUFFIX, HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SET_SPELL, + HOTFIX_SEL_ITEM_SPARSE, HOTFIX_SEL_ITEM_SPARSE_LOCALE, @@ -190,6 +232,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, + HOTFIX_SEL_MOVIE, + HOTFIX_SEL_NAME_GEN, HOTFIX_SEL_NAME_GEN_LOCALE, @@ -206,6 +250,10 @@ enum HotfixDatabaseStatements HOTFIX_SEL_PLAYER_CONDITION, HOTFIX_SEL_PLAYER_CONDITION_LOCALE, + HOTFIX_SEL_POWER_DISPLAY, + + HOTFIX_SEL_QUEST_FACTION_REWARD, + HOTFIX_SEL_QUEST_MONEY_REWARD, HOTFIX_SEL_QUEST_PACKAGE_ITEM, @@ -217,28 +265,62 @@ enum HotfixDatabaseStatements HOTFIX_SEL_QUEST_XP, + HOTFIX_SEL_RAND_PROP_POINTS, + HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, - HOTFIX_SEL_SOUND_ENTRIES, - HOTFIX_SEL_SOUND_ENTRIES_LOCALE, + HOTFIX_SEL_SKILL_LINE, + HOTFIX_SEL_SKILL_LINE_LOCALE, + + HOTFIX_SEL_SKILL_LINE_ABILITY, + + HOTFIX_SEL_SKILL_RACE_CLASS_INFO, + + HOTFIX_SEL_SOUND_KIT, + HOTFIX_SEL_SOUND_KIT_LOCALE, HOTFIX_SEL_SPECIALIZATION_SPELLS, HOTFIX_SEL_SPECIALIZATION_SPELLS_LOCALE, + HOTFIX_SEL_SPELL, + HOTFIX_SEL_SPELL_LOCALE, + + HOTFIX_SEL_SPELL_AURA_OPTIONS, + HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, + HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, - HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CATEGORIES, + + HOTFIX_SEL_SPELL_CATEGORY, + HOTFIX_SEL_SPELL_CATEGORY_LOCALE, HOTFIX_SEL_SPELL_CLASS_OPTIONS, + HOTFIX_SEL_SPELL_COOLDOWNS, + HOTFIX_SEL_SPELL_DURATION, + HOTFIX_SEL_SPELL_EFFECT, + + HOTFIX_SEL_SPELL_EFFECT_SCALING, + + HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, + + HOTFIX_SEL_SPELL_FOCUS_OBJECT, + HOTFIX_SEL_SPELL_FOCUS_OBJECT_LOCALE, + + HOTFIX_SEL_SPELL_INTERRUPTS, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, HOTFIX_SEL_SPELL_LEARN_SPELL, + HOTFIX_SEL_SPELL_LEVELS, + HOTFIX_SEL_SPELL_MISC, HOTFIX_SEL_SPELL_POWER, @@ -256,7 +338,14 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SPELL_REAGENTS, - HOTFIX_SEL_SPELL_RUNE_COST, + HOTFIX_SEL_SPELL_SCALING, + + HOTFIX_SEL_SPELL_SHAPESHIFT, + + HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, + HOTFIX_SEL_SPELL_SHAPESHIFT_FORM_LOCALE, + + HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, HOTFIX_SEL_SPELL_TOTEMS, @@ -283,7 +372,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, HOTFIX_SEL_WORLD_MAP_OVERLAY, - HOTFIX_SEL_WORLD_MAP_OVERLAY_LOCALE, + + HOTFIX_SEL_WORLD_MAP_TRANSFORMS, MAX_HOTFIXDATABASE_STATEMENTS }; diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index e60b9776cba..4f2298858ca 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -165,7 +165,7 @@ void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId) if (!source) return; - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { TC_LOG_ERROR("scripts", "Invalid soundId %u used in DoPlaySoundToSet (Source: %s)", soundId, source->GetGUID().ToString().c_str()); return; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 85c5e2f017a..c47bbfb3282 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1647,7 +1647,7 @@ class TC_GAME_API SmartAIMgr bool IsSoundValid(SmartScriptHolder const& e, uint32 entry) { - if (!sSoundEntriesStore.LookupEntry(entry)) + if (!sSoundKitStore.LookupEntry(entry)) { TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses non-existent Sound entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry); return false; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 642c21e3ff1..f4b51eba6f4 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -924,6 +924,12 @@ CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type) c return sCriteriaMgr->GetGuildCriteriaByType(type); } +bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return AdditionalRequirementsSatisfied(sAchievementMgr->GetModifierTree(modifierTreeId), 0, 0, nullptr, _owner); +} + + std::string PlayerAchievementMgr::GetOwnerInfo() const { return Trinity::StringFormat("%s %s", _owner->GetGUID().ToString().c_str(), _owner->GetName().c_str()); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index b937f2194e2..3e2ec0ef7ff 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -513,7 +513,7 @@ void AuctionHouseMgr::Update() mNeutralAuctions.Update(); } -AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId) +AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId, uint32* houseId) { uint32 houseid = 7; // goblin auction house @@ -550,6 +550,9 @@ AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTem } } + if (houseId) + *houseId = houseid; + return sAuctionHouseStore.LookupEntry(houseid); } @@ -904,7 +907,7 @@ bool AuctionEntry::LoadFromDB(Field* fields) } factionTemplateId = auctioneerInfo->faction; - auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(factionTemplateId); + auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(factionTemplateId, &houseId); if (!auctionHouseEntry) { TC_LOG_ERROR("misc", "Auction %u has auctioneer (GUID : " UI64FMTD " Entry: %u) with wrong faction %u", Id, auctioneer, auctioneerData->id, factionTemplateId); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 17b72a24c22..160cab40771 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -79,11 +79,12 @@ struct TC_GAME_API AuctionEntry ObjectGuid::LowType bidder; uint32 deposit; //deposit can be calculated only when creating auction uint32 etime; + uint32 houseId; AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc uint32 factionTemplateId; // helpers - uint32 GetHouseId() const { return auctionHouseEntry->ID; } + uint32 GetHouseId() const { return houseId; } uint32 GetHouseFaction() const { return auctionHouseEntry->FactionID; } uint32 GetAuctionCut() const; uint32 GetAuctionOutBid() const; @@ -188,7 +189,7 @@ class TC_GAME_API AuctionHouseMgr void SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQLTransaction& trans); static uint32 GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item* pItem, uint32 count); - static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId); + static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId, uint32* houseId); public: diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp index 8a45d40988d..d7e17b266f3 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp @@ -1026,6 +1026,7 @@ void AuctionBotSeller::AddNewAuctions(SellerConfiguration& config) auctionEntry->bidder = UI64LIT(0); auctionEntry->bid = 0; auctionEntry->deposit = sAuctionMgr->GetAuctionDeposit(ahEntry, etime, item, stackCount); + auctionEntry->houseId = houseid; auctionEntry->auctionHouseEntry = ahEntry; auctionEntry->expire_time = time(NULL) + urand(config.GetMinTime(), config.GetMaxTime()) * HOUR; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 3e523cad4fb..c11c25219a5 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -348,18 +348,23 @@ bool SpellChatLink::ValidateName(char* buffer, const char* context) return false; } - uint32 skillLineNameLength = strlen(skillLine->DisplayName_lang); - if (skillLineNameLength > 0 && strncmp(skillLine->DisplayName_lang, buffer, skillLineNameLength) == 0) + for (uint8 i = 0; i < TOTAL_LOCALES; ++i) { - // found the prefix, remove it to perform spellname validation below - // -2 = strlen(": ") - uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; - memmove(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); + uint32 skillLineNameLength = strlen(skillLine->DisplayName->Str[i]); + if (skillLineNameLength > 0 && strncmp(skillLine->DisplayName->Str[i], buffer, skillLineNameLength) == 0) + { + // found the prefix, remove it to perform spellname validation below + // -2 = strlen(": ") + uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; + memmove(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); + break; + } } } - if (*_spell->SpellName && strcmp(_spell->SpellName, buffer) == 0) - return true; + for (uint8 i = 0; i < TOTAL_LOCALES; ++i) + if (*_spell->SpellName->Str[i] && strcmp(_spell->SpellName->Str[i], buffer) == 0) + return true; TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked spell (id: %u) name wasn't found in any localization", context, _spell->Id); return false; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 2ff7196a2dc..a1ca9bd5f73 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2621,8 +2621,15 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player* player, PlayerConditionEntry std::array results; results.fill(true); for (std::size_t i = 0; i < AuraCount::value; ++i) + { if (condition->AuraSpellID[i]) - results[i] = player->HasAura(condition->AuraSpellID[i]); + { + if (condition->AuraCount[i]) + results[i] = player->GetAuraCount(condition->AuraSpellID[i]) >= condition->AuraCount[i]; + else + results[i] = player->HasAura(condition->AuraSpellID[i]); + } + } if (!PlayerConditionLogic(condition->AuraSpellLogic, results)) return false; @@ -2728,5 +2735,8 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player* player, PlayerConditionEntry if (condition->MaxAvgEquippedItemLevel && uint32(std::floor(player->GetFloatValue(PLAYER_FIELD_AVG_ITEM_LEVEL + 1))) > condition->MaxAvgEquippedItemLevel) return false; + if (condition->ModifierTreeID && !player->ModifierTreeSatisfied(condition->ModifierTreeID)) + return false; + return true; } diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2fd9c22b080..ae01936ff0e 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -25,8 +25,11 @@ #include "World.h" DB2Storage sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); +DB2Storage sAnimKitStore("AnimKit.db2", AnimKitFormat, HOTFIX_SEL_ANIM_KIT); DB2Storage sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION); DB2Storage sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); +DB2Storage sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES); DB2Storage sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE); DB2Storage sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityFormat, HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); DB2Storage sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateFormat, HOTFIX_SEL_BATTLE_PET_BREED_STATE); @@ -35,16 +38,21 @@ DB2Storage sBattlePetSpeciesStateStore("Bat DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); +DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); DB2Storage sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); +DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); DB2Storage sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); DB2Storage sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); DB2Storage sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); DB2Storage sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); DB2Storage sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); DB2Storage sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); +DB2Storage sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS); DB2Storage sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); +DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); DB2Storage sGameTablesStore("GameTables.db2", GameTablesFormat, HOTFIX_SEL_GAME_TABLES); DB2Storage sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); DB2Storage sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); @@ -58,6 +66,9 @@ DB2Storage sGarrPlotInstanceStore("GarrPlot DB2Storage sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); DB2Storage sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); DB2Storage sGlyphSlotStore("GlyphSlot.db2", GlyphSlotFormat, HOTFIX_SEL_GLYPH_SLOT); +DB2Storage sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundFormat, HOTFIX_SEL_GUILD_COLOR_BACKGROUND); +DB2Storage sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderFormat, HOTFIX_SEL_GUILD_COLOR_BORDER); +DB2Storage sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemFormat, HOTFIX_SEL_GUILD_COLOR_EMBLEM); DB2Storage sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsFormat, HOTFIX_SEL_GUILD_PERK_SPELLS); DB2Storage sHeirloomStore("Heirloom.db2", HeirloomFormat, HOTFIX_SEL_HEIRLOOM); DB2Storage sHolidaysStore("Holidays.db2", HolidaysEntryFormat, HOTFIX_SEL_HOLIDAYS); @@ -66,10 +77,19 @@ DB2Storage sImportPriceQualityStore("Import DB2Storage sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldFormat, HOTFIX_SEL_IMPORT_PRICE_SHIELD); DB2Storage sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponFormat, HOTFIX_SEL_IMPORT_PRICE_WEAPON); DB2Storage sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceFormat, HOTFIX_SEL_ITEM_APPEARANCE); +DB2Storage sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityFormat, HOTFIX_SEL_ITEM_ARMOR_QUALITY); +DB2Storage sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldFormat, HOTFIX_SEL_ITEM_ARMOR_SHIELD); +DB2Storage sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalFormat, HOTFIX_SEL_ITEM_ARMOR_TOTAL); +DB2Storage sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyFormat, HOTFIX_SEL_ITEM_BAG_FAMILY); DB2Storage sItemBonusStore("ItemBonus.db2", ItemBonusFormat, HOTFIX_SEL_ITEM_BONUS); DB2Storage sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeFormat, HOTFIX_SEL_ITEM_BONUS_TREE_NODE); DB2Storage sItemClassStore("ItemClass.db2", ItemClassFormat, HOTFIX_SEL_ITEM_CLASS); DB2Storage sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostFormat, HOTFIX_SEL_ITEM_CURRENCY_COST); +DB2Storage sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoFormat, HOTFIX_SEL_ITEM_DAMAGE_AMMO); +DB2Storage sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); +DB2Storage sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); +DB2Storage sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); +DB2Storage sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); DB2Storage sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootFormat, HOTFIX_SEL_ITEM_DISENCHANT_LOOT); DB2Storage sItemEffectStore("ItemEffect.db2", ItemEffectFormat, HOTFIX_SEL_ITEM_EFFECT); DB2Storage sItemStore("Item.db2", ItemFormat, HOTFIX_SEL_ITEM); @@ -79,7 +99,8 @@ DB2Storage sItemModifiedAppearanceStore("It DB2Storage sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseFormat, HOTFIX_SEL_ITEM_PRICE_BASE); DB2Storage sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesFormat, HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); DB2Storage sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixFormat, HOTFIX_SEL_ITEM_RANDOM_SUFFIX); -DB2Storage sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); +DB2Storage sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellFormat, HOTFIX_SEL_ITEM_SET_SPELL); +DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); DB2Storage sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); DB2Storage sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE); DB2Storage sItemToBattlePetSpeciesStore("ItemToBattlePetSpecies.db2", ItemToBattlePetSpeciesFormat, HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES); @@ -90,6 +111,7 @@ DB2Storage sModifierTreeStore("ModifierTree DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); DB2Storage sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); DB2Storage sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityFormat, HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); +DB2Storage sMovieStore("Movie.db2", MovieFormat, HOTFIX_SEL_MOVIE); DB2Storage sNameGenStore("NameGen.db2", NameGenFormat, HOTFIX_SEL_NAME_GEN); DB2Storage sNamesProfanityStore("NamesProfanity.db2", NamesProfanityFormat, HOTFIX_SEL_NAMES_PROFANITY); DB2Storage sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED); @@ -97,21 +119,38 @@ DB2Storage sNamesReservedLocaleStore("Names DB2Storage sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); DB2Storage sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); DB2Storage sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION); +DB2Storage sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY); +DB2Storage sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardFormat, HOTFIX_SEL_QUEST_FACTION_REWARD); DB2Storage sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); -DB2Storage sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemfmt, HOTFIX_SEL_QUEST_PACKAGE_ITEM); +DB2Storage sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemFormat, HOTFIX_SEL_QUEST_PACKAGE_ITEM); DB2Storage sQuestSortStore("QuestSort.db2", QuestSortFormat, HOTFIX_SEL_QUEST_SORT); DB2Storage sQuestV2Store("QuestV2.db2", QuestV2Format, HOTFIX_SEL_QUEST_V2); DB2Storage sQuestXPStore("QuestXP.db2", QuestXPFormat, HOTFIX_SEL_QUEST_XP); +DB2Storage sRandPropPointsStore("RandPropPoints.db2", RandPropPointsFormat, HOTFIX_SEL_RAND_PROP_POINTS); DB2Storage sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionFormat, HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); -DB2Storage sSoundEntriesStore("SoundEntries.db2", SoundEntriesFormat, HOTFIX_SEL_SOUND_ENTRIES); +DB2Storage sSkillLineStore("SkillLine.db2", SkillLineFormat, HOTFIX_SEL_SKILL_LINE); +DB2Storage sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityFormat, HOTFIX_SEL_SKILL_LINE_ABILITY); +DB2Storage sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoFormat, HOTFIX_SEL_SKILL_RACE_CLASS_INFO); +DB2Storage sSoundKitStore("SoundKit.db2", SoundKitFormat, HOTFIX_SEL_SOUND_KIT); DB2Storage sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsFormat, HOTFIX_SEL_SPECIALIZATION_SPELLS); +DB2Storage sSpellStore("Spell.db2", SpellFormat, HOTFIX_SEL_SPELL); +DB2Storage sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsFormat, HOTFIX_SEL_SPELL_AURA_OPTIONS); DB2Storage sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsFormat, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); DB2Storage sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesFormat, HOTFIX_SEL_SPELL_CAST_TIMES); DB2Storage sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsFormat, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); +DB2Storage sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesFormat, HOTFIX_SEL_SPELL_CATEGORIES); +DB2Storage sSpellCategoryStore("SpellCategory.db2", SpellCategoryFormat, HOTFIX_SEL_SPELL_CATEGORY); DB2Storage sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); +DB2Storage sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsFormat, HOTFIX_SEL_SPELL_COOLDOWNS); DB2Storage sSpellDurationStore("SpellDuration.db2", SpellDurationFormat, HOTFIX_SEL_SPELL_DURATION); +DB2Storage sSpellEffectStore("SpellEffect.db2", SpellEffectFormat, HOTFIX_SEL_SPELL_EFFECT); +DB2Storage sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingFormat, HOTFIX_SEL_SPELL_EFFECT_SCALING); +DB2Storage sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsFormat, HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); +DB2Storage sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectFormat, HOTFIX_SEL_SPELL_FOCUS_OBJECT); +DB2Storage sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsFormat, HOTFIX_SEL_SPELL_INTERRUPTS); DB2Storage sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); DB2Storage sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); +DB2Storage sSpellLevelsStore("SpellLevels.db2", SpellLevelsFormat, HOTFIX_SEL_SPELL_LEVELS); DB2Storage sSpellMiscStore("SpellMisc.db2", SpellMiscFormat, HOTFIX_SEL_SPELL_MISC); DB2Storage sSpellPowerStore("SpellPower.db2", SpellPowerFormat, HOTFIX_SEL_SPELL_POWER); DB2Storage sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyFormat, HOTFIX_SEL_SPELL_POWER_DIFFICULTY); @@ -120,7 +159,10 @@ DB2Storage sSpellProcsPerMinuteModStore("Sp DB2Storage sSpellRadiusStore("SpellRadius.db2", SpellRadiusFormat, HOTFIX_SEL_SPELL_RADIUS); DB2Storage sSpellRangeStore("SpellRange.db2", SpellRangeFormat, HOTFIX_SEL_SPELL_RANGE); DB2Storage sSpellReagentsStore("SpellReagents.db2", SpellReagentsFormat, HOTFIX_SEL_SPELL_REAGENTS); -DB2Storage sSpellRuneCostStore("SpellRuneCost.db2", SpellRuneCostFormat, HOTFIX_SEL_SPELL_RUNE_COST); +DB2Storage sSpellScalingStore("SpellScaling.db2", SpellScalingFormat, HOTFIX_SEL_SPELL_SCALING); +DB2Storage sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftFormat, HOTFIX_SEL_SPELL_SHAPESHIFT); +DB2Storage sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormFormat, HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); +DB2Storage sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsFormat, HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); DB2Storage sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); DB2Storage sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); DB2Storage sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); @@ -132,6 +174,7 @@ DB2Storage sTransportAnimationStore("Transp DB2Storage sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); DB2Storage sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); DB2Storage sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); +DB2Storage sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -140,12 +183,12 @@ TaxiMask sAllianceTaxiNodesMask; TaxiPathSetBySource sTaxiPathSetBySource; TaxiPathNodesByPath sTaxiPathNodesByPath; -typedef std::list DB2StoreProblemList; +typedef std::vector DB2StoreProblemList; uint32 DB2FilesCount = 0; -template -inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2Storage* storage, std::string const& db2Path, uint32 defaultLocale) +template class DB2> +inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, uint32 defaultLocale, DB2 const& /*hint*/) { // compatibility format and C++ structure sizes ASSERT(DB2FileLoader::GetFormatRecordSize(storage->GetFormat()) == sizeof(T), @@ -204,10 +247,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) DB2StoreProblemList bad_db2_files; uint32 availableDb2Locales = 0xFF; -#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale) +#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale, store) LOAD_DB2(sAchievementStore); + LOAD_DB2(sAnimKitStore); + LOAD_DB2(sArmorLocationStore); LOAD_DB2(sAreaGroupMemberStore); + LOAD_DB2(sBankBagSlotPricesStore); LOAD_DB2(sBattlePetBreedQualityStore); LOAD_DB2(sBattlePetBreedStateStore); LOAD_DB2(sAuctionHouseStore); @@ -217,16 +263,21 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCharStartOutfitStore); LOAD_DB2(sChrClassesXPowerTypesStore); + LOAD_DB2(sChrRacesStore); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); + LOAD_DB2(sCreatureDisplayInfoExtraStore); LOAD_DB2(sCreatureTypeStore); LOAD_DB2(sCriteriaStore); LOAD_DB2(sCriteriaTreeStore); LOAD_DB2(sCurrencyTypesStore); LOAD_DB2(sCurvePointStore); LOAD_DB2(sDestructibleModelDataStore); + LOAD_DB2(sDurabilityCostsStore); LOAD_DB2(sDurabilityQualityStore); + LOAD_DB2(sEmotesTextSoundStore); LOAD_DB2(sGameObjectsStore); + LOAD_DB2(sGameObjectDisplayInfoStore); LOAD_DB2(sGameTablesStore); LOAD_DB2(sGarrAbilityStore); LOAD_DB2(sGarrBuildingPlotInstStore); @@ -240,6 +291,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGarrSiteLevelStore); LOAD_DB2(sGlyphSlotStore); + LOAD_DB2(sGuildColorBackgroundStore); + LOAD_DB2(sGuildColorBorderStore); + LOAD_DB2(sGuildColorEmblemStore); LOAD_DB2(sGuildPerkSpellsStore); LOAD_DB2(sHeirloomStore); LOAD_DB2(sHolidaysStore); @@ -248,10 +302,19 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sImportPriceShieldStore); LOAD_DB2(sImportPriceWeaponStore); LOAD_DB2(sItemAppearanceStore); + LOAD_DB2(sItemArmorQualityStore); + LOAD_DB2(sItemArmorShieldStore); + LOAD_DB2(sItemArmorTotalStore); + LOAD_DB2(sItemBagFamilyStore); LOAD_DB2(sItemBonusStore); LOAD_DB2(sItemBonusTreeNodeStore); LOAD_DB2(sItemClassStore); LOAD_DB2(sItemCurrencyCostStore); + LOAD_DB2(sItemDamageAmmoStore); + LOAD_DB2(sItemDamageOneHandCasterStore); + LOAD_DB2(sItemDamageOneHandStore); + LOAD_DB2(sItemDamageTwoHandCasterStore); + LOAD_DB2(sItemDamageTwoHandStore); LOAD_DB2(sItemDisenchantLootStore); LOAD_DB2(sItemEffectStore); LOAD_DB2(sItemExtendedCostStore); @@ -260,6 +323,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemPriceBaseStore); LOAD_DB2(sItemRandomPropertiesStore); LOAD_DB2(sItemRandomSuffixStore); + LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemSpecStore); @@ -272,6 +336,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); LOAD_DB2(sMountTypeXCapabilityStore); + LOAD_DB2(sMovieStore); LOAD_DB2(sNameGenStore); LOAD_DB2(sNamesProfanityStore); LOAD_DB2(sNamesReservedStore); @@ -279,21 +344,37 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sOverrideSpellDataStore); LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sPlayerConditionStore); + LOAD_DB2(sPowerDisplayStore); + LOAD_DB2(sQuestFactionRewardStore); LOAD_DB2(sQuestMoneyRewardStore); LOAD_DB2(sQuestPackageItemStore); LOAD_DB2(sQuestSortStore); LOAD_DB2(sQuestV2Store); LOAD_DB2(sQuestXPStore); LOAD_DB2(sScalingStatDistributionStore); - LOAD_DB2(sSoundEntriesStore); + LOAD_DB2(sSkillLineStore); + LOAD_DB2(sSkillLineAbilityStore); + LOAD_DB2(sSkillRaceClassInfoStore); + LOAD_DB2(sSoundKitStore); LOAD_DB2(sSpecializationSpellsStore); + LOAD_DB2(sSpellStore); + LOAD_DB2(sSpellAuraOptionsStore); LOAD_DB2(sSpellAuraRestrictionsStore); LOAD_DB2(sSpellCastTimesStore); LOAD_DB2(sSpellCastingRequirementsStore); + LOAD_DB2(sSpellCategoriesStore); + LOAD_DB2(sSpellCategoryStore); LOAD_DB2(sSpellClassOptionsStore); + LOAD_DB2(sSpellCooldownsStore); LOAD_DB2(sSpellDurationStore); + LOAD_DB2(sSpellEffectScalingStore); + LOAD_DB2(sSpellEffectStore); + LOAD_DB2(sSpellEquippedItemsStore); + LOAD_DB2(sSpellFocusObjectStore); + LOAD_DB2(sSpellInterruptsStore); LOAD_DB2(sSpellItemEnchantmentConditionStore); LOAD_DB2(sSpellLearnSpellStore); + LOAD_DB2(sSpellLevelsStore); LOAD_DB2(sSpellMiscStore); LOAD_DB2(sSpellPowerStore); LOAD_DB2(sSpellPowerDifficultyStore); @@ -302,7 +383,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sSpellRadiusStore); LOAD_DB2(sSpellRangeStore); LOAD_DB2(sSpellReagentsStore); - LOAD_DB2(sSpellRuneCostStore); + LOAD_DB2(sSpellScalingStore); + LOAD_DB2(sSpellShapeshiftFormStore); + LOAD_DB2(sSpellShapeshiftStore); + LOAD_DB2(sSpellTargetRestrictionsStore); LOAD_DB2(sSpellTotemsStore); LOAD_DB2(sSpellXSpellVisualStore); LOAD_DB2(sTaxiNodesStore); @@ -314,6 +398,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sTransportRotationStore); LOAD_DB2(sUnitPowerBarStore); LOAD_DB2(sWorldMapOverlayStore); + LOAD_DB2(sWorldMapTransformsStore); #undef LOAD_DB2 @@ -323,21 +408,38 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; - sChrClassesXPowerTypesStore.Sort(&ChrClassesXPowerTypesEntryComparator::Compare); + std::set 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 (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) + for (ChrClassesXPowerTypesEntry const* power : powers) { uint32 index = 0; for (uint32 j = 0; j < MAX_POWERS; ++j) if (_powersByClass[power->ClassID][j] != MAX_POWERS) ++index; + ASSERT(power->PowerType < MAX_POWERS); _powersByClass[power->ClassID][power->PowerType] = index; } + for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore) + _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound; + + for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore) + { + if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.X), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.X)); + if (gameObjectDisplayInfo->GeoBoxMax.Y < gameObjectDisplayInfo->GeoBoxMin.Y) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.Y), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.Y)); + if (gameObjectDisplayInfo->GeoBoxMax.Z < gameObjectDisplayInfo->GeoBoxMin.Z) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.Z), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.Z)); + } + for (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) _glyphSlots.insert(glyphSlot); @@ -355,10 +457,16 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } } + for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore) + _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemId); + for (ItemModifiedAppearanceEntry const* appearanceMod : sItemModifiedAppearanceStore) if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; + for (ItemSetSpellEntry const* entry : sItemSetSpellStore) + _itemSetSpells[entry->ItemSetID].push_back(entry); + for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) _itemSpecOverrides[entry->ItemID].push_back(entry); @@ -424,6 +532,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore) _questPackages[questPackageItem->QuestPackageID].push_back(questPackageItem); + for (SkillRaceClassInfoEntry const* entry : sSkillRaceClassInfoStore) + if (sSkillLineStore.LookupEntry(entry->SkillID)) + _skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry)); + for (SpecializationSpellsEntry const* specSpells : sSpecializationSpellsStore) _specializationSpellsBySpec[specSpells->SpecID].push_back(specSpells); @@ -459,8 +571,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) std::vector pathLength; pathLength.resize(pathCount); // 0 and some other indexes not used for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore) - if (pathLength[entry->PathID] < entry->NodeIndex + 1) - pathLength[entry->PathID] = entry->NodeIndex + 1; + if (pathLength[entry->PathID] < entry->NodeIndex + 1u) + pathLength[entry->PathID] = entry->NodeIndex + 1u; // Set path length sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used @@ -528,7 +640,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) else if (!bad_db2_files.empty()) { std::string str; - for (std::list::iterator i = bad_db2_files.begin(); i != bad_db2_files.end(); ++i) + for (auto i = bad_db2_files.begin(); i != bad_db2_files.end(); ++i) str += *i + "\n"; TC_LOG_ERROR("misc", "\nSome required *.db2 files (%u from %d) not found or not compatible:\n%s", (uint32)bad_db2_files.size(), DB2FilesCount, str.c_str()); @@ -536,8 +648,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } // Check loaded DB2 files proper version - if (!sItemStore.LookupEntry(128706) || // last item added in 6.2.0 (20216) - !sItemExtendedCostStore.LookupEntry(5923) ) // last item extended cost added in 6.2.0 (20216) + if (!sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) + !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) + !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); exit(1); @@ -644,6 +757,31 @@ uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const return _powersByClass[classId][powerType]; } +char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEFAULT_LOCALE*/) +{ + ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); + if (!raceEntry) + return ""; + + if (raceEntry->Name->Str[locale][0] != '\0') + return raceEntry->Name->Str[locale]; + + return raceEntry->Name->Str[DEFAULT_LOCALE]; +} + +EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const +{ + auto itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, class_)); + if (itr != _emoteTextSounds.end()) + return itr->second; + + itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, 0)); + if (itr != _emoteTextSounds.end()) + return itr->second; + + return nullptr; +} + uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const { // Assuming linear item level scaling for heirlooms @@ -719,6 +857,15 @@ uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const return 0; } +std::vector const* DB2Manager::GetItemSetSpells(uint32 itemSetId) const +{ + auto itr = _itemSetSpells.find(itemSetId); + if (itr != _itemSetSpells.end()) + return &itr->second; + + return nullptr; +} + std::vector const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const { auto itr = _itemSpecOverrides.find(itemId); @@ -809,6 +956,22 @@ std::set DB2Manager::GetPhasesForGroup(uint32 group) const return std::set(); } +SkillRaceClassInfoEntry const* DB2Manager::GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_) +{ + auto bounds = _skillRaceClassInfoBySkill.equal_range(skill); + for (auto itr = bounds.first; itr != bounds.second; ++itr) + { + if (itr->second->RaceMask && !(itr->second->RaceMask & (1 << (race - 1)))) + continue; + if (itr->second->ClassMask && !(itr->second->ClassMask & (1 << (class_ - 1)))) + continue; + + return itr->second; + } + + return nullptr; +} + std::vector const* DB2Manager::GetSpecializationSpells(uint32 specId) const { auto itr = _specializationSpellsBySpec.find(specId); @@ -869,11 +1032,80 @@ std::vector DB2Manager::GetSpellProcsPerMinu return std::vector(); } +bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) +{ + if (requiredTotemCategoryId == 0) + return true; + if (itemTotemCategoryId == 0) + return false; + + TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId); + if (!itemEntry) + return false; + TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId); + if (!reqEntry) + return false; + + if (itemEntry->CategoryType != reqEntry->CategoryType) + return false; + + return (itemEntry->CategoryMask & reqEntry->CategoryMask) == reqEntry->CategoryMask; +} + bool DB2Manager::IsToyItem(uint32 toy) const { return _toys.count(toy) > 0; } +void DB2Manager::DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/) +{ + ASSERT(newMapId || newPos); + WorldMapTransformsEntry const* transformation = nullptr; + for (WorldMapTransformsEntry const* transform : sWorldMapTransformsStore) + { + if (transform->MapID != mapId) + continue; + + if (transform->RegionMin.X > x || transform->RegionMax.X < x) + continue; + if (transform->RegionMin.Y > y || transform->RegionMax.Y < y) + continue; + if (transform->RegionMin.Z > z || transform->RegionMax.Z < z) + continue; + + transformation = transform; + break; + } + + if (!transformation) + { + if (newMapId) + *newMapId = mapId; + + if (newPos) + { + newPos->X = x; + newPos->Y = y; + } + return; + } + + if (newMapId) + *newMapId = transformation->NewMapID; + + if (!newPos) + return; + + if (transformation->RegionScale > 0.0f && transformation->RegionScale < 1.0f) + { + x = (x - transformation->RegionMin.X) * transformation->RegionScale + transformation->RegionMin.X; + y = (y - transformation->RegionMin.Y) * transformation->RegionScale + transformation->RegionMin.Y; + } + + newPos->X = x + transformation->RegionOffset.X; + newPos->Y = y + transformation->RegionOffset.Y; +} + bool DB2Manager::ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right) { if (left->ClassID != right->ClassID) @@ -892,5 +1124,5 @@ bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabili { if (left->MountTypeID == right->MountTypeID) return left->OrderIndex < right->OrderIndex; - return left->ID < right->ID; + return left->MountTypeID < right->MountTypeID; } diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b42d1dd8bab..4e3f7bdd70b 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -25,7 +25,10 @@ #include TC_GAME_API extern DB2Storage sAchievementStore; +TC_GAME_API extern DB2Storage sAnimKitStore; +TC_GAME_API extern DB2Storage sArmorLocationStore; TC_GAME_API extern DB2Storage sAuctionHouseStore; +TC_GAME_API extern DB2Storage sBankBagSlotPricesStore; TC_GAME_API extern DB2Storage sBarberShopStyleStore; TC_GAME_API extern DB2Storage sBattlePetBreedQualityStore; TC_GAME_API extern DB2Storage sBattlePetBreedStateStore; @@ -33,15 +36,19 @@ TC_GAME_API extern DB2Storage sBattlePetSp TC_GAME_API extern DB2Storage sBattlePetSpeciesStateStore; TC_GAME_API extern DB2Storage sBroadcastTextStore; TC_GAME_API extern DB2Storage sCharStartOutfitStore; +TC_GAME_API extern DB2Storage sChrRacesStore; TC_GAME_API extern DB2Storage sCinematicSequencesStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoStore; +TC_GAME_API extern DB2Storage sCreatureDisplayInfoExtraStore; TC_GAME_API extern DB2Storage sCreatureTypeStore; TC_GAME_API extern DB2Storage sCriteriaStore; TC_GAME_API extern DB2Storage sCriteriaTreeStore; TC_GAME_API extern DB2Storage sCurrencyTypesStore; TC_GAME_API extern DB2Storage sDestructibleModelDataStore; +TC_GAME_API extern DB2Storage sDurabilityCostsStore; TC_GAME_API extern DB2Storage sDurabilityQualityStore; TC_GAME_API extern DB2Storage sGameObjectsStore; +TC_GAME_API extern DB2Storage sGameObjectDisplayInfoStore; TC_GAME_API extern DB2Storage sGameTablesStore; TC_GAME_API extern DB2Storage sGarrAbilityStore; TC_GAME_API extern DB2Storage sGarrBuildingStore; @@ -55,15 +62,25 @@ TC_GAME_API extern DB2Storage sGarrPlotIns TC_GAME_API extern DB2Storage sGarrSiteLevelStore; TC_GAME_API extern DB2Storage sGarrSiteLevelPlotInstStore; TC_GAME_API extern DB2Storage sGlyphSlotStore; +TC_GAME_API extern DB2Storage sGuildColorBackgroundStore; +TC_GAME_API extern DB2Storage sGuildColorBorderStore; +TC_GAME_API extern DB2Storage sGuildColorEmblemStore; TC_GAME_API extern DB2Storage sGuildPerkSpellsStore; -TC_GAME_API extern DB2Storage sHeirloomStore; TC_GAME_API extern DB2Storage sHolidaysStore; TC_GAME_API extern DB2Storage sImportPriceArmorStore; TC_GAME_API extern DB2Storage sImportPriceQualityStore; TC_GAME_API extern DB2Storage sImportPriceShieldStore; TC_GAME_API extern DB2Storage sImportPriceWeaponStore; +TC_GAME_API extern DB2Storage sItemArmorQualityStore; +TC_GAME_API extern DB2Storage sItemArmorShieldStore; +TC_GAME_API extern DB2Storage sItemArmorTotalStore; +TC_GAME_API extern DB2Storage sItemBagFamilyStore; TC_GAME_API extern DB2Storage sItemClassStore; -TC_GAME_API extern DB2Storage sItemCurrencyCostStore; +TC_GAME_API extern DB2Storage sItemDamageAmmoStore; +TC_GAME_API extern DB2Storage sItemDamageOneHandStore; +TC_GAME_API extern DB2Storage sItemDamageOneHandCasterStore; +TC_GAME_API extern DB2Storage sItemDamageTwoHandStore; +TC_GAME_API extern DB2Storage sItemDamageTwoHandCasterStore; TC_GAME_API extern DB2Storage sItemDisenchantLootStore; TC_GAME_API extern DB2Storage sItemEffectStore; TC_GAME_API extern DB2Storage sItemStore; @@ -72,40 +89,60 @@ TC_GAME_API extern DB2Storage sItemLimitCa TC_GAME_API extern DB2Storage sItemPriceBaseStore; TC_GAME_API extern DB2Storage sItemRandomPropertiesStore; TC_GAME_API extern DB2Storage sItemRandomSuffixStore; -TC_GAME_API extern DB2Storage sItemSparseStore; +TC_GAME_API extern DB2Storage sItemSetSpellStore; +TC_GAME_API extern DB2SparseStorage sItemSparseStore; TC_GAME_API extern DB2Storage sItemSpecStore; TC_GAME_API extern DB2Storage sItemSpecOverrideStore; TC_GAME_API extern DB2Storage sItemToBattlePetSpeciesStore; TC_GAME_API extern DB2Storage sMailTemplateStore; TC_GAME_API extern DB2Storage sModifierTreeStore; TC_GAME_API extern DB2Storage sMountCapabilityStore; +TC_GAME_API extern DB2Storage sMovieStore; TC_GAME_API extern DB2Storage sOverrideSpellDataStore; TC_GAME_API extern DB2Storage sPlayerConditionStore; +TC_GAME_API extern DB2Storage sPowerDisplayStore; +TC_GAME_API extern DB2Storage sQuestFactionRewardStore; TC_GAME_API extern DB2Storage sQuestMoneyRewardStore; TC_GAME_API extern DB2Storage sQuestSortStore; TC_GAME_API extern DB2Storage sQuestXPStore; +TC_GAME_API extern DB2Storage sRandPropPointsStore; TC_GAME_API extern DB2Storage sScalingStatDistributionStore; -TC_GAME_API extern DB2Storage sSoundEntriesStore; +TC_GAME_API extern DB2Storage sSkillLineStore; +TC_GAME_API extern DB2Storage sSkillLineAbilityStore; +TC_GAME_API extern DB2Storage sSkillRaceClassInfoStore; +TC_GAME_API extern DB2Storage sSoundKitStore; +TC_GAME_API extern DB2Storage sSpellStore; +TC_GAME_API extern DB2Storage sSpellAuraOptionsStore; TC_GAME_API extern DB2Storage sSpellAuraRestrictionsStore; TC_GAME_API extern DB2Storage sSpellCastTimesStore; TC_GAME_API extern DB2Storage sSpellCastingRequirementsStore; +TC_GAME_API extern DB2Storage sSpellCategoriesStore; +TC_GAME_API extern DB2Storage sSpellCategoryStore; TC_GAME_API extern DB2Storage sSpellClassOptionsStore; +TC_GAME_API extern DB2Storage sSpellCooldownsStore; TC_GAME_API extern DB2Storage sSpellDurationStore; +TC_GAME_API extern DB2Storage sSpellEffectStore; +TC_GAME_API extern DB2Storage sSpellEffectScalingStore; +TC_GAME_API extern DB2Storage sSpellEquippedItemsStore; +TC_GAME_API extern DB2Storage sSpellFocusObjectStore; +TC_GAME_API extern DB2Storage sSpellInterruptsStore; TC_GAME_API extern DB2Storage sSpellItemEnchantmentConditionStore; TC_GAME_API extern DB2Storage sSpellLearnSpellStore; +TC_GAME_API extern DB2Storage sSpellLevelsStore; TC_GAME_API extern DB2Storage sSpellMiscStore; TC_GAME_API extern DB2Storage sSpellPowerStore; TC_GAME_API extern DB2Storage sSpellProcsPerMinuteStore; TC_GAME_API extern DB2Storage sSpellRadiusStore; TC_GAME_API extern DB2Storage sSpellRangeStore; TC_GAME_API extern DB2Storage sSpellReagentsStore; -TC_GAME_API extern DB2Storage sSpellRuneCostStore; +TC_GAME_API extern DB2Storage sSpellScalingStore; +TC_GAME_API extern DB2Storage sSpellShapeshiftStore; +TC_GAME_API extern DB2Storage sSpellShapeshiftFormStore; +TC_GAME_API extern DB2Storage sSpellTargetRestrictionsStore; TC_GAME_API extern DB2Storage sSpellTotemsStore; TC_GAME_API extern DB2Storage sSpellXSpellVisualStore; TC_GAME_API extern DB2Storage sTaxiNodesStore; TC_GAME_API extern DB2Storage sTaxiPathStore; -TC_GAME_API extern DB2Storage sTotemCategoryStore; -TC_GAME_API extern DB2Storage sToyStore; TC_GAME_API extern DB2Storage sUnitPowerBarStore; TC_GAME_API extern DB2Storage sWorldMapOverlayStore; @@ -142,6 +179,7 @@ public: typedef std::map StorageMap; typedef std::unordered_map> AreaGroupMemberContainer; typedef std::unordered_map CharStartOutfitContainer; + typedef std::map, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::set GlyphSlotContainer; typedef std::map>> HeirloomCurvesContainer; typedef std::unordered_map HeirloomItemsContainer; @@ -150,6 +188,7 @@ public: typedef std::unordered_multimap ItemToBonusTreeContainer; typedef std::unordered_map ItemDisplayIdContainer; typedef std::unordered_map> ItemBonusTreeContainer; + typedef std::unordered_map> ItemSetSpellContainer; typedef std::unordered_map> ItemSpecOverridesContainer; typedef std::unordered_map MountContainer; typedef std::set MountTypeXCapabilitySet; @@ -158,6 +197,7 @@ public: typedef std::array, TOTAL_LOCALES + 1> NameValidationRegexContainer; typedef std::unordered_map> PhaseGroupContainer; typedef std::unordered_map> QuestPackageItemContainer; + typedef std::unordered_multimap SkillRaceClassInfoContainer; typedef std::unordered_map> SpecializationSpellsContainer; typedef std::unordered_map> SpellPowerContainer; typedef std::unordered_map>> SpellPowerDifficultyContainer; @@ -177,12 +217,16 @@ public: static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; + static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); + EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; std::set GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; + bool HasItemCurrencyCost(uint32 itemId) const { return _itemsWithCurrencyCost.count(itemId) > 0; } uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; + std::vector const* GetItemSetSpells(uint32 itemSetId) const; std::vector const* GetItemSpecOverrides(uint32 itemId) const; std::string GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const; MountEntry const* GetMount(uint32 spellId) const; @@ -192,10 +236,13 @@ public: std::vector const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); std::set GetPhasesForGroup(uint32 group) const; + SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector const* GetSpecializationSpells(uint32 specId) const; std::vector GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; std::vector GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; + static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); bool IsToyItem(uint32 toy) const; + static void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr); private: StorageMap _stores; @@ -204,13 +251,16 @@ private: AreaGroupMemberContainer _areaGroupMembers; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + EmotesTextSoundContainer _emoteTextSounds; GlyphSlotContainer _glyphSlots; HeirloomItemsContainer _heirlooms; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; + std::unordered_set _itemsWithCurrencyCost; ItemDisplayIdContainer _itemDisplayIDs; ItemToBonusTreeContainer _itemToBonusTree; + ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; @@ -218,6 +268,7 @@ private: NameValidationRegexContainer _nameValidators; PhaseGroupContainer _phasesByGroup; QuestPackageItemContainer _questPackages; + SkillRaceClassInfoContainer _skillRaceClassInfoBySkill; SpecializationSpellsContainer _specializationSpellsBySpec; SpellPowerContainer _spellPowers; SpellPowerDifficultyContainer _spellPowerDifficulties; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index daebcf7375f..ff3b9efc9c1 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -26,165 +26,229 @@ struct AchievementEntry { - uint32 ID; // 0 - int32 Faction; // 1 -1=all, 0=horde, 1=alliance - int32 MapID; // 2 -1=none - uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) - LocalizedString* Title; // 4 - LocalizedString* Description; // 5 - uint32 Category; // 6 - uint32 Points; // 7 reward points - uint32 UIOrder; // 8 - uint32 Flags; // 9 - uint32 IconID; // 10 icon (from SpellIcon.dbc) - LocalizedString* Reward; // 11 - uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias) - uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias) - uint32 CriteriaTree; // 14 + uint32 ID; + LocalizedString* Title; + LocalizedString* Description; + uint32 Flags; + LocalizedString* Reward; + int16 MapID; // -1 = none + uint16 Supercedes; // its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) + uint16 Category; + uint16 UIOrder; + uint16 IconID; + uint16 SharesCriteria; // referenced achievement (counting of all completed criterias) + uint16 CriteriaTree; + int8 Faction; // -1 = all, 0 = horde, 1 = alliance + uint8 Points; + uint8 MinimumCriteria; // need this count of completed criterias (own or referenced achievement criterias) +}; + +struct AnimKitEntry +{ + uint32 OneShotDuration; + uint16 OneShotStopAnimKitID; + uint16 LowDefAnimKitID; }; struct AreaGroupMemberEntry { - uint32 ID; // 0 - uint32 AreaGroupID; // 1 - uint32 AreaID; // 2 + uint16 AreaGroupID; + uint16 AreaID; +}; + +struct ArmorLocationEntry +{ + float Modifier[5]; }; struct AuctionHouseEntry { - uint32 ID; // 0 - uint32 FactionID; // 1 id of faction.dbc for player factions associated with city - uint32 DepositRate; // 2 1/3 from real - uint32 ConsignmentRate; // 3 - LocalizedString* Name; // 4 + LocalizedString* Name; + uint16 FactionID; // id of faction.dbc for player factions associated with city + uint8 DepositRate; + uint8 ConsignmentRate; +}; + +struct BankBagSlotPricesEntry +{ + uint32 Cost; }; struct BarberShopStyleEntry { - uint32 ID; // 0 - uint32 Type; // 1 value 0 -> hair, value 2 -> facialhair - LocalizedString* DisplayName; // 2 - LocalizedString* Description; // 3 - float CostModifier; // 4 - uint32 Race; // 5 - uint32 Sex; // 6 - uint32 Data; // 7 (real ID to hair/facial hair) + uint32 ID; + LocalizedString* DisplayName; + LocalizedString* Description; + float CostModifier; + uint8 Type; // value 0 -> hair, value 2 -> facialhair + uint8 Race; + uint8 Sex; + uint8 Data; // real ID to hair/facial hair }; struct BattlePetBreedQualityEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - float Modifier; // 2 + float Modifier; + uint8 Quality; }; struct BattlePetBreedStateEntry { - uint32 ID; // 0 - uint32 BreedID; // 1 - uint32 State; // 2 - int32 Value; // 3 + uint32 ID; + int16 Value; + uint8 BreedID; + uint8 State; }; struct BattlePetSpeciesEntry { - uint32 ID; // 0 - uint32 CreatureID; // 1 - uint32 IconFileID; // 2 - uint32 SummonSpellID; // 3 - uint32 PetType; // 4 - int32 Source; // 5 - uint32 Flags; // 6 - LocalizedString* SourceText; // 7 - LocalizedString* Description; // 8 + uint32 ID; + uint32 CreatureID; + uint32 IconFileID; + uint32 SummonSpellID; + LocalizedString* SourceText; + LocalizedString* Description; + uint16 Flags; + uint8 PetType; + int8 Source; }; struct BattlePetSpeciesStateEntry { - uint32 ID; // 0 - uint32 SpeciesID; // 1 - uint32 State; // 2 - int32 Value; // 3 + uint32 ID; + int32 Value; + uint16 SpeciesID; + uint8 State; }; #define MAX_BROADCAST_TEXT_EMOTES 3 struct BroadcastTextEntry { - uint32 ID; - int32 Language; LocalizedString* MaleText; LocalizedString* FemaleText; - uint32 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; - uint32 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES]; - uint32 SoundID; - uint32 UnkEmoteID; - uint32 Type; + uint16 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; + uint16 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES]; + uint16 SoundID; + uint16 UnkEmoteID; + uint8 Language; + uint8 Type; }; #define MAX_OUTFIT_ITEMS 24 struct CharStartOutfitEntry { - uint32 ID; // 0 - uint8 RaceID; // 1 - uint8 ClassID; // 2 - uint8 GenderID; // 3 - uint8 OutfitID; // 4 - int32 ItemID[MAX_OUTFIT_ITEMS]; // 5-28 - uint32 PetDisplayID; // 29 Pet Model ID for starting pet - uint32 PetFamilyID; // 30 Pet Family Entry for starting pet + int32 ItemID[MAX_OUTFIT_ITEMS]; + uint32 PetDisplayID; // Pet Model ID for starting pet + uint8 RaceID; + uint8 ClassID; + uint8 GenderID; + uint8 OutfitID; + uint8 PetFamilyID; // Pet Family Entry for starting pet }; struct ChrClassesXPowerTypesEntry { - uint32 ID; // 0 - uint32 ClassID; // 1 - uint32 PowerType; // 2 + uint8 ClassID; + uint8 PowerType; +}; + +struct ChrRacesEntry +{ + uint32 ID; + uint32 Flags; + char const* ClientPrefix; + char const* ClientFileString; + LocalizedString* Name; + LocalizedString* NameFemale; + LocalizedString* NameMale; + char const* FacialHairCustomization[2]; + char const* HairCustomization; + uint32 CreateScreenFileDataID; + uint32 SelectScreenFileDataID; + float MaleCustomizeOffset[3]; + float FemaleCustomizeOffset[3]; + uint32 LowResScreenFileDataID; + uint16 FactionID; + uint16 ExplorationSoundID; + uint16 MaleDisplayID; + uint16 FemaleDisplayID; + uint16 ResSicknessSpellID; + uint16 SplashSoundID; + uint16 CinematicSequenceID; + uint16 UAMaleCreatureSoundDataID; + uint16 UAFemaleCreatureSoundDataID; + uint16 HighResMaleDisplayID; + uint16 HighResFemaleDisplayID; + uint16 Unk; + uint8 BaseLanguage; + uint8 CreatureType; + uint8 TeamID; + uint8 RaceRelated; + uint8 UnalteredVisualRaceID; + uint8 CharComponentTextureLayoutID; + uint8 DefaultClassID; + uint8 NeutralRaceID; + uint8 CharComponentTexLayoutHiResID; }; struct CinematicSequencesEntry { - uint32 ID; // 0 - uint32 SoundID; // 1 - uint32 Camera[8]; // 2-9 + uint16 SoundID; + uint16 Camera[8]; }; struct CreatureDisplayInfoEntry { - uint32 ID; // 0 - uint32 ModelID; // 1 - uint32 SoundID; // 2 - uint32 ExtendedDisplayInfoID; // 3 - float CreatureModelScale; // 4 - float PlayerModelScale; // 5 Used for players if greater than 0, see client's CGUnit_C::GetModelScale - uint32 CreatureModelAlpha; // 6 - LocalizedString* TextureVariation[3]; // 7-9 - LocalizedString* PortraitTextureName; // 10 - uint32 PortraitCreatureDisplayInfoID; // 11 - uint32 SizeClass; // 12 - uint32 BloodID; // 13 - uint32 NPCSoundID; // 14 - uint32 ParticleColorID; // 15 - uint32 CreatureGeosetData; // 16 - uint32 ObjectEffectPackageID; // 17 - uint32 AnimReplacementSetID; // 18 - uint32 Flags; // 19 - int32 Gender; // 20 - uint32 StateSpellVisualKitID; // 21 + uint32 ID; + uint32 ExtendedDisplayInfoID; + float CreatureModelScale; + float PlayerModelScale; + uint32 TextureVariation[3]; + char const* PortraitTextureName; + uint32 PortraitCreatureDisplayInfoID; + uint32 CreatureGeosetData; + uint32 StateSpellVisualKitID; + uint16 ModelID; + uint16 SoundID; + uint16 NPCSoundID; + uint16 ParticleColorID; + uint16 ObjectEffectPackageID; + uint16 AnimReplacementSetID; + uint8 CreatureModelAlpha; + uint8 SizeClass; + uint8 BloodID; + uint8 Flags; + int8 Gender; + int8 Unk700; +}; + +struct CreatureDisplayInfoExtraEntry +{ + uint32 NPCItemDisplay[10]; + uint32 FileDataID; + uint32 HDFileDataID; + uint8 DisplayRaceID; + uint8 DisplaySexID; + uint8 DisplayClassID; + uint8 SkinID; + uint8 FaceID; + uint8 HairStyleID; + uint8 HairColorID; + uint8 FacialHairID; + uint8 CustomDisplayOption[3]; + uint8 Flags; }; struct CreatureTypeEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. + LocalizedString* Name; + uint8 Flags; // no exp? critters, non-combat pets, gas cloud. }; struct CriteriaEntry { - uint32 ID; // 0 - uint32 Type; // 1 union { uint32 ID; @@ -303,297 +367,319 @@ struct CriteriaEntry // CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182 uint32 CharShipmentContainerID; - } Asset; // 2 - uint32 StartEvent; // 3 - uint32 StartAsset; // 4 - uint32 StartTimer; // 5 - uint32 FailEvent; // 6 - uint32 FailAsset; // 7 - uint32 ModifierTreeId; // 8 - uint32 Flags; // 9 - uint32 EligibilityWorldStateID; // 10 - uint32 EligibilityWorldStateValue; // 11 + } Asset; + uint32 StartAsset; + uint32 FailAsset; + uint16 StartTimer; + uint16 ModifierTreeId; + uint16 EligibilityWorldStateID; + uint8 Type; + uint8 StartEvent; + uint8 FailEvent; + uint8 Flags; + uint8 EligibilityWorldStateValue; }; struct CriteriaTreeEntry { - uint32 ID; // 0 - uint32 CriteriaID; // 1 - uint64 Amount; // 2 - uint32 Operator; // 3 - uint32 Parent; // 4 - uint32 Flags; // 5 - LocalizedString* Description; // 6 - uint32 OrderIndex; // 7 + uint32 Amount; + LocalizedString* Description; + uint16 CriteriaID; + uint16 Parent; + uint16 Flags; + uint16 OrderIndex; + uint8 Operator; }; struct CurrencyTypesEntry { - uint32 ID; // 0 - uint32 CategoryID; // 1 - LocalizedString* Name; // 2 - LocalizedString* InventoryIcon[2]; // 3-4 - uint32 SpellWeight; // 5 - uint32 SpellCategory; // 6 - uint32 MaxQty; // 7 - uint32 MaxEarnablePerWeek; // 8 - uint32 Flags; // 9 - uint32 Quality; // 10 - LocalizedString* Description; // 11 + uint32 ID; + LocalizedString* Name; + char const* InventoryIcon[2]; + uint32 MaxQty; + uint32 MaxEarnablePerWeek; + uint32 Flags; + LocalizedString* Description; + uint8 CategoryID; + uint8 SpellWeight; + uint8 SpellCategory; + uint8 Quality; }; struct CurvePointEntry { - uint32 ID; // 0 - uint32 CurveID; // 1 - uint32 Index; // 2 - float X; // 3 - float Y; // 4 + float X; + float Y; + uint16 CurveID; + uint8 Index; }; struct DestructibleModelDataEntry { - uint32 ID; // 0 - struct - { - uint32 DisplayID; // 1 - uint32 ImpactEffectDoodadSet; // 2 - uint32 AmbientDoodadSet; // 3 - uint32 NameSet; // 4 - } StateDamaged; - struct - { - uint32 DisplayID; // 5 - uint32 DestructionDoodadSet; // 6 - uint32 ImpactEffectDoodadSet; // 7 - uint32 AmbientDoodadSet; // 8 - uint32 NameSet; // 9 - } StateDestroyed; - struct - { - uint32 DisplayID; // 10 - uint32 DestructionDoodadSet; // 11 - uint32 ImpactEffectDoodadSet; // 12 - uint32 AmbientDoodadSet; // 13 - uint32 NameSet; // 14 - } StateRebuilding; - struct - { - uint32 DisplayID; // 15 - uint32 InitDoodadSet; // 16 - uint32 AmbientDoodadSet; // 17 - uint32 NameSet; // 18 - } StateSmoke; - uint32 EjectDirection; // 19 - uint32 RepairGroundFx; // 20 - uint32 DoNotHighlight; // 21 - uint32 HealEffect; // 22 - uint32 HealEffectSpeed; // 23 + uint16 StateDamagedDisplayID; + uint16 StateDestroyedDisplayID; + uint16 StateRebuildingDisplayID; + uint16 StateSmokeDisplayID; + uint16 HealEffectSpeed; + uint8 StateDamagedImpactEffectDoodadSet; + uint8 StateDamagedAmbientDoodadSet; + uint8 StateDamagedNameSet; + uint8 StateDestroyedDestructionDoodadSet; + uint8 StateDestroyedImpactEffectDoodadSet; + uint8 StateDestroyedAmbientDoodadSet; + uint8 StateDestroyedNameSet; + uint8 StateRebuildingDestructionDoodadSet; + uint8 StateRebuildingImpactEffectDoodadSet; + uint8 StateRebuildingAmbientDoodadSet; + uint8 StateRebuildingNameSet; + uint8 StateSmokeInitDoodadSet; + uint8 StateSmokeAmbientDoodadSet; + uint8 StateSmokeNameSet; + uint8 EjectDirection; + uint8 DoNotHighlight; + uint8 HealEffect; +}; + +struct DurabilityCostsEntry +{ + uint16 WeaponSubClassCost[21]; + uint16 ArmorSubClassCost[8]; }; struct DurabilityQualityEntry { - uint32 ID; // 0 - float QualityMod; // 1 + float QualityMod; +}; + +struct EmotesTextSoundEntry +{ + uint16 EmotesTextId; + uint16 SoundId; + uint8 RaceId; + uint8 SexId; + uint8 ClassId; }; struct GameObjectsEntry { - uint32 ID; // 0 - uint32 MapID; // 1 - uint32 DisplayID; // 2 - DBCPosition3D Position; // 3-5 - float RotationX; // 6 - float RotationY; // 7 - float RotationZ; // 8 - float RotationW; // 9 - float Size; // 10 - uint32 PhaseUseFlags; // 11 - uint32 PhaseID; // 12 - uint32 PhaseGroupID; // 13 - uint32 Type; // 14 - uint32 Data[8]; // 15-22 - LocalizedString* Name; // 23 + uint32 ID; + DBCPosition3D Position; + float RotationX; + float RotationY; + float RotationZ; + float RotationW; + float Size; + int32 Data[8]; + LocalizedString* Name; + uint16 MapID; + uint16 DisplayID; + uint16 PhaseID; + uint16 PhaseGroupID; + uint8 PhaseUseFlags; + uint8 Type; +}; + +struct GameObjectDisplayInfoEntry +{ + uint32 FileDataID; + DBCPosition3D GeoBoxMin; + DBCPosition3D GeoBoxMax; + float OverrideLootEffectScale; + float OverrideNameScale; + uint16 Sound[10]; + uint16 ObjectEffectPackageID; }; struct GameTablesEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 NumRows; // 2 - uint32 NumColumns; // 3 + LocalizedString* Name; + uint16 NumRows; + uint8 NumColumns; }; struct GarrAbilityEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - LocalizedString* Name; // 2 - LocalizedString* Description; // 3 - uint32 IconFileDataID; // 4 - uint32 OtherFactionGarrAbilityID; // 5 - uint32 GarrAbilityCategoryID; // 6 - uint32 FollowerTypeID; // 7 + uint32 ID; + LocalizedString* Name; + LocalizedString* Description; + uint32 IconFileDataID; + uint16 OtherFactionGarrAbilityID; + uint8 Flags; + uint8 GarrAbilityCategoryID; + uint8 FollowerTypeID; }; struct GarrBuildingEntry { - uint32 ID; // 0 - uint32 HordeGameObjectID; // 1 - uint32 AllianceGameObjectID; // 2 - uint32 Unknown; // 3 - uint32 Type; // 4 - uint32 Level; // 5 - LocalizedString* NameAlliance; // 6 - LocalizedString* NameHorde; // 7 - LocalizedString* Description; // 8 - LocalizedString* Tooltip; // 9 - uint32 BuildDuration; // 10 - uint32 CostCurrencyID; // 11 - int32 CostCurrencyAmount; // 12 - uint32 HordeTexPrefixKitID; // 13 - uint32 AllianceTexPrefixKitID; // 14 - uint32 IconFileDataID; // 15 - uint32 BonusAmount; // 16 - uint32 Flags; // 17 - uint32 AllianceActivationScenePackageID; // 18 - uint32 HordeActivationScenePackageID; // 19 - uint32 MaxShipments; // 20 - uint32 FollowerRequiredGarrAbilityID; // 21 - uint32 FollowerGarrAbilityEffectID; // 22 - int32 CostMoney; // 23 + uint32 HordeGameObjectID; + uint32 AllianceGameObjectID; + LocalizedString* NameAlliance; + LocalizedString* NameHorde; + LocalizedString* Description; + LocalizedString* Tooltip; + uint32 IconFileDataID; + uint16 BuildDuration; + uint16 CostCurrencyID; + int16 CostCurrencyAmount; + uint16 AllianceActivationScenePackageID; + uint16 HordeActivationScenePackageID; + int16 CostMoney; + uint8 Unknown; + uint8 Type; + uint8 Level; + uint8 HordeTexPrefixKitID; + uint8 AllianceTexPrefixKitID; + uint8 BonusAmount; + uint8 Flags; + uint8 MaxShipments; + uint8 FollowerRequiredGarrAbilityID; + uint8 FollowerGarrAbilityEffectID; + uint8 GarrTypeID; }; struct GarrBuildingPlotInstEntry { - uint32 ID; // 0 - uint32 GarrBuildingID; // 1 - uint32 UiTextureAtlasMemberID; // 2 - uint32 GarrSiteLevelPlotInstID; // 3 - DBCPosition2D LandmarkOffset; // 4-5 + uint32 ID; + DBCPosition2D LandmarkOffset; + uint16 UiTextureAtlasMemberID; + uint16 GarrSiteLevelPlotInstID; + uint8 GarrBuildingID; }; struct GarrClassSpecEntry { - uint32 ID; // 0 - LocalizedString* NameMale; // 1 - LocalizedString* NameFemale; // 2 - LocalizedString* NameGenderless; // 3 - uint32 ClassAtlasID; // 4 UiTextureAtlasMember.db2 ref - uint32 GarrFollItemSetID; // 5 + uint32 ID; + LocalizedString* NameMale; + LocalizedString* NameFemale; + LocalizedString* NameGenderless; + uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref + uint8 GarrFollItemSetID; }; struct GarrFollowerEntry { - uint32 ID; // 0 - uint32 FollowerTypeID; // 1 - uint32 HordeCreatureID; // 2 - uint32 AllianceCreatureID; // 3 - uint32 HordeUiAnimRaceInfoID; // 4 - uint32 AllianceUiAnimRaceInfoID; // 5 - uint32 Quality; // 6 - uint32 HordeGarrClassSpecID; // 7 - uint32 AllianceGarrClassSpecID; // 8 - uint32 HordeGarrFollItemSetID; // 9 - uint32 AllianceGarrFollItemSetID; // 10 - uint32 Level; // 11 - uint32 ItemLevelWeapon; // 12 - uint32 ItemLevelArmor; // 13 - uint32 Unknown1; // 14 - uint32 Flags; // 15 - LocalizedString* HordeSourceText; // 16 - LocalizedString* AllianceSourceText; // 17 - int32 Unknown2; // 18 - int32 Unknown3; // 19 - uint32 HordePortraitIconID; // 20 - uint32 AlliancePortraitIconID; // 21 - uint32 HordeListPortraitTextureKitID; // 22 - uint32 AllianceListPortraitTextureKitID; // 23 + uint32 HordeCreatureID; + uint32 AllianceCreatureID; + LocalizedString* HordeSourceText; + LocalizedString* AllianceSourceText; + uint32 HordePortraitIconID; + uint32 AlliancePortraitIconID; + uint16 ItemLevelWeapon; + uint16 ItemLevelArmor; + uint8 FollowerTypeID; + uint8 HordeUiAnimRaceInfoID; + uint8 AllianceUiAnimRaceInfoID; + uint8 Quality; + uint8 HordeGarrClassSpecID; + uint8 AllianceGarrClassSpecID; + uint8 HordeGarrFollItemSetID; + uint8 AllianceGarrFollItemSetID; + uint8 Level; + uint8 Unknown1; + uint8 Flags; + int8 Unknown2; + int8 Unknown3; + uint8 HordeListPortraitTextureKitID; + uint8 AllianceListPortraitTextureKitID; + uint8 GarrTypeID; }; struct GarrFollowerXAbilityEntry { - uint32 ID; // 0 - uint32 GarrFollowerID; // 1 - uint32 GarrAbilityID; // 2 - uint32 FactionIndex; // 3 + uint16 GarrFollowerID; + uint16 GarrAbilityID; + uint8 FactionIndex; }; struct GarrPlotEntry { - uint32 ID; // 0 - uint32 GarrPlotUICategoryID; // 1 - uint32 PlotType; // 2 - uint32 Flags; // 3 - LocalizedString* Name; // 4 - uint32 MinCount; // 5 - uint32 MaxCount; // 6 - uint32 AllianceConstructionGameObjectID; // 7 - uint32 HordeConstructionGameObjectID; // 8 + LocalizedString* Name; + uint32 AllianceConstructionGameObjectID; + uint32 HordeConstructionGameObjectID; + uint8 GarrPlotUICategoryID; + uint8 PlotType; + uint8 Flags; + uint8 MinCount; + uint8 MaxCount; }; struct GarrPlotBuildingEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - uint32 GarrBuildingID; // 2 + uint8 GarrPlotID; + uint8 GarrBuildingID; }; struct GarrPlotInstanceEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - LocalizedString* Name; // 2 + LocalizedString* Name; + uint8 GarrPlotID; }; struct GarrSiteLevelEntry { - uint32 ID; // 0 - uint32 Level; // 1 - uint32 MapID; // 2 - uint32 SiteID; // 3 - uint32 UITextureKitID; // 4 - DBCPosition2D TownHall; // 5-6 - uint32 MovieID; // 7 - uint32 Level2; // 8 - uint32 UpgradeResourceCost; // 9 - uint32 UpgradeMoneyCost; // 10 + DBCPosition2D TownHall; + uint16 MapID; + uint16 UpgradeResourceCost; + uint16 UpgradeMoneyCost; + uint8 Level; + uint8 SiteID; + uint8 UITextureKitID; + uint8 MovieID; + uint8 Level2; }; struct GarrSiteLevelPlotInstEntry { - uint32 ID; // 0 - uint32 GarrSiteLevelID; // 1 - uint32 GarrPlotInstanceID; // 2 - DBCPosition2D Landmark; // 3-4 - uint32 Unknown; // 5 + DBCPosition2D Landmark; + uint16 GarrSiteLevelID; + uint8 GarrPlotInstanceID; + uint8 Unknown; }; struct GlyphSlotEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Tooltip; // 2 + uint8 Type; + uint8 Tooltip; +}; + +struct GuildColorBackgroundEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorBorderEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorEmblemEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; }; struct GuildPerkSpellsEntry { - uint32 ID; // 0 - uint32 GuildLevel; // 1 - uint32 SpellID; // 2 + uint32 SpellID; + uint8 GuildLevel; }; struct HeirloomEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 Flags; // 2 - LocalizedString* SourceText; // 3 - uint32 Source; // 4 - uint32 OldItem[2]; // 5-6 - uint32 NextDifficultyItemID; // 7 - uint32 UpgradeItemID[2]; // 8-9 - uint32 ItemBonusListID[2]; // 10-11 + uint32 ID; + uint32 ItemID; + LocalizedString* SourceText; + uint32 OldItem[2]; + uint32 NextDifficultyItemID; + uint32 UpgradeItemID[2]; + uint16 ItemBonusListID[2]; + uint8 Flags; + uint8 Source; }; #define MAX_HOLIDAY_DURATIONS 10 @@ -602,122 +688,164 @@ struct HeirloomEntry struct HolidaysEntry { - uint32 ID; // 0 - uint32 Duration[MAX_HOLIDAY_DURATIONS]; // 1-10 - uint32 Date[MAX_HOLIDAY_DATES]; // 11-26 (dates in unix time starting at January, 1, 2000) - uint32 Region; // 27 - uint32 Looping; // 28 - uint32 CalendarFlags[MAX_HOLIDAY_FLAGS]; // 29-38 - uint32 HolidayNameID; // 39 HolidayNames.dbc - uint32 HolidayDescriptionID; // 40 HolidayDescriptions.dbc - LocalizedString* TextureFilename; // 41 - uint32 Priority; // 42 - uint32 CalendarFilterType; // 43 (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) - uint32 Flags; // 44 (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) + uint32 Date[MAX_HOLIDAY_DATES]; // dates in unix time starting at January, 1, 2000 + char const* TextureFilename; + uint16 Duration[MAX_HOLIDAY_DURATIONS]; + uint16 Region; + uint8 Looping; + uint8 CalendarFlags[MAX_HOLIDAY_FLAGS]; + uint8 HolidayNameID; + uint8 HolidayDescriptionID; + uint8 Priority; + int8 CalendarFilterType; + uint8 Flags; }; struct ImportPriceArmorEntry { - uint32 ID; // 0 - float ClothFactor; // 1 - float LeatherFactor; // 2 - float MailFactor; // 3 - float PlateFactor; // 4 + float ClothFactor; + float LeatherFactor; + float MailFactor; + float PlateFactor; }; struct ImportPriceQualityEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; }; struct ImportPriceShieldEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; }; struct ImportPriceWeaponEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; +}; + +struct ItemEntry +{ + uint32 FileDataID; + uint8 Class; + uint8 SubClass; + int8 SoundOverrideSubclass; + int8 Material; + uint8 InventoryType; + uint8 Sheath; + uint8 GroupSoundsID; }; struct ItemAppearanceEntry { - uint32 ID; // 0 - uint32 DisplayID; // 1 - uint32 IconFileDataID; // 2 + uint32 DisplayID; + uint32 IconFileDataID; + uint8 ObjectComponentSlot; +}; + +struct ItemArmorQualityEntry +{ + float QualityMod[7]; + uint16 ItemLevel; +}; + +struct ItemArmorShieldEntry +{ + float Quality[7]; + uint16 ItemLevel; +}; + +struct ItemArmorTotalEntry +{ + float Value[4]; + uint16 ItemLevel; +}; + +struct ItemBagFamilyEntry +{ + LocalizedString* Name; }; struct ItemBonusEntry { - uint32 ID; // 0 - uint32 BonusListID; // 1 - uint32 Type; // 2 - int32 Value[2]; // 3-4 - uint32 Index; // 5 + uint32 ID; + int32 Value[2]; + uint16 BonusListID; + uint8 Type; + uint8 Index; }; struct ItemBonusTreeNodeEntry { - uint32 ID; // 0 - uint32 BonusTreeID; // 1 - uint32 BonusTreeModID; // 2 - uint32 SubTreeID; // 3 - uint32 BonusListID; // 4 + uint16 BonusTreeID; + uint16 SubTreeID; + uint16 BonusListID; + uint8 BonusTreeModID; }; struct ItemClassEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - float PriceMod; // 2 - LocalizedString* Name; // 3 + float PriceMod; + LocalizedString* Name; + uint8 Flags; }; struct ItemCurrencyCostEntry { - uint32 ID; // 0 - uint32 ItemId; // 1 + uint32 ItemId; }; -struct ItemDisenchantLootEntry +struct ItemDamageAmmoEntry { - uint32 ID; // 0 - uint32 ItemClass; // 1 - int32 ItemSubClass; // 2 - uint32 ItemQuality; // 3 - uint32 MinItemLevel; // 4 - uint32 MaxItemLevel; // 5 - uint32 RequiredDisenchantSkill; // 6 + float DPS[7]; + uint16 ItemLevel; }; -struct ItemEffectEntry +struct ItemDamageOneHandEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 Trigger; // 4 - int32 Charges; // 5 - int32 Cooldown; // 6 - uint32 Category; // 7 - int32 CategoryCooldown; // 8 - uint32 ChrSpecializationID; // 9 + float DPS[7]; + uint16 ItemLevel; }; -struct ItemEntry +struct ItemDamageOneHandCasterEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDamageTwoHandEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDamageTwoHandCasterEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDisenchantLootEntry +{ + uint16 MinItemLevel; + uint16 MaxItemLevel; + uint16 RequiredDisenchantSkill; + uint8 ItemClass; + int8 ItemSubClass; + uint8 ItemQuality; +}; + +struct ItemEffectEntry { - uint32 ID; // 0 - uint32 Class; // 1 - uint32 SubClass; // 2 - int32 SoundOverrideSubclass; // 3 - int32 Material; // 4 - uint32 InventoryType; // 5 - uint32 Sheath; // 6 - uint32 FileDataID; // 7 - uint32 GroupSoundsID; // 8 + uint32 ItemID; + uint32 SpellID; + int32 Cooldown; + int32 CategoryCooldown; + int16 Charges; + uint16 Category; + uint16 ChrSpecializationID; + uint8 OrderIndex; + uint8 Trigger; }; #define MAX_ITEM_EXT_COST_ITEMS 5 @@ -725,64 +853,64 @@ struct ItemEntry struct ItemExtendedCostEntry { - uint32 ID; // 0 extended-cost entry id - uint32 RequiredArenaSlot; // 3 arena slot restrictions (min slot value) - uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // 3-6 required item id - uint32 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // 7-11 required count of 1st item - uint32 RequiredPersonalArenaRating; // 12 required personal arena rating - uint32 ItemPurchaseGroup; // 13 - uint32 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // 14-18 required curency id - uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // 19-23 required curency count - uint32 RequiredFactionId; // 24 - uint32 RequiredFactionStanding; // 25 - uint32 RequirementFlags; // 26 - uint32 RequiredAchievement; // 27 - uint32 RequiredMoney; // 28 + uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id + uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count + uint32 RequiredMoney; + uint16 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // required count of 1st item + uint16 RequiredPersonalArenaRating; // required personal arena rating + uint16 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency id + uint8 RequiredArenaSlot; // arena slot restrictions (min slot value) + uint8 RequiredFactionId; + uint8 RequiredFactionStanding; + uint8 RequirementFlags; + uint8 RequiredAchievement; }; struct ItemLimitCategoryEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Quantity; // 2 - uint32 Flags; // 3 + LocalizedString* Name; + uint8 Quantity; + uint8 Flags; }; struct ItemModifiedAppearanceEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 AppearanceModID; // 2 - uint32 AppearanceID; // 3 - uint32 IconFileDataID; // 4 - uint32 Index; // 5 + uint32 ID; + uint32 ItemID; + uint16 AppearanceID; + uint8 AppearanceModID; + uint8 Index; }; struct ItemPriceBaseEntry { - uint32 ID; // 0 - uint32 ItemLevel; // 1 Item level (1 - 1000) - float ArmorFactor; // 2 Price factor for armor - float WeaponFactor; // 3 Price factor for weapons + float ArmorFactor; + float WeaponFactor; + uint16 ItemLevel; }; #define MAX_ITEM_RANDOM_PROPERTIES 5 struct ItemRandomPropertiesEntry { - uint32 ID; // 0 - LocalizedString* InternalName; // 1 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 - LocalizedString* Name; // 7 + LocalizedString* Name; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; }; struct ItemRandomSuffixEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - LocalizedString* InternalName; // 2 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 3-7 - uint32 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; // 8-12 + LocalizedString* Name; + LocalizedString* InternalName; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; + uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; +}; + +struct ItemSetSpellEntry +{ + uint32 SpellID; + uint16 ItemSetID; + uint16 ChrSpecID; + uint8 Threshold; }; #define MAX_ITEM_PROTO_FLAGS 3 @@ -791,474 +919,650 @@ struct ItemRandomSuffixEntry struct ItemSparseEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4 - float Unk1; // 5 - float Unk2; // 6 - uint32 BuyCount; // 7 - uint32 BuyPrice; // 8 - uint32 SellPrice; // 9 - uint32 InventoryType; // 10 - int32 AllowableClass; // 11 - int32 AllowableRace; // 12 - uint32 ItemLevel; // 13 - int32 RequiredLevel; // 14 - uint32 RequiredSkill; // 15 - uint32 RequiredSkillRank; // 16 - uint32 RequiredSpell; // 17 - uint32 RequiredHonorRank; // 18 - uint32 RequiredCityRank; // 19 - uint32 RequiredReputationFaction; // 20 - uint32 RequiredReputationRank; // 21 - uint32 MaxCount; // 22 - uint32 Stackable; // 23 - uint32 ContainerSlots; // 24 - int32 ItemStatType[MAX_ITEM_PROTO_STATS]; // 25 - 34 - int32 ItemStatValue[MAX_ITEM_PROTO_STATS]; // 35 - 44 - int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; // 45 - 54 - float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; // 55 - 64 - uint32 ScalingStatDistribution; // 65 - uint32 DamageType; // 66 - uint32 Delay; // 67 - float RangedModRange; // 68 - uint32 Bonding; // 69 - LocalizedString* Name; // 70 - LocalizedString* Name2; // 71 - LocalizedString* Name3; // 72 - LocalizedString* Name4; // 73 - LocalizedString* Description; // 74 - uint32 PageText; // 75 - uint32 LanguageID; // 76 - uint32 PageMaterial; // 77 - uint32 StartQuest; // 78 - uint32 LockID; // 79 - int32 Material; // 80 - uint32 Sheath; // 81 - uint32 RandomProperty; // 82 - uint32 RandomSuffix; // 83 - uint32 ItemSet; // 84 - uint32 Area; // 85 - uint32 Map; // 86 - uint32 BagFamily; // 87 - uint32 TotemCategory; // 88 - uint32 SocketColor[MAX_ITEM_PROTO_SOCKETS]; // 89-91 - uint32 SocketBonus; // 92 - uint32 GemProperties; // 93 - float ArmorDamageModifier; // 94 - uint32 Duration; // 95 - uint32 ItemLimitCategory; // 96 - uint32 HolidayID; // 97 - float StatScalingFactor; // 98 - uint32 CurrencySubstitutionID; // 99 - uint32 CurrencySubstitutionCount; // 100 - uint32 ItemNameDescriptionID; // 101 + uint32 Flags[MAX_ITEM_PROTO_FLAGS]; + float Unk1; + float Unk2; + uint32 BuyPrice; + uint32 SellPrice; + int32 AllowableClass; + int32 AllowableRace; + uint32 RequiredSpell; + uint32 MaxCount; + uint32 Stackable; + int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; + float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; + float RangedModRange; + LocalizedString* Name; + LocalizedString* Name2; + LocalizedString* Name3; + LocalizedString* Name4; + LocalizedString* Description; + uint32 BagFamily; + float ArmorDamageModifier; + uint32 Duration; + float StatScalingFactor; + uint16 ItemLevel; + uint16 RequiredSkill; + uint16 RequiredSkillRank; + uint16 RequiredReputationFaction; + int16 ItemStatValue[MAX_ITEM_PROTO_STATS]; + uint16 ScalingStatDistribution; + uint16 Delay; + uint16 PageText; + uint16 StartQuest; + uint16 LockID; + uint16 RandomProperty; + uint16 RandomSuffix; + uint16 ItemSet; + uint16 Area; + uint16 Map; + uint16 SocketBonus; + uint16 GemProperties; + uint16 ItemLimitCategory; + uint16 HolidayID; + uint16 ItemNameDescriptionID; + uint8 Quality; + uint8 BuyCount; + uint8 InventoryType; + int8 RequiredLevel; + uint8 RequiredHonorRank; + uint8 RequiredCityRank; + uint8 RequiredReputationRank; + uint8 ContainerSlots; + int8 ItemStatType[MAX_ITEM_PROTO_STATS]; + uint8 DamageType; + uint8 Bonding; + uint8 LanguageID; + uint8 PageMaterial; + int8 Material; + uint8 Sheath; + uint8 TotemCategory; + uint8 SocketColor[MAX_ITEM_PROTO_SOCKETS]; + uint8 CurrencySubstitutionID; + uint8 CurrencySubstitutionCount; + uint8 ArtifactID; }; struct ItemSpecEntry { - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemType; // 3 - uint32 PrimaryStat; // 4 - uint32 SecondaryStat; // 5 - uint32 SpecID; // 6 + uint16 SpecID; + uint8 MinLevel; + uint8 MaxLevel; + uint8 ItemType; + uint8 PrimaryStat; + uint8 SecondaryStat; }; struct ItemSpecOverrideEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 SpecID; // 2 + uint32 ItemID; + uint16 SpecID; }; struct ItemToBattlePetSpeciesEntry { - uint32 ID; // 0 - uint32 BattlePetSpeciesID; // 1 + uint16 BattlePetSpeciesID; }; struct ItemXBonusTreeEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 BonusTreeID; // 2 + uint32 ItemID; + uint16 BonusTreeID; }; #define KEYCHAIN_SIZE 32 struct KeyChainEntry { - uint32 Id; - uint8 Key[KEYCHAIN_SIZE]; + uint8 Key[KEYCHAIN_SIZE]; }; struct MailTemplateEntry { - uint32 ID; // 0 - LocalizedString* Body; // 1 + LocalizedString* Body; }; struct ModifierTreeEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Asset[2]; // 2-3 - uint32 Operator; // 4 - uint32 Amount; // 5 - uint32 Parent; // 6 + uint32 Asset[2]; + uint16 Parent; + uint8 Type; + uint8 Unk700; + uint8 Operator; + uint8 Amount; }; struct MountEntry { - uint32 Id; + uint32 ID; uint32 SpellId; - uint32 MountTypeId; uint32 DisplayId; - uint32 Flags; LocalizedString* Name; LocalizedString* Description; LocalizedString* SourceDescription; - uint32 Source; - uint32 PlayerConditionId; + uint16 MountTypeId; + uint16 Flags; + uint16 PlayerConditionId; + uint8 Source; }; struct MountCapabilityEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 RequiredRidingSkill; // 2 - uint32 RequiredArea; // 3 - uint32 RequiredAura; // 4 - uint32 RequiredSpell; // 5 - uint32 SpeedModSpell; // 6 - int32 RequiredMap; // 7 + uint32 ID; + uint32 RequiredSpell; + uint32 SpeedModSpell; + uint16 RequiredRidingSkill; + uint16 RequiredArea; + int16 RequiredMap; + uint8 Flags; + uint8 RequiredAura; }; struct MountTypeXCapabilityEntry { - uint32 ID; // 0 - uint32 MountTypeID; // 1 - uint32 OrderIndex; // 2 - uint32 MountCapabilityID; // 3 + uint16 MountTypeID; + uint16 MountCapabilityID; + uint8 OrderIndex; +}; + +struct MovieEntry +{ + uint32 AudioFileDataID; + uint32 SubtitleFileDataID; + uint8 Volume; + uint8 KeyID; }; struct NameGenEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Race; // 2 - uint32 Sex; // 3 + LocalizedString* Name; + uint8 Race; + uint8 Sex; }; struct NamesProfanityEntry { - uint32 ID; // 0 - char const* Name; // 1 - int32 Language; // 2 + char const* Name; + int8 Language; }; struct NamesReservedEntry { - uint32 ID; // 0 - char const* Name; // 1 + char const* Name; }; struct NamesReservedLocaleEntry { - uint32 ID; // 0 - char const* Name; // 1 - uint32 LocaleMask; // 2 + char const* Name; + uint8 LocaleMask; }; #define MAX_OVERRIDE_SPELL 10 struct OverrideSpellDataEntry { - uint32 ID; // 0 - uint32 SpellID[MAX_OVERRIDE_SPELL]; // 1-10 - uint32 Flags; // 11 - uint32 PlayerActionbarFileDataID; // 12 + uint32 SpellID[MAX_OVERRIDE_SPELL]; + uint32 PlayerActionbarFileDataID; + uint8 Flags; }; struct PhaseXPhaseGroupEntry { - uint32 ID; - uint32 PhaseID; - uint32 PhaseGroupID; + uint16 PhaseID; + uint16 PhaseGroupID; }; struct PlayerConditionEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 MinLevel; // 2 - uint32 MaxLevel; // 3 - uint32 RaceMask; // 4 - uint32 ClassMask; // 5 - int32 Gender; // 6 - int32 NativeGender; // 7 - uint32 SkillID[4]; // 8-11 - int32 MinSkill[4]; // 12-15 - int32 MaxSkill[4]; // 16-19 - uint32 SkillLogic; // 20 - uint32 LanguageID; // 21 - uint32 MinLanguage; // 22 - uint32 MaxLanguage; // 23 - uint32 MinFactionID[3]; // 24-26 - uint32 MaxFactionID; // 27 - uint32 MinReputation[3]; // 28-30 - uint32 MaxReputation; // 31 - uint32 ReputationLogic; // 32 - uint32 Unknown1; // 33 - uint32 MinPVPRank; // 34 - uint32 MaxPVPRank; // 35 - uint32 PvpMedal; // 36 - uint32 PrevQuestLogic; // 37 - uint32 PrevQuestID[4]; // 38-41 - uint32 CurrQuestLogic; // 42 - uint32 CurrQuestID[4]; // 43-46 - uint32 CurrentCompletedQuestLogic; // 47 - uint32 CurrentCompletedQuestID[4]; // 48-51 - uint32 SpellLogic; // 52 - uint32 SpellID[4]; // 53-56 - uint32 ItemLogic; // 57 - uint32 ItemID[4]; // 58-61 - uint32 ItemCount[4]; // 62-65 - uint32 ItemFlags; // 66 - uint32 Explored[2]; // 67-68 - uint32 Time[2]; // 69-70 - uint32 AuraSpellLogic; // 71 - uint32 AuraSpellID[4]; // 72-75 - uint32 WorldStateExpressionID; // 76 - uint32 WeatherID; // 77 - uint32 PartyStatus; // 78 - uint32 LifetimeMaxPVPRank; // 79 - uint32 AchievementLogic; // 80 - uint32 Achievement[4]; // 81-84 - uint32 LfgLogic; // 85 - uint32 LfgStatus[4]; // 86-89 - uint32 LfgCompare[4]; // 90-93 - uint32 LfgValue[4]; // 94-97 - uint32 AreaLogic; // 98 - uint32 AreaID[4]; // 99-102 - uint32 CurrencyLogic; // 103 - uint32 CurrencyID[4]; // 104-107 - uint32 CurrencyCount[4]; // 108-111 - uint32 QuestKillID; // 112 - uint32 QuestKillLogic; // 113 - uint32 QuestKillMonster[4]; // 114-117 - int32 MinExpansionLevel; // 118 - int32 MaxExpansionLevel; // 119 - int32 MinExpansionTier; // 120 - int32 MaxExpansionTier; // 121 - uint32 MinGuildLevel; // 122 - uint32 MaxGuildLevel; // 123 - uint32 PhaseUseFlags; // 124 - uint32 PhaseID; // 125 - uint32 PhaseGroupID; // 126 - uint32 MinAvgItemLevel; // 127 - uint32 MaxAvgItemLevel; // 128 - uint32 MinAvgEquippedItemLevel; // 129 - uint32 MaxAvgEquippedItemLevel; // 130 - int32 ChrSpecializationIndex; // 131 - int32 ChrSpecializationRole; // 132 - LocalizedString* FailureDescription_lang; // 133 - int32 PowerType; // 134 - int32 PowerTypeComp; // 135 - int32 PowerTypeValue; // 136 + uint32 RaceMask; + uint32 SkillLogic; + uint32 ReputationLogic; + uint32 PrevQuestLogic; + uint32 CurrQuestLogic; + uint32 CurrentCompletedQuestLogic; + uint32 SpellLogic; + uint32 SpellID[4]; + uint32 ItemLogic; + uint32 ItemID[4]; + uint32 Time[2]; + uint32 AuraSpellLogic; + uint32 AuraSpellID[4]; + uint32 AchievementLogic; + uint32 AreaLogic; + uint32 QuestKillLogic; + uint32 QuestKillMonster[6]; + LocalizedString* FailureDescription; + uint32 Unknown700_1; + uint32 Unknown700_2; + uint16 MinLevel; + uint16 MaxLevel; + uint16 ClassMask; + uint16 SkillID[4]; + int16 MinSkill[4]; + int16 MaxSkill[4]; + uint16 MinFactionID[3]; + uint16 MaxFactionID; + uint16 PrevQuestID[4]; + uint16 CurrQuestID[4]; + uint16 CurrentCompletedQuestID[4]; + uint16 Explored[2]; + uint16 WorldStateExpressionID; + uint16 Achievement[4]; + uint16 AreaID[4]; + uint16 QuestKillID; + uint16 PhaseID; + uint16 MinAvgItemLevel; + uint16 MaxAvgItemLevel; + uint16 MinAvgEquippedItemLevel; + uint16 MaxAvgEquippedItemLevel; + uint16 ModifierTreeID; + uint8 Flags; + int8 Gender; + int8 NativeGender; + uint8 LanguageID; + uint8 MinLanguage; + uint8 MaxLanguage; + uint8 MinReputation[3]; + uint8 MaxReputation; + uint8 Unknown1; + uint8 MinPVPRank; + uint8 MaxPVPRank; + uint8 PvpMedal; + uint8 ItemCount[4]; + uint8 ItemFlags; + uint8 AuraCount[4]; + uint8 WeatherID; + uint8 PartyStatus; + uint8 LifetimeMaxPVPRank; + uint8 LfgLogic; + uint8 LfgStatus[4]; + uint8 LfgCompare[4]; + uint8 LfgValue[4]; + uint8 CurrencyLogic; + uint8 CurrencyID[4]; + uint8 CurrencyCount[4]; + int8 MinExpansionLevel; + int8 MaxExpansionLevel; + int8 MinExpansionTier; + int8 MaxExpansionTier; + uint8 MinGuildLevel; + uint8 MaxGuildLevel; + uint8 PhaseUseFlags; + uint8 PhaseGroupID; + int8 ChrSpecializationIndex; + int8 ChrSpecializationRole; + int8 PowerType; + int8 PowerTypeComp; + int8 PowerTypeValue; +}; + +struct PowerDisplayEntry +{ + char const* GlobalStringBaseTag; + uint8 PowerType; + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct QuestFactionRewardEntry +{ + int16 QuestRewFactionValue[10]; }; struct QuestMoneyRewardEntry { - uint32 Level; // 0 - uint32 Money[10]; // 1 + uint32 Money[10]; }; struct QuestPackageItemEntry { - uint32 ID; // 0 - uint32 QuestPackageID; // 1 - uint32 ItemID; // 2 - uint32 ItemCount; // 3 - uint32 FilterType; // 4 + uint32 ItemID; + uint16 QuestPackageID; + uint8 ItemCount; + uint8 FilterType; }; struct QuestSortEntry { - uint32 ID; // 0 - LocalizedString* SortName; // 1 + LocalizedString* SortName; }; struct QuestV2Entry { - uint32 ID; // 0 - uint32 UniqueBitFlag; // 1 + uint16 UniqueBitFlag; }; struct QuestXPEntry { - uint32 ID; // 0 - uint32 Exp[10]; // 1 + uint16 Exp[10]; +}; + +struct RandPropPointsEntry +{ + uint16 EpicPropertiesPoints[5]; + uint16 RarePropertiesPoints[5]; + uint16 UncommonPropertiesPoints[5]; }; struct ScalingStatDistributionEntry { - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemLevelCurveID; // 3 -}; - -struct SoundEntriesEntry -{ - uint32 ID; // 0 - uint32 SoundType; // 1 - LocalizedString* Name; // 2 - uint32 FileDataID[20]; // 3-22 - uint32 Freq[20]; // 23-42 - float VolumeFloat; // 43 - uint32 Flags; // 44 - float MinDistance; // 45 - float DistanceCutoff; // 46 - uint32 EAXDef; // 47 - uint32 SoundEntriesAdvancedID; // 48 - float VolumeVariationPlus; // 49 - float VolumeVariationMinus; // 50 - float PitchVariationPlus; // 51 - float PitchVariationMinus; // 52 - float PitchAdjust; // 53 - uint32 DialogType; // 54 - uint32 BusOverwriteID; // 55 + uint16 ItemLevelCurveID; + uint8 MinLevel; + uint8 MaxLevel; +}; + +struct SkillLineEntry +{ + LocalizedString* DisplayName; + LocalizedString* Description; + LocalizedString* AlternateVerb; + uint16 SpellIconID; + uint16 Flags; + uint8 CategoryID; + uint8 CanLink; + uint8 ParentSkillLineID; +}; + +struct SkillLineAbilityEntry +{ + uint32 SpellID; + uint32 RaceMask; + uint32 ClassMask; + uint32 SupercedesSpell; + uint16 SkillLine; + uint16 MinSkillLineRank; + uint16 TrivialSkillLineRankHigh; + uint16 TrivialSkillLineRankLow; + uint16 UniqueBit; + uint16 TradeSkillCategoryID; + uint8 AquireMethod; + uint8 NumSkillUps; +}; + +struct SkillRaceClassInfoEntry +{ + int32 RaceMask; + uint16 SkillID; + int16 ClassMask; + uint16 Flags; + uint16 SkillTierID; + uint8 Availability; + uint8 MinLevel; +}; + +struct SoundKitEntry +{ + uint32 ID; + uint8 SoundType; + LocalizedString* Name; + float VolumeFloat; + float MinDistance; + float DistanceCutoff; + float VolumeVariationPlus; + float VolumeVariationMinus; + float PitchVariationPlus; + float PitchVariationMinus; + float PitchAdjust; + uint16 Flags; + uint16 SoundEntriesAdvancedID; + uint8 EAXDef; + uint8 DialogType; + uint8 BusOverwriteID; + uint8 Unk700; }; struct SpecializationSpellsEntry { - uint32 ID; // 0 - uint32 SpecID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 OverridesSpellID; // 4 - LocalizedString* Description; // 5 + uint32 ID; + uint32 SpellID; + uint32 OverridesSpellID; + LocalizedString* Description; + uint16 SpecID; + uint8 OrderIndex; +}; + +struct SpellEntry +{ + uint32 ID; + LocalizedString* Name; + LocalizedString* NameSubtext; + LocalizedString* Description; + LocalizedString* AuraDescription; + uint32 MiscID; + uint16 DescriptionVariablesID; +}; + +struct SpellAuraOptionsEntry +{ + uint32 SpellID; + uint32 ProcCharges; + uint32 ProcTypeMask; + uint32 ProcCategoryRecovery; + uint16 CumulativeAura; + uint8 DifficultyID; + uint8 ProcChance; + uint8 SpellProcsPerMinuteID; }; struct SpellAuraRestrictionsEntry { - uint32 ID; // 0 - uint32 CasterAuraState; // 1 - uint32 TargetAuraState; // 2 - uint32 ExcludeCasterAuraState; // 3 - uint32 ExcludeTargetAuraState; // 4 - uint32 CasterAuraSpell; // 5 - uint32 TargetAuraSpell; // 6 - uint32 ExcludeCasterAuraSpell; // 7 - uint32 ExcludeTargetAuraSpell; // 8 + uint32 SpellID; + uint32 CasterAuraSpell; + uint32 TargetAuraSpell; + uint32 ExcludeCasterAuraSpell; + uint32 ExcludeTargetAuraSpell; + uint8 DifficultyID; + uint8 CasterAuraState; + uint8 TargetAuraState; + uint8 ExcludeCasterAuraState; + uint8 ExcludeTargetAuraState; +}; + +struct SpellCastTimesEntry +{ + int32 CastTime; + int32 MinCastTime; + int16 CastTimePerLevel; }; struct SpellCastingRequirementsEntry { - uint32 ID; // 0 - uint32 FacingCasterFlags; // 1 - uint32 MinFactionID; // 1 - uint32 MinReputation; // 3 - uint32 RequiredAreasID; // 4 - uint32 RequiredAuraVision; // 5 - uint32 RequiresSpellFocus; // 6 + uint32 SpellID; + uint16 MinFactionID; + uint16 RequiredAreasID; + uint16 RequiresSpellFocus; + uint8 FacingCasterFlags; + uint8 MinReputation; + uint8 RequiredAuraVision; }; -struct SpellCastTimesEntry +struct SpellCategoriesEntry +{ + uint32 SpellID; + uint16 Category; + uint16 StartRecoveryCategory; + uint16 ChargeCategory; + uint8 DifficultyID; + uint8 DefenseType; + uint8 DispelType; + uint8 Mechanic; + uint8 PreventionType; +}; + +struct SpellCategoryEntry { - uint32 ID; // 0 - int32 CastTime; // 1 - int32 CastTimePerLevel; // 2 - int32 MinCastTime; // 3 + LocalizedString* Name; + int32 ChargeRecoveryTime; + uint8 Flags; + uint8 UsesPerWeek; + uint8 MaxCharges; }; struct SpellClassOptionsEntry { - uint32 ID; // 0 - uint32 ModalNextSpell; // 1 - flag128 SpellClassMask; // 2-5 - uint32 SpellClassSet; // 6 + uint32 SpellID; + flag128 SpellClassMask; + uint16 ModalNextSpell; + uint8 SpellClassSet; +}; + +struct SpellCooldownsEntry +{ + uint32 SpellID; + uint32 CategoryRecoveryTime; + uint32 RecoveryTime; + uint32 StartRecoveryTime; + uint8 DifficultyID; }; struct SpellDurationEntry { - uint32 ID; // 0 - int32 Duration[3]; // 1-3 + int32 Duration; + int32 MaxDuration; + int16 DurationPerLevel; +}; + +struct SpellEffectEntry +{ + uint32 ID; + float EffectAmplitude; + uint32 EffectAuraPeriod; + uint32 EffectBasePoints; + float EffectBonusCoefficient; + float EffectChainAmplitude; + uint32 EffectDieSides; + uint32 EffectItemType; + int32 EffectMiscValue; + int32 EffectMiscValueB; + float EffectPointsPerResource; + float EffectRealPointsPerLevel; + flag128 EffectSpellClassMask; + uint32 EffectTriggerSpell; + float EffectPosFacing; + uint32 SpellID; + uint32 EffectAttributes; + float BonusCoefficientFromAP; + uint16 EffectAura; + uint16 EffectChainTargets; + uint8 DifficultyID; + uint8 Effect; + uint8 EffectMechanic; + uint8 EffectRadiusIndex; + uint8 EffectRadiusMaxIndex; + uint8 ImplicitTarget[2]; + uint8 EffectIndex; +}; + +#define MAX_SPELL_EFFECTS 32 +#define MAX_EFFECT_MASK 0xFFFFFFFF + +struct SpellEffectScalingEntry +{ + float Coefficient; + float Variance; + float ResourceCoefficient; + uint32 SpellEffectID; +}; + +struct SpellEquippedItemsEntry +{ + uint32 SpellID; + int32 EquippedItemInventoryTypeMask; + int32 EquippedItemSubClassMask; + int8 EquippedItemClass; +}; + +struct SpellFocusObjectEntry +{ + LocalizedString* Name; +}; + +struct SpellInterruptsEntry +{ + uint32 SpellID; + uint32 AuraInterruptFlags[2]; + uint32 ChannelInterruptFlags[2]; + uint16 InterruptFlags; + uint8 DifficultyID; }; struct SpellItemEnchantmentConditionEntry { - uint32 ID; // 0 - uint8 LTOperandType[5]; // 1-2 - uint32 LTOperand[5]; // 2-6 - uint8 Operator[5]; // 7-8 - uint8 RTOperandType[5]; // 8-9 - uint32 RTOperand[5]; // 10-14 - uint8 Logic[5]; // 15-16 + uint8 LTOperandType[5]; + uint8 LTOperand[5]; + uint8 Operator[5]; + uint8 RTOperandType[5]; + uint8 RTOperand[5]; + uint8 Logic[5]; }; struct SpellLearnSpellEntry { - uint32 ID; // 0 - uint32 LearnSpellID; // 1 - uint32 SpellID; // 2 - uint32 OverridesSpellID; // 3 + uint32 LearnSpellID; + uint32 SpellID; + uint32 OverridesSpellID; +}; + +struct SpellLevelsEntry +{ + uint32 SpellID; + uint16 BaseLevel; + uint16 MaxLevel; + uint16 SpellLevel; + uint8 DifficultyID; }; struct SpellMiscEntry { - uint32 ID; // 0 - uint32 Attributes; // 1 - uint32 AttributesEx; // 2 - uint32 AttributesExB; // 3 - uint32 AttributesExC; // 4 - uint32 AttributesExD; // 5 - uint32 AttributesExE; // 6 - uint32 AttributesExF; // 7 - uint32 AttributesExG; // 8 - uint32 AttributesExH; // 9 - uint32 AttributesExI; // 10 - uint32 AttributesExJ; // 11 - uint32 AttributesExK; // 12 - uint32 AttributesExL; // 13 - uint32 AttributesExM; // 14 - uint32 CastingTimeIndex; // 15 - uint32 DurationIndex; // 16 - uint32 RangeIndex; // 17 - float Speed; // 18 - uint32 SpellIconID; // 21 - uint32 ActiveIconID; // 22 - uint32 SchoolMask; // 23 - float MultistrikeSpeedMod; // 24 + uint32 Attributes; + uint32 AttributesEx; + uint32 AttributesExB; + uint32 AttributesExC; + uint32 AttributesExD; + uint32 AttributesExE; + uint32 AttributesExF; + uint32 AttributesExG; + uint32 AttributesExH; + uint32 AttributesExI; + uint32 AttributesExJ; + uint32 AttributesExK; + uint32 AttributesExL; + uint32 AttributesExM; + float Speed; + float MultistrikeSpeedMod; + uint16 CastingTimeIndex; + uint16 DurationIndex; + uint16 RangeIndex; + uint16 SpellIconID; + uint16 ActiveIconID; + uint8 SchoolMask; }; struct SpellPowerEntry { - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 PowerIndex; // 2 - uint32 PowerType; // 3 - uint32 ManaCost; // 4 - uint32 ManaCostPerLevel; // 5 - uint32 ManaCostPerSecond; // 6 - uint32 ManaCostAdditional; // 7 Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource + uint32 ID; + uint32 SpellID; + uint32 ManaCost; + float ManaCostPercentage; + float ManaCostPercentagePerSecond; + uint32 RequiredAura; + float HealthCostPercentage; + uint16 ManaCostPerSecond; + uint16 ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG - uint32 PowerDisplayID; // 8 - uint32 UnitPowerBarID; // 9 - float ManaCostPercentage; // 10 - float ManaCostPercentagePerSecond; // 11 - uint32 RequiredAura; // 12 - float HealthCostPercentage; // 13 + uint16 PowerDisplayID; + uint16 UnitPowerBarID; + uint8 PowerIndex; + uint8 PowerType; + uint8 ManaCostPerLevel; }; struct SpellPowerDifficultyEntry { - uint32 SpellPowerID; // 0 - uint32 DifficultyID; // 1 - uint32 PowerIndex; // 2 + uint32 SpellPowerID; + uint8 DifficultyID; + uint8 PowerIndex; }; struct SpellProcsPerMinuteEntry @@ -1279,173 +1583,213 @@ struct SpellProcsPerMinuteModEntry struct SpellRadiusEntry { - uint32 ID; // 0 - float Radius; // 1 - float RadiusPerLevel; // 2 - float RadiusMin; // 3 - float RadiusMax; // 4 + float Radius; + float RadiusPerLevel; + float RadiusMin; + float RadiusMax; }; struct SpellRangeEntry { - uint32 ID; // 0 - float MinRangeHostile; // 1 - float MinRangeFriend; // 2 - float MaxRangeHostile; // 3 - float MaxRangeFriend; // 4 - uint32 Flags; // 5 - LocalizedString* DisplayName; // 6 - LocalizedString* DisplayNameShort; // 7 + float MinRangeHostile; + float MinRangeFriend; + float MaxRangeHostile; + float MaxRangeFriend; + LocalizedString* DisplayName; + LocalizedString* DisplayNameShort; + uint8 Flags; }; #define MAX_SPELL_REAGENTS 8 struct SpellReagentsEntry { - uint32 ID; // 0 - int32 Reagent[MAX_SPELL_REAGENTS]; // 1-8 - uint32 ReagentCount[MAX_SPELL_REAGENTS]; // 9-16 + uint32 SpellID; + int32 Reagent[MAX_SPELL_REAGENTS]; + uint16 ReagentCount[MAX_SPELL_REAGENTS]; +}; + +struct SpellScalingEntry +{ + uint32 SpellID; + uint16 ScalesFromItemLevel; + int8 ScalingClass; + uint8 MaxScalingLevel; +}; + +struct SpellShapeshiftEntry +{ + uint32 SpellID; + uint32 ShapeshiftExclude[2]; + uint32 ShapeshiftMask[2]; + uint8 StanceBarOrder; }; -struct SpellRuneCostEntry +#define MAX_SHAPESHIFT_SPELLS 8 + +struct SpellShapeshiftFormEntry { - uint32 ID; // 0 - uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) - uint32 RunicPower; // 5 + LocalizedString* Name; + float WeaponDamageVariance; + uint32 Flags; + uint16 AttackIconID; + uint16 CombatRoundTime; + uint16 CreatureDisplayID[4]; + uint16 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; + int8 CreatureType; + uint8 MountTypeID; + uint8 BonusActionBar; +}; - bool NoRuneCost() const { return RuneCost[0] == 0 && RuneCost[1] == 0 && RuneCost[2] == 0 && RuneCost[3] == 0; } - bool NoRunicPowerGain() const { return RunicPower == 0; } +struct SpellTargetRestrictionsEntry +{ + uint32 SpellID; + float ConeAngle; + float Width; + uint32 Targets; + uint16 MaxTargetLevel; + uint16 TargetCreatureType; + uint8 DifficultyID; + uint8 MaxAffectedTargets; }; #define MAX_SPELL_TOTEMS 2 struct SpellTotemsEntry { - uint32 ID; // 0 - uint32 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; // 1 - uint32 Totem[MAX_SPELL_TOTEMS]; // 2 + uint32 SpellID; + uint32 Totem[MAX_SPELL_TOTEMS]; + uint8 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; }; struct SpellXSpellVisualEntry { - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 SpellVisualID[2]; // 3-4 - float Unk620; // 5 - uint32 PlayerConditionID; // 6 - uint32 Flags; // 7 + uint32 ID; + uint32 SpellID; + float Unk620; + uint16 SpellVisualID[2]; + uint16 PlayerConditionID; + uint8 DifficultyID; + uint8 Flags; }; struct TaxiNodesEntry { - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Pos; // 2-4 - LocalizedString* Name; // 5 - uint32 MountCreatureID[2]; // 6-7 - uint32 ConditionID; // 8 - uint32 LearnableIndex; // 9 - some kind of index only for learnable nodes - uint32 Flags; // 10 - DBCPosition2D MapOffset; // 11-12 + uint32 ID; + DBCPosition3D Pos; + LocalizedString* Name; + uint32 MountCreatureID[2]; + DBCPosition2D MapOffset; + uint16 MapID; + uint16 ConditionID; + uint16 LearnableIndex; + uint8 Flags; }; struct TaxiPathEntry { - uint32 ID; // 0 - uint32 From; // 1 - uint32 To; // 2 - uint32 Cost; // 3 + uint32 ID; + uint16 From; + uint16 To; + uint16 Cost; }; struct TaxiPathNodeEntry { - uint32 ID; // 0 - uint32 PathID; // 1 - uint32 NodeIndex; // 2 - uint32 MapID; // 3 - DBCPosition3D Loc; // 4-6 - uint32 Flags; // 7 - uint32 Delay; // 8 - uint32 ArrivalEventID; // 9 - uint32 DepartureEventID; // 10 + uint32 ID; + DBCPosition3D Loc; + uint32 Delay; + uint16 PathID; + uint16 MapID; + uint16 ArrivalEventID; + uint16 DepartureEventID; + uint8 NodeIndex; + uint8 Flags; }; struct TotemCategoryEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 CategoryType; // 2 - uint32 CategoryMask; // 3 + LocalizedString* Name; + uint32 CategoryMask; + uint8 CategoryType; }; struct ToyEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 Flags; // 2 - LocalizedString* Description; // 3 - uint32 CategoryFilter; // 4 + uint32 ID; + uint32 ItemID; + LocalizedString* Description; + uint8 Flags; + uint8 CategoryFilter; }; struct TransportAnimationEntry { - uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - DBCPosition3D Pos; // 3-5 - uint32 SequenceID; // 6 + uint32 TransportID; + uint32 TimeIndex; + DBCPosition3D Pos; + uint8 SequenceID; }; struct TransportRotationEntry { - uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - float X; // 3 - float Y; // 4 - float Z; // 5 - float W; // 6 + uint32 TransportID; + uint32 TimeIndex; + float X; + float Y; + float Z; + float W; }; struct UnitPowerBarEntry { - uint32 ID; // 0 - uint32 MinPower; // 1 - uint32 MaxPower; // 2 - uint32 StartPower; // 3 - uint32 CenterPower; // 4 - float RegenerationPeace; // 5 - float RegenerationCombat; // 6 - uint32 BarType; // 7 - uint32 FileDataID[6]; // 8-13 - uint32 Color[6]; // 14-19 - uint32 Flags; // 20 - LocalizedString* Name; // 21 - LocalizedString* Cost; // 22 - LocalizedString* OutOfError; // 23 - LocalizedString* ToolTip; // 24 - float StartInset; // 25 - float EndInset; // 26 + uint32 MaxPower; + float RegenerationPeace; + float RegenerationCombat; + uint32 FileDataID[6]; + uint32 Color[6]; + LocalizedString* Name; + LocalizedString* Cost; + LocalizedString* OutOfError; + LocalizedString* ToolTip; + float StartInset; + float EndInset; + uint16 StartPower; + uint16 Flags; + uint8 MinPower; + uint8 CenterPower; + uint8 BarType; }; #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 struct WorldMapOverlayEntry { - uint32 ID; // 0 - uint32 MapAreaID; // 1 idx in WorldMapArea.dbc - uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; // 2-5 - LocalizedString* TextureName; // 6 - uint32 TextureWidth; // 7 - uint32 TextureHeight; // 8 - uint32 OffsetX; // 9 - uint32 OffsetY; // 10 - uint32 HitRectTop; // 11 - uint32 HitRectLeft; // 12 - uint32 HitRectBottom; // 13 - uint32 HitRectRight; // 14 - uint32 PlayerConditionID; // 15 + char const* TextureName; + uint16 MapAreaID; // idx in WorldMapArea.dbc + uint16 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; + uint16 TextureWidth; + uint16 TextureHeight; + uint16 OffsetX; + uint16 OffsetY; + uint16 HitRectTop; + uint16 HitRectLeft; + uint16 HitRectBottom; + uint16 HitRectRight; + uint16 PlayerConditionID; +}; + +struct WorldMapTransformsEntry +{ + DBCPosition3D RegionMin; + DBCPosition3D RegionMax; + DBCPosition2D RegionOffset; + float RegionScale; + uint16 MapID; + uint16 NewMapID; + uint16 NewDungeonMapID; + uint16 NewAreaID; + uint8 Flags; }; #pragma pack(pop) @@ -1465,7 +1809,7 @@ typedef std::map TaxiPathSetBySource; typedef std::vector TaxiPathNodeList; typedef std::vector TaxiPathNodesByPath; -#define TaxiMaskSize 217 +#define TaxiMaskSize 226 typedef std::array TaxiMask; #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 2a64a2d4eb5..1e8c3be57ea 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -18,113 +18,154 @@ #ifndef TRINITY_DB2SFRM_H #define TRINITY_DB2SFRM_H -char const AchievementFormat[] = "niiissiiiiisiii"; -char const AreaGroupMemberFormat[] = "nii"; -char const AuctionHouseFormat[] = "niiis"; -char const BarberShopStyleFormat[] = "nissfiii"; -char const BattlePetBreedQualityFormat[] = "nif"; -char const BattlePetBreedStateFormat[] = "niii"; -char const BattlePetSpeciesFormat[] = "niiiiiiss"; -char const BattlePetSpeciesStateFormat[] = "niii"; -char const BroadcastTextFormat[] = "nissiiiiiiiii"; -char const CharStartOutfitFormat[] = "nbbbbiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const ChrClassesXPowerTypesFormat[] = "iii"; -char const CinematicSequencesFormat[] = "niiiiiiiii"; -char const CreatureDisplayInfoFormat[] = "niiiffissssiiiiiiiiiii"; -char const CreatureTypeFormat[] = "nsi"; -char const CriteriaFormat[] = "niiiiiiiiiii"; -char const CriteriaTreeFormat[] = "niliiisi"; -char const CurrencyTypesFormat[] = "nisssiiiiiis"; -char const CurvePointFormat[] = "niiff"; -char const DestructibleModelDataFormat[] = "niiiiiiiiiiiiiiiiiiiiiii"; -char const DurabilityQualityFormat[] = "nf"; -char const GameObjectsFormat[] = "niiffffffffiiiiiiiiiiiis"; -char const GameTablesFormat[] = "nsii"; -char const GarrAbilityFormat[] = "nissiiii"; -char const GarrBuildingFormat[] = "niiiiissssiiiiiiiiiiiiii"; -char const GarrBuildingPlotInstFormat[] = "niiiff"; -char const GarrClassSpecFormat[] = "nsssii"; -char const GarrFollowerFormat[] = "niiiiiiiiiiiiiiissiiiiii"; -char const GarrFollowerXAbilityFormat[] = "niii"; -char const GarrPlotBuildingFormat[] = "nii"; -char const GarrPlotFormat[] = "niiisiiii"; -char const GarrPlotInstanceFormat[] = "nis"; -char const GarrSiteLevelFormat[] = "niiiiffiiii"; -char const GarrSiteLevelPlotInstFormat[] = "niiffi"; -char const GlyphSlotFormat[] = "nii"; -char const HeirloomFormat[] = "niisiiiiiiii"; -char const GuildPerkSpellsFormat[] = "nii"; -char const HolidaysEntryFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const ImportPriceArmorFormat[] = "nffff"; -char const ImportPriceQualityFormat[] = "nf"; -char const ImportPriceShieldFormat[] = "nf"; -char const ImportPriceWeaponFormat[] = "nf"; -char const ItemAppearanceFormat[] = "nii"; -char const ItemBonusFormat[] = "niiiii"; -char const ItemBonusTreeNodeFormat[] = "niiii"; -char const ItemClassFormat[] = "nifs"; -char const ItemCurrencyCostFormat[] = "in"; -char const ItemDisenchantLootFormat[] = "niiiiii"; -char const ItemEffectFormat[] = "niiiiiiiii"; -char const ItemExtendedCostFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const ItemFormat[] = "niiiiiiii"; -char const ItemLimitCategoryFormat[] = "nsii"; -char const ItemModifiedAppearanceFormat[] = "niiiii"; -char const ItemPriceBaseFormat[] = "niff"; -char const ItemRandomPropertiesFormat[] = "nsiiiiis"; -char const ItemRandomSuffixFormat[] = "nssiiiiiiiiii"; -char const ItemSparseFormat[] = "niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffffffiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii"; -char const ItemSpecFormat[] = "niiiiii"; -char const ItemSpecOverrideFormat[] = "nii"; -char const ItemToBattlePetSpeciesFormat[] = "ni"; -char const ItemXBonusTreeFormat[] = "nii"; -char const KeyChainFormat[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const MailTemplateFormat[] = "ns"; -char const ModifierTreeFormat[] = "niiiiii"; -char const MountCapabilityFormat[] = "niiiiiii"; -char const MountFormat[] = "niiiisssii"; -char const MountTypeXCapabilityFormat[] = "niii"; -char const NameGenFormat[] = "nsii"; -char const NamesProfanityFormat[] = "nSi"; -char const NamesReservedFormat[] = "nS"; -char const NamesReservedLocaleFormat[] = "nSi"; -char const OverrideSpellDataFormat[] = "niiiiiiiiiiii"; -char const PhaseXPhaseGroupFormat[] = "nii"; -char const PlayerConditionFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const QuestMoneyRewardFormat[] = "niiiiiiiiii"; -char const QuestPackageItemfmt[] = "niiii"; -char const QuestSortFormat[] = "ns"; -char const QuestV2Format[] = "ni"; -char const QuestXPFormat[] = "niiiiiiiiii"; -char const ScalingStatDistributionFormat[] = "niii"; -char const SoundEntriesFormat[] = "nisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiififfiifffffii"; -char const SpecializationSpellsFormat[] = "niiiis"; -char const SpellAuraRestrictionsFormat[] = "niiiiiiii"; -char const SpellCastTimesFormat[] = "niii"; -char const SpellCastingRequirementsFormat[] = "niiiiii"; -char const SpellClassOptionsFormat[] = "niiiiii"; -char const SpellDurationFormat[] = "niii"; -char const SpellItemEnchantmentConditionFormat[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; -char const SpellLearnSpellFormat[] = "niii"; -char const SpellMiscFormat[] = "niiiiiiiiiiiiiiiiifiiif"; -char const SpellPowerDifficultyFormat[] = "nii"; -char const SpellPowerFormat[] = "niiiiiiiiiffif"; -char const SpellProcsPerMinuteFormat[] = "nfi"; -char const SpellProcsPerMinuteModFormat[] = "niifi"; -char const SpellRadiusFormat[] = "nffff"; -char const SpellRangeFormat[] = "nffffiss"; -char const SpellReagentsFormat[] = "niiiiiiiiiiiiiiii"; -char const SpellRuneCostFormat[] = "niiiii"; -char const SpellTotemsFormat[] = "niiii"; -char const SpellXSpellVisualFormat[] = "niiiifii"; -char const TaxiNodesFormat[] = "nifffsiiiiiff"; -char const TaxiPathFormat[] = "niii"; -char const TaxiPathNodeFormat[] = "niiifffiiii"; -char const TotemCategoryFormat[] = "nsii"; -char const ToyFormat[] = "niisi"; -char const TransportAnimationFormat[] = "niifffi"; -char const TransportRotationFormat[] = "niiffff"; -char const UnitPowerBarFormat[] = "niiiiffiiiiiiiiiiiiiissssff"; -char const WorldMapOverlayFormat[] = "niiiiisiiiiiiiii"; +char const AchievementFormat[] = "nssishhhhhhhbbb"; +char const AnimKitFormat[] = "dihh"; +char const AreaGroupMemberFormat[] = "dhh"; +char const ArmorLocationFormat[] = "dfffff"; +char const AuctionHouseFormat[] = "dshbb"; +char const BankBagSlotPricesFormat[] = "di"; +char const BarberShopStyleFormat[] = "nssfbbbb"; +char const BattlePetBreedQualityFormat[] = "dfb"; +char const BattlePetBreedStateFormat[] = "nhbb"; +char const BattlePetSpeciesFormat[] = "niiisshbb"; +char const BattlePetSpeciesStateFormat[] = "nihb"; +char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; +char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; +char const ChrClassesXPowerTypesFormat[] = "dbb"; +char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb"; +char const CinematicSequencesFormat[] = "dhhhhhhhhh"; +char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb"; +char const CreatureDisplayInfoExtraFormat[] = "diiiiiiiiiiiibbbbbbbbbbbb"; +char const CreatureTypeFormat[] = "dsb"; +char const CriteriaFormat[] = "diiihhhbbbbb"; +char const CriteriaTreeFormat[] = "dishhhhb"; +char const CurrencyTypesFormat[] = "nSSsiiisbbbb"; +char const CurvePointFormat[] = "dffhb"; +char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb"; +char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; +char const DurabilityQualityFormat[] = "df"; +char const EmotesTextSoundFormat[] = "dhhbbb"; +char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; +char const GameObjectDisplayInfoFormat[] = "diffffffffhhhhhhhhhhh"; +char const GameTablesFormat[] = "dshb"; +char const GarrAbilityFormat[] = "nssihbbb"; +char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb"; +char const GarrBuildingPlotInstFormat[] = "nffhhb"; +char const GarrClassSpecFormat[] = "nssshb"; +char const GarrFollowerFormat[] = "diissiihhbbbbbbbbbbbbbbbb"; +char const GarrFollowerXAbilityFormat[] = "dhhb"; +char const GarrPlotFormat[] = "dsiibbbbb"; +char const GarrPlotBuildingFormat[] = "dbb"; +char const GarrPlotInstanceFormat[] = "dsb"; +char const GarrSiteLevelFormat[] = "dffhhhbbbbb"; +char const GarrSiteLevelPlotInstFormat[] = "dffhbb"; +char const GlyphSlotFormat[] = "dbb"; +char const GuildColorBackgroundFormat[] = "dbbb"; +char const GuildColorBorderFormat[] = "dbbb"; +char const GuildColorEmblemFormat[] = "dbbb"; +char const GuildPerkSpellsFormat[] = "dib"; +char const HeirloomFormat[] = "nisiiiiihhbb"; +char const HolidaysEntryFormat[] = "diiiiiiiiiiiiiiiiShhhhhhhhhhhbbbbbbbbbbbbbbbb"; +char const ImportPriceArmorFormat[] = "dffff"; +char const ImportPriceQualityFormat[] = "df"; +char const ImportPriceShieldFormat[] = "df"; +char const ImportPriceWeaponFormat[] = "df"; +char const ItemFormat[] = "dibbbbbbb"; +char const ItemAppearanceFormat[] = "diib"; +char const ItemArmorQualityFormat[] = "dfffffffh"; +char const ItemArmorShieldFormat[] = "dfffffffh"; +char const ItemArmorTotalFormat[] = "dffffh"; +char const ItemBagFamilyFormat[] = "ds"; +char const ItemBonusFormat[] = "niihbb"; +char const ItemBonusTreeNodeFormat[] = "dhhhb"; +char const ItemClassFormat[] = "dfsb"; +char const ItemCurrencyCostFormat[] = "di"; +char const ItemDamageAmmoFormat[] = "dfffffffh"; +char const ItemDamageOneHandFormat[] = "dfffffffh"; +char const ItemDamageOneHandCasterFormat[] = "dfffffffh"; +char const ItemDamageTwoHandFormat[] = "dfffffffh"; +char const ItemDamageTwoHandCasterFormat[] = "dfffffffh"; +char const ItemDisenchantLootFormat[] = "dhhhbbb"; +char const ItemEffectFormat[] = "diiiihhhbb"; +char const ItemExtendedCostFormat[] = "diiiiiiiiiiihhhhhhhhhhhbbbbb"; +char const ItemLimitCategoryFormat[] = "dsbb"; +char const ItemModifiedAppearanceFormat[] = "nihbb"; +char const ItemPriceBaseFormat[] = "dffh"; +char const ItemRandomPropertiesFormat[] = "dshhhhh"; +char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh"; +char const ItemSetSpellFormat[] = "dihhb"; +char const ItemSparseFormat[] = "iiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const ItemSpecFormat[] = "dhbbbbb"; +char const ItemSpecOverrideFormat[] = "dih"; +char const ItemToBattlePetSpeciesFormat[] = "dh"; +char const ItemXBonusTreeFormat[] = "dih"; +char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const MailTemplateFormat[] = "ds"; +char const ModifierTreeFormat[] = "diihbbbb"; +char const MountFormat[] = "niissshhhb"; +char const MountCapabilityFormat[] = "niihhhbb"; +char const MountTypeXCapabilityFormat[] = "dhhb"; +char const MovieFormat[] = "diibb"; +char const NameGenFormat[] = "dsbb"; +char const NamesProfanityFormat[] = "dSb"; +char const NamesReservedFormat[] = "dS"; +char const NamesReservedLocaleFormat[] = "dSb"; +char const OverrideSpellDataFormat[] = "diiiiiiiiiiib"; +char const PhaseXPhaseGroupFormat[] = "dhh"; +char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const PowerDisplayFormat[] = "dSbbbb"; +char const QuestFactionRewardFormat[] = "dhhhhhhhhhh"; +char const QuestMoneyRewardFormat[] = "diiiiiiiiii"; +char const QuestPackageItemFormat[] = "dihbb"; +char const QuestSortFormat[] = "ds"; +char const QuestV2Format[] = "dh"; +char const QuestXPFormat[] = "dhhhhhhhhhh"; +char const RandPropPointsFormat[] = "dhhhhhhhhhhhhhhh"; +char const ScalingStatDistributionFormat[] = "dhbb"; +char const SkillLineFormat[] = "dssshhbbb"; +char const SkillLineAbilityFormat[] = "diiiihhhhhhbb"; +char const SkillRaceClassInfoFormat[] = "dihhhhbb"; +char const SoundKitFormat[] = "nsffffffffhhbbbbb"; +char const SpecializationSpellsFormat[] = "niishb"; +char const SpellFormat[] = "nssssih"; +char const SpellAuraOptionsFormat[] = "diiiihbbb"; +char const SpellAuraRestrictionsFormat[] = "diiiiibbbbb"; +char const SpellCastTimesFormat[] = "diih"; +char const SpellCastingRequirementsFormat[] = "dihhhbbb"; +char const SpellCategoriesFormat[] = "dihhhbbbbb"; +char const SpellCategoryFormat[] = "dsibbb"; +char const SpellClassOptionsFormat[] = "diiiiihb"; +char const SpellCooldownsFormat[] = "diiiib"; +char const SpellDurationFormat[] = "diih"; +char const SpellEffectFormat[] = "nfiiffiiiiffiiiiifiifhhbbbbbbbb"; +char const SpellEffectScalingFormat[] = "dfffi"; +char const SpellEquippedItemsFormat[] = "diiib"; +char const SpellFocusObjectFormat[] = "ds"; +char const SpellInterruptsFormat[] = "diiiiihb"; +char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const SpellLearnSpellFormat[] = "diii"; +char const SpellLevelsFormat[] = "dihhhb"; +char const SpellMiscFormat[] = "diiiiiiiiiiiiiiffhhhhhb"; +char const SpellPowerFormat[] = "niiffifhhhhbbb"; +char const SpellPowerDifficultyFormat[] = "nbb"; +char const SpellRadiusFormat[] = "dffff"; +char const SpellRangeFormat[] = "dffffssb"; +char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh"; +char const SpellScalingFormat[] = "dihbb"; +char const SpellShapeshiftFormat[] = "diiiiib"; +char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb"; +char const SpellTargetRestrictionsFormat[] = "diffihhbb"; +char const SpellTotemsFormat[] = "diiibb"; +char const SpellXSpellVisualFormat[] = "nifhhhbb"; +char const TaxiNodesFormat[] = "nfffsiiffhhhb"; +char const TaxiPathFormat[] = "nhhh"; +char const TaxiPathNodeFormat[] = "nfffihhhhbb"; +char const TotemCategoryFormat[] = "dsib"; +char const ToyFormat[] = "nisbb"; +char const TransportAnimationFormat[] = "diifffb"; +char const TransportRotationFormat[] = "diiffff"; +char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb"; +char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhh"; +char const WorldMapTransformsFormat[] = "dfffffffffhhhhb"; #endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 710e92ca712..739b4ac51a0 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -436,6 +436,7 @@ enum Difficulty : uint8 DIFFICULTY_EVENT_SCENARIO = 20, DIFFICULTY_MYTHIC = 23, DIFFICULTY_TIMEWALKER = 24, + DIFFICULTY_PVP_SCENARIO = 25, MAX_DIFFICULTY }; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 79c42c4fc7b..0e0375826ce 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -23,10 +23,8 @@ #include "DBCfmt.h" #include "Timer.h" #include "DB2Stores.h" - #include - struct WMOAreaTableTripple { WMOAreaTableTripple(int32 r, int32 a, int32 g) : groupId(g), rootId(r), adtId(a) @@ -48,12 +46,9 @@ typedef std::multimap CharSectionsMap; typedef std::map> FactionTeamMap; typedef std::map WMOAreaInfoByTripple; -DBCStorage sAnimKitStore(AnimKitfmt); DBCStorage sAreaTableStore(AreaTablefmt); DBCStorage sAreaTriggerStore(AreaTriggerfmt); -DBCStorage sArmorLocationStore(ArmorLocationfmt); -DBCStorage sBankBagSlotPricesStore(BankBagSlotPricesfmt); DBCStorage sBannedAddOnsStore(BannedAddOnsfmt); DBCStorage sBattlemasterListStore(BattlemasterListfmt); @@ -62,48 +57,24 @@ CharSectionsMap sCharSectionMap; DBCStorage sCharTitlesStore(CharTitlesfmt); DBCStorage sChatChannelsStore(ChatChannelsfmt); DBCStorage sChrClassesStore(ChrClassesfmt); -DBCStorage sChrRacesStore(ChrRacesfmt); DBCStorage sChrSpecializationStore(ChrSpecializationfmt); ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -DBCStorage sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt); DBCStorage sCreatureFamilyStore(CreatureFamilyfmt); DBCStorage sCreatureModelDataStore(CreatureModelDatafmt); DBCStorage sDifficultyStore(DifficultyFmt); DBCStorage sDungeonEncounterStore(DungeonEncounterfmt); -DBCStorage sDurabilityCostsStore(DurabilityCostsfmt); DBCStorage sEmotesStore(Emotesfmt); DBCStorage sEmotesTextStore(EmotesTextfmt); -typedef std::tuple EmotesTextSoundKey; -static std::map sEmotesTextSoundMap; -DBCStorage sEmotesTextSoundStore(EmotesTextSoundEntryfmt); DBCStorage sFactionStore(Factionfmt); static FactionTeamMap sFactionTeamMap; DBCStorage sFactionTemplateStore(FactionTemplatefmt); -DBCStorage sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); DBCStorage sGemPropertiesStore(GemPropertiesfmt); DBCStorage sGlyphPropertiesStore(GlyphPropertiesfmt); -DBCStorage sGuildColorBackgroundStore(GuildColorBackgroundfmt); -DBCStorage sGuildColorBorderStore(GuildColorBorderfmt); -DBCStorage sGuildColorEmblemStore(GuildColorEmblemfmt); -DBCStorage sItemArmorQualityStore(ItemArmorQualityfmt); -DBCStorage sItemArmorShieldStore(ItemArmorShieldfmt); -DBCStorage sItemArmorTotalStore(ItemArmorTotalfmt); -DBCStorage sItemBagFamilyStore(ItemBagFamilyfmt); -DBCStorage sItemDamageAmmoStore(ItemDamagefmt); -DBCStorage sItemDamageOneHandCasterStore(ItemDamagefmt); -DBCStorage sItemDamageOneHandStore(ItemDamagefmt); -DBCStorage sItemDamageRangedStore(ItemDamagefmt); -DBCStorage sItemDamageThrownStore(ItemDamagefmt); -DBCStorage sItemDamageTwoHandCasterStore(ItemDamagefmt); -DBCStorage sItemDamageTwoHandStore(ItemDamagefmt); -DBCStorage sItemDamageWandStore(ItemDamagefmt); DBCStorage sItemSetStore(ItemSetfmt); -DBCStorage sItemSetSpellStore(ItemSetSpellfmt); -ItemSetSpellsStore sItemSetSpellsStore; DBCStorage sLFGDungeonStore(LFGDungeonfmt); DBCStorage sLightStore(Lightfmt); @@ -113,37 +84,11 @@ DBCStorage sLockStore(Lockfmt); DBCStorage sMapStore(Mapfmt); DBCStorage sMapDifficultyStore(MapDifficultyfmt); // only for loading MapDifficultyMap sMapDifficultyMap; -DBCStorage sMovieStore(Moviefmt); DBCStorage sPhaseStore(Phasefmt); -DBCStorage sPowerDisplayStore(PowerDisplayfmt); DBCStorage sPvpDifficultyStore(PvpDifficultyfmt); -DBCStorage sQuestFactionRewardStore(QuestFactionRewardfmt); - -DBCStorage sRandomPropertiesPointsStore(RandPropPointsfmt); - -DBCStorage sSkillLineAbilityStore(SkillLineAbilityfmt); -DBCStorage sSkillLineStore(SkillLinefmt); -DBCStorage sSkillRaceClassInfoStore(SkillRaceClassInfofmt); -SkillRaceClassInfoMap SkillRaceClassInfoBySkill; -DBCStorage sSpellAuraOptionsStore(SpellAuraOptionsfmt); -DBCStorage sSpellCategoriesStore(SpellCategoriesfmt); -DBCStorage sSpellCategoryStore(SpellCategoryfmt); -DBCStorage sSpellCooldownsStore(SpellCooldownsfmt); -DBCStorage sSpellEffectStore(SpellEffectfmt); -DBCStorage sSpellEffectScalingStore(SpellEffectScalingfmt); -SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -DBCStorage sSpellStore(Spellfmt); -DBCStorage sSpellEquippedItemsStore(SpellEquippedItemsfmt); -DBCStorage sSpellFocusObjectStore(SpellFocusObjectfmt); -DBCStorage sSpellInterruptsStore(SpellInterruptsfmt); DBCStorage sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); -DBCStorage sSpellLevelsStore(SpellLevelsfmt); -DBCStorage sSpellScalingStore(SpellScalingfmt); -DBCStorage sSpellShapeshiftStore(SpellShapeshiftfmt); -DBCStorage sSpellShapeshiftFormStore(SpellShapeshiftFormfmt); -DBCStorage sSpellTargetRestrictionsStore(SpellTargetRestrictionsfmt); DBCStorage sSummonPropertiesStore(SummonPropertiesfmt); DBCStorage sTalentStore(Talentfmt); @@ -155,30 +100,24 @@ DBCStorage sVehicleSeatStore(VehicleSeatfmt); DBCStorage sWMOAreaTableStore(WMOAreaTablefmt); static WMOAreaInfoByTripple sWMOAreaInfoByTripple; DBCStorage sWorldMapAreaStore(WorldMapAreafmt); -DBCStorage sWorldMapTransformsStore(WorldMapTransformsfmt); DBCStorage sWorldSafeLocsStore(WorldSafeLocsfmt); -GameTable sGtArmorMitigationByLvlStore(GtArmorMitigationByLvlfmt); -GameTable sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); -GameTable sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); -GameTable sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); -GameTable sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); -GameTable sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); -GameTable sGtCombatRatingsStore(GtCombatRatingsfmt); -GameTable sGtItemSocketCostPerLevelStore(GtItemSocketCostPerLevelfmt); -GameTable sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); -GameTable sGtNpcTotalHpStore(GtNpcTotalHpfmt); -GameTable sGtNpcTotalHpExp1Store(GtNpcTotalHpExp1fmt); -GameTable sGtNpcTotalHpExp2Store(GtNpcTotalHpExp2fmt); -GameTable sGtNpcTotalHpExp3Store(GtNpcTotalHpExp3fmt); -GameTable sGtNpcTotalHpExp4Store(GtNpcTotalHpExp4fmt); -GameTable sGtNpcTotalHpExp5Store(GtNpcTotalHpExp5fmt); -GameTable sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); -GameTable sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); -GameTable sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); -GameTable sGtOCTLevelExperienceStore(GtOCTLevelExperiencefmt); -GameTable sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); -GameTable sGtSpellScalingStore(GtSpellScalingfmt); +GameTable sGtBarberShopCostBaseStore; +GameTable sGtChanceToMeleeCritBaseStore; +GameTable sGtChanceToMeleeCritStore; +GameTable sGtChanceToSpellCritBaseStore; +GameTable sGtChanceToSpellCritStore; +GameTable sGtCombatRatingsStore; +GameTable sGtItemSocketCostPerLevelStore; +GameTable sGtNPCManaCostScalerStore; +GameTable sGtNpcTotalHpStore[MAX_EXPANSIONS]; +GameTable sGtNpcDamageByClassStore[MAX_EXPANSIONS]; +GameTable sGtOCTBaseHPByClassStore; +GameTable sGtOCTBaseMPByClassStore; +GameTable sGtOCTHpPerStaminaStore; +GameTable sGtOCTLevelExperienceStore; +GameTable sGtRegenMPPerSptStore; +GameTable sGtSpellScalingStore; typedef std::list StoreProblemList; @@ -297,88 +236,41 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) #define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale) - LOAD_DBC(sAnimKitStore, "AnimKit.dbc");//20444 - LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20444 - LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20444 - LOAD_DBC(sArmorLocationStore, "ArmorLocation.dbc");//20444 - LOAD_DBC(sBankBagSlotPricesStore, "BankBagSlotPrices.dbc");//20444 - LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20444 - LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20444 - LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20444 - LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20444 - LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20444 - LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20444 - LOAD_DBC(sChrRacesStore, "ChrRaces.dbc");//20444 - LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20444 - LOAD_DBC(sCreatureDisplayInfoExtraStore, "CreatureDisplayInfoExtra.dbc");//20444 - LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20444 - LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20444 - LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20444 - LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20444 - LOAD_DBC(sDurabilityCostsStore, "DurabilityCosts.dbc");//20444 - LOAD_DBC(sEmotesStore, "Emotes.dbc");//20444 - LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20444 - LOAD_DBC(sEmotesTextSoundStore, "EmotesTextSound.dbc"); - LOAD_DBC(sFactionStore, "Faction.dbc");//20444 - LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20444 - LOAD_DBC(sGameObjectDisplayInfoStore, "GameObjectDisplayInfo.dbc");//20444 - LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20444 - LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20444 - LOAD_DBC(sGuildColorBackgroundStore, "GuildColorBackground.dbc");//20444 - LOAD_DBC(sGuildColorBorderStore, "GuildColorBorder.dbc"); //20444 - LOAD_DBC(sGuildColorEmblemStore, "GuildColorEmblem.dbc");//20444 - LOAD_DBC(sItemArmorQualityStore, "ItemArmorQuality.dbc");//20444 - LOAD_DBC(sItemArmorShieldStore, "ItemArmorShield.dbc");//20444 - LOAD_DBC(sItemArmorTotalStore, "ItemArmorTotal.dbc");//20444 - LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc");//20444 - LOAD_DBC(sItemDamageAmmoStore, "ItemDamageAmmo.dbc");//20444 - LOAD_DBC(sItemDamageOneHandCasterStore, "ItemDamageOneHandCaster.dbc");//20444 - LOAD_DBC(sItemDamageOneHandStore, "ItemDamageOneHand.dbc");//20444 - LOAD_DBC(sItemDamageRangedStore, "ItemDamageRanged.dbc");//20444 - LOAD_DBC(sItemDamageThrownStore, "ItemDamageThrown.dbc");//20444 - LOAD_DBC(sItemDamageTwoHandCasterStore, "ItemDamageTwoHandCaster.dbc");//20444 - LOAD_DBC(sItemDamageTwoHandStore, "ItemDamageTwoHand.dbc");//20444 - LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//20444 - LOAD_DBC(sItemSetSpellStore, "ItemSetSpell.dbc");//20444 - LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20444 - LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20444 - LOAD_DBC(sLightStore, "Light.dbc"); //20444 - LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20444 - LOAD_DBC(sLockStore, "Lock.dbc");//20444 - LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20444 - LOAD_DBC(sMapStore, "Map.dbc");//20444 - LOAD_DBC(sMovieStore, "Movie.dbc");//20444 - LOAD_DBC(sPhaseStore, "Phase.dbc"); // 20444 - LOAD_DBC(sPowerDisplayStore, "PowerDisplay.dbc");//20444 - LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20444 - LOAD_DBC(sQuestFactionRewardStore, "QuestFactionReward.dbc");//20444 - LOAD_DBC(sRandomPropertiesPointsStore, "RandPropPoints.dbc");//20444 - LOAD_DBC(sSkillLineAbilityStore, "SkillLineAbility.dbc");//20444 - LOAD_DBC(sSkillLineStore, "SkillLine.dbc");//20444 - LOAD_DBC(sSkillRaceClassInfoStore, "SkillRaceClassInfo.dbc");//20444 - LOAD_DBC(sSpellAuraOptionsStore, "SpellAuraOptions.dbc");//20444 - LOAD_DBC(sSpellCategoriesStore, "SpellCategories.dbc");//20444 - LOAD_DBC(sSpellCategoryStore, "SpellCategory.dbc");//20444 - LOAD_DBC(sSpellCooldownsStore, "SpellCooldowns.dbc");//20444 - LOAD_DBC(sSpellEffectScalingStore, "SpellEffectScaling.dbc");//20444 - LOAD_DBC(sSpellEffectStore, "SpellEffect.dbc"/*, &CustomSpellEffectfmt, &CustomSpellEffectEntryIndex*/);//20444 - LOAD_DBC(sSpellEquippedItemsStore, "SpellEquippedItems.dbc");//20444 - LOAD_DBC(sSpellFocusObjectStore, "SpellFocusObject.dbc");//20444 - LOAD_DBC(sSpellInterruptsStore, "SpellInterrupts.dbc");//20444 - LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20444 - LOAD_DBC(sSpellLevelsStore, "SpellLevels.dbc");//20444 - LOAD_DBC(sSpellScalingStore, "SpellScaling.dbc");//20444 - LOAD_DBC(sSpellShapeshiftFormStore, "SpellShapeshiftForm.dbc");//20444 - LOAD_DBC(sSpellShapeshiftStore, "SpellShapeshift.dbc");//20444 - LOAD_DBC(sSpellStore, "Spell.dbc"/*, &CustomSpellfmt, &CustomSpellEntryIndex*/);//20444 - LOAD_DBC(sSpellTargetRestrictionsStore, "SpellTargetRestrictions.dbc");//20444 - LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20444 - LOAD_DBC(sTalentStore, "Talent.dbc");//20444 - LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20444 - LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20444 - LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20444 + LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20810 + LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20810 + LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810 + LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810 + LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810 + LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20810 + LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20810 + LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810 + LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20810 + LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20810 + LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810 + LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20810 + LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20810 + LOAD_DBC(sEmotesStore, "Emotes.dbc");//20810 + LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20810 + LOAD_DBC(sFactionStore, "Faction.dbc");//20810 + LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810 + LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20810 + LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20810 + LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20810 + LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810 + LOAD_DBC(sLightStore, "Light.dbc"); //20810 + LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810 + LOAD_DBC(sLockStore, "Lock.dbc");//20810 + LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810 + LOAD_DBC(sMapStore, "Map.dbc");//20810 + LOAD_DBC(sPhaseStore, "Phase.dbc");//20810 + LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20810 + LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810 + LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20810 + LOAD_DBC(sTalentStore, "Talent.dbc");//20810 + LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20810 + LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810 + LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20810 LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20444 - LOAD_DBC(sWorldMapTransformsStore, "WorldMapTransforms.dbc");//20444 LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20444 #undef LOAD_DBC @@ -408,10 +300,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)", MAX_DIFFICULTY, sDifficultyStore.GetNumRows()); - for (uint32 i = 0; i < sEmotesTextSoundStore.GetNumRows(); ++i) - if (EmotesTextSoundEntry const* entry = sEmotesTextSoundStore.LookupEntry(i)) - sEmotesTextSoundMap[EmotesTextSoundKey(entry->EmotesTextId, entry->RaceId, entry->SexId)] = entry; - for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) { FactionEntry const* faction = sFactionStore.LookupEntry(i); @@ -422,22 +310,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) } } - for (uint32 i = 0; i < sGameObjectDisplayInfoStore.GetNumRows(); ++i) - { - if (GameObjectDisplayInfoEntry const* info = sGameObjectDisplayInfoStore.LookupEntry(i)) - { - if (info->GeoBoxMax.X < info->GeoBoxMin.X) - std::swap(*(float*)(&info->GeoBoxMax.X), *(float*)(&info->GeoBoxMin.X)); - if (info->GeoBoxMax.Y < info->GeoBoxMin.Y) - std::swap(*(float*)(&info->GeoBoxMax.Y), *(float*)(&info->GeoBoxMin.Y)); - if (info->GeoBoxMax.Z < info->GeoBoxMin.Z) - std::swap(*(float*)(&info->GeoBoxMax.Z), *(float*)(&info->GeoBoxMin.Z)); - } - } - - for (ItemSetSpellEntry const* entry : sItemSetSpellStore) - sItemSetSpellsStore[entry->ItemSetID].push_back(entry); - // fill data for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i) if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i)) @@ -449,20 +321,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) if (entry->BracketID > MAX_BATTLEGROUND_BRACKETS) ASSERT(false && "Need update MAX_BATTLEGROUND_BRACKETS by DBC data"); - for (uint32 i = 0; i < sSkillRaceClassInfoStore.GetNumRows(); ++i) - if (SkillRaceClassInfoEntry const* entry = sSkillRaceClassInfoStore.LookupEntry(i)) - if (sSkillLineStore.LookupEntry(entry->SkillID)) - SkillRaceClassInfoBySkill.emplace(entry->SkillID, entry); - - for (uint32 j = 0; j < sSpellEffectScalingStore.GetNumRows(); j++) - { - SpellEffectScalingEntry const* spellEffectScaling = sSpellEffectScalingStore.LookupEntry(j); - if (!spellEffectScaling) - continue; - - sSpellEffectScallingByEffectId.insert(std::make_pair(spellEffectScaling->SpellEffectID, j)); - } - for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) { if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i)) @@ -496,11 +354,10 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) } // Check loaded DBC files proper version - if (!sAreaTableStore.LookupEntry(7941) || // last area added in 6.2.2 (20444) - !sCharTitlesStore.LookupEntry(457) || // last char title added in 6.2.2 (20444) - !sGemPropertiesStore.LookupEntry(2544) || // last gem property added in 6.2.2 (20444) - !sMapStore.LookupEntry(1497) || // last map added in 6.2.2 (20444) - !sSpellStore.LookupEntry(197204) ) // last spell added in 6.2.2 (20444) + if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) + !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) + !sGemPropertiesStore.LookupEntry(2952) || // last gem property added in 7.0.1 (20810) + !sMapStore.LookupEntry(1602) ) // last map added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); exit(1); @@ -519,27 +376,34 @@ void LoadGameTables(const std::string& dataPath, uint32 defaultLocale) #define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file) - LOAD_GT("ArmorMitigationByLvl", sGtArmorMitigationByLvlStore, "gtArmorMitigationByLvl.dbc"); // 21463 - LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20444 - LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20444 - LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20444 - LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20444 - LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20444 - LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20444 - LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20444 - LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20444 - LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore, "gtNpcTotalHp.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpExp1Store, "gtNpcTotalHpExp1.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpExp2Store, "gtNpcTotalHpExp2.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpExp3Store, "gtNpcTotalHpExp3.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpExp4Store, "gtNpcTotalHpExp4.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpExp5Store, "gtNpcTotalHpExp5.dbc"); // 20444 - LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20444 - LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20444 - LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20444 - LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20444 - LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20444 - LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20444 + LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20810 + LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20810 + LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20810 + LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20810 + LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20810 + LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20810 + LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20810 + LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20810 + LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore[0], "gtNpcTotalHp.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpStore[1], "gtNpcTotalHpExp1.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpStore[2], "gtNpcTotalHpExp2.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpStore[3], "gtNpcTotalHpExp3.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpStore[4], "gtNpcTotalHpExp4.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpStore[5], "gtNpcTotalHpExp5.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp6", sGtNpcTotalHpStore[6], "gtNpcTotalHpExp6.dbc"); // 20810 + LOAD_GT("NpcDamageByClass", sGtNpcDamageByClassStore[0], "gtNpcDamageByClass.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp1", sGtNpcDamageByClassStore[1], "gtNpcDamageByClassExp1.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp2", sGtNpcDamageByClassStore[2], "gtNpcDamageByClassExp2.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp3", sGtNpcDamageByClassStore[3], "gtNpcDamageByClassExp3.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp4", sGtNpcDamageByClassStore[4], "gtNpcDamageByClassExp4.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp5", sGtNpcDamageByClassStore[5], "gtNpcDamageByClassExp5.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp6", sGtNpcDamageByClassStore[6], "gtNpcDamageByClassExp6.dbc"); // 20810 + LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20810 + LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20810 + LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20810 + LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20810 + LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20810 + LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20810 #undef LOAD_GT @@ -583,12 +447,6 @@ char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 /*locale*/) return pet_family->Name_lang ? pet_family->Name_lang : NULL; } -EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uint32 gender) -{ - auto itr = sEmotesTextSoundMap.find(EmotesTextSoundKey(emote, race, gender)); - return itr != sEmotesTextSoundMap.end() ? itr->second : nullptr; -} - WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid) { WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid)); @@ -597,12 +455,6 @@ WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid return i->second; } -char const* GetRaceName(uint8 race, uint8 /*locale*/) -{ - ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); - return raceEntry ? raceEntry->Name_lang : NULL; -} - char const* GetClassName(uint8 class_, uint8 /*locale*/) { ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); @@ -636,6 +488,8 @@ uint32 GetMaxLevelForExpansion(uint32 expansion) return 90; case EXPANSION_WARLORDS_OF_DRAENOR: return 100; + case EXPANSION_LEGION: + return 110; default: break; } @@ -654,30 +508,12 @@ uint32 GetExpansionForLevel(uint32 level) return EXPANSION_CATACLYSM; else if (level < 90) return EXPANSION_MISTS_OF_PANDARIA; + else if (level < 100) + return EXPANSION_WARLORDS_OF_DRAENOR; else return CURRENT_EXPANSION; } -bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) -{ - if (requiredTotemCategoryId == 0) - return true; - if (itemTotemCategoryId == 0) - return false; - - TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId); - if (!itemEntry) - return false; - TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId); - if (!reqEntry) - return false; - - if (itemEntry->CategoryType != reqEntry->CategoryType) - return false; - - return (itemEntry->CategoryMask & reqEntry->CategoryMask) == reqEntry->CategoryMask; -} - void Zone2MapCoordinates(float& x, float& y, uint32 worldMapAreaId) { WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); @@ -854,68 +690,3 @@ uint32 GetDefaultMapLight(uint32 mapId) return 0; } - -SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_) -{ - SkillRaceClassInfoBounds bounds = SkillRaceClassInfoBySkill.equal_range(skill); - for (SkillRaceClassInfoMap::iterator itr = bounds.first; itr != bounds.second; ++itr) - { - if (itr->second->RaceMask && !(itr->second->RaceMask & (1 << (race - 1)))) - continue; - if (itr->second->ClassMask && !(itr->second->ClassMask & (1 << (class_ - 1)))) - continue; - - return itr->second; - } - - return NULL; -} - -void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/) -{ - ASSERT(newMapId || newPos); - WorldMapTransformsEntry const* transformation = nullptr; - for (WorldMapTransformsEntry const* transform : sWorldMapTransformsStore) - { - if (transform->MapID != mapId) - continue; - - if (transform->RegionMin.X > x || transform->RegionMax.X < x) - continue; - if (transform->RegionMin.Y > y || transform->RegionMax.Y < y) - continue; - if (transform->RegionMin.Z > z || transform->RegionMax.Z < z) - continue; - - transformation = transform; - break; - } - - if (!transformation) - { - if (newMapId) - *newMapId = mapId; - - if (newPos) - { - newPos->X = x; - newPos->Y = y; - } - return; - } - - if (newMapId) - *newMapId = transformation->NewMapID; - - if (!newPos) - return; - - if (transformation->RegionScale > 0.0f && transformation->RegionScale < 1.0f) - { - x = (x - transformation->RegionMin.X) * transformation->RegionScale + transformation->RegionMin.X; - y = (y - transformation->RegionMin.Y) * transformation->RegionScale + transformation->RegionMin.Y; - } - - newPos->X = x + transformation->RegionOffset.X; - newPos->Y = y + transformation->RegionOffset.Y; -} diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 4ab1769c69f..a1986effa48 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -30,9 +30,6 @@ TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSection // ChrClasses TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale); -// ChrRaces -TC_GAME_API char const* GetRaceName(uint8 race, uint8 locale); - // ChrSpecialization #define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; @@ -40,16 +37,9 @@ typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES // CreatureFamilty TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); -// EmotesText -TC_GAME_API EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uint32 gender); - // Faction TC_GAME_API std::vector const* GetFactionTeamList(uint32 faction); -// ItemSetSpells -typedef std::vector ItemSetSpells; -typedef std::unordered_map ItemSetSpellsStore; - // LfgDungeons TC_GAME_API LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); @@ -69,20 +59,9 @@ TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapI TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); -// SkillRaceClassInfo -typedef std::unordered_multimap SkillRaceClassInfoMap; -typedef std::pair SkillRaceClassInfoBounds; -TC_GAME_API SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); - -// SpellEffectScaling -typedef std::unordered_map SpellEffectScallingByEffectId; - // Talent typedef std::vector TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; -// TotemCategory -TC_GAME_API bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); - // WMOAreaTable TC_GAME_API WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid); @@ -91,9 +70,6 @@ TC_GAME_API uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); TC_GAME_API void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId); TC_GAME_API void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId); -// WorldMapTransforms -TC_GAME_API void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr); - TC_GAME_API uint32 GetMaxLevelForExpansion(uint32 expansion); TC_GAME_API uint32 GetExpansionForLevel(uint32 level); @@ -101,7 +77,7 @@ template class GameTable { public: - GameTable(char const* format) : _storage(format), _gtEntry(nullptr) { } + GameTable() : _storage("df"), _gtEntry(nullptr) { } void SetGameTableEntry(GameTablesEntry const* gtEntry) { _gtEntry = gtEntry; } @@ -125,81 +101,34 @@ private: GameTablesEntry const* _gtEntry; }; -TC_GAME_API extern DBCStorage sAnimKitStore; TC_GAME_API extern DBCStorage sAreaTableStore; TC_GAME_API extern DBCStorage sAreaTriggerStore; -TC_GAME_API extern DBCStorage sArmorLocationStore; -TC_GAME_API extern DBCStorage sBankBagSlotPricesStore; TC_GAME_API extern DBCStorage sBannedAddOnsStore; TC_GAME_API extern DBCStorage sBattlemasterListStore; TC_GAME_API extern DBCStorage sCharSectionsStore; TC_GAME_API extern DBCStorage sCharTitlesStore; TC_GAME_API extern DBCStorage sChatChannelsStore; TC_GAME_API extern DBCStorage sChrClassesStore; -TC_GAME_API extern DBCStorage sChrRacesStore; TC_GAME_API extern DBCStorage sChrSpecializationStore; TC_GAME_API extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -TC_GAME_API extern DBCStorage sCreatureDisplayInfoExtraStore; TC_GAME_API extern DBCStorage sCreatureFamilyStore; TC_GAME_API extern DBCStorage sCreatureModelDataStore; TC_GAME_API extern DBCStorage sDifficultyStore; TC_GAME_API extern DBCStorage sDungeonEncounterStore; -TC_GAME_API extern DBCStorage sDurabilityCostsStore; TC_GAME_API extern DBCStorage sEmotesStore; TC_GAME_API extern DBCStorage sEmotesTextStore; TC_GAME_API extern DBCStorage sFactionStore; TC_GAME_API extern DBCStorage sFactionTemplateStore; -TC_GAME_API extern DBCStorage sGameObjectDisplayInfoStore; TC_GAME_API extern DBCStorage sGemPropertiesStore; TC_GAME_API extern DBCStorage sGlyphPropertiesStore; -TC_GAME_API extern DBCStorage sGuildColorBackgroundStore; -TC_GAME_API extern DBCStorage sGuildColorBorderStore; -TC_GAME_API extern DBCStorage sGuildColorEmblemStore; -TC_GAME_API extern DBCStorage sItemArmorQualityStore; -TC_GAME_API extern DBCStorage sItemArmorShieldStore; -TC_GAME_API extern DBCStorage sItemArmorTotalStore; -TC_GAME_API extern DBCStorage sItemBagFamilyStore; -TC_GAME_API extern DBCStorage sItemDamageAmmoStore; -TC_GAME_API extern DBCStorage sItemDamageOneHandCasterStore; -TC_GAME_API extern DBCStorage sItemDamageOneHandStore; -TC_GAME_API extern DBCStorage sItemDamageRangedStore; -TC_GAME_API extern DBCStorage sItemDamageThrownStore; -TC_GAME_API extern DBCStorage sItemDamageTwoHandCasterStore; -TC_GAME_API extern DBCStorage sItemDamageTwoHandStore; -TC_GAME_API extern DBCStorage sItemDamageWandStore; TC_GAME_API extern DBCStorage sItemSetStore; -TC_GAME_API extern DBCStorage sItemSetSpellStore; -TC_GAME_API extern ItemSetSpellsStore sItemSetSpellsStore; TC_GAME_API extern DBCStorage sLFGDungeonStore; TC_GAME_API extern DBCStorage sLiquidTypeStore; TC_GAME_API extern DBCStorage sLockStore; TC_GAME_API extern DBCStorage sMapStore; TC_GAME_API extern MapDifficultyMap sMapDifficultyMap; -TC_GAME_API extern DBCStorage sMovieStore; TC_GAME_API extern DBCStorage sPhaseStore; -TC_GAME_API extern DBCStorage sPowerDisplayStore; -TC_GAME_API extern DBCStorage sQuestFactionRewardStore; -TC_GAME_API extern DBCStorage sRandomPropertiesPointsStore; -TC_GAME_API extern DBCStorage sSkillLineAbilityStore; -TC_GAME_API extern DBCStorage sSkillLineStore; -TC_GAME_API extern DBCStorage sSkillRaceClassInfoStore; -TC_GAME_API extern DBCStorage sSpellAuraOptionsStore; -TC_GAME_API extern DBCStorage sSpellCategoriesStore; -TC_GAME_API extern DBCStorage sSpellCategoryStore; -TC_GAME_API extern DBCStorage sSpellCooldownsStore; -TC_GAME_API extern DBCStorage sSpellEffectStore; -TC_GAME_API extern DBCStorage sSpellEffectScalingStore; -TC_GAME_API extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -TC_GAME_API extern DBCStorage sSpellStore; -TC_GAME_API extern DBCStorage sSpellEquippedItemsStore; -TC_GAME_API extern DBCStorage sSpellFocusObjectStore; -TC_GAME_API extern DBCStorage sSpellInterruptsStore; TC_GAME_API extern DBCStorage sSpellItemEnchantmentStore; -TC_GAME_API extern DBCStorage sSpellLevelsStore; -TC_GAME_API extern DBCStorage sSpellScalingStore; -TC_GAME_API extern DBCStorage sSpellShapeshiftStore; -TC_GAME_API extern DBCStorage sSpellShapeshiftFormStore; -TC_GAME_API extern DBCStorage sSpellTargetRestrictionsStore; TC_GAME_API extern DBCStorage sSummonPropertiesStore; TC_GAME_API extern DBCStorage sTalentStore; TC_GAME_API extern TalentsByPosition sTalentByPos; @@ -217,12 +146,8 @@ TC_GAME_API extern GameTable sGtChanceToSpell TC_GAME_API extern GameTable sGtCombatRatingsStore; TC_GAME_API extern GameTable sGtItemSocketCostPerLevelStore; TC_GAME_API extern GameTable sGtNPCManaCostScalerStore; -TC_GAME_API extern GameTable sGtNpcTotalHpStore; -TC_GAME_API extern GameTable sGtNpcTotalHpExp1Store; -TC_GAME_API extern GameTable sGtNpcTotalHpExp2Store; -TC_GAME_API extern GameTable sGtNpcTotalHpExp3Store; -TC_GAME_API extern GameTable sGtNpcTotalHpExp4Store; -TC_GAME_API extern GameTable sGtNpcTotalHpExp5Store; +TC_GAME_API extern GameTable sGtNpcTotalHpStore[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable sGtNpcDamageByClassStore[MAX_EXPANSIONS]; TC_GAME_API extern GameTable sGtOCTBaseHPByClassStore; TC_GAME_API extern GameTable sGtOCTBaseMPByClassStore; TC_GAME_API extern GameTable sGtOCTLevelExperienceStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5eed5ca0b6d..30704aaadad 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -26,14 +26,6 @@ // Structures using to access raw DBC data and required packing to portability #pragma pack(push, 1) -struct AnimKitEntry -{ - uint32 ID; // 0 - //uint32 OneShotDuration; // 1 - //uint32 OneShotStopAnimKitID; // 2 - //uint32 LowDefAnimKitID; // 3 -}; - struct AreaTableEntry { uint32 ID; // 0 @@ -56,7 +48,6 @@ struct AreaTableEntry //uint32 UWIntroMusic; // 21 //uint32 UWZoneMusic; // 22 //uint32 UWAmbience; // 23 - //uint32 WorldPvPID; // 24 World_PVP_Area.dbc //uint32 PvPCombastWorldStateID; // 25 //uint32 WildBattlePetLevelMin; // 26 //uint32 WildBattlePetLevelMax; // 27 @@ -90,18 +81,6 @@ struct AreaTriggerEntry //uint32 Flags // 16 }; -struct ArmorLocationEntry -{ - uint32 ID; // 0 - float Modifier[5]; // 1-5 multiplier for armor types (cloth...plate, no armor?) -}; - -struct BankBagSlotPricesEntry -{ - uint32 ID; // 0 - uint32 Cost; // 1 -}; - struct BannedAddOnsEntry { uint32 ID; // 0 @@ -134,7 +113,8 @@ struct BattlemasterListEntry enum CharSectionFlags { SECTION_FLAG_PLAYER = 0x01, - SECTION_FLAG_DEATH_KNIGHT = 0x04 + SECTION_FLAG_DEATH_KNIGHT = 0x04, + SECTION_FLAG_DEMON_HUNTER = 0x40 }; enum CharSectionType @@ -143,7 +123,10 @@ enum CharSectionType SECTION_TYPE_FACE = 1, SECTION_TYPE_FACIAL_HAIR = 2, SECTION_TYPE_HAIR = 3, - SECTION_TYPE_UNDERWEAR = 4 + SECTION_TYPE_UNDERWEAR = 4, + SECTION_TYPE_CUSTOM_DISPLAY_1 = 10, + SECTION_TYPE_CUSTOM_DISPLAY_2 = 12, + SECTION_TYPE_CUSTOM_DISPLAY_3 = 14 }; struct CharSectionsEntry @@ -152,13 +135,12 @@ struct CharSectionsEntry uint32 Race; uint32 Gender; uint32 GenType; - //char* TexturePath[3]; + //uint32 TextureFileDataID[3]; uint32 Flags; uint32 Type; uint32 Color; }; - struct CharTitlesEntry { uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId() @@ -201,53 +183,12 @@ struct ChrClassesEntry //uint32 Unk1; // 18 }; -struct ChrRacesEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 FactionID; // 2 faction template id - //uint32 ExplorationSoundID; // 3 - uint32 MaleDisplayID; // 4 - uint32 FemaleDisplayID; // 5 - //char* ClientPrefix; // 6 - //uint32 BaseLanguage; // 7 - //uint32 CreatureType; // 8 - //uint32 ResSicknessSpellID; // 9 - //uint32 SplashSoundID; // 10 - //char* ClientFileString; // 11 - uint32 CinematicSequenceID; // 12 - uint32 TeamID; // 13 m_alliance (0 alliance, 1 horde, 2 neutral) - char* Name_lang; // 14 - //char* NameFemale_lang; // 15 - //char* NameMale_lang; // 16 - //char* FacialHairCustomization[2]; // 17-18 - //char* HairCustomization; // 19 - //uint32 RaceRelated; // 20 - //uint32 UnalteredVisualRaceID; // 21 - //uint32 UAMaleCreatureSoundDataID; // 22 - //uint32 UAFemaleCreatureSoundDataID; // 23 - //uint32 CharComponentTextureLayoutID; // 24 - //uint32 DefaultClassID; // 25 - //uint32 CreateScreenFileDataID; // 26 - //uint32 SelectScreenFileDataID; // 27 - //float MaleCustomizeOffset[3]; // 28-30 - //float FemaleCustomizeOffset[3]; // 31-33 - //uint32 NeutralRaceID; // 34 - //uint32 LowResScreenFileDataID; // 35 - //uint32 HighResMaleDisplayID; // 36 - //uint32 HighResFemaleDisplayID; // 37 - //uint32 CharComponentTexLayoutHiResID; // 38 - //uint32 Unk; // 39 -}; - -#define MAX_MASTERY_SPELLS 2 - struct ChrSpecializationEntry { uint32 ID; // 0 Specialization ID //char* BackgroundFile; // 1 uint32 ClassID; // 2 - uint32 MasterySpellID[MAX_MASTERY_SPELLS]; // 3 + uint32 MasterySpellID; // 3 uint32 OrderIndex; // 4 uint32 PetTalentType; // 5 uint32 Role; // 6 (0 - Tank, 1 - Healer, 2 - DPS) @@ -257,23 +198,8 @@ struct ChrSpecializationEntry //char* Name_lang; // 10 //char* Name2_lang; // 11 Same as name_lang? //char* Description_lang; // 12 - uint32 PrimaryStatOrder[2]; // 13-14 -}; - -struct CreatureDisplayInfoExtraEntry -{ - //uint32 ID; // 0 - uint32 DisplayRaceID; // 1 - //uint32 DisplaySexID; // 2 - //uint32 SkinID; // 3 - //uint32 FaceID; // 4 - //uint32 HairStyleID; // 5 - //uint32 HairColorID; // 6 - //uint32 FacialHairID; // 7 - //uint32 NPCItemDisplay[11]; // 8-18 - //uint32 Flags; // 19 - //uint32 FileDataID; // 20 - //uint32 Unk; // 21 + //uint32 PrimaryStatOrder; // 13 + //uint32 AnimReplacementSetID; // 14 }; struct CreatureFamilyEntry @@ -304,25 +230,27 @@ struct CreatureModelDataEntry //float FootprintTextureWidth; // 8 //float FootprintParticleScale; // 9 //uint32 FoleyMaterialID; // 10 - //uint32 FootstepShakeSize; // 11 - //uint32 DeathThudShakeSize; // 12 - //uint32 SoundID; // 13 - //float CollisionWidth; // 14 - float CollisionHeight; // 15 - float MountHeight; // 16 - //float GeoBoxMin[3]; // 17-19 - //float GeoBoxMax[3]; // 20-22 - //float WorldEffectScale; // 23 - //float AttachedEffectScale; // 24 - //float MissileCollisionRadius; // 25 - //float MissileCollisionPush; // 26 - //float MissileCollisionRaise; // 27 - //float OverrideLootEffectScale; // 28 - //float OverrideNameScale; // 29 - //float OverrideSelectionRadius; // 30 - //float TamedPetBaseScale; // 31 - //uint32 CreatureGeosetDataID; // 32 - //float HoverHeight; // 33 + //uint32 Unk700_1; // 11 + //uint32 Unk700_2; // 12 + //uint32 FootstepShakeSize; // 13 + //uint32 DeathThudShakeSize; // 14 + //uint32 SoundID; // 15 + //float CollisionWidth; // 16 + float CollisionHeight; // 17 + float MountHeight; // 18 + //float GeoBoxMin[3]; // 19-21 + //float GeoBoxMax[3]; // 22-24 + //float WorldEffectScale; // 25 + //float AttachedEffectScale; // 26 + //float MissileCollisionRadius; // 27 + //float MissileCollisionPush; // 28 + //float MissileCollisionRaise; // 29 + //float OverrideLootEffectScale; // 30 + //float OverrideNameScale; // 31 + //float OverrideSelectionRadius; // 32 + //float TamedPetBaseScale; // 33 + //uint32 CreatureGeosetDataID; // 34 + //float HoverHeight; // 35 }; /* not used @@ -366,13 +294,6 @@ struct DungeonEncounterEntry //uint32 Unk; // 8 Flags2? }; -struct DurabilityCostsEntry -{ - uint32 ID; // 0 - uint32 WeaponSubClassCost[21]; // 1-22 - uint32 ArmorSubClassCost[8]; // 23-30 -}; - struct EmotesEntry { uint32 ID; // 0 @@ -393,15 +314,6 @@ struct EmotesTextEntry //uint32 EmoteText[16]; // 3-18 }; -struct EmotesTextSoundEntry -{ - uint32 Id; // 0 - uint32 EmotesTextId; // 1 - uint32 RaceId; // 2 - uint32 SexId; // 3, 0 male / 1 female - uint32 SoundId; // 4 -}; - struct FactionEntry { uint32 ID; // 0 @@ -484,18 +396,6 @@ struct FactionTemplateEntry bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } }; -struct GameObjectDisplayInfoEntry -{ - uint32 ID; // 0 - uint32 FileDataID; // 1 - //uint32 Sound[10]; // 2-11 - DBCPosition3D GeoBoxMin; // 12-14 - DBCPosition3D GeoBoxMax; // 15-17 - //uint32 ObjectEffectPackageID; // 18 - //float OverrideLootEffectScale; // 19 - //float OverrideNameScale; // 20 -}; - struct GemPropertiesEntry { uint32 ID; // 0 @@ -560,32 +460,12 @@ struct GtNPCManaCostScalerEntry float ratio; }; -struct GtNpcTotalHpEntry -{ - float HP; -}; - -struct GtNpcTotalHpExp1Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp2Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp3Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp4Entry +struct GtNpcDamageByClassEntry { - float HP; + float Damage; }; -struct GtNpcTotalHpExp5Entry +struct GtNpcTotalHpEntry { float HP; }; @@ -640,76 +520,6 @@ struct GtOCTBaseMPByClassEntry float ratio; }; -// GuildColorBackground.dbc -struct GuildColorBackgroundEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// GuildColorBorder.dbc -struct GuildColorBorderEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// GuildColorEmblem.dbc -struct GuildColorEmblemEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// common struct for: -// ItemDamageAmmo.dbc -// ItemDamageOneHand.dbc -// ItemDamageOneHandCaster.dbc -// ItemDamageRanged.dbc -// ItemDamageThrown.dbc -// ItemDamageTwoHand.dbc -// ItemDamageTwoHandCaster.dbc -// ItemDamageWand.dbc -struct ItemDamageEntry -{ - uint32 ID; // 0 item level - float DPS[7]; // 1-7 multiplier for item quality - uint32 ItemLevel; // 8 item level -}; - -struct ItemArmorQualityEntry -{ - uint32 ID; // 0 item level - float QualityMod[7]; // 1-7 multiplier for item quality - uint32 ItemLevel; // 8 item level -}; - -struct ItemArmorShieldEntry -{ - uint32 ID; // 0 item level - uint32 ItemLevel; // 1 item level - float Quality[7]; // 2-8 quality -}; - -struct ItemArmorTotalEntry -{ - uint32 ID; // 0 item level - uint32 ItemLevel; // 1 item level - float Value[4]; // 2-5 multiplier for armor types (cloth...plate) -}; - -struct ItemBagFamilyEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 m_name_lang -}; - struct ItemDisplayInfoEntry { uint32 ID; // 0 @@ -736,15 +546,6 @@ struct ItemSetEntry uint32 RequiredSkillRank; // 20 }; -struct ItemSetSpellEntry -{ - uint32 ID; // 0 - uint32 ItemSetID; // 1 - uint32 SpellID; // 2 - uint32 Threshold; // 3 - uint32 ChrSpecID; // 4 -}; - struct LFGDungeonEntry { uint32 ID; // 0 @@ -910,25 +711,6 @@ struct MinorTalentEntry uint32 OrderIndex; // 3 }; -struct MovieEntry -{ - uint32 ID; // 0 index - //uint32 Volume; // 1 - //uint32 KeyID; // 2 - //uint32 AudioFileDataID; // 3 - //uint32 SubtitleFileDataID; // 4 -}; - -struct PowerDisplayEntry -{ - uint32 ID; // 0 - uint32 PowerType; // 1 - //char* GlobalStringBaseTag; // 2 - //uint8 Red; // 3 - //uint8 Green; // 4 - //uint8 Blue; // 5 -}; - struct PvPDifficultyEntry { //uint32 ID; // 0 @@ -941,280 +723,6 @@ struct PvPDifficultyEntry BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } }; -struct QuestFactionRewEntry -{ - uint32 ID; // 0 - int32 QuestRewFactionValue[10]; // 1-10 -}; - -struct RandomPropertiesPointsEntry -{ - uint32 ItemLevel; // 0 - uint32 EpicPropertiesPoints[5]; // 1-5 - uint32 RarePropertiesPoints[5]; // 6-10 - uint32 UncommonPropertiesPoints[5]; // 11-15 -}; - -struct SkillLineEntry -{ - uint32 ID; // 0 m_ID - int32 CategoryID; // 1 m_categoryID - char* DisplayName_lang; // 2 m_displayName_lang - //char* Description_lang; // 3 m_description_lang - uint32 SpellIconID; // 4 m_spellIconID - //char* AlternateVerb_lang; // 5 m_alternateVerb_lang - uint32 CanLink; // 6 m_canLink (prof. with recipes) - //uint32 ParentSkillLineID; // 7 - //uint32 Flags; // 8 -}; - -struct SkillLineAbilityEntry -{ - uint32 ID; // 0 - uint32 SkillLine; // 1 - uint32 SpellID; // 2 - uint32 RaceMask; // 3 - uint32 ClassMask; // 4 - uint32 MinSkillLineRank; // 7 - uint32 SupercedesSpell; // 8 - uint32 AquireMethod; // 9 - uint32 TrivialSkillLineRankHigh; // 10 - uint32 TrivialSkillLineRankLow; // 11 - uint32 NumSkillUps; // 12 - uint32 UniqueBit; // 13 - uint32 TradeSkillCategoryID; // 14 -}; - -struct SkillRaceClassInfoEntry -{ - //uint32 ID; // 0 - uint32 SkillID; // 1 - int32 RaceMask; // 2 - int32 ClassMask; // 3 - uint32 Flags; // 4 - uint32 Availability; // 5 - uint32 MinLevel; // 6 - uint32 SkillTierID; // 7 -}; - -// SpellEffect.dbc -struct SpellEffectEntry -{ - uint32 ID; // 0 - uint32 DifficultyID; // 1 - uint32 Effect; // 2 - float EffectAmplitude; // 3 - uint32 EffectAura; // 4 - uint32 EffectAuraPeriod; // 5 - uint32 EffectBasePoints; // 6 - float EffectBonusCoefficient; // 7 - float EffectChainAmplitude; // 8 - uint32 EffectChainTargets; // 9 - uint32 EffectDieSides; // 10 - uint32 EffectItemType; // 11 - uint32 EffectMechanic; // 12 - int32 EffectMiscValue; // 13 - int32 EffectMiscValueB; // 14 - float EffectPointsPerResource; // 15 - uint32 EffectRadiusIndex; // 16 - uint32 EffectRadiusMaxIndex; // 17 - float EffectRealPointsPerLevel; // 18 - flag128 EffectSpellClassMask; // 19-22 - uint32 EffectTriggerSpell; // 23 - float EffectPosFacing; // 24 - uint32 ImplicitTarget[2]; // 25-26 - uint32 SpellID; // 27 - uint32 EffectIndex; // 28 - uint32 EffectAttributes; // 29 - float BonusCoefficientFromAP; // 30 -}; - -#define MAX_SPELL_EFFECTS 32 -#define MAX_EFFECT_MASK 0xFFFFFFFF - -// SpellEffectScaling.dbc -struct SpellEffectScalingEntry -{ - uint32 ID; // 0 - float Coefficient; // 1 - float Variance; // 2 - float ResourceCoefficient; // 3 - uint32 SpellEffectID; // 4 -}; - -// SpellAuraOptions.dbc -struct SpellAuraOptionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CumulativeAura; // 3 - uint32 ProcChance; // 4 - uint32 ProcCharges; // 5 - uint32 ProcTypeMask; // 6 - uint32 ProcCategoryRecovery; // 7 - uint32 SpellProcsPerMinuteID; // 8 -}; - -// Spell.dbc -struct SpellEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - //char* NameSubtext_lang; // 2 - //char* Description_lang; // 3 - //char* AuraDescription_lang; // 4 - uint32 RuneCostID; // 5 - uint32 SpellMissileID; // 6 - uint32 DescriptionVariablesID; // 7 - uint32 ScalingID; // 8 - uint32 AuraOptionsID; // 9 - uint32 AuraRestrictionsID; // 10 - uint32 CastingRequirementsID; // 11 - uint32 CategoriesID; // 12 - uint32 ClassOptionsID; // 13 - uint32 CooldownsID; // 14 - uint32 EquippedItemsID; // 15 - uint32 InterruptsID; // 16 - uint32 LevelsID; // 17 - uint32 ReagentsID; // 18 - uint32 ShapeshiftID; // 19 - uint32 TargetRestrictionsID; // 20 - uint32 TotemsID; // 21 - uint32 RequiredProjectID; // 22 - uint32 MiscID; // 23 -}; - -// SpellCategories.dbc -struct SpellCategoriesEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 Category; // 3 - uint32 DefenseType; // 4 - uint32 DispelType; // 5 - uint32 Mechanic; // 6 - uint32 PreventionType; // 7 - uint32 StartRecoveryCategory; // 8 - uint32 ChargeCategory; // 9 -}; - -struct SpellCategoryEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - //uint8 UsesPerWeek; // 2 - //uint8 Padding[3]; // 2 - //char* Name_lang; // 3 - int32 MaxCharges; // 4 - int32 ChargeRecoveryTime; // 5 -}; - -struct SpellFocusObjectEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 -}; - -// SpellEquippedItems.dbc -struct SpellEquippedItemsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - int32 EquippedItemClass; // 3 m_equippedItemClass (value) - int32 EquippedItemInventoryTypeMask; // 4 m_equippedItemInvTypes (mask) - int32 EquippedItemSubClassMask; // 5 m_equippedItemSubclass (mask) -}; - -// SpellCooldowns.dbc -struct SpellCooldownsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CategoryRecoveryTime; // 3 - uint32 RecoveryTime; // 4 - uint32 StartRecoveryTime; // 5 -}; - -// SpellInterrupts.dbc -struct SpellInterruptsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 AuraInterruptFlags[2]; // 3-4 - uint32 ChannelInterruptFlags[2]; // 5-6 - uint32 InterruptFlags; // 7 -}; - -// SpellLevels.dbc -struct SpellLevelsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 BaseLevel; // 3 - uint32 MaxLevel; // 4 - uint32 SpellLevel; // 5 -}; - -#define MAX_SHAPESHIFT_SPELLS 8 - -struct SpellShapeshiftFormEntry -{ - uint32 ID; // 0 - //uint32 BonusActionBar; // 1 - //char* Name_lang; // 2 - uint32 Flags; // 3 - int32 CreatureType; // 4 <=0 humanoid, other normal creature types - //uint32 AttackIconID; // 5 unused, related to next field - uint32 CombatRoundTime; // 6 - uint32 CreatureDisplayID[4]; // 7-10 (0 - Alliance, 1 - Horde) - uint32 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; // 11-18 spells which appear in the bar after shapeshifting - //uint32 MountTypeID; // 19 - //uint32 ExitSoundEntriesID; // 20 -}; - -// SpellShapeshift.dbc -struct SpellShapeshiftEntry -{ - uint32 ID; // 0 - uint32 ShapeshiftExclude[2]; // 1-2 - uint32 ShapeshiftMask[2]; // 3-4 - //uint32 StanceBarOrder; // 5 -}; - -// SpellTargetRestrictions.dbc -struct SpellTargetRestrictionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - float ConeAngle; // 3 - float Width; // 4 - uint32 MaxAffectedTargets; // 5 - uint32 MaxTargetLevel; // 6 - uint32 TargetCreatureType; // 7 - uint32 Targets; // 8 -}; - -// SpellScaling.dbc -struct SpellScalingEntry -{ - uint32 ID; // 0 - int32 CastTimeMin; // 1 - int32 CastTimeMax; // 2 - uint32 CastTimeMaxLevel; // 3 - int32 ScalingClass; // 4 - float NerfFactor; // 5 - uint32 NerfMaxLevel; // 6 - uint32 MaxScalingLevel; // 7 - uint32 ScalesFromItemLevel; // 8 -}; - #define MAX_ITEM_ENCHANTMENT_EFFECTS 3 struct SpellItemEnchantmentEntry @@ -1227,16 +735,18 @@ struct SpellItemEnchantmentEntry //char* Name_lang // 11 uint32 ItemVisual; // 12 uint32 Flags; // 13 - uint32 SRCItemID; // 14 - uint32 ConditionID; // 15 - uint32 RequiredSkillID; // 16 - uint32 RequiredSkillRank; // 17 - uint32 MinLevel; // 18 - uint32 MaxLevel; // 19 - uint32 ItemLevel; // 20 - int32 ScalingClass; // 21 - int32 ScalingClassRestricted; // 22 - float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//23-25 + uint32 ConditionID; // 14 + uint32 RequiredSkillID; // 15 + uint32 RequiredSkillRank; // 16 + uint32 MinLevel; // 17 + uint32 MaxLevel; // 18 + uint32 ItemLevel; // 19 + int32 ScalingClass; // 20 + int32 ScalingClassRestricted; // 21 + float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//22-24 + //uint32 PlayerConditionID; // 25 + //uint32 TransmogCost; // 26 + //uint32 TextureFileDataID; // 27 }; struct StableSlotPricesEntry @@ -1423,20 +933,6 @@ struct WorldMapAreaEntry //uint32 LevelRangeMax; // 13 Maximum recommended level displayed on world map }; -struct WorldMapTransformsEntry -{ - //uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D RegionMin; // 2 - DBCPosition3D RegionMax; // 3 - uint32 NewMapID; // 4 - DBCPosition2D RegionOffset; // 5 - //uint32 NewDungeonMapID; // 6 - //uint32 Flags; // 7 - //uint32 NewAreaID; // 8 - float RegionScale; // 9 -}; - struct WorldSafeLocsEntry { uint32 ID; // 0 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 171eec94266..b85710acae6 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -22,64 +22,27 @@ // x - skip, X - skip, s - char*, f - float, i - uint32, b - uint8, d - index (not included) // n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc -char const AnimKitfmt[] = "nxxx"; -char const AreaTablefmt[] = "niiiiixxxxxxisiiiiixxxxxxxxxx"; +char const AreaTablefmt[] = "niiiiixxxxxxisiiiiixxxxxxxxx"; char const AreaTriggerfmt[] = "nifffxxxfffffxxxx"; -char const ArmorLocationfmt[] = "nfffff"; -char const BankBagSlotPricesfmt[] = "ni"; char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; char const CharSectionsfmt[] = "diiixxxiii"; char const CharTitlesfmt[] = "nxssix"; char const ChatChannelsfmt[] = "nixsx"; char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; -char const ChrRacesfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const ChrSpecializationfmt[] = "nxiiiiiiiiixxxii"; -char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx"; +char const ChrSpecializationfmt[] = "nxiiiiiiiixxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; -char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; +char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; -char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; char const Emotesfmt[] = "nxxiiixx"; char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx"; char const EmotesTextSoundEntryfmt[] = "niiii"; char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; -char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; char const GemPropertiesfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; -char const GtArmorMitigationByLvlfmt[] = "xf"; -char const GtBarberShopCostBasefmt[] = "xf"; -char const GtCombatRatingsfmt[] = "xf"; -char const GtOCTHpPerStaminafmt[] = "df"; -char const GtOCTLevelExperiencefmt[] = "xf"; -char const GtChanceToMeleeCritBasefmt[] = "xf"; -char const GtChanceToMeleeCritfmt[] = "xf"; -char const GtChanceToSpellCritBasefmt[] = "xf"; -char const GtChanceToSpellCritfmt[] = "xf"; -char const GtItemSocketCostPerLevelfmt[] = "xf"; -char const GtNPCManaCostScalerfmt[] = "xf"; -char const GtNpcTotalHpfmt[] = "xf"; -char const GtNpcTotalHpExp1fmt[] = "xf"; -char const GtNpcTotalHpExp2fmt[] = "xf"; -char const GtNpcTotalHpExp3fmt[] = "xf"; -char const GtNpcTotalHpExp4fmt[] = "xf"; -char const GtNpcTotalHpExp5fmt[] = "xf"; -char const GtRegenMPPerSptfmt[] = "xf"; -char const GtSpellScalingfmt[] = "df"; -char const GtOCTBaseHPByClassfmt[] = "df"; -char const GtOCTBaseMPByClassfmt[] = "df"; -char const GuildColorBackgroundfmt[] = "nXXX"; -char const GuildColorBorderfmt[] = "nXXX"; -char const GuildColorEmblemfmt[] = "nXXX"; -char const ItemBagFamilyfmt[] = "nx"; -char const ItemArmorQualityfmt[] = "nfffffffi"; -char const ItemArmorShieldfmt[] = "nifffffff"; -char const ItemArmorTotalfmt[] = "niffff"; -char const ItemDamagefmt[] = "nfffffffi"; char const ItemSetfmt[] = "nsiiiiiiiiiiiiiiiiiii"; -char const ItemSetSpellfmt[] = "niiii"; char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; char const Lightfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; @@ -87,42 +50,15 @@ char const Lockfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; char const Mapfmt[] = "nxiixxsixxixiffxiiiiix"; char const MapDifficultyfmt[] = "diisiiii"; char const MinorTalentfmt[] = "niii"; -char const Moviefmt[] = "nxxxx"; char const Phasefmt[] = "ni"; -char const QuestFactionRewardfmt[] = "niiiiiiiiii"; -char const PowerDisplayfmt[] = "nixXXX"; char const PvpDifficultyfmt[] = "diiii"; -char const RandPropPointsfmt[] = "niiiiiiiiiiiiiii"; -char const SkillLinefmt[] = "nisxixixx"; -char const SkillLineAbilityfmt[] = "niiiiiiiiiiii"; -char const SkillRaceClassInfofmt[] = "diiiiiii"; -char const SpellCategoriesfmt[] = "diiiiiiiii"; -char const SpellCategoryfmt[] = "nixxii"; -char const SpellEffectfmt[] = "niifiiiffiiiiiifiifiiiiifiiiiif"; -const std::string CustomSpellEffectfmt = "ppppppppppppppappppppppppp"; -const std::string CustomSpellEffectEntryIndex = "Id"; -char const Spellfmt[] = "nsxxxiiiiiiiiiiiiiiiiiii"; -const std::string CustomSpellfmt = "ppppppppppppppapaaaaaaaaapaaaaaapapppaapppaaapa"; -const std::string CustomSpellEntryIndex = "Id"; -char const SpellEffectScalingfmt[] = "nfffi"; -char const SpellFocusObjectfmt[] = "nx"; -char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiiifff"; -char const SpellScalingfmt[] = "niiiifiii"; -char const SpellTargetRestrictionsfmt[] = "niiffiiii"; -char const SpellInterruptsfmt[] = "diiiiiii"; -char const SpellEquippedItemsfmt[] = "diiiii"; -char const SpellAuraOptionsfmt[] = "niiiiiiii"; -char const SpellCooldownsfmt[] = "diiiii"; -char const SpellLevelsfmt[] = "diiiii"; -char const SpellShapeshiftfmt[] = "niiiix"; -char const SpellShapeshiftFormfmt[] = "nxxiixiiiiiiiiiiiiixx"; +char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx"; char const SummonPropertiesfmt[] = "niiiii"; char const Talentfmt[] = "niiiiiiiiix"; char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; char const VehicleSeatfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; char const WMOAreaTablefmt[] = "niiixxxxxiixxxx"; char const WorldMapAreafmt[] = "xinxffffixxxxx"; -char const WorldMapTransformsfmt[] = "diffffffiffxxxf"; char const WorldSafeLocsfmt[] = "niffffx"; #endif diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 42d7ff404db..9c524413aba 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2052,8 +2052,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateDamaged.DisplayID) - modelId = modelData->StateDamaged.DisplayID; + if (modelData->StateDamagedDisplayID) + modelId = modelData->StateDamagedDisplayID; SetDisplayId(modelId); if (setHealth) @@ -2080,8 +2080,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateDestroyed.DisplayID) - modelId = modelData->StateDestroyed.DisplayID; + if (modelData->StateDestroyedDisplayID) + modelId = modelData->StateDestroyedDisplayID; SetDisplayId(modelId); if (setHealth) @@ -2099,8 +2099,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateRebuilding.DisplayID) - modelId = modelData->StateRebuilding.DisplayID; + if (modelData->StateRebuildingDisplayID) + modelId = modelData->StateRebuildingDisplayID; SetDisplayId(modelId); // restores to full health diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 20f1772ef00..3eba4d58d80 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -78,28 +78,29 @@ void AddItemsSetItem(Player* player, Item* item) ++eff->EquippedItemCount; - ItemSetSpells& spells = sItemSetSpellsStore[setid]; - - for (ItemSetSpellEntry const* itemSetSpell : spells) + if (std::vector const* itemSetSpells = sDB2Manager.GetItemSetSpells(setid)) { - //not enough for spell - if (itemSetSpell->Threshold > eff->EquippedItemCount) - continue; + for (ItemSetSpellEntry const* itemSetSpell : *itemSetSpells) + { + //not enough for spell + if (itemSetSpell->Threshold > eff->EquippedItemCount) + continue; - if (eff->SetBonuses.count(itemSetSpell)) - continue; + if (eff->SetBonuses.count(itemSetSpell)) + continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSetSpell->SpellID); - if (!spellInfo) - { - TC_LOG_ERROR("entities.player.items", "WORLD: unknown spell id %u in items set %u effects", itemSetSpell->SpellID, setid); - continue; - } + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSetSpell->SpellID); + if (!spellInfo) + { + TC_LOG_ERROR("entities.player.items", "WORLD: unknown spell id %u in items set %u effects", itemSetSpell->SpellID, setid); + continue; + } - eff->SetBonuses.insert(itemSetSpell); - // spell cast only if fit form requirement, in other case will cast at form change - if (!itemSetSpell->ChrSpecID || itemSetSpell->ChrSpecID == player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) - player->ApplyEquipSpell(spellInfo, NULL, true); + eff->SetBonuses.insert(itemSetSpell); + // spell cast only if fit form requirement, in other case will cast at form change + if (!itemSetSpell->ChrSpecID || itemSetSpell->ChrSpecID == player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) + player->ApplyEquipSpell(spellInfo, NULL, true); + } } } @@ -132,18 +133,20 @@ void RemoveItemsSetItem(Player* player, ItemTemplate const* proto) --eff->EquippedItemCount; - ItemSetSpells const& spells = sItemSetSpellsStore[setid]; - for (ItemSetSpellEntry const* itemSetSpell : spells) + if (std::vector const* itemSetSpells = sDB2Manager.GetItemSetSpells(setid)) { - // enough for spell - if (itemSetSpell->Threshold <= eff->EquippedItemCount) - continue; + for (ItemSetSpellEntry const* itemSetSpell : *itemSetSpells) + { + // enough for spell + if (itemSetSpell->Threshold <= eff->EquippedItemCount) + continue; - if (!eff->SetBonuses.count(itemSetSpell)) - continue; + if (!eff->SetBonuses.count(itemSetSpell)) + continue; - player->ApplyEquipSpell(sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID), nullptr, false); - eff->SetBonuses.erase(itemSetSpell); + player->ApplyEquipSpell(sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID), nullptr, false); + eff->SetBonuses.erase(itemSetSpell); + } } if (!eff->EquippedItemCount) //all items of a set were removed @@ -373,6 +376,21 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(1, GetGUID().GetCounter()); trans->Append(stmt); } + if (!GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).empty()) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + uint32 i = 0; + for (; i < MAX_GEM_SOCKETS && i < GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + stmt->setUInt32(1 + i, GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i)); + for (; i < MAX_GEM_SOCKETS; ++i) + stmt->setUInt32(1 + i, 0); + trans->Append(stmt); + } break; } case ITEM_REMOVED: @@ -381,6 +399,10 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); @@ -413,7 +435,9 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie // 0 1 2 3 4 5 6 7 8 9 10 11 12 //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, // 13 14 15 16 17 18 19 20 - // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs FROM item_instance WHERE guid = '%u'", guid); + // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 21 22 23 + // gemItemId1, gemItemId2, gemItemId3 FROM item_instance WHERE guid = '%u'", guid); // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -493,6 +517,17 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[18].GetUInt16()); SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); + uint32 gemItemIds[3] = { fields[21].GetUInt32(), fields[22].GetUInt32(), fields[23].GetUInt32() }; + if (gemItemIds[0] || gemItemIds[1] || gemItemIds[2]) + { + // gem slots must be preserved, hence funky logic + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[0]); + if (gemItemIds[1] || gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[1]); + if (gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[2]); + } + Tokenizer bonusListIDs(fields[20].GetString(), ' '); for (char const* token : bonusListIDs) { @@ -582,27 +617,25 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id) if (itemProto->GetRandomProperty()) { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomProperty()); - ItemRandomPropertiesEntry const* random_id = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomPropertiesStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in 'ItemRandomProperties.dbc'", randomPropId); return 0; } - return random_id->ID; + return randomPropId; } // RandomSuffix case else { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomSuffix()); - ItemRandomSuffixEntry const* random_id = sItemRandomSuffixStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomSuffixStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in sItemRandomSuffixStore.", randomPropId); return 0; } - return -int32(random_id->ID); + return -int32(randomPropId); } } @@ -613,12 +646,12 @@ void Item::SetItemRandomProperties(int32 randomPropId) if (randomPropId > 0) { - ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (item_rand) + ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(-randomPropId); + if (sItemRandomPropertiesStore.LookupEntry(randomPropId)) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != int32(item_rand->ID)) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, item_rand->ID); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); SetState(ITEM_CHANGED, GetOwner()); } for (uint32 i = PROP_ENCHANTMENT_SLOT_1; i < PROP_ENCHANTMENT_SLOT_1 + 3; ++i) @@ -630,10 +663,9 @@ void Item::SetItemRandomProperties(int32 randomPropId) ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(-randomPropId); if (item_rand) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != -int32(item_rand->ID) || - !GetItemSuffixFactor()) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId || !GetItemSuffixFactor()) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, -int32(item_rand->ID)); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); UpdateItemSuffixFactor(); SetState(ITEM_CHANGED, GetOwner()); } @@ -924,36 +956,24 @@ void Item::ClearEnchantment(EnchantmentSlot slot) bool Item::GemsFitSockets() const { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + uint32 gemSlot = 0; + for (uint32 gemItemId : GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint8 SocketColor = GetTemplate()->GetSocketColor(enchant_slot - SOCK_ENCHANTMENT_SLOT); - + uint8 SocketColor = GetTemplate()->GetSocketColor(gemSlot); if (!SocketColor) // no socket slot continue; - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) // no gems on this socket - return false; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) // invalid gem id on this socket - return false; - - uint8 GemColor = 0; + uint32 GemColor = 0; - uint32 gemid = enchantEntry->SRCItemID; - if (gemid) + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + if (gemProto) { - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); - if (gemProto) - { - GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); - if (gemProperty) - GemColor = gemProperty->Type; - } + GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); + if (gemProperty) + GemColor = gemProperty->Type; } - if (!(GemColor & SocketColor)) // bad gem color on this socket + if (!(GemColor & SocketColorToGemTypeMask[SocketColor])) // bad gem color on this socket return false; } return true; @@ -961,44 +981,22 @@ bool Item::GemsFitSockets() const uint8 Item::GetGemCountWithID(uint32 GemID) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [GemID](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - if (GemID == enchantEntry->SRCItemID) - ++count; - } - return count; + return gemItemId == GemID; + }); } uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [limitCategory](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) - continue; + return false; - if (gemProto->GetItemLimitCategory() == limitCategory) - ++count; - } - return count; + return gemProto->GetItemLimitCategory() == limitCategory; + }); } bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 7b30480df35..2f82071f66f 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -178,7 +178,7 @@ TC_GAME_API uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uin return 0; } - RandomPropertiesPointsEntry const* randPropPointsEntry = sRandomPropertiesPointsStore.LookupEntry(itemLevel); + RandPropPointsEntry const* randPropPointsEntry = sRandPropPointsStore.LookupEntry(itemLevel); if (!randPropPointsEntry) return 0; diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index ebed45eaaac..04873bdddcf 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -22,6 +22,29 @@ #include "ItemTemplate.h" #include "Player.h" +uint32 const SocketColorToGemTypeMask[19] = +{ + 0, + SOCKET_COLOR_META, + SOCKET_COLOR_RED, + SOCKET_COLOR_YELLOW, + SOCKET_COLOR_BLUE, + SOCKET_COLOR_HYDRAULIC, + SOCKET_COLOR_COGWHEEL, + SOCKET_COLOR_PRISMATIC, + SOCKET_COLOR_RELIC_IRON, + SOCKET_COLOR_RELIC_BLOOD, + SOCKET_COLOR_RELIC_SHADOW, + SOCKET_COLOR_RELIC_FEL, + SOCKET_COLOR_RELIC_ARCANE, + SOCKET_COLOR_RELIC_FROST, + SOCKET_COLOR_RELIC_FIRE, + SOCKET_COLOR_RELIC_WATER, + SOCKET_COLOR_RELIC_LIFE, + SOCKET_COLOR_RELIC_WIND, + SOCKET_COLOR_RELIC_HOLY +}; + char const* ItemTemplate::GetName(LocaleConstant locale) const { if (!strlen(ExtendedData->Name->Str[locale])) @@ -137,21 +160,21 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) return; - DBCStorage* store = NULL; // get the right store here if (GetInventoryType() > INVTYPE_RANGEDRIGHT) return; + float dps = 0.0f; switch (GetInventoryType()) { case INVTYPE_AMMO: - store = &sItemDamageAmmoStore; + dps = sItemDamageAmmoStore.AssertEntry(itemLevel)->DPS[quality]; break; case INVTYPE_2HWEAPON: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) - store = &sItemDamageTwoHandCasterStore; + dps = sItemDamageTwoHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else - store = &sItemDamageTwoHandStore; + dps = sItemDamageTwoHandStore.AssertEntry(itemLevel)->DPS[quality]; break; case INVTYPE_RANGED: case INVTYPE_THROWN: @@ -159,15 +182,15 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag switch (GetSubClass()) { case ITEM_SUBCLASS_WEAPON_WAND: - store = &sItemDamageWandStore; - break; - case ITEM_SUBCLASS_WEAPON_THROWN: - store = &sItemDamageThrownStore; + dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; break; case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_CROSSBOW: - store = &sItemDamageRangedStore; + if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) + dps = sItemDamageTwoHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; + else + dps = sItemDamageTwoHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; @@ -177,21 +200,14 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag case INVTYPE_WEAPONMAINHAND: case INVTYPE_WEAPONOFFHAND: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) - store = &sItemDamageOneHandCasterStore; + dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else - store = &sItemDamageOneHandStore; + dps = sItemDamageOneHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; } - ASSERT(store); - - ItemDamageEntry const* damageInfo = store->LookupEntry(itemLevel); - if (!damageInfo) - return; - - float dps = damageInfo->DPS[quality]; float avgDamage = dps * GetDelay() * 0.001f; minDamage = (GetStatScalingFactor() * -0.5f + 1.0f) * avgDamage; maxDamage = floor(float(avgDamage * (GetStatScalingFactor() * 0.5f + 1.0f) + 0.5f)); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index d69f1c88845..38265cc9fed 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -317,15 +317,29 @@ enum BAG_FAMILY_MASK enum SocketColor { - SOCKET_COLOR_META = 1, - SOCKET_COLOR_RED = 2, - SOCKET_COLOR_YELLOW = 4, - SOCKET_COLOR_BLUE = 8, - SOCKET_COLOR_HYDRAULIC = 16, // not used - SOCKET_COLOR_COGWHEEL = 32, -}; - -#define SOCKET_COLOR_ALL (SOCKET_COLOR_META | SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE | SOCKET_COLOR_COGWHEEL) + SOCKET_COLOR_META = 0x00001, + SOCKET_COLOR_RED = 0x00002, + SOCKET_COLOR_YELLOW = 0x00004, + SOCKET_COLOR_BLUE = 0x00008, + SOCKET_COLOR_HYDRAULIC = 0x00010, // not used + SOCKET_COLOR_COGWHEEL = 0x00020, + SOCKET_COLOR_PRISMATIC = 0x0000E, + SOCKET_COLOR_RELIC_IRON = 0x00040, + SOCKET_COLOR_RELIC_BLOOD = 0x00080, + SOCKET_COLOR_RELIC_SHADOW = 0x00100, + SOCKET_COLOR_RELIC_FEL = 0x00200, + SOCKET_COLOR_RELIC_ARCANE = 0x00400, + SOCKET_COLOR_RELIC_FROST = 0x00800, + SOCKET_COLOR_RELIC_FIRE = 0x01000, + SOCKET_COLOR_RELIC_WATER = 0x02000, + SOCKET_COLOR_RELIC_LIFE = 0x04000, + SOCKET_COLOR_RELIC_WIND = 0x08000, + SOCKET_COLOR_RELIC_HOLY = 0x10000 +}; + +extern uint32 const SocketColorToGemTypeMask[19]; + +#define SOCKET_COLOR_STANDARD (SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE) enum InventoryType { @@ -646,10 +660,11 @@ class Player; struct TC_GAME_API ItemTemplate { + uint32 Id; ItemEntry const* BasicData; ItemSparseEntry const* ExtendedData; - uint32 GetId() const { return BasicData->ID; } + uint32 GetId() const { return Id; } uint32 GetClass() const { return BasicData->Class; } uint32 GetSubClass() const { return BasicData->SubClass; } uint32 GetQuality() const { return ExtendedData->Quality; } @@ -658,7 +673,7 @@ struct TC_GAME_API ItemTemplate uint32 GetFlags3() const { return ExtendedData->Flags[2]; } float GetUnk1() const { return ExtendedData->Unk1; } float GetUnk2() const { return ExtendedData->Unk2; } - uint32 GetBuyCount() const { return std::max(ExtendedData->BuyCount, 1u); } + uint32 GetBuyCount() const { return std::max(ExtendedData->BuyCount, 1u); } uint32 GetBuyPrice() const { return ExtendedData->BuyPrice; } uint32 GetSellPrice() const { return ExtendedData->SellPrice; } InventoryType GetInventoryType() const { return InventoryType(ExtendedData->InventoryType); } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f9fa1b3aeb6..67d8d89cdf6 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1341,6 +1341,13 @@ std::vector const& Object::GetDynamicValues(uint16 index) const return _dynamicValues[index]; } +uint32 Object::GetDynamicValue(uint16 index, uint8 offset) const +{ + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + ASSERT(offset < _dynamicValues[index].size()); + return _dynamicValues[index][offset]; +} + void Object::AddDynamicValue(uint16 index, uint32 value) { ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 503555037e1..bd31af9363c 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -168,6 +168,7 @@ class TC_GAME_API Object void ApplyModFlag64(uint16 index, uint64 flag, bool apply); std::vector const& GetDynamicValues(uint16 index) const; + uint32 GetDynamicValue(uint16 index, uint8 offset) const; void AddDynamicValue(uint16 index, uint32 value); void RemoveDynamicValue(uint16 index, uint32 value); void ClearDynamicValue(uint16 index); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 90f1c829bb9..38a47d999a9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -421,7 +421,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, true)) + if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Sex, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHairStyle, createInfo->Skin, createInfo->CustomDisplay, true)) { TC_LOG_ERROR("entities.player", "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()); @@ -1805,20 +1805,21 @@ void Player::RegenerateAll() // Runes act as cooldowns, and they don't need to send any data if (getClass() == CLASS_DEATH_KNIGHT) { - for (uint8 i = 0; i < MAX_RUNES; i += 2) + uint32 regeneratedRunes = 0; + uint32 regenIndex = 0; + while (regeneratedRunes < MAX_RECHARGING_RUNES && !m_runes->CooldownOrder.empty()) { - uint8 runeToRegen = i; - uint32 cd = GetRuneCooldown(i); - uint32 secondRuneCd = GetRuneCooldown(i + 1); - // Regenerate second rune of the same type only after first rune is off the cooldown - if (secondRuneCd && (cd > secondRuneCd || !cd)) + uint8 runeToRegen = m_runes->CooldownOrder[regenIndex++]; + uint32 runeCooldown = GetRuneCooldown(runeToRegen); + if (runeCooldown > m_regenTimer) { - runeToRegen = i + 1; - cd = secondRuneCd; + SetRuneCooldown(runeToRegen, runeCooldown - m_regenTimer); + ++regenIndex; } + else + SetRuneCooldown(runeCooldown, 0); - if (cd) - SetRuneCooldown(runeToRegen, (cd > m_regenTimer) ? cd - m_regenTimer : 0); + ++regeneratedRunes; } } @@ -2055,8 +2056,8 @@ void Player::ResetAllPowers() case POWER_RUNIC_POWER: SetPower(POWER_RUNIC_POWER, 0); break; - case POWER_ECLIPSE: - SetPower(POWER_ECLIPSE, 0); + case POWER_LUNAR_POWER: + SetPower(POWER_LUNAR_POWER, 0); break; default: break; @@ -3142,12 +3143,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if (pSkill->ID == fromSkill) + if (_spell_idx->second->SkillLine == fromSkill) continue; // Runeforging special case - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || ((pSkill->ID == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) - if (SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass())) + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) + if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(_spell_idx->second->SkillLine, getRace(), getClass())) LearnDefaultSkill(rcInfo); } } @@ -3230,7 +3231,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const bool Player::IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const { if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - return spellInfo->Id == chrSpec->MasterySpellID[0] || spellInfo->Id == chrSpec->MasterySpellID[1]; + return spellInfo->Id == chrSpec->MasterySpellID; return false; } @@ -3968,6 +3969,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4217,7 +4222,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, uint32(GetMaxPower(POWER_ENERGY)*restore_percent)); SetPower(POWER_FOCUS, uint32(GetMaxPower(POWER_FOCUS)*restore_percent)); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); } // trigger update zone for alive state zone updates @@ -5326,7 +5331,7 @@ void Player::UpdateSkillsForLevel() continue; uint32 pskill = itr->first; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(pskill, getRace(), getClass()); if (!rcEntry) continue; @@ -5363,7 +5368,7 @@ void Player::UpdateSkillsToMaxSkillsForLevel() continue; uint32 pskill = itr->first; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(pskill, getRace(), getClass()); if (!rcEntry) continue; @@ -6129,7 +6134,7 @@ void Player::RewardReputation(Quest const* quest) else { uint32 row = ((quest->RewardFactionValue[i] < 0) ? 1 : 0) + 1; - if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row)) + if (QuestFactionRewardEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row)) { uint32 field = abs(quest->RewardFactionValue[i]); rep = questFactionRewEntry->QuestRewFactionValue[field]; @@ -9764,7 +9769,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) { item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i); - if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) return true; } @@ -9777,7 +9782,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const for (uint32 j = 0; j < bag->GetBagSize(); ++j) { item = GetUseableItemByPos(i, j); - if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) return true; } } @@ -12763,20 +12768,23 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool if (pEnchant->RequiredSkillID > 0 && pEnchant->RequiredSkillRank > GetSkillValue(pEnchant->RequiredSkillID)) return; - // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 - if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(pEnchant->SRCItemID)) - if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) - return; // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements // rather than the gem requirements itself. If the socket has no color it is a prismatic socket. - if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3) - && !item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3)) { - // Check if the requirements for the prismatic socket are met before applying the gem stats - SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); - if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) - return; + if (!item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + { + // Check if the requirements for the prismatic socket are met before applying the gem stats + SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); + if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) + return; + } + + // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 + if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, uint32(slot - SOCK_ENCHANTMENT_SLOT)))) + if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) + return; } if (!item->IsBroken()) @@ -16357,7 +16365,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID), GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID), GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE), - GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID))) + GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID), + std::array{ fields[14].GetUInt8(), fields[15].GetUInt8(), fields[16].GetUInt8() })) { 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; @@ -16922,7 +16931,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) for (; loadedPowers < MAX_POWERS_PER_CLASS; ++loadedPowers) SetUInt32Value(UNIT_FIELD_POWER + loadedPowers, 0); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: The value of player '%s' after load item and aura is: ", m_name.c_str()); outDebugValues(); @@ -17265,8 +17274,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId - // 15 16 17 18 19 20 21 22 - // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 15 16 17 18 19 20 21 22 23 24 25 + // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17288,8 +17297,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create(fields[21].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[22].GetUInt8(); + ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create(fields[24].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[25].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); @@ -21560,23 +21569,11 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) if (i == slot) continue; Item* pItem2 = GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if (pItem2 && !pItem2->IsBroken() && pItem2->GetTemplate()->GetSocketColor(0)) + if (pItem2 && !pItem2->IsBroken()) { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem2->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - uint32 gemid = enchantEntry->SRCItemID; - if (!gemid) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) continue; @@ -21584,13 +21581,11 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) if (!gemProperty) continue; - uint8 GemColor = gemProperty->Type; + uint32 GemColor = gemProperty->Type; for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1) - { if (tmpcolormask & GemColor) ++curcount[b]; - } } } } @@ -23498,7 +23493,7 @@ void Player::ResurrectUsingRequestDataImpl() SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); SetPower(POWER_FOCUS, GetMaxPower(POWER_FOCUS)); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); if (uint32 aura = _resurrectionData->Aura) CastSpell(this, aura, true, nullptr, nullptr, _resurrectionData->GUID); @@ -24005,16 +24000,16 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 void Player::InitGlyphsForLevel() { - uint32 slotMask = 0; - uint8 slot = 0; - uint8 level = getLevel(); - for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) - { - if (level >= ((gs->Tooltip + 1) * 25)) - slotMask |= 1 << slot; + //uint32 slotMask = 0; + //uint8 slot = 0; + //uint8 level = getLevel(); + //for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) + //{ + // if (level >= ((gs->Tooltip + 1) * 25)) + // slotMask |= 1 << slot; - SetGlyphSlot(slot++, gs->ID); - } + // SetGlyphSlot(slot++, gs->ID); + //} } void Player::SetGlyph(uint8 slot, uint32 glyph) @@ -24095,7 +24090,7 @@ bool Player::isTotalImmunity() const return false; } -uint32 Player::GetRuneTypeBaseCooldown() const +uint32 Player::GetRuneBaseCooldown() const { float cooldown = RUNE_BASE_COOLDOWN; @@ -24133,72 +24128,33 @@ void Player::SetRuneCooldown(uint8 index, uint32 cooldown, bool casted /*= false SetRuneTimer(index, 0); } - m_runes->runes[index].Cooldown = cooldown; + m_runes->Cooldown[index] = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); } -void Player::SetRuneConvertAura(uint8 index, AuraEffect const* aura) -{ - m_runes->runes[index].ConvertAura = aura; -} - -void Player::AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura) +void Runes::SetRuneState(uint8 index, bool set /*= true*/) { - SetRuneConvertAura(index, aura); ConvertRune(index, newType); -} - -void Player::RemoveRunesByAuraEffect(AuraEffect const* aura) -{ - for (uint8 i = 0; i < MAX_RUNES; ++i) + auto itr = std::find(CooldownOrder.begin(), CooldownOrder.end(), index); + if (set) { - if (m_runes->runes[i].ConvertAura == aura) - { - ConvertRune(i, GetBaseRune(i)); - SetRuneConvertAura(i, nullptr); - } + RuneState |= (1 << index); // usable + if (itr == CooldownOrder.end()) + CooldownOrder.push_back(index); } -} - -void Player::RestoreBaseRune(uint8 index) -{ - AuraEffect const* aura = m_runes->runes[index].ConvertAura; - // If rune was converted by a non-passive aura that still active we should keep it converted - if (aura && !(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE)) - return; - ConvertRune(index, GetBaseRune(index)); - SetRuneConvertAura(index, nullptr); - // Don't drop passive talents providing rune convertion - if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE) - return; - for (uint8 i = 0; i < MAX_RUNES; ++i) + else { - if (aura == m_runes->runes[i].ConvertAura) - return; + RuneState &= ~(1 << index); // on cooldown + if (itr != CooldownOrder.end()) + CooldownOrder.erase(itr); } - aura->GetBase()->Remove(); -} - -void Player::ConvertRune(uint8 index, RuneType newType) -{ - SetCurrentRune(index, newType); - - WorldPackets::Spells::ConvertRune data; - data.Index = index; - data.Rune = newType; - GetSession()->SendPacket(data.Write()); } -void Player::ResyncRunes(uint8 count) const +void Player::ResyncRunes() const { - WorldPackets::Spells::ResyncRunes data(count); + WorldPackets::Spells::ResyncRunes data(MAX_RUNES); + for (uint32 i = 0; i < MAX_RUNES; ++i) + data.Runes.push_back(uint8(255 - (GetRuneCooldown(i) * 51))); - for (uint32 i = 0; i < count; ++i) - { - WorldPackets::Spells::ResyncRunes::ResyncRune rune; - rune.RuneType = GetCurrentRune(i); // rune type - rune.Cooldown = uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255) - data.Runes.push_back(rune); - } GetSession()->SendPacket(data.Write()); } @@ -24209,16 +24165,6 @@ void Player::AddRunePower(uint8 index) const GetSession()->SendPacket(&data); } -static RuneType runeSlotTypes[MAX_RUNES] = -{ - /*0*/ RUNE_BLOOD, - /*1*/ RUNE_BLOOD, - /*2*/ RUNE_UNHOLY, - /*3*/ RUNE_UNHOLY, - /*4*/ RUNE_FROST, - /*5*/ RUNE_FROST -}; - void Player::InitRunes() { if (getClass() != CLASS_DEATH_KNIGHT) @@ -24228,20 +24174,14 @@ void Player::InitRunes() if (runeIndex == MAX_POWERS) return; - m_runes = new Runes; - - m_runes->runeState = 0; - m_runes->lastUsedRune = RUNE_BLOOD; + m_runes = new Runes(); + m_runes->RuneState = 0; for (uint8 i = 0; i < MAX_RUNES; ++i) { - SetBaseRune(i, runeSlotTypes[i]); // init base types - SetCurrentRune(i, runeSlotTypes[i]); // init current types SetRuneCooldown(i, 0); // reset cooldowns SetRuneTimer(i, 0xFFFFFFFF); // Reset rune flags SetLastRuneGraceTimer(i, 0); - SetRuneConvertAura(i, nullptr); - m_runes->SetRuneState(i); } // set a base regen timer equal to 10 sec @@ -24249,15 +24189,6 @@ void Player::InitRunes() SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + runeIndex, 0.1f); } -bool Player::IsBaseRuneSlotsOnCooldown(RuneType runeType) const -{ - for (uint8 i = 0; i < MAX_RUNES; ++i) - if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0) - return false; - - return true; -} - void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast) { Loot loot; @@ -24400,7 +24331,7 @@ void Player::_LoadSkills(PreparedQueryResult result) uint16 value = fields[1].GetUInt16(); uint16 max = fields[2].GetUInt16(); - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skill, getRace(), getClass()); if (!rcEntry) { TC_LOG_ERROR("entities.player", "Player::_LoadSkills: Player '%s' (%s, Race: %u, Class: %u) has forbidden skill %u for his race/class combination", @@ -24512,16 +24443,9 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi return res; // check unique-equipped on gems - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(gemItemId); if (!pGem) continue; @@ -24679,6 +24603,11 @@ void Player::CompletedAchievement(AchievementEntry const* entry) m_achievementMgr->CompletedAchievement(entry, this); } +bool Player::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return m_achievementMgr->ModifierTreeSatisfied(modifierTreeId); +} + bool Player::LearnTalent(uint32 talentId) { TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); @@ -25306,9 +25235,8 @@ void Player::ActivateTalentGroup(uint8 spec) if (CanUseMastery()) if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (uint32 mastery = specialization->MasterySpellID[i]) - LearnSpell(mastery, false); + if (uint32 mastery = specialization->MasterySpellID) + LearnSpell(mastery, false); // set glyphs for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) @@ -26088,7 +26016,19 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const uint32 Player::CalculateTalentsTiers() const { - uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels; + uint32 const* rowLevels; + switch (getClass()) + { + case CLASS_DEATH_KNIGHT: + rowLevels = DKTalentRowLevels; + break; + case CLASS_DEMON_HUNTER: + rowLevels = DHTalentRowLevels; + default: + rowLevels = DefaultTalentRowLevels; + break; + } + for (uint32 i = MAX_TALENT_TIERS; i; --i) if (getLevel() >= rowLevels[i - 1]) return i; @@ -26219,9 +26159,8 @@ void Player::RemoveSpecializationSpells() } } - for (uint32 j = 0; j < MAX_MASTERY_SPELLS; ++j) - if (uint32 mastery = specialization->MasterySpellID[j]) - RemoveAurasDueToSpell(mastery); + if (uint32 mastery = specialization->MasterySpellID) + RemoveAurasDueToSpell(mastery); } } } @@ -26232,8 +26171,21 @@ void Player::RemoveSocial() m_social = nullptr; } -// TODO: check demon hunter custom display sections -bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, bool create /*=false*/) +bool IsSectionFlagValid(CharSectionsEntry const* entry, uint8 class_, bool create) +{ + if (create && !(entry->Flags & SECTION_FLAG_PLAYER)) + return false; + + if (class_ != CLASS_DEATH_KNIGHT && (entry->Flags & SECTION_FLAG_DEATH_KNIGHT)) + return false; + + if (class_ != CLASS_DEMON_HUNTER && (entry->Flags & SECTION_FLAG_DEMON_HUNTER)) + return false; + + return true; +} + +bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, std::array const& customDisplay, bool create /*= false*/) { // Check skin color // For Skin type is always 0 @@ -26241,10 +26193,9 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha { // Skin Color defined as Face color, too, we check skin & face in one pass if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor)) { - // Check DeathKnight exclusive - if (((entry->Flags & SECTION_FLAG_DEATH_KNIGHT) || (entry2->Flags & SECTION_FLAG_DEATH_KNIGHT)) && class_ != CLASS_DEATH_KNIGHT) + if (!IsSectionFlagValid(entry, class_, create)) return false; - if (create && !((entry->Flags & SECTION_FLAG_PLAYER) && (entry2->Flags & SECTION_FLAG_PLAYER))) + if (!IsSectionFlagValid(entry2, class_, create)) return false; } else @@ -26259,18 +26210,14 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha // Check Hair if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor)) { - if ((entry->Flags & SECTION_FLAG_DEATH_KNIGHT) && class_ != CLASS_DEATH_KNIGHT) - return false; - if (create && !(entry->Flags & SECTION_FLAG_PLAYER)) + if (!IsSectionFlagValid(entry, class_, create)) return false; if (!excludeCheck) { if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor)) { - if ((entry2->Flags & SECTION_FLAG_DEATH_KNIGHT) && class_ != CLASS_DEATH_KNIGHT) - return false; - if (create && !(entry2->Flags & SECTION_FLAG_PLAYER)) + if (!IsSectionFlagValid(entry2, class_, create)) return false; } else @@ -26285,6 +26232,11 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha else return false; + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + if (CharSectionsEntry const* entry = GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0)) + if (!IsSectionFlagValid(entry, class_, create)) + return false; + return true; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index aa1f1d0697e..b538bbbe05c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -447,7 +447,8 @@ struct Areas float y2; }; -#define MAX_RUNES 6 +#define MAX_RUNES 7 +#define MAX_RECHARGING_RUNES 3 enum RuneCooldowns { @@ -455,36 +456,13 @@ enum RuneCooldowns RUNE_MISS_COOLDOWN = 1500 // cooldown applied on runes when the spell misses }; -enum RuneType : uint8 -{ - RUNE_BLOOD = 0, - RUNE_UNHOLY = 1, - RUNE_FROST = 2, - RUNE_DEATH = 3, - NUM_RUNE_TYPES = 4 -}; - -struct RuneInfo -{ - RuneType BaseRune; - RuneType CurrentRune; - uint32 Cooldown; - AuraEffect const* ConvertAura; -}; - struct Runes { - RuneInfo runes[MAX_RUNES]; - uint8 runeState; // mask of available runes - RuneType lastUsedRune; + std::deque CooldownOrder; + uint32 Cooldown[MAX_RUNES]; + uint8 RuneState; // mask of available runes - void SetRuneState(uint8 index, bool set = true) - { - if (set) - runeState |= (1 << index); // usable - else - runeState &= ~(1 << index); // on cooldown - } + void SetRuneState(uint8 index, bool set = true); }; struct EnchantDuration @@ -1162,6 +1140,7 @@ struct ResurrectionData static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; +static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 }; struct TC_GAME_API PlayerTalentInfo { @@ -1652,7 +1631,7 @@ class TC_GAME_API Player : public Unit, public GridObject 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 ((1 << (Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0; } - static bool ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, bool create = false); + static bool ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, std::array const& customDisplay, bool create = false); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -2424,24 +2403,11 @@ class TC_GAME_API Player : public Unit, public GridObject bool isAllowedToLoot(const Creature* creature); DeclinedName const* GetDeclinedNames() const { return m_declinedname; } - uint8 GetRunesState() const { return m_runes->runeState; } - RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); } - RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); } - uint32 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; } - uint32 GetRuneBaseCooldown(uint8 index) const { return GetRuneTypeBaseCooldown(); } - uint32 GetRuneTypeBaseCooldown() const; - bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const; - RuneType GetLastUsedRune() const { return m_runes->lastUsedRune; } - void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; } - void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; } - void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; } + uint8 GetRunesState() const { return m_runes->RuneState; } + uint32 GetRuneCooldown(uint8 index) const { return m_runes->Cooldown[index]; } + uint32 GetRuneBaseCooldown() const; void SetRuneCooldown(uint8 index, uint32 cooldown, bool casted = false); - void SetRuneConvertAura(uint8 index, AuraEffect const* aura); - void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura); - void RemoveRunesByAuraEffect(AuraEffect const* aura); - void RestoreBaseRune(uint8 index); - void ConvertRune(uint8 index, RuneType newType); - void ResyncRunes(uint8 count) const; + void ResyncRunes() const; void AddRunePower(uint8 index) const; void InitRunes(); @@ -2454,6 +2420,7 @@ class TC_GAME_API Player : public Unit, public GridObject void StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry); void CompletedAchievement(AchievementEntry const* entry); + bool ModifierTreeSatisfied(uint32 modifierTreeId) const; bool HasTitle(uint32 bitIndex) const; bool HasTitle(CharTitlesEntry const* title) const { return HasTitle(title->MaskID); } diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index 6617267be6a..22af722d592 100644 --- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp +++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp @@ -108,8 +108,8 @@ void TaxiPathGraph::AddVerticeAndEdgeFromNodeInfo(TaxiNodesEntry const* from, Ta uint32 map1, map2; DBCPosition2D pos1, pos2; - DeterminaAlternateMapPosition(nodes[i - 1]->MapID, nodes[i - 1]->Loc.X, nodes[i - 1]->Loc.Y, nodes[i - 1]->Loc.Z, &map1, &pos1); - DeterminaAlternateMapPosition(nodes[i]->MapID, nodes[i]->Loc.X, nodes[i]->Loc.Y, nodes[i]->Loc.Z, &map2, &pos2); + DB2Manager::DeterminaAlternateMapPosition(nodes[i - 1]->MapID, nodes[i - 1]->Loc.X, nodes[i - 1]->Loc.Y, nodes[i - 1]->Loc.Z, &map1, &pos1); + DB2Manager::DeterminaAlternateMapPosition(nodes[i]->MapID, nodes[i]->Loc.X, nodes[i]->Loc.Y, nodes[i]->Loc.Z, &map2, &pos2); if (map1 != map2) continue; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index deb163fde7e..f9ba83c19ca 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -539,24 +539,21 @@ void Player::UpdateMastery() if (!chrSpec) return; - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - { - if (!chrSpec->MasterySpellID[i]) - continue; + if (!chrSpec->MasterySpellID) + return; - if (Aura* aura = GetAura(chrSpec->MasterySpellID[i])) + if (Aura* aura = GetAura(chrSpec->MasterySpellID)) + { + for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) { - for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) - { - if (!effect) - continue; + if (!effect) + continue; - float mult = effect->BonusCoefficient; - if (G3D::fuzzyEq(mult, 0.0f)) - continue; + float mult = effect->BonusCoefficient; + if (G3D::fuzzyEq(mult, 0.0f)) + continue; - aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); - } + aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); } } } @@ -780,7 +777,7 @@ void Player::UpdateAllRunesRegen() if (runeIndex == MAX_POWERS) return; - uint32 cooldown = GetRuneTypeBaseCooldown(); + uint32 cooldown = GetRuneBaseCooldown(); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + runeIndex, float(1 * IN_MILLISECONDS) / float(cooldown)); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + runeIndex, float(1 * IN_MILLISECONDS) / float(cooldown)); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 271b84364de..2bf8d161798 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6056,78 +6056,6 @@ bool Unit::HandleAuraProc(Unit* /*victim*/, uint32 /*damage*/, Aura* triggeredBy } case SPELLFAMILY_DEATHKNIGHT: { - // Blood of the North - // Reaping - // Death Rune Mastery - /// @todo move those to spell scripts - if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622) - { - *handled = true; - // Convert recently used Blood Rune to Death Rune - if (Player* player = ToPlayer()) - { - if (player->getClass() != CLASS_DEATH_KNIGHT) - return false; - - RuneType rune = ToPlayer()->GetLastUsedRune(); - // can't proc from death rune use - if (rune == RUNE_DEATH) - return false; - AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0); - if (!aurEff) - return false; - - // Reset amplitude - set death rune remove timer to 30s - aurEff->ResetPeriodic(true); - uint32 runesLeft; - - if (dummySpell->SpellIconID == 2622) - runesLeft = 2; - else - runesLeft = 1; - - for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i) - { - if (dummySpell->SpellIconID == 2622) - { - if (player->GetCurrentRune(i) == RUNE_DEATH || - player->GetBaseRune(i) == RUNE_BLOOD) - continue; - } - else - { - if (player->GetCurrentRune(i) == RUNE_DEATH || - player->GetBaseRune(i) != RUNE_BLOOD) - continue; - } - if (player->GetRuneCooldown(i) != (player->GetRuneBaseCooldown(i) - player->GetLastRuneGraceTimer(i))) - continue; - - --runesLeft; - // Mark aura as used - player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff); - } - return true; - } - return false; - } - - switch (dummySpell->Id) - { - // Bone Shield cooldown - case 49222: - { - *handled = true; - if (cooldown && GetTypeId() == TYPEID_PLAYER) - { - if (GetSpellHistory()->HasCooldown(100000)) - return false; - - GetSpellHistory()->AddCooldown(100000, 0, std::chrono::milliseconds(cooldown)); - } - return true; - } - } break; } case SPELLFAMILY_WARRIOR: @@ -11153,16 +11081,16 @@ int32 Unit::GetCreatePowers(Powers power) const case POWER_RUNIC_POWER: return 1000; case POWER_RUNES: - return 0; + return 6; case POWER_SOUL_SHARDS: return 400; - case POWER_ECLIPSE: + case POWER_LUNAR_POWER: return 100; case POWER_HOLY_POWER: return 3; case POWER_CHI: return 4; - case POWER_SHADOW_ORBS: + case POWER_INSANITY: return 3; case POWER_BURNING_EMBERS: return 40; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 415c46afa5d..5ba84c271be 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1446,7 +1446,7 @@ class TC_GAME_API Unit : public WorldObject Powers getPowerType() const { return Powers(GetUInt32Value(UNIT_FIELD_DISPLAY_POWER)); } void setPowerType(Powers power); int32 GetPower(Powers power) const; - int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } + int32 GetMinPower(Powers power) const { return power == POWER_LUNAR_POWER ? -100 : 0; } int32 GetMaxPower(Powers power) const; float GetPowerPct(Powers power) const { return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; } int32 CountPctFromMaxPower(Powers power, int32 pct) const { return CalculatePct(GetMaxPower(power), pct); } diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 56cbb9ad58e..33bf14d4c15 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -23,7 +23,7 @@ #include "ObjectMgr.h" #include "VehicleDefines.h" -Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1) +Garrison::Garrison(Player* owner) : _owner(owner), _siteLevelId(0), _siteLevel(nullptr), _followerActivationsRemainingToday(1) { } @@ -34,7 +34,8 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue return false; Field* fields = garrison->Fetch(); - _siteLevel = sGarrSiteLevelStore.LookupEntry(fields[0].GetUInt32()); + _siteLevelId = fields[0].GetUInt32(); + _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevelId); _followerActivationsRemainingToday = fields[1].GetUInt32(); if (!_siteLevel) return false; @@ -47,7 +48,7 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue { fields = blueprints->Fetch(); if (GarrBuildingEntry const* building = sGarrBuildingStore.LookupEntry(fields[0].GetUInt32())) - _knownBuildings.insert(building->ID); + _knownBuildings.insert(fields[0].GetUInt32()); } while (blueprints->NextRow()); } @@ -141,7 +142,7 @@ void Garrison::SaveToDB(SQLTransaction trans) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - stmt->setUInt32(1, _siteLevel->ID); + stmt->setUInt32(1, _siteLevelId); stmt->setUInt32(2, _followerActivationsRemainingToday); trans->Append(stmt); @@ -219,14 +220,17 @@ void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) bool Garrison::Create(uint32 garrSiteId) { - _siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); - if (!_siteLevel) + DBStorageIterator siteLevelItr = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); + if (siteLevelItr == sGarrSiteLevelStore.end()) return false; + _siteLevelId = siteLevelItr.Key(); + _siteLevel = siteLevelItr.Value(); + InitializePlots(); WorldPackets::Garrison::GarrisonCreateResult garrisonCreateResult; - garrisonCreateResult.GarrSiteLevelID = _siteLevel->ID; + garrisonCreateResult.GarrSiteLevelID = _siteLevelId; _owner->SendDirectMessage(garrisonCreateResult.Write()); _owner->SendUpdatePhasing(); SendRemoteInfo(); @@ -247,11 +251,11 @@ void Garrison::Delete() void Garrison::InitializePlots() { - if (std::vector const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID)) + if (std::vector> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevelId)) { for (std::size_t i = 0; i < plots->size(); ++i) { - uint32 garrPlotInstanceId = plots->at(i)->GarrPlotInstanceID; + uint32 garrPlotInstanceId = plots->at(i).second->GarrPlotInstanceID; GarrPlotInstanceEntry const* plotInstance = sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId); GameObjectsEntry const* gameObject = sGarrisonMgr.GetPlotGameObject(_siteLevel->MapID, garrPlotInstanceId); if (!plotInstance || !gameObject) @@ -266,7 +270,7 @@ void Garrison::InitializePlots() plotInfo.PacketInfo.PlotPos.Relocate(gameObject->Position.X, gameObject->Position.Y, gameObject->Position.Z, 2 * std::acos(gameObject->RotationW)); plotInfo.PacketInfo.PlotType = plot->PlotType; plotInfo.EmptyGameObjectId = gameObject->ID; - plotInfo.GarrSiteLevelPlotInstId = plots->at(i)->ID; + plotInfo.GarrSiteLevelPlotInstId = plots->at(i).first; } } } @@ -439,13 +443,13 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) if (constructing->Level > 1) { // Restore previous level building - GarrBuildingEntry const* restored = sGarrisonMgr.GetPreviousLevelBuilding(constructing->Type, constructing->Level); + uint32 restored = sGarrisonMgr.GetPreviousLevelBuildingId(constructing->Type, constructing->Level); ASSERT(restored); WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; placeBuildingResult.Result = GARRISON_SUCCESS; placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId; - placeBuildingResult.BuildingInfo.GarrBuildingID = restored->ID; + placeBuildingResult.BuildingInfo.GarrBuildingID = restored; placeBuildingResult.BuildingInfo.TimeBuilt = time(nullptr); placeBuildingResult.BuildingInfo.Active = true; @@ -505,7 +509,7 @@ void Garrison::AddFollower(uint32 garrFollowerId) follower.PacketInfo.Xp = 0; follower.PacketInfo.CurrentBuildingID = 0; follower.PacketInfo.CurrentMissionID = 0; - follower.PacketInfo.AbilityID = sGarrisonMgr.RollFollowerAbilities(followerEntry, follower.PacketInfo.Quality, GetFaction(), true); + follower.PacketInfo.AbilityID = sGarrisonMgr.RollFollowerAbilities(garrFollowerId, followerEntry, follower.PacketInfo.Quality, GetFaction(), true); follower.PacketInfo.FollowerStatus = 0; addFollowerResult.Follower = follower.PacketInfo; @@ -527,7 +531,7 @@ void Garrison::SendInfo() { WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo; garrisonInfo.GarrSiteID = _siteLevel->SiteID; - garrisonInfo.GarrSiteLevelID = _siteLevel->ID; + garrisonInfo.GarrSiteLevelID = _siteLevelId; garrisonInfo.FactionIndex = GetFaction(); garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; for (auto& p : _plots) @@ -554,7 +558,7 @@ void Garrison::SendRemoteInfo() const remoteInfo.Sites.resize(1); WorldPackets::Garrison::GarrisonRemoteSiteInfo& remoteSiteInfo = remoteInfo.Sites[0]; - remoteSiteInfo.GarrSiteLevelID = _siteLevel->ID; + remoteSiteInfo.GarrSiteLevelID = _siteLevelId; for (auto const& p : _plots) if (p.second.BuildingInfo.PacketInfo) remoteSiteInfo.Buildings.emplace_back(p.first, p.second.BuildingInfo.PacketInfo->GarrBuildingID); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 2aa38ee6ad3..68ebbc4c0b9 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -157,6 +157,7 @@ private: GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const; GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const; Player* _owner; + uint32 _siteLevelId; GarrSiteLevelEntry const* _siteLevel; uint32 _followerActivationsRemainingToday; diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index 5c9bef62fc3..e2cba691910 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -32,8 +32,8 @@ GarrisonMgr& GarrisonMgr::Instance() void GarrisonMgr::Initialize() { - for (GarrSiteLevelPlotInstEntry const* plotInstance : sGarrSiteLevelPlotInstStore) - _garrisonPlotInstBySiteLevel[plotInstance->GarrSiteLevelID].push_back(plotInstance); + for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr) + _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.Key(), itr.Value())); for (GameObjectsEntry const* gameObject : sGameObjectsStore) if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT) @@ -45,8 +45,8 @@ void GarrisonMgr::Initialize() for (GarrBuildingPlotInstEntry const* buildingPlotInst : sGarrBuildingPlotInstStore) _garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID; - for (GarrBuildingEntry const* building : sGarrBuildingStore) - _garrisonBuildingsByType[building->Type].push_back(building); + for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr) + _garrisonBuildingsByType[itr->Type].push_back(itr.Key()); for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore) { @@ -73,16 +73,16 @@ void GarrisonMgr::Initialize() LoadFollowerClassSpecAbilities(); } -GarrSiteLevelEntry const* GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const +DBStorageIterator GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const { - for (GarrSiteLevelEntry const* garrSiteLevel : sGarrSiteLevelStore) - if (garrSiteLevel->SiteID == garrSiteId && garrSiteLevel->Level == level) - return garrSiteLevel; + for (auto itr = sGarrSiteLevelStore.begin(); itr != sGarrSiteLevelStore.end(); ++itr) + if (itr->SiteID == garrSiteId && itr->Level == level) + return itr; - return nullptr; + return sGarrSiteLevelStore.end(); } -std::vector const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const +std::vector> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const { auto itr = _garrisonPlotInstBySiteLevel.find(garrSiteLevelId); if (itr != _garrisonPlotInstBySiteLevel.end()) @@ -122,15 +122,15 @@ uint32 GarrisonMgr::GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSi return 0; } -GarrBuildingEntry const* GarrisonMgr::GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const +uint32 GarrisonMgr::GetPreviousLevelBuildingId(uint32 buildingType, uint32 currentLevel) const { auto itr = _garrisonBuildingsByType.find(buildingType); if (itr != _garrisonBuildingsByType.end()) - for (GarrBuildingEntry const* building : itr->second) - if (building->Level == currentLevel - 1) - return building; + for (uint32 buildingId : itr->second) + if (sGarrBuildingStore.AssertEntry(buildingId)->Level == currentLevel - 1) + return buildingId; - return nullptr; + return 0; } FinalizeGarrisonPlotGOInfo const* GarrisonMgr::GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const @@ -164,7 +164,7 @@ uint32 const AbilitiesForQuality[][2] = { 2, 3 } // Legendary }; -std::list GarrisonMgr::RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const +std::list GarrisonMgr::RollFollowerAbilities(uint32 garrFollowerId, GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const { ASSERT(faction < 2); @@ -173,7 +173,7 @@ std::list GarrisonMgr::RollFollowerAbilities(GarrFollow uint32 slots[2] = { AbilitiesForQuality[quality][0], AbilitiesForQuality[quality][1] }; GarrAbilities const* abilities = nullptr; - auto itr = _garrisonFollowerAbilities[faction].find(follower->ID); + auto itr = _garrisonFollowerAbilities[faction].find(garrFollowerId); if (itr != _garrisonFollowerAbilities[faction].end()) abilities = &itr->second; diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h index 6130fd67b25..7a93941d59b 100644 --- a/src/server/game/Garrison/GarrisonMgr.h +++ b/src/server/game/Garrison/GarrisonMgr.h @@ -45,15 +45,15 @@ public: void Initialize(); - GarrSiteLevelEntry const* GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; - std::vector const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; + DBStorageIterator GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; + std::vector> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; GameObjectsEntry const* GetPlotGameObject(uint32 mapId, uint32 garrPlotInstanceId) const; bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const; uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const; - GarrBuildingEntry const* GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const; + uint32 GetPreviousLevelBuildingId(uint32 buildingType, uint32 currentLevel) const; FinalizeGarrisonPlotGOInfo const* GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const; uint64 GenerateFollowerDbId(); - std::list RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const; + std::list RollFollowerAbilities(uint32 garrFollowerId, GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const; std::list GetClassSpecAbilities(GarrFollowerEntry const* follower, uint32 faction) const; private: @@ -61,11 +61,11 @@ private: void LoadPlotFinalizeGOInfo(); void LoadFollowerClassSpecAbilities(); - std::unordered_map> _garrisonPlotInstBySiteLevel; + std::unordered_map>> _garrisonPlotInstBySiteLevel; std::unordered_map> _garrisonPlots; std::unordered_map> _garrisonBuildingsByPlot; std::unordered_map _garrisonBuildingPlotInstances; - std::unordered_map> _garrisonBuildingsByType; + std::unordered_map> _garrisonBuildingsByType; std::unordered_map _finalizePlotGOInfo; std::unordered_map _garrisonFollowerAbilities[2]; std::unordered_map> _garrisonFollowerClassSpecAbilities; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 96936a82d08..c52622bd966 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2410,7 +2410,7 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, itemTemplate.GetMaxStackSize() > 1 || itemTemplate.GetQuality() < ITEM_QUALITY_UNCOMMON || itemTemplate.GetQuality() > ITEM_QUALITY_EPIC || !(itemTemplate.GetClass() == ITEM_CLASS_ARMOR || itemTemplate.GetClass() == ITEM_CLASS_WEAPON) || - !(Item::GetSpecialPrice(&itemTemplate) || sItemCurrencyCostStore.LookupEntry(itemTemplate.GetId()))) + !(Item::GetSpecialPrice(&itemTemplate) || sDB2Manager.HasItemCurrencyCost(itemTemplate.GetId()))) return; for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) @@ -2424,18 +2424,18 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, disenchant->MinItemLevel <= itemTemplate.GetBaseItemLevel() && disenchant->MaxItemLevel >= itemTemplate.GetBaseItemLevel()) { - if (disenchant->ID == 60 || disenchant->ID == 61) // epic item disenchant ilvl range 66-99 (classic) + if (i == 60 || i == 61) // epic item disenchant ilvl range 66-99 (classic) { if (itemTemplate.GetBaseRequiredLevel() > 60 || itemTemplate.GetRequiredSkillRank() > 300) continue; // skip to epic item disenchant ilvl range 90-199 (TBC) } - else if (disenchant->ID == 66 || disenchant->ID == 67) // epic item disenchant ilvl range 90-199 (TBC) + else if (i == 66 || i == 67) // epic item disenchant ilvl range 90-199 (TBC) { if (itemTemplate.GetBaseRequiredLevel() <= 60 || (itemTemplate.GetRequiredSkill() && itemTemplate.GetRequiredSkillRank() <= 300)) continue; } - *disenchantID = disenchant->ID; + *disenchantID = i; *requiredDisenchantSkill = disenchant->RequiredDisenchantSkill; return; } @@ -2624,13 +2624,15 @@ void ObjectMgr::LoadItemTemplates() uint32 oldMSTime = getMSTime(); uint32 sparseCount = 0; - for (ItemSparseEntry const* sparse : sItemSparseStore) + for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr) { - ItemEntry const* db2Data = sItemStore.LookupEntry(sparse->ID); + ItemSparseEntry const* sparse = itr->second; + ItemEntry const* db2Data = sItemStore.LookupEntry(itr->first); if (!db2Data) continue; - ItemTemplate& itemTemplate = _itemTemplateStore[sparse->ID]; + ItemTemplate& itemTemplate = _itemTemplateStore[itr->first]; + itemTemplate.Id = itr->first; itemTemplate.BasicData = db2Data; itemTemplate.ExtendedData = sparse; @@ -2644,7 +2646,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; - if (std::vector const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) + if (std::vector const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(itemTemplate.Id)) { for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) itemTemplate.Specializations[0].insert(itemSpecOverride->SpecID); @@ -3448,6 +3450,12 @@ void ObjectMgr::LoadPlayerInfo() if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_CATACLYSM && (race == RACE_GOBLIN || race == RACE_WORGEN)) continue; + if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_MISTS_OF_PANDARIA && (race == RACE_PANDAREN_NEUTRAL || race == RACE_PANDAREN_HORDE || race == RACE_PANDAREN_ALLIANCE)) + continue; + + if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_LEGION && class_ == CLASS_DEMON_HUNTER) + continue; + // fatal error if no level 1 data if (!info->levelInfo || info->levelInfo[0].stats[0] == 0) { @@ -4388,7 +4396,7 @@ void ObjectMgr::LoadQuests() if (qinfo->SoundAccept) { - if (!sSoundEntriesStore.LookupEntry(qinfo->SoundAccept)) + if (!sSoundKitStore.LookupEntry(qinfo->SoundAccept)) { TC_LOG_ERROR("sql.sql", "Quest %u has `SoundAccept` = %u but sound %u does not exist, set to 0.", qinfo->GetQuestId(), qinfo->SoundAccept, qinfo->SoundAccept); @@ -4398,7 +4406,7 @@ void ObjectMgr::LoadQuests() if (qinfo->SoundTurnIn) { - if (!sSoundEntriesStore.LookupEntry(qinfo->SoundTurnIn)) + if (!sSoundKitStore.LookupEntry(qinfo->SoundTurnIn)) { TC_LOG_ERROR("sql.sql", "Quest %u has `SoundTurnIn` = %u but sound %u does not exist, set to 0.", qinfo->GetQuestId(), qinfo->SoundTurnIn, qinfo->SoundTurnIn); @@ -8703,25 +8711,12 @@ void ObjectMgr::LoadCreatureClassLevelStats() if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0) TC_LOG_ERROR("sql.sql", "Creature base stats for level %u has invalid class %u", Level, Class); - GtNpcTotalHpEntry const* HpExp0 = sGtNpcTotalHpStore.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp1Entry const* HpExp1 = sGtNpcTotalHpExp1Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp2Entry const* HpExp2 = sGtNpcTotalHpExp2Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp3Entry const* HpExp3 = sGtNpcTotalHpExp3Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp4Entry const* HpExp4 = sGtNpcTotalHpExp4Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp5Entry const* HpExp5 = sGtNpcTotalHpExp5Store.EvaluateTable(Level - 1, Class - 1); - CreatureBaseStats stats; - stats.BaseHealth[0] = uint32(HpExp0->HP); - stats.BaseHealth[1] = uint32(HpExp1->HP); - stats.BaseHealth[2] = uint32(HpExp2->HP); - stats.BaseHealth[3] = uint32(HpExp3->HP); - stats.BaseHealth[4] = uint32(HpExp4->HP); - stats.BaseHealth[5] = uint32(HpExp5->HP); - for (uint8 i = 0; i < MAX_EXPANSIONS; ++i) { - stats.BaseDamage[i] = fields[6 + i].GetFloat(); + stats.BaseHealth[0] = sGtNpcTotalHpStore[i].EvaluateTable(Level - 1, Class - 1)->HP; + stats.BaseDamage[0] = sGtNpcDamageByClassStore[i].EvaluateTable(Level - 1, Class - 1)->Damage; if (stats.BaseDamage[i] < 0.0f) { TC_LOG_ERROR("sql.sql", "Creature base stats for class %u, level %u has invalid negative base damage[%u] - set to 0.0", Class, Level, i); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 86a59f04f23..e0d15e8def0 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -368,7 +368,7 @@ void Guild::BankTab::LoadFromDB(Field* fields) bool Guild::BankTab::LoadItemFromDB(Field* fields) { - uint8 slotId = fields[23].GetUInt8(); + uint8 slotId = fields[26].GetUInt8(); ObjectGuid::LowType itemGuid = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); if (slotId >= GUILD_BANK_MAX_SLOTS) @@ -2395,7 +2395,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[22].GetUInt8(); + uint8 tabId = fields[25].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 6af809dcedb..20cbf22d40e 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -403,8 +403,8 @@ void GuildMgr::LoadGuilds() // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, - // 17 18 19 20 21 22 23 - // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 17 18 19 20 21 22 23 24 25 26 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -417,7 +417,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[21].GetUInt64(); + uint64 guildId = fields[24].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 43a0baa75a7..1fa50f1493e 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -55,7 +55,7 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Creature* unit) return; } - AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction()); + AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction(), nullptr); if (!ahEntry) return; @@ -139,7 +139,8 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell return; } - AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction()); + uint32 houseId = 0; + AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction(), &houseId); if (!auctionHouseEntry) { TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Unit (%s) has wrong faction.", packet.Auctioneer.ToString().c_str()); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 07507392cef..95a99736563 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -280,7 +280,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) TC_LOG_INFO("network", "Loading char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); - if (!Player::ValidateAppearance(charInfo.Race, charInfo.Class, charInfo.Sex, charInfo.HairStyle, charInfo.HairColor, charInfo.Face, charInfo.FacialHair, charInfo.Skin)) + if (!Player::ValidateAppearance(charInfo.Race, charInfo.Class, charInfo.Sex, charInfo.HairStyle, charInfo.HairColor, charInfo.Face, charInfo.FacialHair, charInfo.Skin, charInfo.CustomDisplay)) { TC_LOG_ERROR("entities.player.loading", "Player %s has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString().c_str()); @@ -1432,7 +1432,8 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance packet.NewHairColor, bs_face ? bs_face->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID), bs_facialHair->Data, - bs_skinColor ? bs_skinColor->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID))) + bs_skinColor ? bs_skinColor->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID), + std::array{0, 0, 0})) return; GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f); @@ -1534,7 +1535,8 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World uint8 plrGender = fields[3].GetUInt8(); uint16 atLoginFlags = fields[4].GetUInt16(); - if (!Player::ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo->HairStyleID, customizeInfo->HairColorID, customizeInfo->FaceID, customizeInfo->FacialHairStyleID, customizeInfo->SkinID, true)) + if (!Player::ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo->HairStyleID, customizeInfo->HairColorID, customizeInfo->FaceID, + customizeInfo->FacialHairStyleID, customizeInfo->SkinID, customizeInfo->CustomDisplay, true)) { SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo); return; diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 8c7f8190e09..80ee0918616 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -901,29 +901,21 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } - // tried to put normal gem in meta socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_META && GemProps[i]->Type != SOCKET_COLOR_META) - return; - - // tried to put meta gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_META && GemProps[i]->Type == SOCKET_COLOR_META) - return; - - // tried to put normal gem in cogwheel socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_COGWHEEL && GemProps[i]->Type != SOCKET_COLOR_COGWHEEL) - return; - - // tried to put cogwheel gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_COGWHEEL && GemProps[i]->Type == SOCKET_COLOR_COGWHEEL) - return; + // Gem must match socket color + if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != GemProps[i]->Type) + { + // unless its red, blue, yellow or prismatic + if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(GemProps[i]->Type & SOCKET_COLOR_PRISMATIC)) + return; + } } uint32 GemEnchants[MAX_GEM_SOCKETS]; - uint32 OldEnchants[MAX_GEM_SOCKETS]; + uint32 oldGemItemIds[MAX_GEM_SOCKETS]; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get new and old enchantments { GemEnchants[i] = (GemProps[i]) ? GemProps[i]->EnchantID : 0; - OldEnchants[i] = itemTarget->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i)); + oldGemItemIds[i] = itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() > i ? itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)[i] : 0; } // check unique-equipped conditions @@ -951,15 +943,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) + if (iGemProto->GetId() == oldGemItemIds[j]) { - if (iGemProto->GetId() == enchantEntry->SRCItemID) - { - _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); - return; - } + _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); + return; } } } @@ -980,13 +969,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) if (iGemProto->GetItemLimitCategory() == Gems[j]->GetTemplate()->GetItemLimitCategory()) ++limit_newcount; } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { // existing gem - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) - if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID)) - if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) - ++limit_newcount; + if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemItemIds[j])) + if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) + ++limit_newcount; } } @@ -1018,16 +1006,25 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot) _player->ApplyEnchantment(itemTarget, EnchantmentSlot(enchant_slot), false); + uint32 reqGemSlots = 0; + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + if (Gems[i]) + reqGemSlots = i + 1; + + while (itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() < reqGemSlots) + itemTarget->AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, 0); + for (int i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (GemEnchants[i]) + if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) { - itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); - if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) - { - uint32 gemCount = 1; - _player->DestroyItemCount(guidItem, gemCount, true); - } + itemTarget->SetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i, guidItem->GetEntry()); + + if (GemEnchants[i]) + itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); + + uint32 gemCount = 1; + _player->DestroyItemCount(guidItem, gemCount, true); } } diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 2060468a41a..d6e1b35de6e 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -71,7 +71,7 @@ void WorldSession::HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRe void WorldSession::HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet) { - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(packet.SkillLine, GetPlayer()->getRace(), GetPlayer()->getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(packet.SkillLine, GetPlayer()->getRace(), GetPlayer()->getClass()); if (!rcEntry || !(rcEntry->Flags & SKILL_FLAG_UNLEARNABLE)) return; diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index a7e11e81970..be4f71e8b71 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1557,7 +1557,7 @@ void LoadLootTemplates_Disenchant() if (!disenchant) continue; - uint32 lootid = disenchant->ID; + uint32 lootid = i; if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Disenchant.ReportNonExistingId(lootid); else diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 63079904a67..1ef2e7b0ed9 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -82,10 +82,11 @@ enum Expansions EXPANSION_CATACLYSM = 3, EXPANSION_MISTS_OF_PANDARIA = 4, EXPANSION_WARLORDS_OF_DRAENOR = 5, - MAX_EXPANSIONS = 6 + EXPANSION_LEGION = 6, + MAX_EXPANSIONS }; -#define CURRENT_EXPANSION EXPANSION_WARLORDS_OF_DRAENOR +#define CURRENT_EXPANSION EXPANSION_LEGION enum Gender { @@ -174,11 +175,12 @@ enum Classes CLASS_MAGE = 8, CLASS_WARLOCK = 9, CLASS_MONK = 10, - CLASS_DRUID = 11 + CLASS_DRUID = 11, + CLASS_DEMON_HUNTER = 12 }; // max+1 for player class -#define MAX_CLASSES 12 +#define MAX_CLASSES 13 #define CLASSMASK_ALL_PLAYABLE \ ((1<<(CLASS_WARRIOR-1)) | \ @@ -191,7 +193,8 @@ enum Classes (1<<(CLASS_MAGE-1)) | \ (1<<(CLASS_WARLOCK-1)) | \ (1<<(CLASS_MONK-1)) | \ - (1<<(CLASS_DRUID-1))) + (1<<(CLASS_DRUID-1)) | \ + (1<<(CLASS_DEMON_HUNTER-1))) // valid classes for creature_template.unit_class enum UnitClass @@ -253,16 +256,18 @@ enum Powers // (6.0) POWER_RUNES = 5, POWER_RUNIC_POWER = 6, POWER_SOUL_SHARDS = 7, - POWER_ECLIPSE = 8, + POWER_LUNAR_POWER = 8, POWER_HOLY_POWER = 9, POWER_ALTERNATE_POWER = 10, // Used in some quests - POWER_DARK_FORCE = 11, + POWER_MAELSTROM = 11, POWER_CHI = 12, - POWER_SHADOW_ORBS = 13, + POWER_INSANITY = 13, POWER_BURNING_EMBERS = 14, POWER_DEMONIC_FURY = 15, POWER_ARCANE_CHARGES = 16, - MAX_POWERS = 17, + POWER_FURY = 17, + POWER_PAIN = 18, + MAX_POWERS = 19, POWER_ALL = 127, // default for class? POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value) }; @@ -725,7 +730,7 @@ enum SpellAttr10 SPELL_ATTR10_UNK9 = 0x00000200, // 9 SPELL_ATTR10_UNK10 = 0x00000400, // 10 SPELL_ATTR10_HERB_GATHERING_MINING = 0x00000800, // 11 Only Herb Gathering and Mining - SPELL_ATTR10_UNK12 = 0x00001000, // 12 + SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING = 0x00001000, // 12 SPELL_ATTR10_UNK13 = 0x00002000, // 13 SPELL_ATTR10_UNK14 = 0x00004000, // 14 SPELL_ATTR10_UNK15 = 0x00008000, // 15 @@ -756,7 +761,7 @@ enum SpellAttr11 SPELL_ATTR11_UNK4 = 0x00000010, // 4 SPELL_ATTR11_UNK5 = 0x00000020, // 5 SPELL_ATTR11_UNK6 = 0x00000040, // 6 - SPELL_ATTR11_NO_RANK = 0x00000080, // 7 Spell_C_GetSpellRank returns 0 instead of 5 * std::min(SpellLevels->MaxLevel, caster->Level) + SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL = 0x00000080, // 7 Spell_C_GetSpellRank returns SpellLevels->MaxLevel * 5 instead of std::min(SpellLevels->MaxLevel, caster->Level) * 5 SPELL_ATTR11_UNK8 = 0x00000100, // 8 SPELL_ATTR11_UNK9 = 0x00000200, // 9 SPELL_ATTR11_UNK10 = 0x00000400, // 10 diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index aa78cae6deb..53800dbb726 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -780,22 +780,11 @@ void WorldPackets::Spells::SpellClick::Read() TryAutoDismount = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Spells::ConvertRune::Write() -{ - _worldPacket << uint8(Index); - _worldPacket << uint8(Rune); - - return &_worldPacket; -} - WorldPacket const* WorldPackets::Spells::ResyncRunes::Write() { _worldPacket << uint32(Runes.size()); - for (auto const& rune : Runes) - { - _worldPacket << uint8(rune.RuneType); - _worldPacket << uint8(rune.Cooldown); - } + if (!Runes.empty()) + _worldPacket.append(Runes.data(), Runes.size()); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index b1cb39251de..0680405eeb2 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -799,31 +799,14 @@ namespace WorldPackets bool TryAutoDismount = false; }; - class ConvertRune final : public ServerPacket - { - public: - ConvertRune() : ServerPacket(SMSG_CONVERT_RUNE, 1 + 1) { } - - WorldPacket const* Write() override; - - uint8 Index = 0; - uint8 Rune = 0; - }; - class ResyncRunes final : public ServerPacket { public: - struct ResyncRune - { - uint8 RuneType = 0; - uint8 Cooldown = 0; - }; - ResyncRunes(size_t size) : ServerPacket(SMSG_RESYNC_RUNES, 4 + 2 * size) { } WorldPacket const* Write() override; - std::vector Runes; + std::vector Runes; }; class MissileTrajectoryCollision final : public ClientPacket diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b7159ea08ae..900092c126b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1001,7 +1001,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSOLE_WRITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTROL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 8027f49db0d..715799294de 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1668,7 +1668,6 @@ enum OpcodeServer : uint32 SMSG_BF_MGR_ENTRY_INVITE = 0xBADD, SMSG_BF_MGR_QUEUE_INVITE = 0xBADD, SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0xBADD, - SMSG_CONVERT_RUNE = 0xBADD, }; inline bool IsInstanceOnlyOpcode(uint32 opcode) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index c86e20a53ad..e529990cccd 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -308,7 +308,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK implemented in Spell::EffectApplyAura &AuraEffect::HandleAuraCloneCaster, //247 SPELL_AURA_CLONE_CASTER &AuraEffect::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst - &AuraEffect::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE + &AuraEffect::HandleNULL, //249 SPELL_AURA_CONVERT_RUNE deprecated &AuraEffect::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2 &AuraEffect::HandleNoImmediateEffect, //251 SPELL_AURA_MOD_ENEMY_DODGE &AuraEffect::HandleModCombatSpeedPct, //252 SPELL_AURA_252 Is there any difference between this and SPELL_AURA_MELEE_SLOW ? maybe not stacking mod? @@ -5250,39 +5250,6 @@ void AuraEffect::HandleComprehendLanguage(AuraApplication const* aurApp, uint8 m } } -void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode, bool apply) const -{ - if (!(mode & AURA_EFFECT_HANDLE_REAL)) - return; - - Unit* target = aurApp->GetTarget(); - - Player* player = target->ToPlayer(); - if (!player) - return; - - if (player->getClass() != CLASS_DEATH_KNIGHT) - return; - - uint32 runes = m_amount; - // convert number of runes specified in aura amount of rune type in miscvalue to runetype in miscvalueb - if (apply) - { - for (uint32 i = 0; i < MAX_RUNES && runes; ++i) - { - if (GetMiscValue() != player->GetCurrentRune(i)) - continue; - if (!player->GetRuneCooldown(i)) - { - player->AddRuneByAuraEffect(i, RuneType(GetMiscValueB()), this); - --runes; - } - } - } - else - player->RemoveRunesByAuraEffect(this); -} - void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, bool apply) const { Unit* target = aurApp->GetTarget(); @@ -5575,19 +5542,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const target->DealDamage(target, damage, NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); break; } - // Blood of the North - // Reaping - // Death Rune Mastery - if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) - { - if (target->GetTypeId() != TYPEID_PLAYER) - return; - if (target->ToPlayer()->getClass() != CLASS_DEATH_KNIGHT) - return; - - // timer expired - remove death runes - target->ToPlayer()->RemoveRunesByAuraEffect(this); - } break; default: break; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 0d907e4148c..46a0ccdabc6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -294,7 +294,6 @@ class TC_GAME_API AuraEffect void HandleAuraEmpathy(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModFaction(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleComprehendLanguage(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModFakeInebriation(AuraApplication const* aurApp, uint8 mode, bool apply) const; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 521abd26e7b..af22d2fa496 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1517,21 +1517,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b target->RemoveAura(61988); break; case SPELLFAMILY_DEATHKNIGHT: - // Blood of the North - // Reaping - // Death Rune Mastery - if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) - { - if (!GetEffect(0) || GetEffect(0)->GetAuraType() != SPELL_AURA_PERIODIC_DUMMY) - break; - if (target->GetTypeId() != TYPEID_PLAYER) - break; - if (target->ToPlayer()->getClass() != CLASS_DEATH_KNIGHT) - break; - - // aura removed - remove death runes - target->ToPlayer()->RemoveRunesByAuraEffect(GetEffect(0)); - } break; case SPELLFAMILY_HUNTER: // Glyph of Freezing Trap diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index dac9b82549c..cf35e643a02 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3340,7 +3340,7 @@ void Spell::cast(bool skipCheck) if (m_caster->ToPlayer()->GetCommandStatus(CHEAT_COOLDOWN)) { m_caster->GetSpellHistory()->ResetCooldown(m_spellInfo->Id, true); - m_caster->GetSpellHistory()->RestoreCharge(m_spellInfo->ChargeCategoryEntry); + m_caster->GetSpellHistory()->RestoreCharge(m_spellInfo->ChargeCategoryId); } } @@ -3892,8 +3892,7 @@ void Spell::SendSpellStart() && std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power != POWER_HEALTH; }) != m_powerCost.end()) castFlags |= CAST_FLAG_POWER_LEFT_SELF; - if (m_spellInfo->RuneCostID && - std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end()) + if (std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end()) castFlags |= CAST_FLAG_NO_GCD; // not needed, but Blizzard sends it WorldPackets::Spells::SpellStart packet; @@ -3938,7 +3937,7 @@ void Spell::SendSpellStart() for (uint8 i = 0; i < MAX_RUNES; ++i) { // float casts ensure the division is performed on floats as we need float result - float baseCd = float(player->GetRuneBaseCooldown(i)); + float baseCd = float(player->GetRuneBaseCooldown()); castData.RemainingRunes->Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed } } @@ -3995,7 +3994,6 @@ void Spell::SendSpellGo() if ((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) - && m_spellInfo->RuneCostID && std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end() && !(_triggeredCastFlags & TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)) { @@ -4056,7 +4054,7 @@ void Spell::SendSpellGo() for (uint8 i = 0; i < MAX_RUNES; ++i) { // float casts ensure the division is performed on floats as we need float result - float baseCd = float(player->GetRuneBaseCooldown(i)); + float baseCd = float(player->GetRuneBaseCooldown()); castData.RemainingRunes->Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed } } @@ -4544,9 +4542,10 @@ void Spell::TakePower() } } -SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) +SpellCastResult Spell::CheckRuneCost() { - if (std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) == m_powerCost.end() || !runeCostID) + auto runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }); + if (runeCost == m_powerCost.end()) return SPELL_CAST_OK; Player* player = m_caster->ToPlayer(); @@ -4556,36 +4555,12 @@ SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) if (player->getClass() != CLASS_DEATH_KNIGHT) return SPELL_CAST_OK; - SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(runeCostID); - if (!src) - return SPELL_CAST_OK; - - if (src->NoRuneCost()) - return SPELL_CAST_OK; - - int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death - - for (uint32 i = 0; i < NUM_RUNE_TYPES; ++i) - { - runeCost[i] = src->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } - - runeCost[RUNE_DEATH] += MAX_RUNES; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - if ((player->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0)) - runeCost[rune]--; - } - - for (uint32 i = 0; i < RUNE_DEATH; ++i) - if (runeCost[i] > 0) - runeCost[RUNE_DEATH] += runeCost[i]; + int32 readyRunes = 0; + for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + if (player->GetRuneCooldown(i) == 0) + ++readyRunes; - if (runeCost[RUNE_DEATH] > MAX_RUNES) + if (readyRunes < runeCost->Amount) return SPELL_FAILED_NO_POWER; // not sure if result code is correct return SPELL_CAST_OK; @@ -4596,95 +4571,24 @@ void Spell::TakeRunePower(bool didHit) if (m_caster->GetTypeId() != TYPEID_PLAYER || m_caster->getClass() != CLASS_DEATH_KNIGHT) return; - SpellRuneCostEntry const* runeCostData = sSpellRuneCostStore.LookupEntry(m_spellInfo->RuneCostID); - if (!runeCostData || (runeCostData->NoRuneCost() && runeCostData->NoRunicPowerGain())) - return; - Player* player = m_caster->ToPlayer(); m_runesState = player->GetRunesState(); // store previous state - int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death - - for (uint32 i = 0; i < NUM_RUNE_TYPES; ++i) + int32 runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { - runeCost[i] = runeCostData->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } + return cost.Power == POWER_RUNES; + })->Amount; - bool convertUsedRunes = false; - for (AuraEffect const* convertConsumedRuneAuras : m_caster->GetAuraEffectsByType(SPELL_AURA_CONVERT_CONSUMED_RUNE)) - if (convertConsumedRuneAuras->IsAffectingSpell(m_spellInfo)) - convertUsedRunes = true; - - // Let's say we use a skill that requires a Frost rune. This is the order: - // - Frost rune - // - Death rune, originally a Frost rune - // - Death rune, any kind - for (uint32 i = 0; i < MAX_RUNES; ++i) + for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) { - RuneType rune = player->GetCurrentRune(i); - if (!player->GetRuneCooldown(i) && runeCost[rune] > 0) + if (!player->GetRuneCooldown(i) && runeCost > 0) { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[rune]--; + player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown() : uint32(RUNE_MISS_COOLDOWN), true); + --runeCost; if (convertUsedRunes) player->ConvertRune(i, RUNE_DEATH); } } - - // Find a Death rune where the base rune matches the one we need - runeCost[RUNE_DEATH] += runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST]; - if (runeCost[RUNE_DEATH] > 0) - { - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - RuneType baseRune = player->GetBaseRune(i); - if (!player->GetRuneCooldown(i) && rune == RUNE_DEATH && runeCost[baseRune] > 0) - { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[baseRune]--; - runeCost[rune]--; - - // keep Death Rune type if missed - if (didHit && !convertUsedRunes) - player->RestoreBaseRune(i); - - if (runeCost[RUNE_DEATH] == 0) - break; - } - } - } - - // Grab any Death rune - if (runeCost[RUNE_DEATH] > 0) - { - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - if (!player->GetRuneCooldown(i) && rune == RUNE_DEATH) - { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[rune]--; - - // keep Death Rune type if missed - if (didHit && !convertUsedRunes) - player->RestoreBaseRune(i); - - if (runeCost[RUNE_DEATH] == 0) - break; - } - } - } - - // you can gain some runic power when use runes - if (didHit) - if (int32 rp = int32(runeCostData->RunicPower * sWorld->getRate(RATE_POWER_RUNICPOWER_INCOME))) - player->ModifyPower(POWER_RUNIC_POWER, int32(rp)); } void Spell::TakeReagents() @@ -5952,7 +5856,7 @@ SpellCastResult Spell::CheckRange(bool strict) { // check needed by 68766 51693 - both spells are cast on enemies and have 0 max range // these are triggered by other spells - possibly we should omit range check in that case? - if (m_spellInfo->RangeEntry->ID == 1) + if (m_spellInfo->RangeIndex == 1) return SPELL_CAST_OK; range_type = m_spellInfo->RangeEntry->Flags; @@ -6025,7 +5929,7 @@ SpellCastResult Spell::CheckPower() //check rune cost only if a spell has PowerType == POWER_RUNES if (cost.Power == POWER_RUNES) { - SpellCastResult failReason = CheckRuneCost(m_spellInfo->RuneCostID); + SpellCastResult failReason = CheckRuneCost(); if (failReason != SPELL_CAST_OK) return failReason; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 192ed942ce0..2be8c001ae7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -501,7 +501,7 @@ class TC_GAME_API Spell SpellCastResult CheckItems(); SpellCastResult CheckRange(bool strict); SpellCastResult CheckPower(); - SpellCastResult CheckRuneCost(uint32 runeCostID); + SpellCastResult CheckRuneCost(); SpellCastResult CheckCasterAuras() const; SpellCastResult CheckArenaAndRatedBattlegroundCastRules(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d605e1d8679..b174454225d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1618,7 +1618,7 @@ void Spell::EffectEnergize(SpellEffIndex /*effIndex*/) if (level_diff > 0) damage -= level_multiplier * level_diff; - if (damage < 0 && power != POWER_ECLIPSE) + if (damage < 0 && power != POWER_LUNAR_POWER) return; m_caster->EnergizeBySpell(unitTarget, m_spellInfo->Id, damage, power); @@ -2435,7 +2435,7 @@ void Spell::EffectLearnSkill(SpellEffIndex /*effIndex*/) return; uint32 skillid = effectInfo->MiscValue; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skillid, unitTarget->getRace(), unitTarget->getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skillid, unitTarget->getRace(), unitTarget->getClass()); if (!rcEntry) return; @@ -5192,52 +5192,24 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) m_runesState = m_caster->ToPlayer()->GetRunesState(); uint32 count = damage; - if (count == 0) count = 1; - for (uint32 j = 0; j < MAX_RUNES && count > 0; ++j) + if (count == 0) + count = 1; + + // first restore fully depleted runes + for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { - if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(effectInfo->MiscValue)) + if (player->GetRuneCooldown(j) == player->GetRuneBaseCooldown()) { - if (m_spellInfo->Id == 45529) - if (player->GetBaseRune(j) != RuneType(effectInfo->MiscValueB)) - continue; player->SetRuneCooldown(j, 0); --count; } } - // Blood Tap - if (m_spellInfo->Id == 45529 && count > 0) - { - for (uint32 l = 0; l + 1 < MAX_RUNES && count > 0; ++l) - { - // Check if both runes are on cd as that is the only time when this needs to come into effect - if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(effectInfo->MiscValueB)) && (player->GetRuneCooldown(l + 1) && player->GetCurrentRune(l + 1) == RuneType(effectInfo->MiscValueB))) - { - // Should always update the rune with the lowest cd - if (l + 1 < MAX_RUNES && player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1)) - l++; - player->SetRuneCooldown(l, 0); - --count; - // is needed to push through to the client that the rune is active - player->ResyncRunes(MAX_RUNES); - } - else - break; - } - } - - // Empower rune weapon - if (m_spellInfo->Id == 47568) + // then the rest if we still got something left + for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { - // Need to do this just once - if (effIndex != 0) - return; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - if (player->GetRuneCooldown(i) && (player->GetCurrentRune(i) == RUNE_FROST || player->GetCurrentRune(i) == RUNE_DEATH)) - player->SetRuneCooldown(i, 0); - } + player->SetRuneCooldown(j, 0); + --count; } } @@ -5435,7 +5407,7 @@ void Spell::EffectPlayMusic(SpellEffIndex /*effIndex*/) uint32 soundid = effectInfo->MiscValue; - if (!sSoundEntriesStore.LookupEntry(soundid)) + if (!sSoundKitStore.LookupEntry(soundid)) { TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) does not exist in spell %u.", soundid, m_spellInfo->Id); return; @@ -5489,7 +5461,7 @@ void Spell::EffectPlaySound(SpellEffIndex /*effIndex*/) uint32 soundId = effectInfo->MiscValue; - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) does not exist in spell %u.", soundId, m_spellInfo->Id); return; diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 7de2c2a9d46..bb991b66cf9 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -237,7 +237,7 @@ void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, Item const* item, void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, uint32 itemID, Spell* spell /*= nullptr*/) { - if (ConsumeCharge(spellInfo->ChargeCategoryEntry)) + if (ConsumeCharge(spellInfo->ChargeCategoryId)) return; if (Player* player = _owner->ToPlayer()) @@ -268,7 +268,7 @@ bool SpellHistory::IsReady(SpellInfo const* spellInfo, uint32 itemId /*= 0*/, bo if (HasCooldown(spellInfo->Id, itemId, ignoreCategoryCooldown)) return false; - if (!HasCharge(spellInfo->ChargeCategoryEntry)) + if (!HasCharge(spellInfo->ChargeCategoryId)) return false; return true; @@ -696,16 +696,16 @@ bool SpellHistory::IsSchoolLocked(SpellSchoolMask schoolMask) const return false; } -bool SpellHistory::ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry) +bool SpellHistory::ConsumeCharge(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) + if (!sSpellCategoryStore.LookupEntry(chargeCategoryId)) return false; - int32 chargeRecovery = GetChargeRecoveryTime(chargeCategoryEntry); - if (chargeRecovery > 0 && GetMaxCharges(chargeCategoryEntry) > 0) + int32 chargeRecovery = GetChargeRecoveryTime(chargeCategoryId); + if (chargeRecovery > 0 && GetMaxCharges(chargeCategoryId) > 0) { Clock::time_point recoveryStart; - std::deque& charges = _categoryCharges[chargeCategoryEntry->ID]; + std::deque& charges = _categoryCharges[chargeCategoryId]; if (charges.empty()) recoveryStart = Clock::now(); else @@ -718,12 +718,9 @@ bool SpellHistory::ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry) return false; } -void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) +void SpellHistory::RestoreCharge(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) - return; - - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); if (itr != _categoryCharges.end() && !itr->second.empty()) { itr->second.pop_back(); @@ -731,7 +728,7 @@ void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) if (Player* player = GetPlayerOwner()) { WorldPackets::Spells::SetSpellCharges setSpellCharges; - setSpellCharges.Category = chargeCategoryEntry->ID; + setSpellCharges.Category = chargeCategoryId; if (!itr->second.empty()) setSpellCharges.NextRecoveryTime = uint32(std::chrono::duration_cast(itr->second.front().RechargeEnd - Clock::now()).count()); setSpellCharges.ConsumedCharges = itr->second.size(); @@ -742,12 +739,9 @@ void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) } } -void SpellHistory::ResetCharges(SpellCategoryEntry const* chargeCategoryEntry) +void SpellHistory::ResetCharges(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) - return; - - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); if (itr != _categoryCharges.end()) { _categoryCharges.erase(itr); @@ -756,7 +750,7 @@ void SpellHistory::ResetCharges(SpellCategoryEntry const* chargeCategoryEntry) { WorldPackets::Spells::ClearSpellCharges clearSpellCharges; clearSpellCharges.IsPet = _owner != player; - clearSpellCharges.Category = chargeCategoryEntry->ID; + clearSpellCharges.Category = chargeCategoryId; player->SendDirectMessage(clearSpellCharges.Write()); } } @@ -774,40 +768,42 @@ void SpellHistory::ResetAllCharges() } } -bool SpellHistory::HasCharge(SpellCategoryEntry const* chargeCategoryEntry) const +bool SpellHistory::HasCharge(uint32 chargeCategoryId) const { - if (!chargeCategoryEntry) + if (!sSpellCategoryStore.LookupEntry(chargeCategoryId)) return true; // Check if the spell is currently using charges (untalented warlock Dark Soul) - int32 maxCharges = GetMaxCharges(chargeCategoryEntry); + int32 maxCharges = GetMaxCharges(chargeCategoryId); if (maxCharges <= 0) return true; - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); return itr == _categoryCharges.end() || int32(itr->second.size()) < maxCharges; } -int32 SpellHistory::GetMaxCharges(SpellCategoryEntry const* chargeCategoryEntry) const +int32 SpellHistory::GetMaxCharges(uint32 chargeCategoryId) const { + SpellCategoryEntry const* chargeCategoryEntry = sSpellCategoryStore.LookupEntry(chargeCategoryId); if (!chargeCategoryEntry) return 0; uint32 charges = chargeCategoryEntry->MaxCharges; - charges += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MAX_CHARGES, chargeCategoryEntry->ID); + charges += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MAX_CHARGES, chargeCategoryId); return charges; } -int32 SpellHistory::GetChargeRecoveryTime(SpellCategoryEntry const* chargeCategoryEntry) const +int32 SpellHistory::GetChargeRecoveryTime(uint32 chargeCategoryId) const { + SpellCategoryEntry const* chargeCategoryEntry = sSpellCategoryStore.LookupEntry(chargeCategoryId); if (!chargeCategoryEntry) return 0; int32 recoveryTime = chargeCategoryEntry->ChargeRecoveryTime; - recoveryTime += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MOD, chargeCategoryEntry->ID); + recoveryTime += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MOD, chargeCategoryId); float recoveryTimeF = recoveryTime; - recoveryTimeF *= _owner->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER, chargeCategoryEntry->ID); + recoveryTimeF *= _owner->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER, chargeCategoryId); if (_owner->HasAuraType(SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE)) recoveryTimeF *= _owner->GetFloatValue(UNIT_MOD_CAST_HASTE); diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h index f2a3d346fdf..51b22c7e38a 100644 --- a/src/server/game/Spells/SpellHistory.h +++ b/src/server/game/Spells/SpellHistory.h @@ -132,13 +132,13 @@ public: bool IsSchoolLocked(SpellSchoolMask schoolMask) const; // Charges - bool ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry); - void RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry); - void ResetCharges(SpellCategoryEntry const* chargeCategoryEntry); + bool ConsumeCharge(uint32 chargeCategoryId); + void RestoreCharge(uint32 chargeCategoryId); + void ResetCharges(uint32 chargeCategoryId); void ResetAllCharges(); - bool HasCharge(SpellCategoryEntry const* chargeCategoryEntry) const; - int32 GetMaxCharges(SpellCategoryEntry const* chargeCategoryEntry) const; - int32 GetChargeRecoveryTime(SpellCategoryEntry const* chargeCategoryEntry) const; + bool HasCharge(uint32 chargeCategoryId) const; + int32 GetMaxCharges(uint32 chargeCategoryId) const; + int32 GetChargeRecoveryTime(uint32 chargeCategoryId) const; // Global cooldown bool HasGlobalCooldown(SpellInfo const* spellInfo) const; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 28ac49fde1f..5b820f02c02 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -360,7 +360,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}, // 147 }; -SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) +SpellEffectInfo::SpellEffectInfo(SpellEffectScalingEntry const* spellEffectScaling, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) { _spellInfo = spellInfo; EffectIndex = _effect ? _effect->EffectIndex : effIndex; @@ -389,12 +389,9 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con BonusCoefficientFromAP = _effect ? _effect->BonusCoefficientFromAP : 0.0f; ImplicitTargetConditions = NULL; - uint32 _effectScalingId = _effect ? sSpellEffectScallingByEffectId.find(_effect->ID) != sSpellEffectScallingByEffectId.end() ? sSpellEffectScallingByEffectId[_effect->ID] : 0 : 0; - SpellEffectScalingEntry const* _effectScalingEntry = sSpellEffectScalingStore.LookupEntry(_effectScalingId); - - Scaling.Coefficient = _effectScalingEntry ? _effectScalingEntry->Coefficient : 0.0f; - Scaling.Variance = _effectScalingEntry ? _effectScalingEntry->Variance : 0.0f; - Scaling.ResourceCoefficient = _effectScalingEntry ? _effectScalingEntry->ResourceCoefficient : 0.0f; + Scaling.Coefficient = spellEffectScaling ? spellEffectScaling->Coefficient : 0.0f; + Scaling.Variance = spellEffectScaling ? spellEffectScaling->Variance : 0.0f; + Scaling.ResourceCoefficient = spellEffectScaling ? spellEffectScaling->ResourceCoefficient : 0.0f; } bool SpellEffectInfo::IsEffect() const @@ -468,7 +465,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* else if (caster) level = caster->getLevel(); - if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_UNK12)) + if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING)) level = _spellInfo->BaseLevel; if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel < level) @@ -492,12 +489,6 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* } else value = GetRandomPropertyPoints(_spellInfo->Scaling.ScalesFromItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); - - if (level < _spellInfo->Scaling.CastTimeMaxLevel && _spellInfo->Scaling.CastTimeMax) - value *= float(_spellInfo->Scaling.CastTimeMin + (level - 1) * (_spellInfo->Scaling.CastTimeMax - _spellInfo->Scaling.CastTimeMin) / (_spellInfo->Scaling.CastTimeMaxLevel - 1)) / float(_spellInfo->Scaling.CastTimeMax); - - if (level < _spellInfo->Scaling.NerfMaxLevel) - value *= ((((1.0f - _spellInfo->Scaling.NerfFactor) * (level - 1)) / (_spellInfo->Scaling.NerfMaxLevel - 1)) + _spellInfo->Scaling.NerfFactor); } value *= Scaling.Coefficient; @@ -976,10 +967,11 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE }; -SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals) +SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals, + std::unordered_map const& effectScaling) : _hasPowerDifficultyData(false) { - Id = spellEntry->ID; + Id = data.Entry->ID; // SpellDifficultyEntry for (SpellEffectEntryMap::value_type const& itr : effectsMap) @@ -990,31 +982,17 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef for (size_t i = 0; i < effects.size(); ++i) { if (SpellEffectEntry const* effect = effects[i]) - _effects[itr.first][effect->EffectIndex] = new SpellEffectInfo(spellEntry, this, effect->EffectIndex, effect); + { + auto scalingItr = effectScaling.find(effect->ID); + _effects[itr.first][effect->EffectIndex] = new SpellEffectInfo(scalingItr != effectScaling.end() ? scalingItr->second : nullptr, this, effect->EffectIndex, effect); + } } } - SpellName = spellEntry->Name_lang; - RuneCostID = spellEntry->RuneCostID; - SpellDifficultyId = 0; - SpellScalingId = spellEntry->ScalingID; - SpellAuraOptionsId = spellEntry->AuraOptionsID; - SpellAuraRestrictionsId = spellEntry->AuraRestrictionsID; - SpellCastingRequirementsId = spellEntry->CastingRequirementsID; - SpellCategoriesId = spellEntry->CategoriesID; - SpellClassOptionsId = spellEntry->ClassOptionsID; - SpellCooldownsId = spellEntry->CooldownsID; - SpellEquippedItemsId = spellEntry->EquippedItemsID; - SpellInterruptsId = spellEntry->InterruptsID; - SpellLevelsId = spellEntry->LevelsID; - SpellReagentsId = spellEntry->ReagentsID; - SpellShapeshiftId = spellEntry->ShapeshiftID; - SpellTargetRestrictionsId = spellEntry->TargetRestrictionsID; - SpellTotemsId = spellEntry->TotemsID; - SpellMiscId = spellEntry->MiscID; + SpellName = data.Entry->Name; // SpellMiscEntry - SpellMiscEntry const* _misc = GetSpellMisc(); + SpellMiscEntry const* _misc = data.Misc; Attributes = _misc ? _misc->Attributes : 0; AttributesEx = _misc ? _misc->AttributesEx : 0; AttributesEx2 = _misc ? _misc->AttributesExB : 0; @@ -1031,6 +1009,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef AttributesEx13 = _misc ? _misc->AttributesExM : 0; CastTimeEntry = _misc ? (_misc->CastingTimeIndex ? sSpellCastTimesStore.LookupEntry(_misc->CastingTimeIndex) : NULL) : NULL; DurationEntry = _misc ? (_misc->DurationIndex ? sSpellDurationStore.LookupEntry(_misc->DurationIndex) : NULL) : NULL; + RangeIndex = _misc ? _misc->RangeIndex : 0; RangeEntry = _misc ? (_misc->RangeIndex ? sSpellRangeStore.LookupEntry(_misc->RangeIndex) : NULL) : NULL; Speed = _misc ? _misc->Speed : 0; SchoolMask = _misc ? _misc->SchoolMask : 0; @@ -1041,18 +1020,13 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef _visuals = std::move(visuals); // SpellScalingEntry - SpellScalingEntry const* _scaling = GetSpellScaling(); - Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; - Scaling.CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; - Scaling.CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; + SpellScalingEntry const* _scaling = data.Scaling; Scaling.Class = _scaling ? _scaling->ScalingClass : 0; - Scaling.NerfFactor = _scaling ? _scaling->NerfFactor : 0; - Scaling.NerfMaxLevel = _scaling ? _scaling->NerfMaxLevel : 0; Scaling.MaxScalingLevel = _scaling ? _scaling->MaxScalingLevel : 0; Scaling.ScalesFromItemLevel = _scaling ? _scaling->ScalesFromItemLevel : 0; // SpellAuraOptionsEntry - SpellAuraOptionsEntry const* _options = GetSpellAuraOptions(); + SpellAuraOptionsEntry const* _options = data.AuraOptions; SpellProcsPerMinuteEntry const* _ppm = _options ? sSpellProcsPerMinuteStore.LookupEntry(_options->SpellProcsPerMinuteID) : nullptr; ProcFlags = _options ? _options->ProcTypeMask : 0; ProcChance = _options ? _options->ProcChance : 0; @@ -1064,7 +1038,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef StackAmount = _options ? _options->CumulativeAura : 0; // SpellAuraRestrictionsEntry - SpellAuraRestrictionsEntry const* _aura = GetSpellAuraRestrictions(); + SpellAuraRestrictionsEntry const* _aura = data.AuraRestrictions; CasterAuraState = _aura ? _aura->CasterAuraState : 0; TargetAuraState = _aura ? _aura->TargetAuraState : 0; ExcludeCasterAuraState = _aura ? _aura->ExcludeCasterAuraState : 0; @@ -1075,47 +1049,47 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef ExcludeTargetAuraSpell = _aura ? _aura->ExcludeTargetAuraSpell : 0; // SpellCastingRequirementsEntry - SpellCastingRequirementsEntry const* _castreq = GetSpellCastingRequirements(); + SpellCastingRequirementsEntry const* _castreq = data.CastingRequirements; RequiresSpellFocus = _castreq ? _castreq->RequiresSpellFocus : 0; FacingCasterFlags = _castreq ? _castreq->FacingCasterFlags : 0; RequiredAreasID = _castreq ? _castreq->RequiredAreasID : -1; // SpellCategoriesEntry - SpellCategoriesEntry const* _categorie = GetSpellCategories(); - CategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->Category) : NULL; + SpellCategoriesEntry const* _categorie = data.Categories; + CategoryId = _categorie ? _categorie->Category : 0; Dispel = _categorie ? _categorie->DispelType : 0; Mechanic = _categorie ? _categorie->Mechanic : 0; StartRecoveryCategory = _categorie ? _categorie->StartRecoveryCategory : 0; DmgClass = _categorie ? _categorie->DefenseType : 0; PreventionType = _categorie ? _categorie->PreventionType : 0; - ChargeCategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->ChargeCategory) : 0; + ChargeCategoryId = _categorie ? _categorie->ChargeCategory : 0; // SpellClassOptionsEntry - SpellClassOptionsEntry const* _class = GetSpellClassOptions(); + SpellClassOptionsEntry const* _class = data.ClassOptions; SpellFamilyName = _class ? _class->SpellClassSet : 0; SpellFamilyFlags = _class ? _class->SpellClassMask : flag128(); // SpellCooldownsEntry - SpellCooldownsEntry const* _cooldowns = GetSpellCooldowns(); + SpellCooldownsEntry const* _cooldowns = data.Cooldowns; RecoveryTime = _cooldowns ? _cooldowns->RecoveryTime : 0; CategoryRecoveryTime = _cooldowns ? _cooldowns->CategoryRecoveryTime : 0; StartRecoveryTime = _cooldowns ? _cooldowns->StartRecoveryTime : 0; // SpellEquippedItemsEntry - SpellEquippedItemsEntry const* _equipped = GetSpellEquippedItems(); + SpellEquippedItemsEntry const* _equipped = data.EquippedItems; EquippedItemClass = _equipped ? _equipped->EquippedItemClass : -1; EquippedItemSubClassMask = _equipped ?_equipped->EquippedItemSubClassMask : -1; EquippedItemInventoryTypeMask = _equipped ? _equipped->EquippedItemInventoryTypeMask : -1; // SpellInterruptsEntry - SpellInterruptsEntry const* _interrupt = GetSpellInterrupts(); + SpellInterruptsEntry const* _interrupt = data.Interrupts; InterruptFlags = _interrupt ? _interrupt->InterruptFlags : 0; // TODO: 6.x these flags have 2 parts AuraInterruptFlags = _interrupt ? _interrupt->AuraInterruptFlags[0] : 0; ChannelInterruptFlags = _interrupt ? _interrupt->ChannelInterruptFlags[0] : 0; // SpellLevelsEntry - SpellLevelsEntry const* _levels = GetSpellLevels(); + SpellLevelsEntry const* _levels = data.Levels; MaxLevel = _levels ? _levels->MaxLevel : 0; BaseLevel = _levels ? _levels->BaseLevel : 0; SpellLevel = _levels ? _levels->SpellLevel : 0; @@ -1124,26 +1098,26 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef PowerCosts = sDB2Manager.GetSpellPowers(Id, DIFFICULTY_NONE, &_hasPowerDifficultyData); // SpellReagentsEntry - SpellReagentsEntry const* _reagents = GetSpellReagents(); + SpellReagentsEntry const* _reagents = data.Reagents; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) Reagent[i] = _reagents ? _reagents->Reagent[i] : 0; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) ReagentCount[i] = _reagents ? _reagents->ReagentCount[i] : 0; // SpellShapeshiftEntry - SpellShapeshiftEntry const* _shapeshift = GetSpellShapeshift(); + SpellShapeshiftEntry const* _shapeshift = data.Shapeshift; Stances = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftMask[0], _shapeshift->ShapeshiftMask[1]) : 0; StancesNot = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftExclude[0], _shapeshift->ShapeshiftExclude[1]) : 0; // SpellTargetRestrictionsEntry - SpellTargetRestrictionsEntry const* _target = GetSpellTargetRestrictions(); + SpellTargetRestrictionsEntry const* _target = data.TargetRestrictions; Targets = _target ? _target->Targets : 0; TargetCreatureType = _target ? _target->TargetCreatureType : 0; MaxAffectedTargets = _target ? _target->MaxAffectedTargets : 0; MaxTargetLevel = _target ? _target->MaxTargetLevel : 0; // SpellTotemsEntry - SpellTotemsEntry const* _totem = GetSpellTotems(); + SpellTotemsEntry const* _totem = data.Totems; for (uint8 i = 0; i < 2; ++i) TotemCategory[i] = _totem ? _totem->RequiredTotemCategoryID[i] : 0; for (uint8 i = 0; i < 2; ++i) @@ -1169,7 +1143,7 @@ void SpellInfo::_UnloadSpellEffects() uint32 SpellInfo::GetCategory() const { - return CategoryEntry ? CategoryEntry->ID : 0; + return CategoryId; } bool SpellInfo::HasEffect(uint32 difficulty, SpellEffectName effect) const @@ -1475,7 +1449,11 @@ bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const bool SpellInfo::IsCooldownStartedOnEvent() const { - return Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE || (CategoryEntry && CategoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT); + if (Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + return true; + + SpellCategoryEntry const* category = sSpellCategoryStore.LookupEntry(CategoryId); + return category && category->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT; } bool SpellInfo::IsDeathPersistent() const @@ -2505,33 +2483,43 @@ int32 SpellInfo::GetDuration() const { if (!DurationEntry) return 0; - return (DurationEntry->Duration[0] == -1) ? -1 : abs(DurationEntry->Duration[0]); + return (DurationEntry->Duration == -1) ? -1 : abs(DurationEntry->Duration); } int32 SpellInfo::GetMaxDuration() const { if (!DurationEntry) return 0; - return (DurationEntry->Duration[2] == -1) ? -1 : abs(DurationEntry->Duration[2]); + return (DurationEntry->MaxDuration == -1) ? -1 : abs(DurationEntry->MaxDuration); } uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const { int32 castTime = 0; - if (!level && spell) - level = spell->GetCaster()->getLevel(); - - // not all spells have cast time index and this is all is pasiive abilities - if (level && Scaling.CastTimeMax > 0) + if (CastTimeEntry) { - castTime = Scaling.CastTimeMax; - if (Scaling.CastTimeMaxLevel > level) - castTime = Scaling.CastTimeMin + int32(level - 1) * (Scaling.CastTimeMax - Scaling.CastTimeMin) / (Scaling.CastTimeMaxLevel - 1); + 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->CastTime + CastTimeEntry->CastTimePerLevel * level; + if (castTime < CastTimeEntry->MinCastTime) + castTime = CastTimeEntry->MinCastTime; } - else if (CastTimeEntry) - castTime = CastTimeEntry->CastTime; - if (!castTime) + if (castTime <= 0) return 0; if (spell) @@ -3344,81 +3332,6 @@ bool SpellInfo::_IsPositiveTarget(uint32 targetA, uint32 targetB) return true; } -SpellTargetRestrictionsEntry const* SpellInfo::GetSpellTargetRestrictions() const -{ - return SpellTargetRestrictionsId ? sSpellTargetRestrictionsStore.LookupEntry(SpellTargetRestrictionsId) : NULL; -} - -SpellEquippedItemsEntry const* SpellInfo::GetSpellEquippedItems() const -{ - return SpellEquippedItemsId ? sSpellEquippedItemsStore.LookupEntry(SpellEquippedItemsId) : NULL; -} - -SpellInterruptsEntry const* SpellInfo::GetSpellInterrupts() const -{ - return SpellInterruptsId ? sSpellInterruptsStore.LookupEntry(SpellInterruptsId) : NULL; -} - -SpellLevelsEntry const* SpellInfo::GetSpellLevels() const -{ - return SpellLevelsId ? sSpellLevelsStore.LookupEntry(SpellLevelsId) : NULL; -} - -SpellReagentsEntry const* SpellInfo::GetSpellReagents() const -{ - return SpellReagentsId ? sSpellReagentsStore.LookupEntry(SpellReagentsId) : NULL; -} - -SpellScalingEntry const* SpellInfo::GetSpellScaling() const -{ - return SpellScalingId ? sSpellScalingStore.LookupEntry(SpellScalingId) : NULL; -} - -SpellShapeshiftEntry const* SpellInfo::GetSpellShapeshift() const -{ - return SpellShapeshiftId ? sSpellShapeshiftStore.LookupEntry(SpellShapeshiftId) : NULL; -} - -SpellTotemsEntry const* SpellInfo::GetSpellTotems() const -{ - return SpellTotemsId ? sSpellTotemsStore.LookupEntry(SpellTotemsId) : NULL; -} - -SpellMiscEntry const* SpellInfo::GetSpellMisc() const -{ - return SpellMiscId ? sSpellMiscStore.LookupEntry(SpellMiscId) : NULL; -} - -SpellAuraOptionsEntry const* SpellInfo::GetSpellAuraOptions() const -{ - return SpellAuraOptionsId ? sSpellAuraOptionsStore.LookupEntry(SpellAuraOptionsId) : NULL; -} - -SpellAuraRestrictionsEntry const* SpellInfo::GetSpellAuraRestrictions() const -{ - return SpellAuraRestrictionsId ? sSpellAuraRestrictionsStore.LookupEntry(SpellAuraRestrictionsId) : NULL; -} - -SpellCastingRequirementsEntry const* SpellInfo::GetSpellCastingRequirements() const -{ - return SpellCastingRequirementsId ? sSpellCastingRequirementsStore.LookupEntry(SpellCastingRequirementsId) : NULL; -} - -SpellCategoriesEntry const* SpellInfo::GetSpellCategories() const -{ - return SpellCategoriesId ? sSpellCategoriesStore.LookupEntry(SpellCategoriesId) : NULL; -} - -SpellClassOptionsEntry const* SpellInfo::GetSpellClassOptions() const -{ - return SpellClassOptionsId ? sSpellClassOptionsStore.LookupEntry(SpellClassOptionsId) : NULL; -} - -SpellCooldownsEntry const* SpellInfo::GetSpellCooldowns() const -{ - return SpellCooldownsId ? sSpellCooldownsStore.LookupEntry(SpellCooldownsId) : NULL; -} - void SpellInfo::_UnloadImplicitTargetConditionLists() { // find the same instances of ConditionList and delete them. diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 4faf98a0791..764760ddffa 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -277,7 +277,7 @@ public: RealPointsPerLevel(0), BasePoints(0), PointsPerResource(0), Amplitude(0), ChainAmplitude(0), BonusCoefficient(0), MiscValue(0), MiscValueB(0), Mechanic(MECHANIC_NONE), PositionFacing(0), RadiusEntry(NULL), ChainTargets(0), ItemType(0), TriggerSpell(0), BonusCoefficientFromAP(0.0f), ImplicitTargetConditions(NULL) { } - SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect); + SpellEffectInfo(SpellEffectScalingEntry const* spellEffectScaling, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect); bool IsEffect() const; bool IsEffect(SpellEffectName effectName) const; @@ -324,11 +324,13 @@ typedef std::unordered_map SpellVisualMap; typedef std::vector AuraEffectVector; +struct SpellInfoLoadHelper; + class TC_GAME_API SpellInfo { public: uint32 Id; - SpellCategoryEntry const* CategoryEntry; + uint32 CategoryId; uint32 Dispel; uint32 Mechanic; uint32 Attributes; @@ -379,7 +381,7 @@ public: uint32 SpellLevel; SpellDurationEntry const* DurationEntry; std::vector PowerCosts; - uint32 RuneCostID; + uint32 RangeIndex; SpellRangeEntry const* RangeEntry; float Speed; uint32 StackAmount; @@ -393,7 +395,7 @@ public: uint32 SpellVisual[2]; uint32 SpellIconID; uint32 ActiveIconID; - char* SpellName; + LocalizedString const* SpellName; uint32 MaxTargetLevel; uint32 MaxAffectedTargets; uint32 SpellFamilyName; @@ -402,32 +404,11 @@ public: uint32 PreventionType; int32 RequiredAreasID; uint32 SchoolMask; - SpellCategoryEntry const* ChargeCategoryEntry; - uint32 SpellDifficultyId; - uint32 SpellScalingId; - uint32 SpellAuraOptionsId; - uint32 SpellAuraRestrictionsId; - uint32 SpellCastingRequirementsId; - uint32 SpellCategoriesId; - uint32 SpellClassOptionsId; - uint32 SpellCooldownsId; - uint32 SpellEquippedItemsId; - uint32 SpellInterruptsId; - uint32 SpellLevelsId; - uint32 SpellReagentsId; - uint32 SpellShapeshiftId; - uint32 SpellTargetRestrictionsId; - uint32 SpellTotemsId; - uint32 SpellMiscId; + uint32 ChargeCategoryId; // SpellScalingEntry struct ScalingInfo { - int32 CastTimeMin; - int32 CastTimeMax; - uint32 CastTimeMaxLevel; int32 Class; - float NerfFactor; - uint32 NerfMaxLevel; uint32 MaxScalingLevel; uint32 ScalesFromItemLevel; } Scaling; @@ -435,24 +416,8 @@ public: uint32 ExplicitTargetMask; SpellChainNode const* ChainEntry; - // struct access functions - SpellTargetRestrictionsEntry const* GetSpellTargetRestrictions() const; - SpellAuraOptionsEntry const* GetSpellAuraOptions() const; - SpellAuraRestrictionsEntry const* GetSpellAuraRestrictions() const; - SpellCastingRequirementsEntry const* GetSpellCastingRequirements() const; - SpellCategoriesEntry const* GetSpellCategories() const; - SpellClassOptionsEntry const* GetSpellClassOptions() const; - SpellCooldownsEntry const* GetSpellCooldowns() const; - SpellEquippedItemsEntry const* GetSpellEquippedItems() const; - SpellInterruptsEntry const* GetSpellInterrupts() const; - SpellLevelsEntry const* GetSpellLevels() const; - SpellReagentsEntry const* GetSpellReagents() const; - SpellScalingEntry const* GetSpellScaling() const; - SpellShapeshiftEntry const* GetSpellShapeshift() const; - SpellTotemsEntry const* GetSpellTotems() const; - SpellMiscEntry const* GetSpellMisc() const; - - SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals); + SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals, + std::unordered_map const& effectScaling); ~SpellInfo(); uint32 GetCategory() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index beeb1109dce..d5f3c0c5d77 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2690,9 +2690,11 @@ void SpellMgr::LoadSpellInfoStore() UnloadSpellInfoStore(); mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); + std::unordered_map loadData; std::unordered_map effectsBySpell; std::unordered_map visualsBySpell; + std::unordered_map spellEffectScallingByEffectId; for (SpellEffectEntry const* effect : sSpellEffectStore) { @@ -2709,12 +2711,70 @@ void SpellMgr::LoadSpellInfoStore() effectsForDifficulty[effect->EffectIndex] = effect; } + for (SpellAuraOptionsEntry const* auraOptions : sSpellAuraOptionsStore) + if (!auraOptions->DifficultyID) // TODO: implement + loadData[auraOptions->SpellID].AuraOptions = auraOptions; + + for (SpellAuraRestrictionsEntry const* auraRestrictions : sSpellAuraRestrictionsStore) + if (!auraRestrictions->DifficultyID) // TODO: implement + loadData[auraRestrictions->SpellID].AuraRestrictions = auraRestrictions; + + for (SpellCastingRequirementsEntry const* castingRequirements : sSpellCastingRequirementsStore) + loadData[castingRequirements->SpellID].CastingRequirements = castingRequirements; + + for (SpellCategoriesEntry const* categories : sSpellCategoriesStore) + if (!categories->DifficultyID) // TODO: implement + loadData[categories->SpellID].Categories = categories; + + for (SpellClassOptionsEntry const* classOptions : sSpellClassOptionsStore) + loadData[classOptions->SpellID].ClassOptions = classOptions; + + for (SpellCooldownsEntry const* cooldowns : sSpellCooldownsStore) + if (!cooldowns->DifficultyID) // TODO: implement + loadData[cooldowns->SpellID].Cooldowns = cooldowns; + + for (SpellEffectScalingEntry const* spellEffectScaling : sSpellEffectScalingStore) + spellEffectScallingByEffectId[spellEffectScaling->SpellEffectID] = spellEffectScaling; + + for (SpellEquippedItemsEntry const* equippedItems : sSpellEquippedItemsStore) + loadData[equippedItems->SpellID].EquippedItems = equippedItems; + + for (SpellInterruptsEntry const* interrupts : sSpellInterruptsStore) + if (!interrupts->DifficultyID) // TODO: implement + loadData[interrupts->SpellID].Interrupts = interrupts; + + for (SpellLevelsEntry const* levels : sSpellLevelsStore) + if (!levels->DifficultyID) // TODO: implement + loadData[levels->SpellID].Levels = levels; + + for (SpellReagentsEntry const* reagents : sSpellReagentsStore) + loadData[reagents->SpellID].Reagents = reagents; + + for (SpellScalingEntry const* scaling : sSpellScalingStore) + loadData[scaling->SpellID].Scaling = scaling; + + for (SpellShapeshiftEntry const* shapeshift : sSpellShapeshiftStore) + loadData[shapeshift->SpellID].Shapeshift = shapeshift; + + for (SpellTargetRestrictionsEntry const* targetRestrictions : sSpellTargetRestrictionsStore) + if (!targetRestrictions->DifficultyID) // TODO: implement + loadData[targetRestrictions->SpellID].TargetRestrictions = targetRestrictions; + + for (SpellTotemsEntry const* totems : sSpellTotemsStore) + loadData[totems->SpellID].Totems = totems; + for (SpellXSpellVisualEntry const* visual : sSpellXSpellVisualStore) visualsBySpell[visual->SpellID][visual->DifficultyID].push_back(visual); for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) + { if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) - mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i], std::move(visualsBySpell[i])); + { + loadData[i].Entry = spellEntry; + loadData[i].Misc = sSpellMiscStore.LookupEntry(spellEntry->MiscID); + mSpellInfoMap[i] = new SpellInfo(loadData[i], effectsBySpell[i], std::move(visualsBySpell[i]), spellEffectScallingByEffectId); + } + } TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -3115,12 +3175,6 @@ void SpellMgr::LoadSpellInfoCorrections() case 6474: // Earthbind Totem (instant pulse) spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; break; - case 5176: // Wrath - case 2912: // Starfire - //case 78674: // Starsurge 6.x effect 1 is no more - const_cast(spellInfo->GetEffect(EFFECT_1))->Effect = SPELL_EFFECT_DUMMY; - const_cast(spellInfo->GetEffect(EFFECT_1))->TargetA = TARGET_UNIT_CASTER; - break; case 70728: // Exploit Weakness (needs target selection script) case 70840: // Devious Minds (needs target selection script) const_cast(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); @@ -3467,6 +3521,11 @@ void SpellMgr::LoadSpellInfoCorrections() void SpellMgr::LoadPetFamilySpellsStore() { + std::unordered_map levelsBySpell; + for (SpellLevelsEntry const* levels : sSpellLevelsStore) + if (!levels->DifficultyID) + levelsBySpell[levels->SpellID] = levels; + for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) { SkillLineAbilityEntry const* skillLine = sSkillLineAbilityStore.LookupEntry(j); @@ -3477,8 +3536,8 @@ void SpellMgr::LoadPetFamilySpellsStore() if (!spellInfo) continue; - SpellLevelsEntry const* levels = sSpellLevelsStore.LookupEntry(spellInfo->LevelsID); - if (spellInfo->LevelsID && (!levels || levels->SpellLevel)) + auto levels = levelsBySpell.find(skillLine->SpellID); + if (levels != levelsBySpell.end() && levels->second->SpellLevel) continue; if (SpellMiscEntry const* spellMisc = sSpellMiscStore.LookupEntry(spellInfo->MiscID)) diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 79721235c17..e9488d8ecbb 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -597,6 +597,27 @@ TC_GAME_API int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto TC_GAME_API extern PetFamilySpellsStore sPetFamilySpellsStore; +struct SpellInfoLoadHelper +{ + SpellEntry const* Entry = nullptr; + + SpellAuraOptionsEntry const* AuraOptions = nullptr; + SpellAuraRestrictionsEntry const* AuraRestrictions = nullptr; + SpellCastingRequirementsEntry const* CastingRequirements = nullptr; + SpellCategoriesEntry const* Categories = nullptr; + SpellClassOptionsEntry const* ClassOptions = nullptr; + SpellCooldownsEntry const* Cooldowns = nullptr; + SpellEquippedItemsEntry const* EquippedItems = nullptr; + SpellInterruptsEntry const* Interrupts = nullptr; + SpellLevelsEntry const* Levels = nullptr; + SpellMiscEntry const* Misc = nullptr; + SpellReagentsEntry const* Reagents = nullptr; + SpellScalingEntry const* Scaling = nullptr; + SpellShapeshiftEntry const* Shapeshift = nullptr; + SpellTargetRestrictionsEntry const* TargetRestrictions = nullptr; + SpellTotemsEntry const* Totems = nullptr; +}; + class TC_GAME_API SpellMgr { // Constructors diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index f4bc3f7fcba..8aa1c1a4dc8 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -121,7 +121,7 @@ void CreatureTextMgr::LoadCreatureTexts() if (temp.sound) { - if (!sSoundEntriesStore.LookupEntry(temp.sound)) + if (!sSoundKitStore.LookupEntry(temp.sound)) { TC_LOG_ERROR("sql.sql", "CreatureTextMgr: Entry %u, Group %u in table `creature_text` has Sound %u but sound does not exist.", temp.entry, temp.group, temp.sound); temp.sound = 0; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index b2094df08ef..59eb97d1476 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -171,7 +171,7 @@ public: uint32 soundId = atoi((char*)args); - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 16e94242021..5f31d7f806f 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -325,7 +325,7 @@ public: if ((skillInfo->CategoryID == SKILL_CATEGORY_PROFESSION || skillInfo->CategoryID == SKILL_CATEGORY_SECONDARY) && skillInfo->CanLink) // only prof. with recipes have { - HandleLearnSkillRecipesHelper(target, skillInfo->ID); + HandleLearnSkillRecipesHelper(target, i); } } @@ -358,7 +358,7 @@ public: std::string name; - SkillLineEntry const* targetSkillInfo = NULL; + uint32 skillId = 0; for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i) { SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(i); @@ -370,23 +370,42 @@ public: !skillInfo->CanLink) // only prof with recipes have set continue; - name = skillInfo->DisplayName_lang; + int locale = handler->GetSessionDbcLocale(); + name = skillInfo->DisplayName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, namePart)) - continue; + { + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; - targetSkillInfo = skillInfo; + name = skillInfo->DisplayName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, namePart)) + break; + } + } + + if (locale < TOTAL_LOCALES) + { + skillId = i; + break; + } } - if (!targetSkillInfo) + if (!skillId) return false; - HandleLearnSkillRecipesHelper(target, targetSkillInfo->ID); + HandleLearnSkillRecipesHelper(target, skillId); - uint16 maxLevel = target->GetPureMaxSkillValue(targetSkillInfo->ID); - target->SetSkill(targetSkillInfo->ID, target->GetSkillStep(targetSkillInfo->ID), maxLevel, maxLevel); + uint16 maxLevel = target->GetPureMaxSkillValue(skillId); + target->SetSkill(skillId, target->GetSkillStep(skillId), maxLevel, maxLevel); handler->PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, name.c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 67c89a2f10c..b66fc95c407 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -436,7 +436,7 @@ public: AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); - char const* name = aura->GetSpellInfo()->SpellName; + char const* name = aura->GetSpellInfo()->SpellName->Str[handler->GetSessionDbcLocale()]; bool talent = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); std::ostringstream ss_name; diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 57bf557771b..b032aa8ef2e 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -688,41 +688,59 @@ public: SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(id); if (skillInfo) { - std::string name = skillInfo->DisplayName_lang; + int locale = handler->GetSessionDbcLocale(); + std::string name = skillInfo->DisplayName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = skillInfo->DisplayName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - char valStr[50] = ""; - char const* knownStr = ""; - if (target && target->HasSkill(id)) + if (locale < TOTAL_LOCALES) { - knownStr = handler->GetTrinityString(LANG_KNOWN); - uint32 curValue = target->GetPureSkillValue(id); - uint32 maxValue = target->GetPureMaxSkillValue(id); - uint32 permValue = target->GetSkillPermBonusValue(id); - uint32 tempValue = target->GetSkillTempBonusValue(id); - - char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); - snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); - } + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - // send skill in "id - [namedlink locale]" format - if (handler->GetSession()) - handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr); - else - handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr); + char valStr[50] = ""; + char const* knownStr = ""; + if (target && target->HasSkill(id)) + { + knownStr = handler->GetTrinityString(LANG_KNOWN); + uint32 curValue = target->GetPureSkillValue(id); + uint32 maxValue = target->GetPureMaxSkillValue(id); + uint32 permValue = target->GetSkillPermBonusValue(id); + uint32 tempValue = target->GetSkillTempBonusValue(id); + + char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); + snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); + } - if (!found) - found = true; + // send skill in "id - [namedlink locale]" format + if (handler->GetSession()) + handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr); + else + handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr); + + if (!found) + found = true; + } } } if (!found) @@ -758,63 +776,81 @@ public: SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id); if (spellInfo) { - std::string name = spellInfo->SpellName; + int locale = handler->GetSessionDbcLocale(); + std::string name = spellInfo->SpellName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = spellInfo->SpellName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - bool known = target && target->HasSpell(id); + if (locale < TOTAL_LOCALES) + { + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); - bool learn = effect ? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + bool known = target && target->HasSpell(id); - SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect ? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; - bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); - bool passive = spellInfo->IsPassive(); - bool active = target && target->HasAura(id); + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; - // unit32 used to prevent interpreting uint8 as char at output - // find rank of learned spell for learning spell, or talent rank - uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); + bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); + bool passive = spellInfo->IsPassive(); + bool active = target && target->HasAura(id); - // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; - else - ss << id << " - " << name; + // unit32 used to prevent interpreting uint8 as char at output + // find rank of learned spell for learning spell, or talent rank + uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); - // include rank in link name - if (rank) - ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; + // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + else + ss << id << " - " << name; - if (handler->GetSession()) - ss << "]|h|r"; - - if (talent) - ss << handler->GetTrinityString(LANG_TALENT); - if (passive) - ss << handler->GetTrinityString(LANG_PASSIVE); - if (learn) - ss << handler->GetTrinityString(LANG_LEARN); - if (known) - ss << handler->GetTrinityString(LANG_KNOWN); - if (active) - ss << handler->GetTrinityString(LANG_ACTIVE); + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - handler->SendSysMessage(ss.str().c_str()); + if (handler->GetSession()) + ss << "]|h|r"; + + if (talent) + ss << handler->GetTrinityString(LANG_TALENT); + if (passive) + ss << handler->GetTrinityString(LANG_PASSIVE); + if (learn) + ss << handler->GetTrinityString(LANG_LEARN); + if (known) + ss << handler->GetTrinityString(LANG_KNOWN); + if (active) + ss << handler->GetTrinityString(LANG_ACTIVE); - if (!found) - found = true; + handler->SendSysMessage(ss.str().c_str()); + + if (!found) + found = true; + } } } if (!found) @@ -836,56 +872,56 @@ public: if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id)) { int locale = handler->GetSessionDbcLocale(); - std::string name = spellInfo->SpellName; + std::string name = spellInfo->SpellName->Str[locale]; if (name.empty()) { handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); return true; } - bool known = target && target->HasSpell(id); + bool known = target && target->HasSpell(id); - SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); - bool learn = effect? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; - SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; - bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); - bool passive = spellInfo->IsPassive(); - bool active = target && target->HasAura(id); + bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); + bool passive = spellInfo->IsPassive(); + bool active = target && target->HasAura(id); - // unit32 used to prevent interpreting uint8 as char at output - // find rank of learned spell for learning spell, or talent rank - uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); + // unit32 used to prevent interpreting uint8 as char at output + // find rank of learned spell for learning spell, or talent rank + uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); - // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; - else - ss << id << " - " << name; - - // include rank in link name - if (rank) - ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; + // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + else + ss << id << " - " << name; - if (handler->GetSession()) - ss << ' ' << localeNames[locale] << "]|h|r"; - else - ss << ' ' << localeNames[locale]; - - if (talent) - ss << handler->GetTrinityString(LANG_TALENT); - if (passive) - ss << handler->GetTrinityString(LANG_PASSIVE); - if (learn) - ss << handler->GetTrinityString(LANG_LEARN); - if (known) - ss << handler->GetTrinityString(LANG_KNOWN); - if (active) - ss << handler->GetTrinityString(LANG_ACTIVE); + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - handler->SendSysMessage(ss.str().c_str()); + if (handler->GetSession()) + ss << ' ' << localeNames[locale] << "]|h|r"; + else + ss << ' ' << localeNames[locale]; + + if (talent) + ss << handler->GetTrinityString(LANG_TALENT); + if (passive) + ss << handler->GetTrinityString(LANG_PASSIVE); + if (learn) + ss << handler->GetTrinityString(LANG_LEARN); + if (known) + ss << handler->GetTrinityString(LANG_KNOWN); + if (active) + ss << handler->GetTrinityString(LANG_ACTIVE); + + handler->SendSysMessage(ss.str().c_str()); } else handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 7ad80352995..e6fb42853e3 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -755,7 +755,7 @@ public: } target->GetSpellHistory()->ResetCooldown(spellIid, true); - target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryEntry); + target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryId); handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); } return true; @@ -1168,10 +1168,10 @@ public: if (itemNameStr && itemNameStr[0]) { std::string itemName = itemNameStr+1; - auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](ItemSparseEntry const* itemSparse) + auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](std::pair kv) { for (uint32 i = 0; i < MAX_LOCALES; ++i) - if (itemName == itemSparse->Name->Str[i]) + if (itemName == kv.second->Name->Str[i]) return true; return false; }); @@ -1183,7 +1183,7 @@ public: return false; } - itemId = itr->ID; + itemId = itr->first; } else return false; @@ -1469,7 +1469,7 @@ public: // add the skill to the player's book with step 1 (which is the first rank, in most cases something // like 'Apprentice '. target->SetSkill(skill, targetHasSkill ? target->GetSkillStep(skill) : 1, level, max); - handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->DisplayName_lang, handler->GetNameLink(target).c_str(), level, max); + handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->DisplayName->Str[handler->GetSessionDbcLocale()], handler->GetNameLink(target).c_str(), level, max); return true; } @@ -1573,7 +1573,7 @@ public: uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN); uint8 gender = 0; - int8 locale = handler->GetSessionDbcLocale(); + LocaleConstant locale = handler->GetSessionDbcLocale(); uint32 totalPlayerTime = 0; uint8 level = 0; std::string alive = handler->GetTrinityString(LANG_ERROR); @@ -1794,7 +1794,7 @@ public: handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level); // Output XI. LANG_PINFO_CHR_RACE - raceStr = GetRaceName(raceid, locale); + raceStr = DB2Manager::GetChrRaceName(raceid, locale); classStr = GetClassName(classid, locale); handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str()); @@ -2608,7 +2608,7 @@ public: uint32 soundId = atoi((char*)args); - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); handler->SetSentErrorMessage(true); @@ -2688,7 +2688,7 @@ public: { AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); - char const* name = aura->GetSpellInfo()->SpellName; + char const* name = aura->GetSpellInfo()->SpellName->Str[handler->GetSessionDbcLocale()]; bool self = target->GetGUID() == aura->GetCasterGUID(); if (self) diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 4488561589f..a4665973009 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -172,7 +172,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader int32 energizeAmount = -GetEffectValue(); // -13 // If we are set to fill the lunar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura @@ -180,7 +180,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the solar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) <= 0) caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); break; } @@ -189,7 +189,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader int32 energizeAmount = GetEffectValue(); // 20 // If we are set to fill the solar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura @@ -197,7 +197,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); break; } @@ -205,7 +205,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader { // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { int32 energizeAmount = GetEffectValue(); // 15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); @@ -220,10 +220,10 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); // The energizing effect brought us out of the solar eclipse, remove the aura - else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) <= 0) caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); break; } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index b0853c71b2c..7dcd3a4fbb9 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -2706,7 +2706,7 @@ public: if (Player* target = GetHitUnit()->ToPlayer()) { target->HandleEmoteCommand(EMOTE_ONESHOT_TRAIN); - if (EmotesTextSoundEntry const* soundEntry = FindTextSoundEmoteFor(TEXT_EMOTE_TRAIN, target->getRace(), target->getGender())) + if (EmotesTextSoundEntry const* soundEntry = sDB2Manager.GetTextSoundEmoteFor(TEXT_EMOTE_TRAIN, target->getRace(), target->getGender(), target->getClass())) target->PlayDistanceSound(soundEntry->SoundId); } } diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp new file mode 100644 index 00000000000..2e7e974cb5d --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -0,0 +1,683 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "Common.h" +#include "DB2SparseStorageLoader.h" +#include "Database/DatabaseEnv.h" +#include "Log.h" + +DB2SparseFileLoader::DB2SparseFileLoader() +{ + fileName = nullptr; + + recordCount = 0; + fieldCount = 0; + recordSize = 0; + offsetsPos = 0; + tableHash = 0; + build = 0; + unk1 = 0; + minIndex = 0; + maxIndex = 0; + localeMask = 0; + copyIdSize = 0; + + dataStart = 0; + data = nullptr; + offsets = nullptr; +} + +bool DB2SparseFileLoader::Load(const char *filename) +{ + if (data) + { + delete[] data; + data = nullptr; + } + + FILE* f = fopen(filename, "rb"); + if (!f) + return false; + + fileName = filename; + uint32 header; + if (fread(&header, 4, 1, f) != 1) // Signature + { + fclose(f); + return false; + } + + EndianConvert(header); + + if (header != 0x34424457) + { + fclose(f); + return false; //'WDB4' + } + + if (fread(&recordCount, 4, 1, f) != 1) // Number of records + { + fclose(f); + return false; + } + + EndianConvert(recordCount); + + if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields + { + fclose(f); + return false; + } + + EndianConvert(fieldCount); + + if (fread(&recordSize, 4, 1, f) != 1) // Size of a record + { + fclose(f); + return false; + } + + EndianConvert(recordSize); + + if (fread(&offsetsPos, 4, 1, f) != 1) // String size + { + fclose(f); + return false; + } + + EndianConvert(offsetsPos); + + if (fread(&tableHash, 4, 1, f) != 1) // Table hash + { + fclose(f); + return false; + } + + EndianConvert(tableHash); + + if (fread(&build, 4, 1, f) != 1) // Build + { + fclose(f); + return false; + } + + EndianConvert(build); + + if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 + { + fclose(f); + return false; + } + + EndianConvert(unk1); + + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 + { + fclose(f); + return false; + } + + EndianConvert(minIndex); + + if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 + { + fclose(f); + return false; + } + + EndianConvert(maxIndex); + + if (fread(&localeMask, 4, 1, f) != 1) // Locales + { + fclose(f); + return false; + } + + EndianConvert(localeMask); + + if (fread(©IdSize, 4, 1, f) != 1) + { + fclose(f); + return false; + } + + EndianConvert(copyIdSize); + + if (fread(&metaFlags, 4, 1, f) != 1) + { + fclose(f); + return false; + } + + EndianConvert(metaFlags); + + dataStart = ftell(f); + + data = new unsigned char[offsetsPos - dataStart]; + + if (fread(data, offsetsPos - dataStart, 1, f) != 1) + { + fclose(f); + return false; + } + + offsets = new OffsetTableEntry[maxIndex - minIndex + 1]; + if (fread(offsets, (maxIndex - minIndex + 1) * 6, 1, f) != 1) + { + fclose(f); + return false; + } + + fclose(f); + return true; +} + +DB2SparseFileLoader::~DB2SparseFileLoader() +{ + delete[] data; + delete[] offsets; +} + +uint32 DB2SparseFileLoader::GetFormatRecordSize(const char * format) +{ + uint32 recordsize = 0; + for (uint32 x = 0; format[x]; ++x) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_INT: + recordsize += 4; + break; + case FT_STRING: + case FT_STRING_NOT_LOCALIZED: + recordsize += sizeof(char*); + break; + case FT_BYTE: + recordsize += 1; + break; + case FT_LONG: + recordsize += 8; + break; + case FT_SHORT: + recordsize += 2; + break; + } + } + + return recordsize; +} + +uint32 DB2SparseFileLoader::GetFormatStringFieldCount(const char* format) +{ + uint32 stringfields = 0; + for (uint32 x = 0; format[x]; ++x) + if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) + ++stringfields; + + return stringfields; +} + +uint32 DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(char const* format) +{ + uint32 stringfields = 0; + for (uint32 x = 0; format[x]; ++x) + if (format[x] == FT_STRING) + ++stringfields; + + return stringfields; +} + +static char const* const nullStr = ""; + +char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable, uint32 locale, std::vector& stringPool) +{ + typedef char* ptr; + if (strlen(format) != fieldCount) + return NULL; + + //get struct size and index pos + uint32 recordsize = GetFormatRecordSize(format); + + uint32 offsetCount = maxIndex - minIndex + 1; + uint32 records = 0; + uint32 expandedDataSize = 0; + for (uint32 i = 0; i < offsetCount; ++i) + { + if (offsets[i].FileOffset && offsets[i].RecordSize) + { + ++records; + expandedDataSize += offsets[i].RecordSize; + } + } + + char* dataTable = new char[records * recordsize]; + + // we store flat holders pool as single memory block + std::size_t stringFields = GetFormatStringFieldCount(format); + std::size_t localizedStringFields = GetFormatLocalizedStringFieldCount(format); + + // each string field at load have array of string for each locale + std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * records; + + char* stringHoldersPool = new char[stringHoldersPoolSize]; + stringPool.push_back(stringHoldersPool); + + // DB2 strings expected to have at least empty string + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + ((char const**)stringHoldersPool)[i] = nullStr; + + char* stringTable = new char[expandedDataSize - records * (recordsize - stringFields * sizeof(char*))]; + memset(stringTable, 0, expandedDataSize - records * (recordsize - stringFields * sizeof(char*))); + stringPool.push_back(stringTable); + char* stringPtr = stringTable; + + uint32 offset = 0; + uint32 recordNum = 0; + for (uint32 y = 0; y < offsetCount; ++y) + { + if (!offsets[y].FileOffset || !offsets[y].RecordSize) + continue; + + indexTable.Insert(y + minIndex, &dataTable[offset]); + uint32 fieldOffset = 0; + uint32 stringFieldOffset = 0; + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + *((float*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 4; + fieldOffset += 4; + break; + case FT_IND: + case FT_INT: + *((uint32*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 4; + fieldOffset += 4; + break; + case FT_BYTE: + *((uint8*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 1; + fieldOffset += 1; + break; + case FT_LONG: + *((uint64*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 8; + fieldOffset += 8; + break; + case FT_SHORT: + *((uint16*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 2; + fieldOffset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); + *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + (*slot)->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + stringFieldOffset += stringHolderSize; + offset += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const*** slot = (char const***)(&dataTable[offset]); + *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + **slot = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + ++stringFieldOffset; + offset += sizeof(char*); + break; + } + } + } + + ++recordNum; + } + + return dataTable; +} + +char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) +{ + if (strlen(format) != fieldCount) + return nullptr; + + if (!(localeMask & (1 << locale))) + { + char const* sep = ""; + std::ostringstream str; + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + { + if (localeMask & (1 << i)) + { + str << sep << localeNames[i]; + sep = ", "; + } + } + + TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]); + return nullptr; + } + + uint32 offsetCount = maxIndex - minIndex + 1; + uint32 records = 0; + for (uint32 i = 0; i < offsetCount; ++i) + if (offsets[i].FileOffset && offsets[i].RecordSize) + ++records; + + uint32 recordsize = GetFormatRecordSize(format); + std::size_t stringFields = GetFormatStringFieldCount(format); + char* stringTable = new char[offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))]; + memset(stringTable, 0, offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))); + char* stringPtr = stringTable; + + uint32 offset = 0; + + for (uint32 y = 0; y < offsetCount; y++) + { + if (!offsets[y].FileOffset || !offsets[y].RecordSize) + continue; + + uint32 fieldOffset; + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_IND: + case FT_INT: + offset += 4; + fieldOffset += 4; + break; + case FT_BYTE: + offset += 1; + fieldOffset += 1; + break; + case FT_LONG: + offset += 8; + fieldOffset += 8; + break; + case FT_SHORT: + offset += 2; + fieldOffset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); + db2str->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char** db2str = (char**)(&dataTable[offset]); + *db2str = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + offset += sizeof(char*); + break; + } + } + } + } + + return stringTable; +} + +char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool) +{ + // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format + PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); + if (!result) + return nullptr; + + uint32 const fieldCount = strlen(format); + if (fieldCount != result->GetFieldCount()) + return nullptr; + + // get struct size and index pos + uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); + + // we store flat holders pool as single memory block + std::size_t stringFields = DB2SparseFileLoader::GetFormatStringFieldCount(format); + std::size_t localizedStringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + + // each string field at load have array of string for each locale + std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + + char* stringHolders = nullptr; + if (stringFields) + { + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); + stringHolders = new char[stringHoldersPoolSize]; + stringPool.push_back(stringHolders); + + // DB2 strings expected to have at least empty string + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + ((char const**)stringHolders)[i] = nullStr; + } + + char* tempDataTable = new char[result->GetRowCount() * recordSize]; + uint32* newIndexes = new uint32[result->GetRowCount()]; + uint32 rec = 0; + uint32 newRecords = 0; + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldOffset = 0; + + uint32 indexValue = fields[0].GetUInt32(); + + // Attempt to overwrite existing data + char* dataValue = indexTable.Get(indexValue); + if (!dataValue) + { + newIndexes[newRecords] = indexValue; + dataValue = &tempDataTable[newRecords++ * recordSize]; + } + + for (uint32 f = 0; f < fieldCount; f++) + { + switch (format[f]) + { + case FT_FLOAT: + *((float*)(&dataValue[offset])) = fields[f].GetFloat(); + offset += 4; + break; + case FT_IND: + case FT_INT: + *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); + offset += 4; + break; + case FT_BYTE: + *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); + offset += 1; + break; + case FT_LONG: + *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); + offset += 8; + break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); + *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); + + stringFieldOffset += stringHolderSize; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) + stringPool.push_back(str); + + ++stringFieldOffset; + offset += sizeof(char*); + break; + } + } + } + + ASSERT(offset == recordSize); + ++rec; + } while (result->NextRow()); + + if (!newRecords) + { + delete[] tempDataTable; + delete[] newIndexes; + return nullptr; + } + + // Compact new data table to only contain new records not previously loaded from file + char* dataTable = new char[newRecords * recordSize]; + memcpy(dataTable, tempDataTable, newRecords * recordSize); + + // insert new records to index table + for (uint32 i = 0; i < newRecords; ++i) + indexTable.Insert(newIndexes[i], &dataTable[i * recordSize]); + + delete[] tempDataTable; + delete[] newIndexes; + + return dataTable; +} + +void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool) +{ + PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); + stmt->setString(0, localeNames[locale]); + PreparedQueryResult result = HotfixDatabase.Query(stmt); + if (!result) + return; + + size_t stringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + if (result->GetFieldCount() != stringFields + 1 /*ID*/) + return; + + uint32 const fieldCount = strlen(format); + uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); + ASSERT(0 >= 0, "DB2Storage must be indexed to load localized strings"); + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldNumInRecord = 0; + uint32 indexValue = fields[0].GetUInt32(); + + // Attempt to overwrite existing data + if (char* dataValue = indexTable.Get(indexValue)) + { + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_IND: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_LONG: + offset += 8; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); + if (db2str->Str[locale] == nullStr) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(char*); + break; + } + } + } + + ASSERT(offset == recordSize); + } + else + TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u!", _storageName.c_str(), indexValue); + + } while (result->NextRow()); + + return; +} + +char* DB2SparseDatabaseLoader::AddString(char const** holder, std::string const& value) +{ + if (!value.empty()) + { + std::size_t existingLength = strlen(*holder); + if (existingLength >= value.length()) + { + // Reuse existing storage if there is enough space + char* str = const_cast(*holder); + memcpy(str, value.c_str(), value.length()); + str[value.length()] = '\0'; + return nullptr; + } + + char* str = new char[value.length() + 1]; + memcpy(str, value.c_str(), value.length()); + str[value.length()] = '\0'; + *holder = str; + return str; + } + + return nullptr; +} diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.h b/src/server/shared/DataStores/DB2SparseStorageLoader.h new file mode 100644 index 00000000000..13f31e12d56 --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef DB2_SPARSE_FILE_LOADER_H +#define DB2_SPARSE_FILE_LOADER_H + +#include "Define.h" +#include "Utilities/ByteConverter.h" +#include "Implementation/HotfixDatabase.h" +#include +#include + +class IndexTable +{ +public: + virtual void Insert(uint32 index, char* data) const = 0; + virtual char* Get(uint32 index) const = 0; +}; + +template +class IndexTableAdapter : public IndexTable +{ +public: + IndexTableAdapter(std::unordered_map& indexTable) : _indexTable(indexTable) { } + + void Insert(uint32 index, char* data) const override + { + _indexTable[index] = (T const*)data; + } + + char* Get(uint32 index) const override + { + auto itr = _indexTable.find(index); + if (itr != _indexTable.end()) + return (char*)itr->second; + return nullptr; + } + +private: + std::unordered_map& _indexTable; +}; + +class DB2SparseFileLoader +{ + public: + DB2SparseFileLoader(); + ~DB2SparseFileLoader(); + + bool Load(const char *filename); + + uint32 GetNumRows() const { return recordCount; } + uint32 GetCols() const { return fieldCount; } + uint32 GetHash() const { return tableHash; } + bool IsLoaded() const { return (data != NULL); } + char* AutoProduceData(const char* fmt, IndexTable const& indexTable, uint32 locale, std::vector& stringPool); + char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); + static uint32 GetFormatRecordSize(const char * format); + static uint32 GetFormatStringFieldCount(const char * format); + static uint32 GetFormatLocalizedStringFieldCount(const char * format); +private: +#pragma pack(push, 1) + struct OffsetTableEntry + { + uint32 FileOffset; + uint16 RecordSize; + }; +#pragma pack(pop) + + char const* fileName; + + // WDB2 / WCH2 fields + uint32 recordSize; + uint32 recordCount; + uint32 fieldCount; + uint32 offsetsPos; + uint32 tableHash; + uint32 build; + uint32 unk1; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; + + uint32 dataStart; + unsigned char* data; + OffsetTableEntry* offsets; +}; + +class DB2SparseDatabaseLoader +{ +public: + explicit DB2SparseDatabaseLoader(std::string const& storageName) : _storageName(storageName) { } + + char* Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool); + void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool); + static char* AddString(char const** holder, std::string const& value); + +private: + std::string _storageName; +}; + +#endif diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index d2be433806f..d101d12a52e 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -23,22 +23,25 @@ DB2FileLoader::DB2FileLoader() { fileName = nullptr; + recordSize = 0; recordCount = 0; fieldCount = 0; stringSize = 0; - fieldsOffset = nullptr; - data = nullptr; - stringTable = nullptr; - tableHash = 0; build = 0; - unk1 = 0; minIndex = 0; maxIndex = 0; localeMask = 0; - unk5 = 0; + copyIdSize = 0; + + fieldsOffset = nullptr; + data = nullptr; + stringTable = nullptr; + idTable = nullptr; + idTableSize = 0; + copyTable = nullptr; } bool DB2FileLoader::Load(const char *filename, const char *fmt) @@ -55,7 +58,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) fileName = filename; uint32 header; - if (fread(&header, 4, 1, f) != 1) // Signature + if (fread(&header, 4, 1, f) != 1) // Signature { fclose(f); return false; @@ -63,13 +66,13 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(header); - if (header != 0x32424457) + if (header != 0x34424457) { fclose(f); - return false; //'WDB2' + return false; //'WDB4' } - if (fread(&recordCount, 4, 1, f) != 1) // Number of records + if (fread(&recordCount, 4, 1, f) != 1) // Number of records { fclose(f); return false; @@ -77,7 +80,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(recordCount); - if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields + if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields { fclose(f); return false; @@ -85,7 +88,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(fieldCount); - if (fread(&recordSize, 4, 1, f) != 1) // Size of a record + if (fread(&recordSize, 4, 1, f) != 1) // Size of a record { fclose(f); return false; @@ -93,7 +96,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(recordSize); - if (fread(&stringSize, 4, 1, f) != 1) // String size + if (fread(&stringSize, 4, 1, f) != 1) // String size { fclose(f); return false; @@ -101,8 +104,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(stringSize); - /* NEW WDB2 FIELDS*/ - if (fread(&tableHash, 4, 1, f) != 1) // Table hash + if (fread(&tableHash, 4, 1, f) != 1) // Table hash { fclose(f); return false; @@ -110,7 +112,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(tableHash); - if (fread(&build, 4, 1, f) != 1) // Build + if (fread(&build, 4, 1, f) != 1) // Build { fclose(f); return false; @@ -118,7 +120,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(build); - if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 + if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 { fclose(f); return false; @@ -126,7 +128,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(unk1); - if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { fclose(f); return false; @@ -134,7 +136,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(minIndex); - if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 + if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 { fclose(f); return false; @@ -142,7 +144,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(maxIndex); - if (fread(&localeMask, 4, 1, f) != 1) // Locales + if (fread(&localeMask, 4, 1, f) != 1) // Locales { fclose(f); return false; @@ -150,18 +152,26 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(localeMask); - if (fread(&unk5, 4, 1, f) != 1) // Unknown WDB2 + if (fread(©IdSize, 4, 1, f) != 1) { fclose(f); return false; } - EndianConvert(unk5); + EndianConvert(copyIdSize); - if (maxIndex != 0) + if (fread(&metaFlags, 4, 1, f) != 1) { - int32 diff = maxIndex - minIndex + 1; - fseek(f, diff * 4 + diff * 2, SEEK_CUR); // diff * 4: an index for rows, diff * 2: a memory allocation bank + fclose(f); + return false; + } + + EndianConvert(metaFlags); + + if (fmt[0] == FT_SORT) + { + idTableSize = recordCount * sizeof(uint32); + ++fmt; } fieldsOffset = new uint32[fieldCount]; @@ -173,6 +183,8 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) fieldsOffset[i] += 1; else if (fmt[i - 1] == FT_LONG) fieldsOffset[i] += 8; + else if (fmt[i - 1] == FT_SHORT) + fieldsOffset[i] += 2; else // 4 byte fields (int32/float/strings) fieldsOffset[i] += 4; } @@ -186,29 +198,49 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) return false; } + if (idTableSize) + { + idTable = new unsigned char[idTableSize]; + if (fread(idTable, idTableSize, 1, f) != 1) + { + fclose(f); + return false; + } + } + + if (copyIdSize) + { + copyTable = new unsigned char[copyIdSize]; + if (fread(copyTable, copyIdSize, 1, f) != 1) + { + fclose(f); + return false; + } + } + fclose(f); return true; } DB2FileLoader::~DB2FileLoader() { - if (data) - delete [] data; - if (fieldsOffset) - delete [] fieldsOffset; + delete[] data; + delete[] idTable; + delete[] copyTable; + delete[] fieldsOffset; } DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) { assert(data); - return Record(*this, data + id*recordSize); + return Record(*this, data + id * recordSize); } uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) { uint32 recordsize = 0; int32 i = -1; - for (uint32 x=0; format[x]; ++x) + for (uint32 x = 0; format[x]; ++x) { switch (format[x]) { @@ -233,6 +265,9 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) case FT_LONG: recordsize += 8; break; + case FT_SHORT: + recordsize += 2; + break; } } @@ -264,8 +299,8 @@ uint32 DB2FileLoader::GetFormatLocalizedStringFieldCount(char const* format) char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable) { - typedef char * ptr; - if (strlen(format) != fieldCount) + typedef char* ptr; + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return NULL; //get struct size and index pos @@ -276,9 +311,28 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** { uint32 maxi = 0; //find max index - for (uint32 y = 0; y < recordCount; y++) + if (!idTableSize) + { + for (uint32 y = 0; y < recordCount; ++y) + { + uint32 ind = getRecord(y).getUInt(indexField); + if (ind > maxi) + maxi = ind; + } + } + else { - uint32 ind = getRecord(y).getUInt(indexField); + ASSERT(indexField == 0); + for (uint32 y = 0; y < recordCount; ++y) + { + uint32 ind = ((uint32*)idTable)[y]; + if (ind > maxi) + maxi = ind; + } + } + for (uint32 y = 0; y < copyIdSize; y += 8) + { + uint32 ind = *((uint32*)(copyTable + y)); if (ind > maxi) maxi = ind; } @@ -290,18 +344,25 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** } else { + ASSERT(!copyIdSize, "Storage %s uses id copy table - must be indexed!", fileName); records = recordCount; indexTable = new ptr[recordCount]; } - char* dataTable = new char[recordCount * recordsize]; + char* dataTable = new char[(recordCount + (copyIdSize / 8)) * recordsize]; uint32 offset = 0; + if (idTableSize) + { + ASSERT(format[0] == 'd'); + ++format; + } + for (uint32 y = 0; y < recordCount; y++) { if (indexField >= 0) - indexTable[getRecord(y).getUInt(indexField)] = &dataTable[offset]; + indexTable[!idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]] = &dataTable[offset]; else indexTable[y] = &dataTable[offset]; @@ -326,6 +387,10 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x); offset += 8; break; + case FT_SHORT: + *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x); + offset += 2; + break; case FT_STRING: case FT_STRING_NOT_LOCALIZED: *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings @@ -335,6 +400,20 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** } } + uint32* copyIds = (uint32*)copyTable; + for (uint32 c = 0; c < copyIdSize / 4; c += 2) + { + uint32 to = copyIds[c]; + uint32 from = copyIds[c + 1]; + + if (from && from < records && indexTable[from]) + { + indexTable[to] = &dataTable[offset]; + memcpy(indexTable[to], indexTable[from], recordsize); + offset += recordsize; + } + } + return dataTable; } @@ -342,7 +421,7 @@ static char const* const nullStr = ""; char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* dataTable) { - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return nullptr; // we store flat holders pool as single memory block @@ -365,6 +444,9 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da uint32 offset = 0; + if (idTableSize) + ++format; + // assign string holders to string field slots for (uint32 y = 0; y < recordCount; y++) { @@ -385,6 +467,9 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: case FT_STRING_NOT_LOCALIZED: { @@ -411,7 +496,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) { - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return nullptr; if (!(localeMask & (1 << locale))) @@ -436,6 +521,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin uint32 offset = 0; + if (idTableSize) + ++format; + for (uint32 y = 0; y < recordCount; y++) { for (uint32 x = 0; x < fieldCount; x++) @@ -453,6 +541,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: { // fill only not filled entries @@ -481,7 +572,7 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin return stringPool; } -char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list& stringPool) +char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool) { // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); @@ -582,6 +673,10 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); offset += 8; break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; case FT_STRING: { LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); @@ -640,7 +735,7 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa return dataTable; } -void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list& stringPool) +void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -682,6 +777,9 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: { // fill only not filled entries diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index 41705c67f19..67525779ef5 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -22,7 +22,7 @@ #include "Utilities/ByteConverter.h" #include "Implementation/HotfixDatabase.h" #include -#include +#include class TC_SHARED_API DB2FileLoader { @@ -61,6 +61,13 @@ class TC_SHARED_API DB2FileLoader EndianConvert(val); return val; } + uint16 getUInt16(size_t field) const + { + assert(field < file.fieldCount); + uint16 val = *reinterpret_cast(offset + file.GetOffset(field)); + EndianConvert(val); + return val; + } const char *getString(size_t field) const { assert(field < file.fieldCount); @@ -95,23 +102,26 @@ class TC_SHARED_API DB2FileLoader private: char const* fileName; + // WDB2 / WCH2 fields uint32 recordSize; uint32 recordCount; uint32 fieldCount; uint32 stringSize; - uint32 *fieldsOffset; - unsigned char *data; - unsigned char *stringTable; + uint32 tableHash; + uint32 build; + uint32 unk1; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; - // WDB2 / WCH2 fields - uint32 tableHash; // WDB2 - uint32 build; // WDB2 - - int unk1; // WDB2 (Unix time in WCH2) - int minIndex; // WDB2 - int maxIndex; // WDB2 (index table) - int localeMask; // WDB2 - int unk5; // WDB2 + uint32 *fieldsOffset; + unsigned char* data; + unsigned char* stringTable; + unsigned char* idTable; + uint32 idTableSize; + unsigned char* copyTable; }; class TC_SHARED_API DB2DatabaseLoader @@ -119,8 +129,8 @@ class TC_SHARED_API DB2DatabaseLoader public: explicit DB2DatabaseLoader(std::string const& storageName) : _storageName(storageName) { } - char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list& stringPool); - void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list& stringPool); + char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool); + void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector& stringPool); static char* AddString(char const** holder, std::string const& value); private: diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index 72271ce507b..570e8174a39 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -20,6 +20,7 @@ #include "Common.h" #include "DB2StorageLoader.h" +#include "DB2SparseStorageLoader.h" #include "DBStorageIterator.h" #include "ByteBuffer.h" @@ -27,7 +28,16 @@ class DB2StorageBase { public: - virtual ~DB2StorageBase() { } + DB2StorageBase(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) + : _tableHash(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } + + virtual ~DB2StorageBase() + { + delete[] reinterpret_cast(_dataTable); + delete[] reinterpret_cast(_dataTableEx); + for (char* strings : _stringPool) + delete[] strings; + } uint32 GetHash() const { return _tableHash; } @@ -37,39 +47,20 @@ public: virtual void EraseRecord(uint32 id) = 0; -protected: - uint32 _tableHash; -}; + std::string const& GetFileName() const { return _fileName; } -template -class DB2Storage : public DB2StorageBase -{ - typedef std::list StringPoolList; -public: - typedef DBStorageIterator iterator; + uint32 GetFieldCount() const { return _fieldCount; } - DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : _fileName(fileName), _indexTableSize(0), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) - { - _indexTable.AsT = NULL; - } + char const* GetFormat() const { return _format; } - ~DB2Storage() - { - delete[] reinterpret_cast(_indexTable.AsT); - delete[] reinterpret_cast(_dataTable); - delete[] reinterpret_cast(_dataTableEx); - for (char* stringPool : _stringPoolList) - delete[] stringPool; - } + virtual bool Load(std::string const& path, uint32 locale) = 0; + virtual bool LoadStringsFrom(std::string const& path, uint32 locale) = 0; + virtual void LoadFromDB() = 0; + virtual void LoadStringsFromDB(uint32 locale) = 0; - bool HasRecord(uint32 id) const override { return id < _indexTableSize && _indexTable.AsT[id] != nullptr; } - void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override +protected: + void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const { - ASSERT(id < _indexTableSize); - char const* entry = _indexTable.AsChar[id]; - ASSERT(entry); - std::size_t fields = strlen(_format); for (uint32 i = 0; i < fields; ++i) { @@ -122,16 +113,48 @@ public: } } + uint32 _tableHash; + std::string _fileName; + uint32 _fieldCount; + char const* _format; + char* _dataTable; + char* _dataTableEx; + std::vector _stringPool; + HotfixDatabaseStatements _hotfixStatement; +}; + +template +class DB2Storage : public DB2StorageBase +{ + static_assert(std::is_standard_layout::value, "T in DB2Storage must have standard layout."); + +public: + typedef DBStorageIterator iterator; + + DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, format, preparedStmtIndex), + _indexTableSize(0) + { + _indexTable.AsT = NULL; + } + + ~DB2Storage() + { + delete[] reinterpret_cast(_indexTable.AsT); + } + + bool HasRecord(uint32 id) const override { return id < _indexTableSize && _indexTable.AsT[id] != nullptr; } + void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override + { + WriteRecordData(reinterpret_cast(AssertEntry(id)), locale, buffer); + } + void EraseRecord(uint32 id) override { if (id < _indexTableSize) _indexTable.AsT[id] = nullptr; } T const* LookupEntry(uint32 id) const { return (id >= _indexTableSize) ? nullptr : _indexTable.AsT[id]; } T const* AssertEntry(uint32 id) const { return ASSERT_NOTNULL(LookupEntry(id)); } - std::string const& GetFileName() const { return _fileName; } uint32 GetNumRows() const { return _indexTableSize; } - char const* GetFormat() const { return _format; } - uint32 GetFieldCount() const { return _fieldCount; } - bool Load(std::string const& path, uint32 locale) + bool Load(std::string const& path, uint32 locale) override { DB2FileLoader db2; // Check if load was successful, only then continue @@ -142,23 +165,23 @@ public: _tableHash = db2.GetHash(); // load raw non-string data - _dataTable = reinterpret_cast(db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar)); + _dataTable = db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar); // create string holders for loaded string fields - if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_format, (char*)_dataTable)) + if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_format, _dataTable)) { - _stringPoolList.push_back(stringHolders); + _stringPool.push_back(stringHolders); // load strings from db2 data - if (char* stringBlock = db2.AutoProduceStrings(_format, (char*)_dataTable, locale)) - _stringPoolList.push_back(stringBlock); + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); } // error in db2 file at loading if NULL return _indexTable.AsT != NULL; } - bool LoadStringsFrom(std::string const& path, uint32 locale) + bool LoadStringsFrom(std::string const& path, uint32 locale) override { // DB2 must be already loaded using Load if (!_indexTable.AsT) @@ -171,54 +194,129 @@ public: // load strings from another locale db2 data if (DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) - if (char* stringBlock = db2.AutoProduceStrings(_format, (char*)_dataTable, locale)) - _stringPoolList.push_back(stringBlock); + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); return true; } - void LoadFromDB() + void LoadFromDB() override { char* extraStringHolders = nullptr; - if (char* dataTable = DB2DatabaseLoader(_fileName).Load(_format, _hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPoolList)) - _dataTableEx = reinterpret_cast(dataTable); - + _dataTableEx = DB2DatabaseLoader(_fileName).Load(_format, _hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); if (extraStringHolders) - _stringPoolList.push_back(extraStringHolders); + _stringPool.push_back(extraStringHolders); } - void LoadStringsFromDB(uint32 locale) + void LoadStringsFromDB(uint32 locale) override { if (!DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) return; - DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPoolList); - } - - typedef bool(*SortFunc)(T const* left, T const* right); - - void Sort(SortFunc pred) - { - ASSERT(strpbrk(_format, "nd") == nullptr, "Only non-indexed storages can be sorted"); - std::sort(_indexTable.AsT, _indexTable.AsT + _indexTableSize, pred); + DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPool); } iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } iterator end() { return iterator(_indexTable.AsT, _indexTableSize, _indexTableSize); } private: - std::string _fileName; - uint32 _indexTableSize; - uint32 _fieldCount; - char const* _format; union { T** AsT; char** AsChar; } _indexTable; - T* _dataTable; - T* _dataTableEx; - StringPoolList _stringPoolList; - HotfixDatabaseStatements _hotfixStatement; + uint32 _indexTableSize; +}; + +template +class DB2SparseStorage : public DB2StorageBase +{ + static_assert(std::is_pod::value, "T in DB2SparseStorage must be POD-type."); + +public: + typedef typename std::unordered_map::const_iterator iterator; + + DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) + : DB2StorageBase(fileName, format, preparedStmtIndex) + { + } + + ~DB2SparseStorage() + { + } + + bool HasRecord(uint32 id) const override { return _indexTable.count(id) > 0; } + void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override + { + WriteRecordData(reinterpret_cast(AssertEntry(id)), locale, buffer); + } + + void EraseRecord(uint32 id) override { _indexTable.erase(id); } + + T const* LookupEntry(uint32 id) const + { + auto itr = _indexTable.find(id); + if (itr != _indexTable.end()) + return itr->second; + return nullptr; + } + + T const* AssertEntry(uint32 id) const { return ASSERT_NOTNULL(LookupEntry(id)); } + + uint32 GetNumRows() const { return _indexTable.size(); } + + bool Load(std::string const& path, uint32 locale) override + { + DB2SparseFileLoader db2; + // Check if load was successful, only then continue + if (!db2.Load((path + _fileName).c_str())) + return false; + + _fieldCount = db2.GetCols(); + _tableHash = db2.GetHash(); + + // load raw non-string data + _dataTable = db2.AutoProduceData(_format, IndexTableAdapter(_indexTable), locale, _stringPool); + + // error in db2 file at loading if NULL + return !_indexTable.empty(); + } + + bool LoadStringsFrom(std::string const& path, uint32 locale) override + { + // DB2 must be already loaded using Load + if (_indexTable.empty()) + return false; + + DB2SparseFileLoader db2; + // Check if load was successful, only then continue + if (!db2.Load((path + _fileName).c_str())) + return false; + + // load strings from another locale db2 data + if (DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); + return true; + } + + void LoadFromDB() override + { + _dataTableEx = DB2SparseDatabaseLoader(_fileName).Load(_format, _hotfixStatement, IndexTableAdapter(_indexTable), _stringPool); + } + + void LoadStringsFromDB(uint32 locale) override + { + if (!DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) + return; + + DB2SparseDatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter(_indexTable), _stringPool); + } + + iterator begin() const { return _indexTable.begin(); } + iterator end() const { return _indexTable.end(); } + +private: + std::unordered_map _indexTable; }; #endif diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp index 829c3708221..ec3a95f74b9 100644 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ b/src/server/shared/DataStores/DBCFileLoader.cpp @@ -172,17 +172,6 @@ uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos) char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable) { - /* - format STRING, NA, FLOAT, NA, INT <=> - struct{ - char* field0, - float field1, - int field2 - }entry; - - this func will generate entry[rows] data; - */ - typedef char* ptr; if (strlen(format) != fieldCount) return NULL; @@ -193,11 +182,11 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** if (i >= 0) { - uint32 maxi = 0; + int32 maxi = 0; //find max index for (uint32 y = 0; y < recordCount; ++y) { - uint32 ind = getRecord(y).getUInt(i); + int32 ind = int32(getRecord(y).getUInt(i)); if (ind > maxi) maxi = ind; } @@ -224,7 +213,10 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** for (uint32 y = 0; y < recordCount; ++y) { if (i >= 0) - indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; + { + if (int32(getRecord(y).getUInt(i)) >= 0) + indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; + } else indexTable[y] = &dataTable[offset]; diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h index 8148a2a5300..8e7d03f2756 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -35,8 +35,11 @@ public: } } - T* operator->() { return _index[_pos]; } - T* operator*() { return _index[_pos]; } + uint32 Key() const { return _pos; } + T const* Value() const { return _index[_pos]; } + + T const* operator->() { return _index[_pos]; } + T const* operator*() { return _index[_pos]; } bool operator==(DBStorageIterator const& right) const { /*ASSERT(_index == right._index, "Iterator belongs to a different container")*/ return _pos == right._pos; } bool operator!=(DBStorageIterator const& right) const { return !(*this == right); } -- cgit v1.2.3 From 41ae38d94d627f1945dc1aed46837068b83ed654 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 31 Jan 2016 19:25:51 +0100 Subject: Core/DataStores: Updated dbc/db2 to 7.0.1.20914 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_02.sql | 341 +++++++++++++++++++++ .../Database/Implementation/HotfixDatabase.cpp | 66 +++- .../Database/Implementation/HotfixDatabase.h | 23 ++ .../game/Battlegrounds/BattlegroundQueue.cpp | 2 +- src/server/game/DataStores/DB2Stores.cpp | 114 +++++-- src/server/game/DataStores/DB2Stores.h | 14 + src/server/game/DataStores/DB2Structure.h | 178 ++++++++++- src/server/game/DataStores/DB2fmt.h | 18 +- src/server/game/DataStores/DBCStores.cpp | 72 +---- src/server/game/DataStores/DBCStores.h | 18 -- src/server/game/DataStores/DBCStructure.h | 182 ----------- src/server/game/DataStores/DBCfmt.h | 10 - src/server/game/Entities/Player/Player.cpp | 20 +- src/server/game/Entities/Totem/Totem.cpp | 12 +- src/server/game/Entities/Totem/Totem.h | 7 - src/server/game/Entities/Unit/StatSystem.cpp | 22 +- src/server/game/Entities/Vehicle/Vehicle.cpp | 10 +- src/server/game/Entities/Vehicle/Vehicle.h | 2 +- src/server/game/Groups/Group.cpp | 4 +- src/server/game/Handlers/BattleGroundHandler.cpp | 8 +- src/server/game/Handlers/CombatHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 2 +- src/server/game/Handlers/SkillHandler.cpp | 3 +- src/server/game/Handlers/VehicleHandler.cpp | 15 +- src/server/game/Maps/Map.h | 1 + src/server/game/Spells/Spell.cpp | 4 +- src/server/game/Spells/SpellEffects.cpp | 8 +- src/server/game/Spells/SpellInfo.cpp | 4 +- src/server/scripts/Commands/cs_lookup.cpp | 44 ++- .../shared/DataStores/DB2SparseStorageLoader.cpp | 11 +- 30 files changed, 824 insertions(+), 393 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_02.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_02.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_02.sql new file mode 100644 index 00000000000..3f94f33dc1e --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_02.sql @@ -0,0 +1,341 @@ +-- +-- Table structure for table `chat_channels` +-- +DROP TABLE IF EXISTS `chat_channels`; +CREATE TABLE `chat_channels` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Shortcut` text, + `FactionGroup` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chat_channels_locale` +-- +DROP TABLE IF EXISTS `chat_channels_locale`; +CREATE TABLE `chat_channels_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `Shortcut_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_specialization` +-- +DROP TABLE IF EXISTS `chr_specialization`; +CREATE TABLE `chr_specialization` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `MasterySpellID1` int(10) unsigned NOT NULL DEFAULT '0', + `MasterySpellID2` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `AnimReplacementSetID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Name2` text, + `Description` text, + `BackgroundFile` text, + `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PetTalentType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Role` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PrimaryStatOrder` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_specialization_locale` +-- + +DROP TABLE IF EXISTS `chr_specialization_locale`; +CREATE TABLE `chr_specialization_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `Name2_lang` text, + `Description_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `creature_display_info_extra` +-- +ALTER TABLE `creature_display_info_extra` + DROP `NPCItemDisplay1`, + DROP `NPCItemDisplay2`, + DROP `NPCItemDisplay3`, + DROP `NPCItemDisplay4`, + DROP `NPCItemDisplay5`, + DROP `NPCItemDisplay6`, + DROP `NPCItemDisplay7`, + DROP `NPCItemDisplay8`, + DROP `NPCItemDisplay9`, + DROP `NPCItemDisplay10`; + +-- +-- Table structure for table `emotes` +-- +DROP TABLE IF EXISTS `emotes`; +CREATE TABLE `emotes` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EmoteSlashCommand` text, + `SpellVisualKitID` int(10) unsigned NOT NULL DEFAULT '0', + `EmoteFlags` int(10) unsigned NOT NULL DEFAULT '0', + `AnimID` smallint(5) unsigned NOT NULL DEFAULT '0', + `EmoteSoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `EmoteSpecProc` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EmoteSpecProcParam` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `gameobject_display_info` +-- +ALTER TABLE `gameobject_display_info` + DROP `Sound1`, + DROP `Sound2`, + DROP `Sound3`, + DROP `Sound4`, + DROP `Sound5`, + DROP `Sound6`, + DROP `Sound7`, + DROP `Sound8`, + DROP `Sound9`, + DROP `Sound10`; + +-- +-- Table structure for table `garr_class_spec` +-- +ALTER TABLE `garr_class_spec` ADD COLUMN `Unknown700` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollItemSetID`; + +-- +-- Table structure for table `gem_properties` +-- +DROP TABLE IF EXISTS `gem_properties`; +CREATE TABLE `gem_properties` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Type` int(10) unsigned NOT NULL DEFAULT '0', + `EnchantID` smallint(5) unsigned NOT NULL DEFAULT '0', + `MinItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaxCountInv` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxCountItem` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `glyph_properties` +-- +DROP TABLE IF EXISTS `glyph_properties`; +CREATE TABLE `glyph_properties` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Type` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GlyphExclusiveCategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_set` +-- +DROP TABLE IF EXISTS `item_set`; +CREATE TABLE `item_set` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `ItemID1` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID2` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID3` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID4` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID5` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID6` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID7` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID8` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID9` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID10` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID11` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID12` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID13` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID14` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID15` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID16` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID17` int(10) unsigned NOT NULL DEFAULT '0', + `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredSkill` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_set_locale` +-- +DROP TABLE IF EXISTS `item_set_locale`; +CREATE TABLE `item_set_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `lock` +-- +DROP TABLE IF EXISTS `lock`; +CREATE TABLE `lock` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Index1` int(10) unsigned NOT NULL DEFAULT '0', + `Index2` int(10) unsigned NOT NULL DEFAULT '0', + `Index3` int(10) unsigned NOT NULL DEFAULT '0', + `Index4` int(10) unsigned NOT NULL DEFAULT '0', + `Index5` int(10) unsigned NOT NULL DEFAULT '0', + `Index6` int(10) unsigned NOT NULL DEFAULT '0', + `Index7` int(10) unsigned NOT NULL DEFAULT '0', + `Index8` int(10) unsigned NOT NULL DEFAULT '0', + `Skill1` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill2` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill3` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill4` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill5` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill6` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill7` smallint(5) unsigned NOT NULL DEFAULT '0', + `Skill8` smallint(5) unsigned NOT NULL DEFAULT '0', + `Type1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type4` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type5` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type6` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type7` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type8` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action4` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action5` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action6` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action7` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Action8` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `pvp_difficulty` +-- + +DROP TABLE IF EXISTS `pvp_difficulty`; +CREATE TABLE `pvp_difficulty` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `BracketID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_levels` +-- +ALTER TABLE `spell_levels` ADD COLUMN `MaxUsableLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; + +-- +-- Table structure for table `summon_properties` +-- +DROP TABLE IF EXISTS `summon_properties`; +CREATE TABLE `summon_properties` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Category` int(10) unsigned NOT NULL DEFAULT '0', + `Faction` int(10) unsigned NOT NULL DEFAULT '0', + `Type` int(10) unsigned NOT NULL DEFAULT '0', + `Slot` int(11) NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `vehicle_seat` +-- +DROP TABLE IF EXISTS `vehicle_seat`; +CREATE TABLE `vehicle_seat` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags1` int(10) unsigned NOT NULL DEFAULT '0', + `Flags2` int(10) unsigned NOT NULL DEFAULT '0', + `Flags3` int(10) unsigned NOT NULL DEFAULT '0', + `AttachmentOffsetX` float NOT NULL DEFAULT '0', + `AttachmentOffsetY` float NOT NULL DEFAULT '0', + `AttachmentOffsetZ` float NOT NULL DEFAULT '0', + `EnterPreDelay` float NOT NULL DEFAULT '0', + `EnterSpeed` float NOT NULL DEFAULT '0', + `EnterGravity` float NOT NULL DEFAULT '0', + `EnterMinDuration` float NOT NULL DEFAULT '0', + `EnterMaxDuration` float NOT NULL DEFAULT '0', + `EnterMinArcHeight` float NOT NULL DEFAULT '0', + `EnterMaxArcHeight` float NOT NULL DEFAULT '0', + `ExitPreDelay` float NOT NULL DEFAULT '0', + `ExitSpeed` float NOT NULL DEFAULT '0', + `ExitGravity` float NOT NULL DEFAULT '0', + `ExitMinDuration` float NOT NULL DEFAULT '0', + `ExitMaxDuration` float NOT NULL DEFAULT '0', + `ExitMinArcHeight` float NOT NULL DEFAULT '0', + `ExitMaxArcHeight` float NOT NULL DEFAULT '0', + `PassengerYaw` float NOT NULL DEFAULT '0', + `PassengerPitch` float NOT NULL DEFAULT '0', + `PassengerRoll` float NOT NULL DEFAULT '0', + `VehicleEnterAnimDelay` float NOT NULL DEFAULT '0', + `VehicleExitAnimDelay` float NOT NULL DEFAULT '0', + `CameraEnteringDelay` float NOT NULL DEFAULT '0', + `CameraEnteringDuration` float NOT NULL DEFAULT '0', + `CameraExitingDelay` float NOT NULL DEFAULT '0', + `CameraExitingDuration` float NOT NULL DEFAULT '0', + `CameraOffsetX` float NOT NULL DEFAULT '0', + `CameraOffsetY` float NOT NULL DEFAULT '0', + `CameraOffsetZ` float NOT NULL DEFAULT '0', + `CameraPosChaseRate` float NOT NULL DEFAULT '0', + `CameraFacingChaseRate` float NOT NULL DEFAULT '0', + `CameraEnteringZoom` float NOT NULL DEFAULT '0', + `CameraSeatZoomMin` float NOT NULL DEFAULT '0', + `CameraSeatZoomMax` float NOT NULL DEFAULT '0', + `UISkinFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `EnterAnimStart` smallint(6) NOT NULL DEFAULT '0', + `EnterAnimLoop` smallint(6) NOT NULL DEFAULT '0', + `RideAnimStart` smallint(6) NOT NULL DEFAULT '0', + `RideAnimLoop` smallint(6) NOT NULL DEFAULT '0', + `RideUpperAnimStart` smallint(6) NOT NULL DEFAULT '0', + `RideUpperAnimLoop` smallint(6) NOT NULL DEFAULT '0', + `ExitAnimStart` smallint(6) NOT NULL DEFAULT '0', + `ExitAnimLoop` smallint(6) NOT NULL DEFAULT '0', + `ExitAnimEnd` smallint(6) NOT NULL DEFAULT '0', + `VehicleEnterAnim` smallint(6) NOT NULL DEFAULT '0', + `VehicleExitAnim` smallint(6) NOT NULL DEFAULT '0', + `VehicleRideAnimLoop` smallint(6) NOT NULL DEFAULT '0', + `EnterUISoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ExitUISoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `EnterAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RideAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ExitAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VehicleEnterAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VehicleRideAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VehicleExitAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CameraModeID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AttachmentID` tinyint(4) NOT NULL DEFAULT '0', + `PassengerAttachmentID` tinyint(4) NOT NULL DEFAULT '0', + `VehicleEnterAnimBone` tinyint(4) NOT NULL DEFAULT '0', + `VehicleExitAnimBone` tinyint(4) NOT NULL DEFAULT '0', + `VehicleRideAnimLoopBone` tinyint(4) NOT NULL DEFAULT '0', + `VehicleAbilityDisplay` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 666b697a4c3..d2a62e1f9ce 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -80,6 +80,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " "ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + // ChatChannels.db2 + PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Flags, Name, Shortcut, FactionGroup FROM chat_channels ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); + // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); @@ -93,6 +97,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); + // ChrSpecialization.db2 + PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, MasterySpellID1, MasterySpellID2, Flags, AnimReplacementSetID, Name, Name2, " + "Description, BackgroundFile, SpellIconID, ClassID, OrderIndex, PetTalentType, Role, PrimaryStatOrder FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, Name_lang, Name2_lang, Description_lang FROM chr_specialization_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + // CinematicSequences.db2 PrepareStatement(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" " FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH); @@ -104,10 +114,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfoExtra.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, NPCItemDisplay1, NPCItemDisplay2, NPCItemDisplay3, NPCItemDisplay4, " - "NPCItemDisplay5, NPCItemDisplay6, NPCItemDisplay7, NPCItemDisplay8, NPCItemDisplay9, NPCItemDisplay10, FileDataID, HDFileDataID, " - "DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, " - "CustomDisplayOption2, CustomDisplayOption3, Flags FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, FileDataID, HDFileDataID, DisplayRaceID, DisplaySexID, DisplayClassID, " + "SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, CustomDisplayOption2, CustomDisplayOption3, Flags" + " FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); @@ -149,6 +158,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() // DurabilityQuality.db2 PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); + // Emotes.db2 + PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSoundID, EmoteSpecProc, " + "EmoteSpecProcParam FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); + // EmotesTextSound.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); @@ -160,8 +173,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // GameobjectDisplayInfo.db2 PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, " - "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, Sound1, Sound2, Sound3, Sound4, Sound5, Sound6, Sound7, Sound8, Sound9, Sound10, " - "ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // GameTables.db2 PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH); @@ -185,7 +197,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 - PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID" + PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, Unknown700" " FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -222,6 +234,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, LandmarkX, LandmarkY, GarrSiteLevelID, GarrPlotInstanceID, Unknown" " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + // GemProperties.db2 + PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantID, MinItemLevel, MaxCountInv, MaxCountItem FROM gem_properties" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // GlyphProperties.db2 + PrepareStatement(HOTFIX_SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, Type, GlyphExclusiveCategoryID FROM glyph_properties" + " ORDER BY ID DESC", CONNECTION_SYNCH); + // GlyphSlot.db2 PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); @@ -354,6 +374,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang, InternalName_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSet.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " + "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill FROM item_set" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSetSpell.db2 PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, SpellID, ItemSetID, ChrSpecID, Threshold FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH); @@ -392,6 +418,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain" " ORDER BY ID DESC", 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, " + "Action6, Action7, Action8 FROM `lock` ORDER BY ID DESC", CONNECTION_SYNCH); + // MailTemplate.db2 PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -457,6 +488,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() // PowerDisplay.db2 PrepareStatement(HOTFIX_SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, PowerType, Red, Green, Blue FROM power_display ORDER BY ID DESC", CONNECTION_SYNCH); + // PvpDifficulty.db2 + PrepareStatement(HOTFIX_SEL_PVP_DIFFICULTY, "SELECT ID, MapID, BracketID, MinLevel, MaxLevel FROM pvp_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); + // QuestFactionReward.db2 PrepareStatement(HOTFIX_SEL_QUEST_FACTION_REWARD, "SELECT ID, QuestRewFactionValue1, QuestRewFactionValue2, QuestRewFactionValue3, " "QuestRewFactionValue4, QuestRewFactionValue5, QuestRewFactionValue6, QuestRewFactionValue7, QuestRewFactionValue8, QuestRewFactionValue9, " @@ -590,7 +624,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, LearnSpellID, SpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); // SpellLevels.db2 - PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, SpellID, BaseLevel, MaxLevel, SpellLevel, DifficultyID FROM spell_levels ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, SpellID, BaseLevel, MaxLevel, SpellLevel, DifficultyID, MaxUsableLevel FROM spell_levels" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellMisc.db2 PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes, AttributesEx, AttributesExB, AttributesExC, AttributesExD, AttributesExE, " @@ -653,6 +688,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, Unk620, SpellVisualID1, SpellVisualID2, PlayerConditionID, DifficultyID, " "Flags FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); + // SummonProperties.db2 + PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Category, Faction, Type, Slot, Flags FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH); + // TaxiNodes.db2 PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " "ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); @@ -687,6 +725,18 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); + // VehicleSeat.db2 + PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, Flags1, Flags2, Flags3, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, " + "EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, EnterMinArcHeight, EnterMaxArcHeight, ExitPreDelay, ExitSpeed, " + "ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, PassengerYaw, PassengerPitch, PassengerRoll, " + "VehicleEnterAnimDelay, VehicleExitAnimDelay, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " + "CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, " + "CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " + "ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterUISoundID, ExitUISoundID, " + "EnterAnimKitID, RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, " + "PassengerAttachmentID, VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay FROM vehicle_seat" + " ORDER BY ID DESC", CONNECTION_SYNCH); + // WorldMapOverlay.db2 PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, " "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay" diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 322df76d74d..cedaccf6168 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -63,11 +63,17 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CHAR_START_OUTFIT, + HOTFIX_SEL_CHAT_CHANNELS, + HOTFIX_SEL_CHAT_CHANNELS_LOCALE, + HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, HOTFIX_SEL_CHR_RACES, HOTFIX_SEL_CHR_RACES_LOCALE, + HOTFIX_SEL_CHR_SPECIALIZATION, + HOTFIX_SEL_CHR_SPECIALIZATION_LOCALE, + HOTFIX_SEL_CINEMATIC_SEQUENCES, HOTFIX_SEL_CREATURE_DISPLAY_INFO, @@ -93,6 +99,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_DURABILITY_QUALITY, + HOTFIX_SEL_EMOTES, + HOTFIX_SEL_EMOTES_TEXT_SOUND, HOTFIX_SEL_GAMEOBJECTS, @@ -131,6 +139,10 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, + HOTFIX_SEL_GEM_PROPERTIES, + + HOTFIX_SEL_GLYPH_PROPERTIES, + HOTFIX_SEL_GLYPH_SLOT, HOTFIX_SEL_GUILD_COLOR_BACKGROUND, @@ -205,6 +217,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_RANDOM_SUFFIX, HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SET, + HOTFIX_SEL_ITEM_SET_LOCALE, + HOTFIX_SEL_ITEM_SET_SPELL, HOTFIX_SEL_ITEM_SPARSE, @@ -220,6 +235,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_KEY_CHAIN, + HOTFIX_SEL_LOCK, + HOTFIX_SEL_MAIL_TEMPLATE, HOTFIX_SEL_MAIL_TEMPLATE_LOCALE, @@ -252,6 +269,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_POWER_DISPLAY, + HOTFIX_SEL_PVP_DIFFICULTY, + HOTFIX_SEL_QUEST_FACTION_REWARD, HOTFIX_SEL_QUEST_MONEY_REWARD, @@ -351,6 +370,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SPELL_X_SPELL_VISUAL, + HOTFIX_SEL_SUMMON_PROPERTIES, + HOTFIX_SEL_TAXI_NODES, HOTFIX_SEL_TAXI_NODES_LOCALE, @@ -371,6 +392,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_UNIT_POWER_BAR, HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, + HOTFIX_SEL_VEHICLE_SEAT, + HOTFIX_SEL_WORLD_MAP_OVERLAY, HOTFIX_SEL_WORLD_MAP_TRANSFORMS, diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 6b6c7558f3e..bb4aea1a22c 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -814,7 +814,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp return; } - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketById(bg_template->GetMapId(), bracket_id); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketById(bg_template->GetMapId(), bracket_id); if (!bracketEntry) { TC_LOG_ERROR("bg.battleground", "Battleground: Update: bg bracket entry not found for map %u bracket id %u", bg_template->GetMapId(), bracket_id); diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index ae01936ff0e..1778a0b97aa 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -36,9 +36,11 @@ DB2Storage sBattlePetBreedStateStore("Battl DB2Storage sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesFormat, HOTFIX_SEL_BATTLE_PET_SPECIES); DB2Storage sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateFormat, HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); +DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS); DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); +DB2Storage sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationFormat, HOTFIX_SEL_CHR_SPECIALIZATION); DB2Storage sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); @@ -50,6 +52,7 @@ DB2Storage sCurvePointStore("CurvePoint.db2 DB2Storage sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); DB2Storage sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS); DB2Storage sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage sEmotesStore("Emotes.db2", EmotesFormat, HOTFIX_SEL_EMOTES); DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); @@ -65,6 +68,8 @@ DB2Storage sGarrPlotStore("GarrPlot.db2", G DB2Storage sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceFormat, HOTFIX_SEL_GARR_PLOT_INSTANCE); DB2Storage sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); DB2Storage sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); +DB2Storage sGemPropertiesStore("GemProperties.db2", GemPropertiesFormat, HOTFIX_SEL_GEM_PROPERTIES); +DB2Storage sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesFormat, HOTFIX_SEL_GLYPH_PROPERTIES); DB2Storage sGlyphSlotStore("GlyphSlot.db2", GlyphSlotFormat, HOTFIX_SEL_GLYPH_SLOT); DB2Storage sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundFormat, HOTFIX_SEL_GUILD_COLOR_BACKGROUND); DB2Storage sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderFormat, HOTFIX_SEL_GUILD_COLOR_BORDER); @@ -99,6 +104,7 @@ DB2Storage sItemModifiedAppearanceStore("It DB2Storage sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseFormat, HOTFIX_SEL_ITEM_PRICE_BASE); DB2Storage sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesFormat, HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); DB2Storage sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixFormat, HOTFIX_SEL_ITEM_RANDOM_SUFFIX); +DB2Storage sItemSetStore("ItemSet.db2", ItemSetFormat, HOTFIX_SEL_ITEM_SET); DB2Storage sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellFormat, HOTFIX_SEL_ITEM_SET_SPELL); DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); DB2Storage sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); @@ -106,6 +112,7 @@ DB2Storage sItemSpecOverrideStore("ItemSpec DB2Storage sItemToBattlePetSpeciesStore("ItemToBattlePetSpecies.db2", ItemToBattlePetSpeciesFormat, HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES); DB2Storage sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); DB2Storage sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); +DB2Storage sLockStore("Lock.db2", LockFormat, HOTFIX_SEL_LOCK); DB2Storage sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); DB2Storage sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE); DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); @@ -120,6 +127,7 @@ DB2Storage sOverrideSpellDataStore("Overrid DB2Storage sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); DB2Storage sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION); DB2Storage sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY); +DB2Storage sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyFormat, HOTFIX_SEL_PVP_DIFFICULTY); DB2Storage sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardFormat, HOTFIX_SEL_QUEST_FACTION_REWARD); DB2Storage sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); DB2Storage sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemFormat, HOTFIX_SEL_QUEST_PACKAGE_ITEM); @@ -165,6 +173,7 @@ DB2Storage sSpellShapeshiftFormStore("Spell DB2Storage sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsFormat, HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); DB2Storage sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); DB2Storage sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); +DB2Storage sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesFormat, HOTFIX_SEL_SUMMON_PROPERTIES); DB2Storage sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); DB2Storage sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); DB2Storage sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); @@ -173,6 +182,7 @@ DB2Storage sToyStore("Toy.db2", ToyFormat, DB2Storage sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION); DB2Storage sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); DB2Storage sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); +DB2Storage sVehicleSeatStore("VehicleSeat.db2", VehicleSeatFormat, HOTFIX_SEL_VEHICLE_SEAT); DB2Storage sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); DB2Storage sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS); @@ -262,8 +272,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sBattlePetSpeciesStateStore); LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCharStartOutfitStore); + LOAD_DB2(sChatChannelsStore); LOAD_DB2(sChrClassesXPowerTypesStore); LOAD_DB2(sChrRacesStore); + LOAD_DB2(sChrSpecializationStore); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); LOAD_DB2(sCreatureDisplayInfoExtraStore); @@ -275,6 +287,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sDestructibleModelDataStore); LOAD_DB2(sDurabilityCostsStore); LOAD_DB2(sDurabilityQualityStore); + LOAD_DB2(sEmotesStore); LOAD_DB2(sEmotesTextSoundStore); LOAD_DB2(sGameObjectsStore); LOAD_DB2(sGameObjectDisplayInfoStore); @@ -290,6 +303,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sGarrPlotStore); LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGarrSiteLevelStore); + LOAD_DB2(sGemPropertiesStore); + LOAD_DB2(sGlyphPropertiesStore); LOAD_DB2(sGlyphSlotStore); LOAD_DB2(sGuildColorBackgroundStore); LOAD_DB2(sGuildColorBorderStore); @@ -323,6 +338,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemPriceBaseStore); LOAD_DB2(sItemRandomPropertiesStore); LOAD_DB2(sItemRandomSuffixStore); + LOAD_DB2(sItemSetStore); LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); LOAD_DB2(sItemSpecOverrideStore); @@ -331,6 +347,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemToBattlePetSpeciesStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeyChainStore); + LOAD_DB2(sLockStore); LOAD_DB2(sMailTemplateStore); LOAD_DB2(sModifierTreeStore); LOAD_DB2(sMountCapabilityStore); @@ -345,6 +362,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sPlayerConditionStore); LOAD_DB2(sPowerDisplayStore); + LOAD_DB2(sPvpDifficultyStore); LOAD_DB2(sQuestFactionRewardStore); LOAD_DB2(sQuestMoneyRewardStore); LOAD_DB2(sQuestPackageItemStore); @@ -389,6 +407,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sSpellTargetRestrictionsStore); LOAD_DB2(sSpellTotemsStore); LOAD_DB2(sSpellXSpellVisualStore); + LOAD_DB2(sSummonPropertiesStore); LOAD_DB2(sTaxiNodesStore); LOAD_DB2(sTaxiPathNodeStore); LOAD_DB2(sTaxiPathStore); @@ -397,6 +416,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sTransportAnimationStore); LOAD_DB2(sTransportRotationStore); LOAD_DB2(sUnitPowerBarStore); + LOAD_DB2(sVehicleSeatStore); LOAD_DB2(sWorldMapOverlayStore); LOAD_DB2(sWorldMapTransformsStore); @@ -408,23 +428,36 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; - std::set powers; - for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) - powers.insert(power); + { + std::set 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 (uint32 i = 0; i < MAX_CLASSES; ++i) + for (uint32 j = 0; j < MAX_POWERS; ++j) + _powersByClass[i][j] = MAX_POWERS; - for (ChrClassesXPowerTypesEntry const* power : powers) - { - uint32 index = 0; - for (uint32 j = 0; j < MAX_POWERS; ++j) - if (_powersByClass[power->ClassID][j] != MAX_POWERS) - ++index; + for (ChrClassesXPowerTypesEntry const* power : powers) + { + uint32 index = 0; + for (uint32 j = 0; j < MAX_POWERS; ++j) + if (_powersByClass[power->ClassID][j] != MAX_POWERS) + ++index; + + ASSERT(power->PowerType < MAX_POWERS); + _powersByClass[power->ClassID][power->PowerType] = index; + } + } - ASSERT(power->PowerType < MAX_POWERS); - _powersByClass[power->ClassID][power->PowerType] = index; + memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex)); + for (uint32 i = 0; i < sChrSpecializationStore.GetNumRows(); ++i) + { + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(i)) + { + ASSERT(chrSpec->ClassID < MAX_CLASSES); + ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); + _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec; + } } for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore) @@ -444,6 +477,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) _glyphSlots.insert(glyphSlot); + for (HeirloomEntry const* heirloom : sHeirloomStore) + _heirlooms[heirloom->ItemID] = heirloom; + for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -529,6 +565,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) _phasesByGroup[group->PhaseGroupID].insert(phase->ID); + for (PvPDifficultyEntry const* entry : sPvpDifficultyStore) + { + ASSERT(entry->BracketID < MAX_BATTLEGROUND_BRACKETS, "PvpDifficulty bracket (%d) exceeded max allowed value (%d)", entry->BracketID, MAX_BATTLEGROUND_BRACKETS); + } + for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore) _questPackages[questPackageItem->QuestPackageID].push_back(questPackageItem); @@ -628,9 +669,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (ToyEntry const* toy : sToyStore) _toys.insert(toy->ItemID); - for (HeirloomEntry const* heirloom : sHeirloomStore) - _heirlooms[heirloom->ItemID] = heirloom; - // error checks if (bad_db2_files.size() >= DB2FilesCount) { @@ -648,7 +686,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } // Check loaded DB2 files proper version - if (!sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) + if (!sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914) + !sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810) { @@ -752,6 +791,11 @@ CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint return itr->second; } +ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const +{ + return _chrSpecializationsByIndex[class_][index]; +} + uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const { return _powersByClass[classId][powerType]; @@ -929,6 +973,40 @@ ResponseCodes DB2Manager::ValidateName(std::string const& name, LocaleConstant l return CHAR_NAME_SUCCESS; } +PvPDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid, uint32 level) +{ + PvPDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case + for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) + { + if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) + { + // skip unrelated and too-high brackets + if (entry->MapID != mapid || entry->MinLevel > level) + continue; + + // exactly fit + if (entry->MaxLevel >= level) + return entry; + + // remember for possible out-of-range case (search higher from existed) + if (!maxEntry || maxEntry->MaxLevel < entry->MaxLevel) + maxEntry = entry; + } + } + + return maxEntry; +} + +PvPDifficultyEntry const* DB2Manager::GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id) +{ + for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) + if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) + if (entry->MapID == mapid && entry->GetBracketId() == id) + return entry; + + return nullptr; +} + std::vector const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const { auto itr = _questPackages.find(questPackageID); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 4e3f7bdd70b..ded2bf01b4f 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -36,7 +36,9 @@ TC_GAME_API extern DB2Storage sBattlePetSp TC_GAME_API extern DB2Storage sBattlePetSpeciesStateStore; TC_GAME_API extern DB2Storage sBroadcastTextStore; TC_GAME_API extern DB2Storage sCharStartOutfitStore; +TC_GAME_API extern DB2Storage sChatChannelsStore; TC_GAME_API extern DB2Storage sChrRacesStore; +TC_GAME_API extern DB2Storage sChrSpecializationStore; TC_GAME_API extern DB2Storage sCinematicSequencesStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoExtraStore; @@ -47,6 +49,7 @@ TC_GAME_API extern DB2Storage sCurrencyTyp TC_GAME_API extern DB2Storage sDestructibleModelDataStore; TC_GAME_API extern DB2Storage sDurabilityCostsStore; TC_GAME_API extern DB2Storage sDurabilityQualityStore; +TC_GAME_API extern DB2Storage sEmotesStore; TC_GAME_API extern DB2Storage sGameObjectsStore; TC_GAME_API extern DB2Storage sGameObjectDisplayInfoStore; TC_GAME_API extern DB2Storage sGameTablesStore; @@ -61,6 +64,8 @@ TC_GAME_API extern DB2Storage sGarrPlotSto TC_GAME_API extern DB2Storage sGarrPlotInstanceStore; TC_GAME_API extern DB2Storage sGarrSiteLevelStore; TC_GAME_API extern DB2Storage sGarrSiteLevelPlotInstStore; +TC_GAME_API extern DB2Storage sGemPropertiesStore; +TC_GAME_API extern DB2Storage sGlyphPropertiesStore; TC_GAME_API extern DB2Storage sGlyphSlotStore; TC_GAME_API extern DB2Storage sGuildColorBackgroundStore; TC_GAME_API extern DB2Storage sGuildColorBorderStore; @@ -89,11 +94,13 @@ TC_GAME_API extern DB2Storage sItemLimitCa TC_GAME_API extern DB2Storage sItemPriceBaseStore; TC_GAME_API extern DB2Storage sItemRandomPropertiesStore; TC_GAME_API extern DB2Storage sItemRandomSuffixStore; +TC_GAME_API extern DB2Storage sItemSetStore; TC_GAME_API extern DB2Storage sItemSetSpellStore; TC_GAME_API extern DB2SparseStorage sItemSparseStore; TC_GAME_API extern DB2Storage sItemSpecStore; TC_GAME_API extern DB2Storage sItemSpecOverrideStore; TC_GAME_API extern DB2Storage sItemToBattlePetSpeciesStore; +TC_GAME_API extern DB2Storage sLockStore; TC_GAME_API extern DB2Storage sMailTemplateStore; TC_GAME_API extern DB2Storage sModifierTreeStore; TC_GAME_API extern DB2Storage sMountCapabilityStore; @@ -141,9 +148,11 @@ TC_GAME_API extern DB2Storage sSpellShapes TC_GAME_API extern DB2Storage sSpellTargetRestrictionsStore; TC_GAME_API extern DB2Storage sSpellTotemsStore; TC_GAME_API extern DB2Storage sSpellXSpellVisualStore; +TC_GAME_API extern DB2Storage sSummonPropertiesStore; TC_GAME_API extern DB2Storage sTaxiNodesStore; TC_GAME_API extern DB2Storage sTaxiPathStore; TC_GAME_API extern DB2Storage sUnitPowerBarStore; +TC_GAME_API extern DB2Storage sVehicleSeatStore; TC_GAME_API extern DB2Storage sWorldMapOverlayStore; TC_GAME_API extern TaxiMask sTaxiNodesMask; @@ -179,6 +188,7 @@ public: typedef std::map StorageMap; typedef std::unordered_map> AreaGroupMemberContainer; typedef std::unordered_map CharStartOutfitContainer; + typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES][MAX_SPECIALIZATIONS]; typedef std::map, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::set GlyphSlotContainer; typedef std::map>> HeirloomCurvesContainer; @@ -216,6 +226,7 @@ public: std::vector GetAreasForGroup(uint32 areaGroupId) const; static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; + ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; @@ -236,6 +247,8 @@ public: std::vector const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); std::set GetPhasesForGroup(uint32 group) const; + static PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); + static PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector const* GetSpecializationSpells(uint32 specId) const; std::vector GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; @@ -251,6 +264,7 @@ private: AreaGroupMemberContainer _areaGroupMembers; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + ChrSpecializationByIndexContainer _chrSpecializationsByIndex; EmotesTextSoundContainer _emoteTextSounds; GlyphSlotContainer _glyphSlots; HeirloomItemsContainer _heirlooms; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index ff3b9efc9c1..171d4324a62 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -148,6 +148,14 @@ struct CharStartOutfitEntry uint8 PetFamilyID; // Pet Family Entry for starting pet }; +struct ChatChannelsEntry +{ + uint32 Flags; + LocalizedString* Name; + LocalizedString* Shortcut; + uint8 FactionGroup; +}; + struct ChrClassesXPowerTypesEntry { uint8 ClassID; @@ -193,6 +201,26 @@ struct ChrRacesEntry uint8 CharComponentTexLayoutHiResID; }; +#define MAX_MASTERY_SPELLS 2 + +struct ChrSpecializationEntry +{ + uint32 ID; + uint32 MasterySpellID[MAX_MASTERY_SPELLS]; + uint32 Flags; + uint32 AnimReplacementSetID; + LocalizedString* Name; + LocalizedString* Name2; + LocalizedString* Description; + char* BackgroundFile; + uint16 SpellIconID; + uint8 ClassID; + uint8 OrderIndex; + uint8 PetTalentType; + uint8 Role; + uint8 PrimaryStatOrder; +}; + struct CinematicSequencesEntry { uint16 SoundID; @@ -226,7 +254,6 @@ struct CreatureDisplayInfoEntry struct CreatureDisplayInfoExtraEntry { - uint32 NPCItemDisplay[10]; uint32 FileDataID; uint32 HDFileDataID; uint8 DisplayRaceID; @@ -451,6 +478,17 @@ struct DurabilityQualityEntry float QualityMod; }; +struct EmotesEntry +{ + char const* EmoteSlashCommand; + uint32 SpellVisualKitID; + uint32 EmoteFlags; + uint16 AnimID; + uint16 EmoteSoundID; + uint8 EmoteSpecProc; + uint8 EmoteSpecProcParam; +}; + struct EmotesTextSoundEntry { uint16 EmotesTextId; @@ -486,7 +524,6 @@ struct GameObjectDisplayInfoEntry DBCPosition3D GeoBoxMax; float OverrideLootEffectScale; float OverrideNameScale; - uint16 Sound[10]; uint16 ObjectEffectPackageID; }; @@ -554,6 +591,7 @@ struct GarrClassSpecEntry LocalizedString* NameGenderless; uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref uint8 GarrFollItemSetID; + uint8 Unknown700; }; struct GarrFollowerEntry @@ -636,6 +674,23 @@ struct GarrSiteLevelPlotInstEntry uint8 Unknown; }; +struct GemPropertiesEntry +{ + uint32 Type; + uint16 EnchantID; + uint16 MinItemLevel; + uint8 MaxCountInv; + uint8 MaxCountItem; +}; + +struct GlyphPropertiesEntry +{ + uint32 SpellID; + uint16 SpellIconID; + uint8 Type; + uint8 GlyphExclusiveCategoryID; +}; + struct GlyphSlotEntry { uint8 Type; @@ -905,6 +960,16 @@ struct ItemRandomSuffixEntry uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; }; +#define MAX_ITEM_SET_ITEMS 17 + +struct ItemSetEntry +{ + LocalizedString* Name; + uint32 ItemID[MAX_ITEM_SET_ITEMS]; + uint16 RequiredSkillRank; + uint8 RequiredSkill; +}; + struct ItemSetSpellEntry { uint32 SpellID; @@ -1017,6 +1082,16 @@ struct KeyChainEntry uint8 Key[KEYCHAIN_SIZE]; }; +#define MAX_LOCK_CASE 8 + +struct LockEntry +{ + uint32 Index[MAX_LOCK_CASE]; + uint16 Skill[MAX_LOCK_CASE]; + uint8 Type[MAX_LOCK_CASE]; + uint8 Action[MAX_LOCK_CASE]; +}; + struct MailTemplateEntry { LocalizedString* Body; @@ -1205,6 +1280,17 @@ struct PowerDisplayEntry uint8 Blue; }; +struct PvPDifficultyEntry +{ + uint16 MapID; + uint8 BracketID; + uint8 MinLevel; + uint8 MaxLevel; + + // helpers + BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } +}; + struct QuestFactionRewardEntry { int16 QuestRewFactionValue[10]; @@ -1511,6 +1597,7 @@ struct SpellLevelsEntry uint16 MaxLevel; uint16 SpellLevel; uint8 DifficultyID; + uint8 MaxUsableLevel; }; struct SpellMiscEntry @@ -1673,6 +1760,15 @@ struct SpellXSpellVisualEntry uint8 Flags; }; +struct SummonPropertiesEntry +{ + uint32 Category; + uint32 Faction; + uint32 Type; + int32 Slot; + uint32 Flags; +}; + struct TaxiNodesEntry { uint32 ID; @@ -1761,6 +1857,84 @@ struct UnitPowerBarEntry uint8 BarType; }; +struct VehicleSeatEntry +{ + uint32 Flags[3]; + DBCPosition3D AttachmentOffset; + float EnterPreDelay; + float EnterSpeed; + float EnterGravity; + float EnterMinDuration; + float EnterMaxDuration; + float EnterMinArcHeight; + float EnterMaxArcHeight; + float ExitPreDelay; + float ExitSpeed; + float ExitGravity; + float ExitMinDuration; + float ExitMaxDuration; + float ExitMinArcHeight; + float ExitMaxArcHeight; + float PassengerYaw; + float PassengerPitch; + float PassengerRoll; + float VehicleEnterAnimDelay; + float VehicleExitAnimDelay; + float CameraEnteringDelay; + float CameraEnteringDuration; + float CameraExitingDelay; + float CameraExitingDuration; + DBCPosition3D CameraOffset; + float CameraPosChaseRate; + float CameraFacingChaseRate; + float CameraEnteringZoom; + float CameraSeatZoomMin; + float CameraSeatZoomMax; + uint32 UISkinFileDataID; + int16 EnterAnimStart; + int16 EnterAnimLoop; + int16 RideAnimStart; + int16 RideAnimLoop; + int16 RideUpperAnimStart; + int16 RideUpperAnimLoop; + int16 ExitAnimStart; + int16 ExitAnimLoop; + int16 ExitAnimEnd; + int16 VehicleEnterAnim; + int16 VehicleExitAnim; + int16 VehicleRideAnimLoop; + uint16 EnterUISoundID; + uint16 ExitUISoundID; + uint16 EnterAnimKitID; + uint16 RideAnimKitID; + uint16 ExitAnimKitID; + uint16 VehicleEnterAnimKitID; + uint16 VehicleRideAnimKitID; + uint16 VehicleExitAnimKitID; + uint16 CameraModeID; + int8 AttachmentID; + int8 PassengerAttachmentID; + int8 VehicleEnterAnimBone; + int8 VehicleExitAnimBone; + int8 VehicleRideAnimLoopBone; + uint8 VehicleAbilityDisplay; + + bool CanEnterOrExit() const + { + return ((Flags[0] & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0 || + //If it has anmation for enter/ride, means it can be entered/exited by logic + (Flags[0] & (VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER | VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_RIDE)) != 0); + } + bool CanSwitchFromSeat() const { return (Flags[0] & VEHICLE_SEAT_FLAG_CAN_SWITCH) != 0; } + bool IsUsableByOverride() const + { + return (Flags[0] & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) + || (Flags[1] & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4))); + } + bool IsEjectable() const { return (Flags[1] & VEHICLE_SEAT_FLAG_B_EJECTABLE) != 0; } +}; + #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 struct WorldMapOverlayEntry diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 1e8c3be57ea..596a67bd35d 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -31,11 +31,13 @@ char const BattlePetSpeciesFormat[] = "niiisshbb"; char const BattlePetSpeciesStateFormat[] = "nihb"; char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; +char const ChatChannelsFormat[] = "dissb"; char const ChrClassesXPowerTypesFormat[] = "dbb"; char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb"; +char const ChrSpecializationFormat[] = "niiiisssShbbbbb"; char const CinematicSequencesFormat[] = "dhhhhhhhhh"; char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb"; -char const CreatureDisplayInfoExtraFormat[] = "diiiiiiiiiiiibbbbbbbbbbbb"; +char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb"; char const CreatureTypeFormat[] = "dsb"; char const CriteriaFormat[] = "diiihhhbbbbb"; char const CriteriaTreeFormat[] = "dishhhhb"; @@ -44,14 +46,15 @@ char const CurvePointFormat[] = "dffhb"; char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb"; char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; char const DurabilityQualityFormat[] = "df"; +char const EmotesFormat[] = "dSiihhbb"; char const EmotesTextSoundFormat[] = "dhhbbb"; char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; -char const GameObjectDisplayInfoFormat[] = "diffffffffhhhhhhhhhhh"; +char const GameObjectDisplayInfoFormat[] = "diffffffffh"; char const GameTablesFormat[] = "dshb"; char const GarrAbilityFormat[] = "nssihbbb"; char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb"; char const GarrBuildingPlotInstFormat[] = "nffhhb"; -char const GarrClassSpecFormat[] = "nssshb"; +char const GarrClassSpecFormat[] = "nssshbb"; char const GarrFollowerFormat[] = "diissiihhbbbbbbbbbbbbbbbb"; char const GarrFollowerXAbilityFormat[] = "dhhb"; char const GarrPlotFormat[] = "dsiibbbbb"; @@ -59,6 +62,8 @@ char const GarrPlotBuildingFormat[] = "dbb"; char const GarrPlotInstanceFormat[] = "dsb"; char const GarrSiteLevelFormat[] = "dffhhhbbbbb"; char const GarrSiteLevelPlotInstFormat[] = "dffhbb"; +char const GemPropertiesFormat[] = "dihhbb"; +char const GlyphPropertiesFormat[] = "dihbb"; char const GlyphSlotFormat[] = "dbb"; char const GuildColorBackgroundFormat[] = "dbbb"; char const GuildColorBorderFormat[] = "dbbb"; @@ -93,6 +98,7 @@ char const ItemModifiedAppearanceFormat[] = "nihbb"; char const ItemPriceBaseFormat[] = "dffh"; char const ItemRandomPropertiesFormat[] = "dshhhhh"; char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh"; +char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiihb"; char const ItemSetSpellFormat[] = "dihhb"; char const ItemSparseFormat[] = "iiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const ItemSpecFormat[] = "dhbbbbb"; @@ -100,6 +106,7 @@ char const ItemSpecOverrideFormat[] = "dih"; char const ItemToBattlePetSpeciesFormat[] = "dh"; char const ItemXBonusTreeFormat[] = "dih"; char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb"; char const MailTemplateFormat[] = "ds"; char const ModifierTreeFormat[] = "diihbbbb"; char const MountFormat[] = "niissshhhb"; @@ -114,6 +121,7 @@ char const OverrideSpellDataFormat[] = "diiiiiiiiiiib"; char const PhaseXPhaseGroupFormat[] = "dhh"; char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const PowerDisplayFormat[] = "dSbbbb"; +char const PvpDifficultyFormat[] = "dhbbb"; char const QuestFactionRewardFormat[] = "dhhhhhhhhhh"; char const QuestMoneyRewardFormat[] = "diiiiiiiiii"; char const QuestPackageItemFormat[] = "dihbb"; @@ -144,7 +152,7 @@ char const SpellFocusObjectFormat[] = "ds"; char const SpellInterruptsFormat[] = "diiiiihb"; char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const SpellLearnSpellFormat[] = "diii"; -char const SpellLevelsFormat[] = "dihhhb"; +char const SpellLevelsFormat[] = "dihhhbb"; char const SpellMiscFormat[] = "diiiiiiiiiiiiiiffhhhhhb"; char const SpellPowerFormat[] = "niiffifhhhhbbb"; char const SpellPowerDifficultyFormat[] = "nbb"; @@ -157,6 +165,7 @@ char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb"; char const SpellTargetRestrictionsFormat[] = "diffihhbb"; char const SpellTotemsFormat[] = "diiibb"; char const SpellXSpellVisualFormat[] = "nifhhhbb"; +char const SummonPropertiesFormat[] = "diiiii"; char const TaxiNodesFormat[] = "nfffsiiffhhhb"; char const TaxiPathFormat[] = "nhhh"; char const TaxiPathNodeFormat[] = "nfffihhhhbb"; @@ -165,6 +174,7 @@ char const ToyFormat[] = "nisbb"; char const TransportAnimationFormat[] = "diifffb"; char const TransportRotationFormat[] = "diiffff"; char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb"; +char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffffffffffffffihhhhhhhhhhhhhhhhhhhhhbbbbbb"; char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhh"; char const WorldMapTransformsFormat[] = "dfffffffffhhhhb"; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 0e0375826ce..04313191799 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -55,47 +55,35 @@ DBCStorage sBattlemasterListStore(BattlemasterL DBCStorage sCharSectionsStore(CharSectionsfmt); CharSectionsMap sCharSectionMap; DBCStorage sCharTitlesStore(CharTitlesfmt); -DBCStorage sChatChannelsStore(ChatChannelsfmt); DBCStorage sChrClassesStore(ChrClassesfmt); -DBCStorage sChrSpecializationStore(ChrSpecializationfmt); -ChrSpecializationByIndexArray sChrSpecializationByIndexStore; DBCStorage sCreatureFamilyStore(CreatureFamilyfmt); DBCStorage sCreatureModelDataStore(CreatureModelDatafmt); DBCStorage sDifficultyStore(DifficultyFmt); DBCStorage sDungeonEncounterStore(DungeonEncounterfmt); -DBCStorage sEmotesStore(Emotesfmt); DBCStorage sEmotesTextStore(EmotesTextfmt); DBCStorage sFactionStore(Factionfmt); static FactionTeamMap sFactionTeamMap; DBCStorage sFactionTemplateStore(FactionTemplatefmt); -DBCStorage sGemPropertiesStore(GemPropertiesfmt); -DBCStorage sGlyphPropertiesStore(GlyphPropertiesfmt); -DBCStorage sItemSetStore(ItemSetfmt); - DBCStorage sLFGDungeonStore(LFGDungeonfmt); DBCStorage sLightStore(Lightfmt); DBCStorage sLiquidTypeStore(LiquidTypefmt); -DBCStorage sLockStore(Lockfmt); DBCStorage sMapStore(Mapfmt); DBCStorage sMapDifficultyStore(MapDifficultyfmt); // only for loading MapDifficultyMap sMapDifficultyMap; DBCStorage sPhaseStore(Phasefmt); -DBCStorage sPvpDifficultyStore(PvpDifficultyfmt); DBCStorage sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); -DBCStorage sSummonPropertiesStore(SummonPropertiesfmt); DBCStorage sTalentStore(Talentfmt); TalentsByPosition sTalentByPos; DBCStorage sVehicleStore(Vehiclefmt); -DBCStorage sVehicleSeatStore(VehicleSeatfmt); DBCStorage sWMOAreaTableStore(WMOAreaTablefmt); static WMOAreaInfoByTripple sWMOAreaInfoByTripple; @@ -242,36 +230,26 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810 LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810 LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20810 - LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20810 LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810 - LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20810 LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20810 LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810 LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20810 LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20810 - LOAD_DBC(sEmotesStore, "Emotes.dbc");//20810 LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20810 LOAD_DBC(sFactionStore, "Faction.dbc");//20810 LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810 - LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20810 - LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20810 - LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20810 LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810 LOAD_DBC(sLightStore, "Light.dbc"); //20810 LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810 - LOAD_DBC(sLockStore, "Lock.dbc");//20810 LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810 LOAD_DBC(sMapStore, "Map.dbc");//20810 LOAD_DBC(sPhaseStore, "Phase.dbc");//20810 - LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20810 LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810 - LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20810 LOAD_DBC(sTalentStore, "Talent.dbc");//20810 - LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20810 LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810 LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20810 - LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20444 - LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20444 + LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20810 + LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20810 #undef LOAD_DBC @@ -280,12 +258,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) if (entry->Race && ((1 << (entry->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races sCharSectionMap.insert({ entry->GenType | (entry->Gender << 8) | (entry->Race << 16), entry }); - memset(sChrSpecializationByIndexStore, 0, sizeof(sChrSpecializationByIndexStore)); - for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore) - { - ASSERT(chrSpec->ClassID < MAX_CLASSES); - ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); - uint32 storageIndex = chrSpec->ClassID; if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC) { @@ -316,11 +288,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) sMapDifficultyMap[entry->MapID][entry->DifficultyID] = entry; sMapDifficultyMap[0][0] = sMapDifficultyMap[1][0]; //map 0 is missing from MapDifficulty.dbc use this till its ported to sql - for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) - if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) - if (entry->BracketID > MAX_BATTLEGROUND_BRACKETS) - ASSERT(false && "Need update MAX_BATTLEGROUND_BRACKETS by DBC data"); - for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) { if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i)) @@ -356,7 +323,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) // Check loaded DBC files proper version if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) - !sGemPropertiesStore.LookupEntry(2952) || // last gem property added in 7.0.1 (20810) !sMapStore.LookupEntry(1602) ) // last map added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); @@ -606,40 +572,6 @@ MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficult return mapDiff; } -PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level) -{ - PvPDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case - for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) - { - if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) - { - // skip unrelated and too-high brackets - if (entry->MapID != mapid || entry->MinLevel > level) - continue; - - // exactly fit - if (entry->MaxLevel >= level) - return entry; - - // remember for possible out-of-range case (search higher from existed) - if (!maxEntry || maxEntry->MaxLevel < entry->MaxLevel) - maxEntry = entry; - } - } - - return maxEntry; -} - -PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id) -{ - for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) - if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) - if (entry->MapID == mapid && entry->GetBracketId() == id) - return entry; - - return NULL; -} - uint32 GetLiquidFlags(uint32 liquidType) { if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType)) diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index a1986effa48..b55c9573421 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -30,10 +30,6 @@ TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSection // ChrClasses TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale); -// ChrSpecialization -#define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES -typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; - // CreatureFamilty TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); @@ -55,10 +51,6 @@ TC_GAME_API MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Diff TC_GAME_API MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty); TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty); -// PvpDifficulty -TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); -TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); - // Talent typedef std::vector TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; @@ -107,33 +99,23 @@ TC_GAME_API extern DBCStorage sBannedAddOnsSto TC_GAME_API extern DBCStorage sBattlemasterListStore; TC_GAME_API extern DBCStorage sCharSectionsStore; TC_GAME_API extern DBCStorage sCharTitlesStore; -TC_GAME_API extern DBCStorage sChatChannelsStore; TC_GAME_API extern DBCStorage sChrClassesStore; -TC_GAME_API extern DBCStorage sChrSpecializationStore; -TC_GAME_API extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; TC_GAME_API extern DBCStorage sCreatureFamilyStore; TC_GAME_API extern DBCStorage sCreatureModelDataStore; TC_GAME_API extern DBCStorage sDifficultyStore; TC_GAME_API extern DBCStorage sDungeonEncounterStore; -TC_GAME_API extern DBCStorage sEmotesStore; TC_GAME_API extern DBCStorage sEmotesTextStore; TC_GAME_API extern DBCStorage sFactionStore; TC_GAME_API extern DBCStorage sFactionTemplateStore; -TC_GAME_API extern DBCStorage sGemPropertiesStore; -TC_GAME_API extern DBCStorage sGlyphPropertiesStore; -TC_GAME_API extern DBCStorage sItemSetStore; TC_GAME_API extern DBCStorage sLFGDungeonStore; TC_GAME_API extern DBCStorage sLiquidTypeStore; -TC_GAME_API extern DBCStorage sLockStore; TC_GAME_API extern DBCStorage sMapStore; TC_GAME_API extern MapDifficultyMap sMapDifficultyMap; TC_GAME_API extern DBCStorage sPhaseStore; TC_GAME_API extern DBCStorage sSpellItemEnchantmentStore; -TC_GAME_API extern DBCStorage sSummonPropertiesStore; TC_GAME_API extern DBCStorage sTalentStore; TC_GAME_API extern TalentsByPosition sTalentByPos; TC_GAME_API extern DBCStorage sVehicleStore; -TC_GAME_API extern DBCStorage sVehicleSeatStore; TC_GAME_API extern DBCStorage sWMOAreaTableStore; TC_GAME_API extern DBCStorage sWorldSafeLocsStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 30704aaadad..8dcb1a687a4 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -151,15 +151,6 @@ struct CharTitlesEntry //uint32 Flags; // 5 }; -struct ChatChannelsEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - //uint32 FactionGroup // 2 - char* Name_lang; // 3 - //char* Shortcut_lang; // 4 -}; - struct ChrClassesEntry { uint32 ID; // 0 @@ -183,25 +174,6 @@ struct ChrClassesEntry //uint32 Unk1; // 18 }; -struct ChrSpecializationEntry -{ - uint32 ID; // 0 Specialization ID - //char* BackgroundFile; // 1 - uint32 ClassID; // 2 - uint32 MasterySpellID; // 3 - uint32 OrderIndex; // 4 - uint32 PetTalentType; // 5 - uint32 Role; // 6 (0 - Tank, 1 - Healer, 2 - DPS) - uint32 SpellIconID; // 7 - uint32 RaidBuffs; // 8 - uint32 Flags; // 9 - //char* Name_lang; // 10 - //char* Name2_lang; // 11 Same as name_lang? - //char* Description_lang; // 12 - //uint32 PrimaryStatOrder; // 13 - //uint32 AnimReplacementSetID; // 14 -}; - struct CreatureFamilyEntry { uint32 ID; // 0 @@ -294,18 +266,6 @@ struct DungeonEncounterEntry //uint32 Unk; // 8 Flags2? }; -struct EmotesEntry -{ - uint32 ID; // 0 - //char* EmoteSlashCommand; // 1 - //uint32 AnimID; // 2 ref to animationData - uint32 EmoteFlags; // 3 bitmask, may be unit_flags - uint32 EmoteSpecProc; // 4 Can be 0, 1 or 2 (determine how emote are shown) - uint32 EmoteSpecProcParam; // 5 uncomfirmed, may be enum UnitStandStateType - //uint32 EmoteSoundID; // 6 ref to soundEntries - //uint32 SpellVisualKitID // 7 -}; - struct EmotesTextEntry { uint32 ID; // 0 @@ -396,25 +356,6 @@ struct FactionTemplateEntry bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } }; -struct GemPropertiesEntry -{ - uint32 ID; // 0 - uint32 EnchantID; // 1 - //uint32 MaxCountInv; // 2 - //uint32 MaxCountItem; // 3 - uint32 Type; // 4 - uint32 MinItemLevel; // 5 -}; - -struct GlyphPropertiesEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 Type; // 2 - uint32 SpellIconID; // 3 GlyphIconId (SpellIcon.dbc) - //uint32 GlyphExclusiveCategoryID; // 4 -}; - struct GtArmorMitigationByLvlEntry { //uint32 level; @@ -534,18 +475,6 @@ struct ItemDisplayInfoEntry //uint32 ParticleColorID; // 22 }; -#define MAX_ITEM_SET_ITEMS 17 -#define MAX_ITEM_SET_SPELLS 8 - -struct ItemSetEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - uint32 ItemID[MAX_ITEM_SET_ITEMS]; // 2-18 - uint32 RequiredSkill; // 19 - uint32 RequiredSkillRank; // 20 -}; - struct LFGDungeonEntry { uint32 ID; // 0 @@ -617,17 +546,6 @@ struct LiquidTypeEntry //uint32 Int[4]; // 47-50 }; -#define MAX_LOCK_CASE 8 - -struct LockEntry -{ - uint32 ID; // 0 - uint32 Type[MAX_LOCK_CASE]; // 1-8 - uint32 Index[MAX_LOCK_CASE]; // 9-16 - uint32 Skill[MAX_LOCK_CASE]; // 17-24 - //uint32 Action[MAX_LOCK_CASE]; // 25-32 -}; - struct PhaseEntry { uint32 ID; // 0 @@ -711,18 +629,6 @@ struct MinorTalentEntry uint32 OrderIndex; // 3 }; -struct PvPDifficultyEntry -{ - //uint32 ID; // 0 - uint32 MapID; // 1 - uint32 BracketID; // 2 m_rangeIndex - uint32 MinLevel; // 3 - uint32 MaxLevel; // 4 - - // helpers - BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } -}; - #define MAX_ITEM_ENCHANTMENT_EFFECTS 3 struct SpellItemEnchantmentEntry @@ -755,16 +661,6 @@ struct StableSlotPricesEntry uint32 Price; }; -struct SummonPropertiesEntry -{ - uint32 ID; // 0 - uint32 Category; // 1, 0 - can't be controlled?, 1 - something guardian?, 2 - pet?, 3 - something controllable?, 4 - taxi/mount? - uint32 Faction; // 2, 14 rows > 0 - uint32 Type; // 3, see enum - int32 Slot; // 4, 0-6 - uint32 Flags; // 5 -}; - #define MAX_TALENT_TIERS 7 #define MAX_TALENT_COLUMNS 3 @@ -818,84 +714,6 @@ struct VehicleEntry uint32 PowerDisplayID[3]; // 38-40 }; -struct VehicleSeatEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - int32 AttachmentID; // 2 - DBCPosition3D AttachmentOffset; // 3-5 - float EnterPreDelay; // 6 - float EnterSpeed; // 7 - float EnterGravity; // 8 - float EnterMinDuration; // 9 - float EnterMaxDuration; // 10 - float EnterMinArcHeight; // 11 - float EnterMaxArcHeight; // 12 - int32 EnterAnimStart; // 13 - int32 EnterAnimLoop; // 14 - int32 RideAnimStart; // 15 - int32 RideAnimLoop; // 16 - int32 RideUpperAnimStart; // 17 - int32 RideUpperAnimLoop; // 18 - float ExitPreDelay; // 19 - float ExitSpeed; // 20 - float ExitGravity; // 21 - float ExitMinDuration; // 22 - float ExitMaxDuration; // 23 - float ExitMinArcHeight; // 24 - float ExitMaxArcHeight; // 25 - int32 ExitAnimStart; // 26 - int32 ExitAnimLoop; // 27 - int32 ExitAnimEnd; // 28 - float PassengerYaw; // 29 - float PassengerPitch; // 30 - float PassengerRoll; // 31 - int32 PassengerAttachmentID; // 32 - int32 VehicleEnterAnim; // 33 - int32 VehicleExitAnim; // 34 - int32 VehicleRideAnimLoop; // 35 - int32 VehicleEnterAnimBone; // 36 - int32 VehicleExitAnimBone; // 37 - int32 VehicleRideAnimLoopBone; // 38 - float VehicleEnterAnimDelay; // 39 - float VehicleExitAnimDelay; // 40 - uint32 VehicleAbilityDisplay; // 41 - uint32 EnterUISoundID; // 42 - uint32 ExitUISoundID; // 43 - uint32 FlagsB; // 44 - float CameraEnteringDelay; // 45 - float CameraEnteringDuration; // 46 - float CameraExitingDelay; // 47 - float CameraExitingDuration; // 48 - DBCPosition3D CameraOffset; // 49-51 - float CameraPosChaseRate; // 52 - float CameraFacingChaseRate; // 53 - float CameraEnteringZoom; // 54 - float CameraSeatZoomMin; // 55 - float CameraSeatZoomMax; // 56 - uint32 EnterAnimKitID; // 57 - uint32 RideAnimKitID; // 58 - uint32 ExitAnimKitID; // 59 - uint32 VehicleEnterAnimKitID; // 60 - uint32 VehicleRideAnimKitID; // 61 - uint32 VehicleExitAnimKitID; // 62 - uint32 CameraModeID; // 63 - uint32 FlagsC; // 64 - uint32 UISkinFileDataID; // 65 - - bool CanEnterOrExit() const - { - return ((Flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0 || - //If it has anmation for enter/ride, means it can be entered/exited by logic - (Flags & (VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER | VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_RIDE)) != 0); - } - bool CanSwitchFromSeat() const { return (Flags & VEHICLE_SEAT_FLAG_CAN_SWITCH) != 0; } - bool IsUsableByOverride() const { return (Flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) - || (FlagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | - VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4))); } - bool IsEjectable() const { return (FlagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE) != 0; } -}; - struct WMOAreaTableEntry { uint32 ID; // 0 index diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index b85710acae6..b20b55d709f 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -28,35 +28,25 @@ char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; char const CharSectionsfmt[] = "diiixxxiii"; char const CharTitlesfmt[] = "nxssix"; -char const ChatChannelsfmt[] = "nixsx"; char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; -char const ChrSpecializationfmt[] = "nxiiiiiiiixxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; -char const Emotesfmt[] = "nxxiiixx"; char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx"; char const EmotesTextSoundEntryfmt[] = "niiii"; char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; -char const GemPropertiesfmt[] = "nixxii"; -char const GlyphPropertiesfmt[] = "niiix"; -char const ItemSetfmt[] = "nsiiiiiiiiiiiiiiiiiii"; char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; char const Lightfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const Lockfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; char const Mapfmt[] = "nxiixxsixxixiffxiiiiix"; char const MapDifficultyfmt[] = "diisiiii"; char const MinorTalentfmt[] = "niii"; char const Phasefmt[] = "ni"; -char const PvpDifficultyfmt[] = "diiii"; char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx"; -char const SummonPropertiesfmt[] = "niiiii"; char const Talentfmt[] = "niiiiiiiiix"; char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; -char const VehicleSeatfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; char const WMOAreaTablefmt[] = "niiixxxxxiixxxx"; char const WorldMapAreafmt[] = "xinxffffixxxxx"; char const WorldSafeLocsfmt[] = "niffffx"; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 38a47d999a9..04d7c07aa3d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3231,7 +3231,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const bool Player::IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const { if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - return spellInfo->Id == chrSpec->MasterySpellID; + return spellInfo->Id == chrSpec->MasterySpellID[0] || spellInfo->Id == chrSpec->MasterySpellID[1]; return false; } @@ -4729,9 +4729,9 @@ void Player::UpdateLocalChannels(uint32 newZone) else currentNameExt = current_zone->AreaName_lang; - snprintf(new_channel_name_buf, 100, channel->Name_lang, currentNameExt); + snprintf(new_channel_name_buf, 100, channel->Name->Str[m_session->GetSessionDbcLocale()], currentNameExt); - joinChannel = cMgr->GetJoinChannel(new_channel_name_buf, channel->ID); + joinChannel = cMgr->GetJoinChannel(new_channel_name_buf, i); if (usedChannel) { if (joinChannel != usedChannel) @@ -4744,7 +4744,7 @@ void Player::UpdateLocalChannels(uint32 newZone) } } else - joinChannel = cMgr->GetJoinChannel(channel->Name_lang, channel->ID); + joinChannel = cMgr->GetJoinChannel(channel->Name->Str[m_session->GetSessionDbcLocale()], i); } else removeChannel = usedChannel; @@ -25235,8 +25235,9 @@ void Player::ActivateTalentGroup(uint8 spec) if (CanUseMastery()) if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - if (uint32 mastery = specialization->MasterySpellID) - LearnSpell(mastery, false); + for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) + if (uint32 mastery = specialization->MasterySpellID[i]) + LearnSpell(mastery, false); // set glyphs for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) @@ -26146,7 +26147,7 @@ void Player::RemoveSpecializationSpells() { for (uint32 i = 0; i < MAX_SPECIALIZATIONS; ++i) { - if (ChrSpecializationEntry const* specialization = sChrSpecializationByIndexStore[getClass()][i]) + if (ChrSpecializationEntry const* specialization = sDB2Manager.GetChrSpecializationByIndex(getClass(), i)) { if (std::vector const* specSpells = sDB2Manager.GetSpecializationSpells(specialization->ID)) { @@ -26159,8 +26160,9 @@ void Player::RemoveSpecializationSpells() } } - if (uint32 mastery = specialization->MasterySpellID) - RemoveAurasDueToSpell(mastery); + for (uint32 j = 0; j < MAX_MASTERY_SPELLS; ++j) + if (uint32 mastery = specialization->MasterySpellID[j]) + RemoveAurasDueToSpell(mastery); } } } diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index e3a5f9065e0..878475cd386 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -67,7 +67,17 @@ void Totem::InitStats(uint32 duration) } // set display id depending on caster's race - SetDisplayId(owner->GetModelForTotem(PlayerTotemType(m_Properties->ID))); + if (SpellInfo const* createdBySpell = sSpellMgr->GetSpellInfo(GetUInt32Value(UNIT_CREATED_BY_SPELL))) + { + SpellEffectInfoVector effects = createdBySpell->GetEffectsForDifficulty(DIFFICULTY_NONE); + auto summonEffect = std::find_if(effects.begin(), effects.end(), [](SpellEffectInfo const* effect) + { + return effect && effect->IsEffect(SPELL_EFFECT_SUMMON); + }); + + if (summonEffect != effects.end()) + SetDisplayId(owner->GetModelForTotem(PlayerTotemType((*summonEffect)->MiscValueB))); + } } Minion::InitStats(duration); diff --git a/src/server/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h index 14bb60f916f..d2b91bb8684 100644 --- a/src/server/game/Entities/Totem/Totem.h +++ b/src/server/game/Entities/Totem/Totem.h @@ -27,13 +27,6 @@ enum TotemType TOTEM_ACTIVE = 1, TOTEM_STATUE = 2 // copied straight from MaNGOS, may need more implementation to work }; -// Some Totems cast spells that are not in creature DB -enum TotemSpells -{ - // Totemic Wrath - SPELL_TOTEMIC_WRATH_TALENT = 77746, - SPELL_TOTEMIC_WRATH = 77747 -}; class TC_GAME_API Totem : public Minion { diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index f9ba83c19ca..da04c39c289 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -539,21 +539,21 @@ void Player::UpdateMastery() if (!chrSpec) return; - if (!chrSpec->MasterySpellID) - return; - - if (Aura* aura = GetAura(chrSpec->MasterySpellID)) + for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) { - for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) + if (Aura* aura = GetAura(chrSpec->MasterySpellID[i])) { - if (!effect) - continue; + for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) + { + if (!effect) + continue; - float mult = effect->BonusCoefficient; - if (G3D::fuzzyEq(mult, 0.0f)) - continue; + float mult = effect->BonusCoefficient; + if (G3D::fuzzyEq(mult, 0.0f)) + continue; - aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); + aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); + } } } } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index cd7e038508c..a1523db5d62 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -478,12 +478,12 @@ Vehicle* Vehicle::RemovePassenger(Unit* unit) _me->SetFlag64(UNIT_NPC_FLAGS, (_me->GetTypeId() == TYPEID_PLAYER ? UNIT_NPC_FLAG_PLAYER_VEHICLE : UNIT_NPC_FLAG_SPELLCLICK)); // Remove UNIT_FLAG_NOT_SELECTABLE if passenger did not have it before entering vehicle - if (seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable) + if (seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable) unit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); seat->second.Passenger.Reset(); - if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_CAN_CONTROL) _me->RemoveCharmedBy(unit); if (_me->IsInWorld()) @@ -785,11 +785,11 @@ bool VehicleJoinEvent::Execute(uint64, uint32) player->StopCastingCharm(); player->StopCastingBindSight(); player->SendOnCancelExpectedVehicleRideAura(); - if (!(veSeat->FlagsB & VEHICLE_SEAT_FLAG_B_KEEP_PET)) + if (!(veSeat->Flags[1] & VEHICLE_SEAT_FLAG_B_KEEP_PET)) player->UnsummonPetTemporaryIfAny(); } - if (Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE) + if (Seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE) Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Passenger->m_movementInfo.transport.pos.Relocate(veSeat->AttachmentOffset.X, veSeat->AttachmentOffset.Y, veSeat->AttachmentOffset.Z); @@ -799,7 +799,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) Passenger->m_movementInfo.transport.vehicleId = Target->GetVehicleInfo()->ID; if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER && - Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + Seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_CAN_CONTROL) ASSERT(Target->GetBase()->SetCharmedBy(Passenger, CHARM_TYPE_VEHICLE)); // SMSG_CLIENT_CONTROL Passenger->SendClearTarget(); // SMSG_BREAK_TARGET diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index dbaaa3b7b9f..6433004c744 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -65,6 +65,7 @@ class TC_GAME_API Vehicle : public TransportBase void SetLastShootPos(Position const& pos) { _lastShootPos.Relocate(pos); } Position const& GetLastShootPos() const { return _lastShootPos; } + SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger); SeatMap Seats; ///< The collection of all seats on the vehicle. Including vacant ones. VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger) const; @@ -83,7 +84,6 @@ class TC_GAME_API Vehicle : public TransportBase STATUS_UNINSTALLING, }; - SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger); void InitMovementInfoForBase(); /// This method transforms supplied transport offsets into global coordinates diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 43763631b0b..93e301bf548 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1935,7 +1935,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (!reference) return ERR_BATTLEGROUND_JOIN_FAILED; - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); if (!bracketEntry) return ERR_BATTLEGROUND_JOIN_FAILED; @@ -1959,7 +1959,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_BATTLEGROUND_JOIN_TIMED_OUT; } // not in the same battleground level braket, don't let join - PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); + PvPDifficultyEntry const* memberBracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); if (memberBracketEntry != bracketEntry) return ERR_BATTLEGROUND_JOIN_RANGE_INDEX; // don't let join rated matches if the arena team id doesn't match diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index e8fdb384d89..84a6c77bbe2 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -95,7 +95,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt return; // expected bracket entry - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; @@ -314,7 +314,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl bgTypeId = bg->GetTypeID(); // expected bracket entry - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; @@ -475,7 +475,7 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battlegrou continue; // expected bracket entry - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) continue; @@ -511,7 +511,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl BattlegroundTypeId bgTypeId = bg->GetTypeID(); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype); - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; diff --git a/src/server/game/Handlers/CombatHandler.cpp b/src/server/game/Handlers/CombatHandler.cpp index 4796ddf92fe..e067e4433d8 100644 --- a/src/server/game/Handlers/CombatHandler.cpp +++ b/src/server/game/Handlers/CombatHandler.cpp @@ -51,7 +51,7 @@ void WorldSession::HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& pa { VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(_player); ASSERT(seat); - if (!(seat->Flags & VEHICLE_SEAT_FLAG_CAN_ATTACK)) + if (!(seat->Flags[0] & VEHICLE_SEAT_FLAG_CAN_ATTACK)) { SendAttackStop(enemy); return; diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index cace773b65e..ae0dcc586ef 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -362,7 +362,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov { if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(mover)) { - if (seat->Flags & VEHICLE_SEAT_FLAG_ALLOW_TURNING) + if (seat->Flags[0] & VEHICLE_SEAT_FLAG_ALLOW_TURNING) { if (movementInfo.pos.GetOrientation() != mover->GetOrientation()) { diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index d6e1b35de6e..3596eee68f6 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -88,8 +88,7 @@ void WorldSession::HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecia return; } - ChrSpecializationEntry const* chrSpec = sChrSpecializationByIndexStore[player->getClass()][packet.SpecGroupIndex]; - + ChrSpecializationEntry const* chrSpec = sDB2Manager.GetChrSpecializationByIndex(player->getClass(), packet.SpecGroupIndex); if (!chrSpec) { TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization index %u not found", packet.SpecGroupIndex); diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index 57e941d1338..0ebc2957383 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -45,7 +45,7 @@ void WorldSession::HandleRequestVehiclePrevSeat(WorldPackets::Vehicle::RequestVe if (!seat->CanSwitchFromSeat()) { TC_LOG_ERROR("network", "HandleRequestVehiclePrevSeat: %s tried to switch seats but current seatflags %u don't permit that.", - GetPlayer()->GetGUID().ToString().c_str(), seat->Flags); + GetPlayer()->GetGUID().ToString().c_str(), seat->Flags[0]); return; } @@ -62,7 +62,7 @@ void WorldSession::HandleRequestVehicleNextSeat(WorldPackets::Vehicle::RequestVe if (!seat->CanSwitchFromSeat()) { TC_LOG_ERROR("network", "HandleRequestVehicleNextSeat: %s tried to switch seats but current seatflags %u don't permit that.", - GetPlayer()->GetGUID().ToString().c_str(), seat->Flags); + GetPlayer()->GetGUID().ToString().c_str(), seat->Flags[0]); return; } @@ -79,7 +79,7 @@ void WorldSession::HandleMoveChangeVehicleSeats(WorldPackets::Vehicle::MoveChang if (!seat->CanSwitchFromSeat()) { TC_LOG_ERROR("network", "HandleMoveChangeVehicleSeats: %s tried to switch seats but current seatflags %u don't permit that.", - GetPlayer()->GetGUID().ToString().c_str(), seat->Flags); + GetPlayer()->GetGUID().ToString().c_str(), seat->Flags[0]); return; } @@ -108,7 +108,7 @@ void WorldSession::HandleRequestVehicleSwitchSeat(WorldPackets::Vehicle::Request if (!seat->CanSwitchFromSeat()) { TC_LOG_ERROR("network", "HandleRequestVehicleSwitchSeat: %s tried to switch seats but current seatflags %u don't permit that.", - GetPlayer()->GetGUID().ToString().c_str(), seat->Flags); + GetPlayer()->GetGUID().ToString().c_str(), seat->Flags[0]); return; } @@ -174,13 +174,14 @@ void WorldSession::HandleRequestVehicleExit(WorldPackets::Vehicle::RequestVehicl { if (Vehicle* vehicle = GetPlayer()->GetVehicle()) { - if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(GetPlayer())) + auto itr = vehicle->GetSeatIteratorForPassenger(GetPlayer()); + if (itr != vehicle->Seats.end()) { - if (seat->CanEnterOrExit()) + if (itr->second.SeatInfo->CanEnterOrExit()) GetPlayer()->ExitVehicle(); else TC_LOG_ERROR("network", "%s tried to exit vehicle, but seatflags %u (ID: %u) don't permit that.", - GetPlayer()->GetGUID().ToString().c_str(), seat->ID, seat->Flags); + GetPlayer()->GetGUID().ToString().c_str(), vehicle->GetVehicleInfo()->SeatID[itr->first], itr->second.SeatInfo->Flags[0]); } } } diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 6a87a1e3246..7d73d9b6625 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -22,6 +22,7 @@ #include "Define.h" #include "DBCStructure.h" +#include "DB2Structure.h" #include "GridDefines.h" #include "Cell.h" #include "Timer.h" diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index cf35e643a02..a6734f6c205 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4556,7 +4556,7 @@ SpellCastResult Spell::CheckRuneCost() return SPELL_CAST_OK; int32 readyRunes = 0; - for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + for (int32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) if (player->GetRuneCooldown(i) == 0) ++readyRunes; @@ -4579,7 +4579,7 @@ void Spell::TakeRunePower(bool didHit) return cost.Power == POWER_RUNES; })->Amount; - for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + for (int32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) { if (!player->GetRuneCooldown(i) && runeCost > 0) { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b174454225d..31e0b126be6 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2034,7 +2034,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) // however so far noone found a generic check to find all of those (there's no related data in summonproperties.dbc // and in spell attributes, possibly we need to add a table for those) // so here's a list of MiscValueB values, which is currently most generic check - switch (properties->ID) + switch (effectInfo->MiscValueB) { case 64: case 61: @@ -5175,7 +5175,7 @@ void Spell::EffectQuestStart(SpellEffIndex /*effIndex*/) } } -void Spell::EffectActivateRune(SpellEffIndex effIndex) +void Spell::EffectActivateRune(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; @@ -5196,7 +5196,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) count = 1; // first restore fully depleted runes - for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) + for (int32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { if (player->GetRuneCooldown(j) == player->GetRuneBaseCooldown()) { @@ -5206,7 +5206,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) } // then the rest if we still got something left - for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) + for (int32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { player->SetRuneCooldown(j, 0); --count; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 5b820f02c02..031ab5bdbdf 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2079,11 +2079,11 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster); if (!(AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED) - && (vehicleSeat->Flags & checkMask) != checkMask) + && (vehicleSeat->Flags[0] & checkMask) != checkMask) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; // Can only summon uncontrolled minions/guardians when on controlled vehicle - if (vehicleSeat->Flags & (VEHICLE_SEAT_FLAG_CAN_CONTROL | VEHICLE_SEAT_FLAG_UNK2)) + if (vehicleSeat->Flags[0] & (VEHICLE_SEAT_FLAG_CAN_CONTROL | VEHICLE_SEAT_FLAG_UNK2)) { for (SpellEffectInfo const* effect : GetEffectsForDifficulty(caster->GetMap()->GetDifficultyID())) { diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index b032aa8ef2e..4ff0d1a70a9 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -425,27 +425,45 @@ public: ItemSetEntry const* set = sItemSetStore.LookupEntry(id); if (set) { - std::string name = set->Name_lang; + int32 locale = handler->GetSessionDbcLocale(); + std::string name = set->Name->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = set->Name->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - // send item set in "id - [namedlink locale]" format - if (handler->GetSession()) - handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), ""); - else - handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), ""); + if (locale < TOTAL_LOCALES) + { + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - if (!found) - found = true; + // send item set in "id - [namedlink locale]" format + if (handler->GetSession()) + handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), ""); + else + handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), ""); + + if (!found) + found = true; + } } } if (!found) diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp index 2e7e974cb5d..42914b4da17 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -390,7 +390,7 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl ++records; uint32 recordsize = GetFormatRecordSize(format); - std::size_t stringFields = GetFormatStringFieldCount(format); + std::size_t stringFields = GetFormatLocalizedStringFieldCount(format); char* stringTable = new char[offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))]; memset(stringTable, 0, offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))); char* stringPtr = stringTable; @@ -402,7 +402,7 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl if (!offsets[y].FileOffset || !offsets[y].RecordSize) continue; - uint32 fieldOffset; + uint32 fieldOffset = 0; for (uint32 x = 0; x < fieldCount; x++) { switch (format[x]) @@ -427,7 +427,6 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl break; case FT_STRING: { - // fill only not filled entries LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); db2str->Str[locale] = stringPtr; strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); @@ -438,11 +437,7 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl } case FT_STRING_NOT_LOCALIZED: { - char** db2str = (char**)(&dataTable[offset]); - *db2str = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; + fieldOffset += strlen((char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]) + 1; offset += sizeof(char*); break; } -- cgit v1.2.3 From 885d9b53c38662e00e3b4977b82e9cf36d197f94 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 6 Feb 2016 17:53:37 +0100 Subject: Core/DataStores: Updated dbc/db2 to 7.0.1.20994 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_03.sql | 280 +++++++++++++++++++++ .../Database/Implementation/HotfixDatabase.cpp | 44 ++++ .../Database/Implementation/HotfixDatabase.h | 25 ++ src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 3 +- src/server/game/Chat/Chat.cpp | 5 +- src/server/game/DataStores/DB2Stores.cpp | 51 +++- src/server/game/DataStores/DB2Stores.h | 10 + src/server/game/DataStores/DB2Structure.h | 174 +++++++++++++ src/server/game/DataStores/DB2fmt.h | 9 + src/server/game/DataStores/DBCEnums.h | 46 ++-- src/server/game/DataStores/DBCStores.cpp | 62 +---- src/server/game/DataStores/DBCStores.h | 12 - src/server/game/DataStores/DBCStructure.h | 188 -------------- src/server/game/DataStores/DBCfmt.h | 10 - src/server/game/Entities/Creature/Creature.h | 4 +- src/server/game/Entities/Pet/Pet.cpp | 6 +- src/server/game/Entities/Player/Player.cpp | 12 +- src/server/game/Garrison/Garrison.cpp | 4 +- src/server/game/Garrison/GarrisonMgr.cpp | 4 +- src/server/game/Globals/ObjectMgr.cpp | 40 +-- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/game/Instances/InstanceScript.cpp | 5 +- src/server/game/Loot/LootMgr.cpp | 7 +- src/server/game/Maps/Map.cpp | 12 +- src/server/game/Maps/MapManager.cpp | 2 +- src/server/game/Spells/SpellMgr.cpp | 2 +- src/server/scripts/Commands/cs_character.cpp | 2 +- src/server/scripts/Commands/cs_go.cpp | 4 +- src/server/scripts/Commands/cs_group.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 125 ++++++--- src/server/scripts/Commands/cs_misc.cpp | 12 +- src/server/scripts/Commands/cs_titles.cpp | 12 +- .../shared/DataStores/DB2SparseStorageLoader.h | 1 + src/server/shared/DataStores/DB2StorageLoader.h | 1 + src/server/shared/DataStores/DB2Store.h | 23 +- src/server/shared/DataStores/DBCFileLoader.cpp | 9 +- src/server/shared/DataStores/DBStorageIterator.h | 4 +- 37 files changed, 804 insertions(+), 410 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_03.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_03.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_03.sql new file mode 100644 index 00000000000..959b3275e9d --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_03.sql @@ -0,0 +1,280 @@ +-- +-- Table structure for table `area_table` +-- +DROP TABLE IF EXISTS `area_table`; +CREATE TABLE `area_table` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags1` int(10) unsigned NOT NULL DEFAULT '0', + `Flags2` int(10) unsigned NOT NULL DEFAULT '0', + `ZoneName` text, + `AmbientMultiplier` float NOT NULL DEFAULT '0', + `AreaName` text, + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ParentAreaID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AreaBit` smallint(6) NOT NULL DEFAULT '0', + `AmbienceID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ZoneMusic` smallint(5) unsigned NOT NULL DEFAULT '0', + `IntroSound` smallint(5) unsigned NOT NULL DEFAULT '0', + `LiquidTypeID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `LiquidTypeID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `LiquidTypeID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `LiquidTypeID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `UWZoneMusic` smallint(5) unsigned NOT NULL DEFAULT '0', + `UWAmbience` smallint(5) unsigned NOT NULL DEFAULT '0', + `PvPCombastWorldStateID` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundProviderPref` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SoundProviderPrefUnderwater` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExplorationLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FactionGroupMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MountFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UWIntroMusic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `WildBattlePetLevelMin` tinyint(3) unsigned NOT NULL DEFAULT '0', + `WildBattlePetLevelMax` tinyint(3) unsigned NOT NULL DEFAULT '0', + `WindSettingsID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `area_table_locale` +-- +DROP TABLE IF EXISTS `area_table_locale`; +CREATE TABLE `area_table_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `AreaName_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `area_trigger` +-- +DROP TABLE IF EXISTS `area_trigger`; +CREATE TABLE `area_trigger` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `PosX` float NOT NULL DEFAULT '0', + `PosY` float NOT NULL DEFAULT '0', + `PosZ` float NOT NULL DEFAULT '0', + `Radius` float NOT NULL DEFAULT '0', + `BoxLength` float NOT NULL DEFAULT '0', + `BoxWidth` float NOT NULL DEFAULT '0', + `BoxHeight` float NOT NULL DEFAULT '0', + `BoxYaw` float NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0', + `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ShapeID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AreaTriggerActionSetID` smallint(5) unsigned NOT NULL DEFAULT '0', + `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ShapeType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flag` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `char_titles` +-- +DROP TABLE IF EXISTS `char_titles`; +CREATE TABLE `char_titles` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `NameMale` text, + `NameFemale` text, + `ConditionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaskID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `char_titles_locale` +-- +DROP TABLE IF EXISTS `char_titles_locale`; +CREATE TABLE `char_titles_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `NameMale_lang` text, + `NameFemale_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `creature_family` +-- +DROP TABLE IF EXISTS `creature_family`; +CREATE TABLE `creature_family` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `MinScale` float NOT NULL DEFAULT '0', + `MaxScale` float NOT NULL DEFAULT '0', + `Name` text, + `IconFile` text, + `SkillLine1` smallint(5) unsigned NOT NULL DEFAULT '0', + `SkillLine2` smallint(5) unsigned NOT NULL DEFAULT '0', + `PetFoodMask` smallint(5) unsigned NOT NULL DEFAULT '0', + `MinScaleLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxScaleLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PetTalentType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CategoryEnumID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `creature_family_locale` +-- +DROP TABLE IF EXISTS `creature_family_locale`; +CREATE TABLE `creature_family_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `difficulty` +-- +DROP TABLE IF EXISTS `difficulty`; +CREATE TABLE `difficulty` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `FallbackDifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `InstanceType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `OldEnumValue` tinyint(4) NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ToggleDifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GroupSizeHealthCurveID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GroupSizeDmgCurveID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GroupSizeSpellPointsCurveID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ItemBonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `difficulty_locale` +-- +DROP TABLE IF EXISTS `difficulty_locale`; +CREATE TABLE `difficulty_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `dungeon_encounter` +-- +DROP TABLE IF EXISTS `dungeon_encounter`; +CREATE TABLE `dungeon_encounter` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `CreatureDisplayID` int(10) unsigned NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `OrderIndex` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Bit` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `dungeon_encounter_locale` +-- +DROP TABLE IF EXISTS `dungeon_encounter_locale`; +CREATE TABLE `dungeon_encounter_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `emotes_text` +-- +DROP TABLE IF EXISTS `emotes_text`; +CREATE TABLE `emotes_text` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `EmoteID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `emotes_text_locale` +-- +DROP TABLE IF EXISTS `emotes_text_locale`; +CREATE TABLE `emotes_text_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `map` +-- +DROP TABLE IF EXISTS `map`; +CREATE TABLE `map` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Directory` text, + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `MapType` int(10) unsigned NOT NULL DEFAULT '0', + `MinimapIconScale` float NOT NULL DEFAULT '0', + `CorpsePosX` float NOT NULL DEFAULT '0', + `CorpsePosY` float NOT NULL DEFAULT '0', + `RaidOffset` int(10) unsigned NOT NULL DEFAULT '0', + `MapName` text, + `MapDescription0` text, + `MapDescription1` text, + `AreaTableID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LoadingScreenID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CorpseMapID` smallint(6) NOT NULL DEFAULT '0', + `TimeOfDayOverride` smallint(5) unsigned NOT NULL DEFAULT '0', + `ParentMapID` smallint(6) NOT NULL DEFAULT '0', + `CosmeticParentMapID` smallint(6) NOT NULL DEFAULT '0', + `InstanceType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `unk5` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExpansionID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TimeOffset` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `map_locale` +-- +DROP TABLE IF EXISTS `map_locale`; +CREATE TABLE `map_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `MapName_lang` text, + `MapDescription0_lang` text, + `MapDescription1_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `phase` +-- +DROP TABLE IF EXISTS `phase`; +CREATE TABLE `phase` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index d2a62e1f9ce..9b9363f6724 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -41,6 +41,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() // AreaGroupMember.db2 PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaGroupID, AreaID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH); + // AreaTable.db2 + PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, Flags1, Flags2, ZoneName, AmbientMultiplier, AreaName, MapID, ParentAreaID, AreaBit, " + "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWZoneMusic, UWAmbience, " + "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, UWIntroMusic, " + "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?", CONNECTION_SYNCH); + + // AreaTrigger.db2 + PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT ID, PosX, PosY, PosZ, Radius, BoxLength, BoxWidth, BoxHeight, BoxYaw, MapID, PhaseID, " + "PhaseGroupID, ShapeID, AreaTriggerActionSetID, PhaseUseFlags, ShapeType, Flag FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH); + // ArmorLocation.db2 PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Modifier1, Modifier2, Modifier3, Modifier4, Modifier5 FROM armor_location ORDER BY ID DESC", CONNECTION_SYNCH); @@ -80,6 +91,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " "ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + // CharTitles.db2 + PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale, NameFemale, ConditionID, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale_lang, NameFemale_lang FROM char_titles_locale WHERE locale = ?", CONNECTION_SYNCH); + // ChatChannels.db2 PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Flags, Name, Shortcut, FactionGroup FROM chat_channels ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -118,6 +133,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() "SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, CustomDisplayOption2, CustomDisplayOption3, Flags" " FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); + // CreatureFamily.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, MinScale, MaxScale, Name, IconFile, SkillLine1, SkillLine2, PetFoodMask, MinScaleLevel, " + "MaxScaleLevel, PetTalentType, CategoryEnumID FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); + // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -147,6 +167,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() "StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, DoNotHighlight, HealEffect" " FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + // Difficulty.db2 + PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, FallbackDifficultyID, InstanceType, MinPlayers, MaxPlayers, OldEnumValue, Flags, " + "ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID, ItemBonusTreeModID, OrderIndex FROM difficulty" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); + + // DungeonEncounter.db2 + PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name, CreatureDisplayID, MapID, OrderIndex, SpellIconID, DifficultyID, Bit, Flags" + " FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?", CONNECTION_SYNCH); + // DurabilityCosts.db2 PrepareStatement(HOTFIX_SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, " "WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, " @@ -162,6 +193,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSoundID, EmoteSpecProc, " "EmoteSpecProcParam FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); + // EmotesText.db2 + PrepareStatement(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name_lang FROM emotes_text_locale WHERE locale = ?", CONNECTION_SYNCH); + // EmotesTextSound.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); @@ -427,6 +462,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); + // Map.db2 + PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, RaidOffset, MapName, " + "MapDescription0, MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " + "InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH); + // ModifierTree.db2 PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); @@ -463,6 +504,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, " "SpellID9, SpellID10, PlayerActionbarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); + // Phase.db2 + PrepareStatement(HOTFIX_SEL_PHASE, "SELECT ID, Flags FROM phase ORDER BY ID DESC", CONNECTION_SYNCH); + // PhaseXPhaseGroup.db2 PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index cedaccf6168..0c915c06b92 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -39,6 +39,11 @@ enum HotfixDatabaseStatements HOTFIX_SEL_AREA_GROUP_MEMBER, + HOTFIX_SEL_AREA_TABLE, + HOTFIX_SEL_AREA_TABLE_LOCALE, + + HOTFIX_SEL_AREA_TRIGGER, + HOTFIX_SEL_ARMOR_LOCATION, HOTFIX_SEL_AUCTION_HOUSE, @@ -63,6 +68,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CHAR_START_OUTFIT, + HOTFIX_SEL_CHAR_TITLES, + HOTFIX_SEL_CHAR_TITLES_LOCALE, + HOTFIX_SEL_CHAT_CHANNELS, HOTFIX_SEL_CHAT_CHANNELS_LOCALE, @@ -80,6 +88,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, + HOTFIX_SEL_CREATURE_FAMILY, + HOTFIX_SEL_CREATURE_FAMILY_LOCALE, + HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, @@ -95,12 +106,21 @@ enum HotfixDatabaseStatements HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, + HOTFIX_SEL_DIFFICULTY, + HOTFIX_SEL_DIFFICULTY_LOCALE, + + HOTFIX_SEL_DUNGEON_ENCOUNTER, + HOTFIX_SEL_DUNGEON_ENCOUNTER_LOCALE, + HOTFIX_SEL_DURABILITY_COSTS, HOTFIX_SEL_DURABILITY_QUALITY, HOTFIX_SEL_EMOTES, + HOTFIX_SEL_EMOTES_TEXT, + HOTFIX_SEL_EMOTES_TEXT_LOCALE, + HOTFIX_SEL_EMOTES_TEXT_SOUND, HOTFIX_SEL_GAMEOBJECTS, @@ -240,6 +260,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MAIL_TEMPLATE, HOTFIX_SEL_MAIL_TEMPLATE_LOCALE, + HOTFIX_SEL_MAP, + HOTFIX_SEL_MAP_LOCALE, + HOTFIX_SEL_MODIFIER_TREE, HOTFIX_SEL_MOUNT, @@ -262,6 +285,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_OVERRIDE_SPELL_DATA, + HOTFIX_SEL_PHASE, + HOTFIX_SEL_PHASE_X_PHASE_GROUP, HOTFIX_SEL_PLAYER_CONDITION, diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 6a0ee3b11e2..a869699dbec 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1168,8 +1168,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; } - PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId); - if (!phase) + if (!sPhaseStore.LookupEntry(phaseId)) { TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_ID uses invalid phaseid %u for creature " SI64FMTD ", skipped", phaseId, e.entryOrGuid); return false; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 15743a0e686..85d803a6948 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -305,9 +305,10 @@ bool ChatHandler::ExecuteCommandInTable(std::vector const& table, c std::string zoneName = "Unknown"; if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { - areaName = area->AreaName_lang; + int32 locale = GetSessionDbcLocale(); + areaName = area->AreaName->Str[locale]; if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID)) - zoneName = zone->AreaName_lang; + zoneName = zone->AreaName->Str[locale]; } sLog->outCommand(m_session->GetAccountId(), "Command: %s [Player: %s (%s) (Account: %u) X: %f Y: %f Z: %f Map: %u (%s) Area: %u (%s) Zone: %s Selected: %s (%s)]", diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 1778a0b97aa..f985a266e29 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -27,6 +27,8 @@ DB2Storage sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); DB2Storage sAnimKitStore("AnimKit.db2", AnimKitFormat, HOTFIX_SEL_ANIM_KIT); DB2Storage sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage sAreaTableStore("AreaTable.db2", AreaTableFormat, HOTFIX_SEL_AREA_TABLE); +DB2Storage sAreaTriggerStore("AreaTrigger.db2", AreaTriggerFormat, HOTFIX_SEL_AREA_TRIGGER); DB2Storage sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION); DB2Storage sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); DB2Storage sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES); @@ -38,21 +40,26 @@ DB2Storage sBattlePetSpeciesStateStore("Bat DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS); DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); +DB2Storage sCharTitlesStore("CharTitles.db2", CharTitlesFormat, HOTFIX_SEL_CHAR_TITLES); DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); DB2Storage sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationFormat, HOTFIX_SEL_CHR_SPECIALIZATION); DB2Storage sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); +DB2Storage sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyFormat, HOTFIX_SEL_CREATURE_FAMILY); DB2Storage sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); DB2Storage sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); DB2Storage sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); DB2Storage sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); DB2Storage sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); DB2Storage sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); +DB2Storage sDifficultyStore("Difficulty.db2", DifficultyFormat, HOTFIX_SEL_DIFFICULTY); +DB2Storage sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterFormat, HOTFIX_SEL_DUNGEON_ENCOUNTER); DB2Storage sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS); DB2Storage sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); DB2Storage sEmotesStore("Emotes.db2", EmotesFormat, HOTFIX_SEL_EMOTES); +DB2Storage sEmotesTextStore("EmotesText.db2", EmotesTextFormat, HOTFIX_SEL_EMOTES_TEXT); DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); @@ -114,6 +121,7 @@ DB2Storage sItemXBonusTreeStore("ItemXBonus DB2Storage sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); DB2Storage sLockStore("Lock.db2", LockFormat, HOTFIX_SEL_LOCK); DB2Storage sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); +DB2Storage sMapStore("Map.db2", MapFormat, HOTFIX_SEL_MAP); DB2Storage sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE); DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); DB2Storage sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); @@ -124,6 +132,7 @@ DB2Storage sNamesProfanityStore("NamesProfa DB2Storage sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED); DB2Storage sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleFormat, HOTFIX_SEL_NAMES_RESERVED_LOCALE); DB2Storage sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); +DB2Storage sPhaseStore("Phase.db2", PhaseFormat, HOTFIX_SEL_PHASE); DB2Storage sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); DB2Storage sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION); DB2Storage sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY); @@ -207,8 +216,16 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D ++DB2FilesCount; +#define EXPECTED_DB2_BUILD 20950 + if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale)) { + if (storage->GetBuild() != EXPECTED_DB2_BUILD) + { + errlist.push_back(Trinity::StringFormat("DB2 file %s is from wrong client version!", storage->GetFileName())); + return; + } + storage->LoadFromDB(); for (uint32 i = 0; i < TOTAL_LOCALES; ++i) @@ -263,6 +280,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sAnimKitStore); LOAD_DB2(sArmorLocationStore); LOAD_DB2(sAreaGroupMemberStore); + LOAD_DB2(sAreaTableStore); + LOAD_DB2(sAreaTriggerStore); LOAD_DB2(sBankBagSlotPricesStore); LOAD_DB2(sBattlePetBreedQualityStore); LOAD_DB2(sBattlePetBreedStateStore); @@ -272,6 +291,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sBattlePetSpeciesStateStore); LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCharStartOutfitStore); + LOAD_DB2(sCharTitlesStore); LOAD_DB2(sChatChannelsStore); LOAD_DB2(sChrClassesXPowerTypesStore); LOAD_DB2(sChrRacesStore); @@ -279,15 +299,19 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); LOAD_DB2(sCreatureDisplayInfoExtraStore); + LOAD_DB2(sCreatureFamilyStore); LOAD_DB2(sCreatureTypeStore); LOAD_DB2(sCriteriaStore); LOAD_DB2(sCriteriaTreeStore); LOAD_DB2(sCurrencyTypesStore); LOAD_DB2(sCurvePointStore); LOAD_DB2(sDestructibleModelDataStore); + LOAD_DB2(sDifficultyStore); + LOAD_DB2(sDungeonEncounterStore); LOAD_DB2(sDurabilityCostsStore); LOAD_DB2(sDurabilityQualityStore); LOAD_DB2(sEmotesStore); + LOAD_DB2(sEmotesTextStore); LOAD_DB2(sEmotesTextSoundStore); LOAD_DB2(sGameObjectsStore); LOAD_DB2(sGameObjectDisplayInfoStore); @@ -349,6 +373,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sKeyChainStore); LOAD_DB2(sLockStore); LOAD_DB2(sMailTemplateStore); + LOAD_DB2(sMapStore); LOAD_DB2(sModifierTreeStore); LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); @@ -359,6 +384,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sNamesReservedStore); LOAD_DB2(sNamesReservedLocaleStore); LOAD_DB2(sOverrideSpellDataStore); + LOAD_DB2(sPhaseStore); LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sPlayerConditionStore); LOAD_DB2(sPowerDisplayStore); @@ -460,6 +486,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } } + ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(), + "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)", + MAX_DIFFICULTY, sDifficultyStore.GetNumRows()); + for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore) _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound; @@ -563,7 +593,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (PhaseXPhaseGroupEntry const* group : sPhaseXPhaseGroupStore) if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) - _phasesByGroup[group->PhaseGroupID].insert(phase->ID); + _phasesByGroup[group->PhaseGroupID].insert(group->PhaseID); for (PvPDifficultyEntry const* entry : sPvpDifficultyStore) { @@ -686,9 +716,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } // Check loaded DB2 files proper version - if (!sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914) + if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) + !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) + !sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914) !sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) - !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) + !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) + !sMapStore.LookupEntry(1602) || // last map added in 7.0.1 (20810) !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); @@ -813,6 +846,18 @@ char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEF return raceEntry->Name->Str[DEFAULT_LOCALE]; } +char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, uint32 locale) +{ + if (!petfamily) + return nullptr; + + CreatureFamilyEntry const* petFamily = sCreatureFamilyStore.LookupEntry(petfamily); + if (!petFamily) + return nullptr; + + return petFamily->Name->Str[locale][0] != '\0' ? petFamily->Name->Str[locale] : nullptr; +} + EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const { auto itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, class_)); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index ded2bf01b4f..5dbd24dacf6 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -26,6 +26,8 @@ TC_GAME_API extern DB2Storage sAchievementStore; TC_GAME_API extern DB2Storage sAnimKitStore; +TC_GAME_API extern DB2Storage sAreaTableStore; +TC_GAME_API extern DB2Storage sAreaTriggerStore; TC_GAME_API extern DB2Storage sArmorLocationStore; TC_GAME_API extern DB2Storage sAuctionHouseStore; TC_GAME_API extern DB2Storage sBankBagSlotPricesStore; @@ -36,20 +38,25 @@ TC_GAME_API extern DB2Storage sBattlePetSp TC_GAME_API extern DB2Storage sBattlePetSpeciesStateStore; TC_GAME_API extern DB2Storage sBroadcastTextStore; TC_GAME_API extern DB2Storage sCharStartOutfitStore; +TC_GAME_API extern DB2Storage sCharTitlesStore; TC_GAME_API extern DB2Storage sChatChannelsStore; TC_GAME_API extern DB2Storage sChrRacesStore; TC_GAME_API extern DB2Storage sChrSpecializationStore; TC_GAME_API extern DB2Storage sCinematicSequencesStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoExtraStore; +TC_GAME_API extern DB2Storage sCreatureFamilyStore; TC_GAME_API extern DB2Storage sCreatureTypeStore; TC_GAME_API extern DB2Storage sCriteriaStore; TC_GAME_API extern DB2Storage sCriteriaTreeStore; TC_GAME_API extern DB2Storage sCurrencyTypesStore; TC_GAME_API extern DB2Storage sDestructibleModelDataStore; +TC_GAME_API extern DB2Storage sDifficultyStore; +TC_GAME_API extern DB2Storage sDungeonEncounterStore; TC_GAME_API extern DB2Storage sDurabilityCostsStore; TC_GAME_API extern DB2Storage sDurabilityQualityStore; TC_GAME_API extern DB2Storage sEmotesStore; +TC_GAME_API extern DB2Storage sEmotesTextStore; TC_GAME_API extern DB2Storage sGameObjectsStore; TC_GAME_API extern DB2Storage sGameObjectDisplayInfoStore; TC_GAME_API extern DB2Storage sGameTablesStore; @@ -102,10 +109,12 @@ TC_GAME_API extern DB2Storage sItemSpecOve TC_GAME_API extern DB2Storage sItemToBattlePetSpeciesStore; TC_GAME_API extern DB2Storage sLockStore; TC_GAME_API extern DB2Storage sMailTemplateStore; +TC_GAME_API extern DB2Storage sMapStore; TC_GAME_API extern DB2Storage sModifierTreeStore; TC_GAME_API extern DB2Storage sMountCapabilityStore; TC_GAME_API extern DB2Storage sMovieStore; TC_GAME_API extern DB2Storage sOverrideSpellDataStore; +TC_GAME_API extern DB2Storage sPhaseStore; TC_GAME_API extern DB2Storage sPlayerConditionStore; TC_GAME_API extern DB2Storage sPowerDisplayStore; TC_GAME_API extern DB2Storage sQuestFactionRewardStore; @@ -229,6 +238,7 @@ public: ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); + static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 171d4324a62..692ae88847e 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -56,6 +56,60 @@ struct AreaGroupMemberEntry uint16 AreaID; }; +struct AreaTableEntry +{ + uint32 Flags[2]; + char const* ZoneName; + float AmbientMultiplier; + LocalizedString* AreaName; + uint16 MapID; + uint16 ParentAreaID; + int16 AreaBit; + uint16 AmbienceID; + uint16 ZoneMusic; + uint16 IntroSound; + uint16 LiquidTypeID[4]; + uint16 UWZoneMusic; + uint16 UWAmbience; + uint16 PvPCombastWorldStateID; + uint8 SoundProviderPref; + uint8 SoundProviderPrefUnderwater; + uint8 ExplorationLevel; + uint8 FactionGroupMask; + uint8 MountFlags; + uint8 UWIntroMusic; + uint8 WildBattlePetLevelMin; + uint8 WildBattlePetLevelMax; + uint8 WindSettingsID; + + // helpers + bool IsSanctuary() const + { + if (MapID == 609) + return true; + return (Flags[0] & AREA_FLAG_SANCTUARY) != 0; + } +}; + +struct AreaTriggerEntry +{ + uint32 ID; + DBCPosition3D Pos; + float Radius; + float BoxLength; + float BoxWidth; + float BoxHeight; + float BoxYaw; + uint16 MapID; + uint16 PhaseID; + uint16 PhaseGroupID; + uint16 ShapeID; + uint16 AreaTriggerActionSetID; + uint8 PhaseUseFlags; + uint8 ShapeType; + uint8 Flag; +}; + struct ArmorLocationEntry { float Modifier[5]; @@ -148,6 +202,15 @@ struct CharStartOutfitEntry uint8 PetFamilyID; // Pet Family Entry for starting pet }; +struct CharTitlesEntry +{ + LocalizedString* NameMale; + LocalizedString* NameFemale; + uint16 ConditionID; + uint16 MaskID; + uint8 Flags; +}; + struct ChatChannelsEntry { uint32 Flags; @@ -268,6 +331,20 @@ struct CreatureDisplayInfoExtraEntry uint8 Flags; }; +struct CreatureFamilyEntry +{ + float MinScale; + float MaxScale; + LocalizedString* Name; + char const* IconFile; + uint16 SkillLine[2]; + uint16 PetFoodMask; + uint8 MinScaleLevel; + uint8 MaxScaleLevel; + uint8 PetTalentType; + uint8 CategoryEnumID; +}; + struct CreatureTypeEntry { LocalizedString* Name; @@ -467,6 +544,36 @@ struct DestructibleModelDataEntry uint8 HealEffect; }; +struct DifficultyEntry +{ + uint32 ID; + LocalizedString* Name; + uint8 FallbackDifficultyID; + uint8 InstanceType; + uint8 MinPlayers; + uint8 MaxPlayers; + int8 OldEnumValue; + uint8 Flags; + uint8 ToggleDifficultyID; + uint8 GroupSizeHealthCurveID; + uint8 GroupSizeDmgCurveID; + uint8 GroupSizeSpellPointsCurveID; + uint8 ItemBonusTreeModID; + uint8 OrderIndex; +}; + +struct DungeonEncounterEntry +{ + LocalizedString* Name; + uint32 CreatureDisplayID; + uint16 MapID; + uint16 OrderIndex; + uint16 SpellIconID; + uint8 DifficultyID; + uint8 Bit; + uint8 Flags; +}; + struct DurabilityCostsEntry { uint16 WeaponSubClassCost[21]; @@ -489,6 +596,12 @@ struct EmotesEntry uint8 EmoteSpecProcParam; }; +struct EmotesTextEntry +{ + LocalizedString* Name; + uint16 EmoteID; +}; + struct EmotesTextSoundEntry { uint16 EmotesTextId; @@ -1097,6 +1210,62 @@ struct MailTemplateEntry LocalizedString* Body; }; +struct MapEntry +{ + uint32 ID; + char* Directory; + uint32 Flags; + uint32 MapType; + float MinimapIconScale; + DBCPosition2D CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance) + uint32 RaidOffset; + LocalizedString* MapName; + LocalizedString* MapDescription0; // Horde + LocalizedString* MapDescription1; // Alliance + uint16 AreaTableID; + uint16 LoadingScreenID; + int16 CorpseMapID; // map_id of entrance map in ghost mode (continent always and in most cases = normal entrance) + uint16 TimeOfDayOverride; + int16 ParentMapID; + int16 CosmeticParentMapID; + uint8 InstanceType; + uint8 unk5; + uint8 ExpansionID; + uint8 MaxPlayers; + uint8 TimeOffset; + + // Helpers + uint8 Expansion() const { return ExpansionID; } + + bool IsDungeon() const { return (InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID) && !IsGarrison(); } + bool IsNonRaidDungeon() const { return InstanceType == MAP_INSTANCE; } + bool Instanceable() const { return InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID || InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; } + bool IsRaid() const { return InstanceType == MAP_RAID; } + bool IsBattleground() const { return InstanceType == MAP_BATTLEGROUND; } + bool IsBattleArena() const { return InstanceType == MAP_ARENA; } + bool IsBattlegroundOrArena() const { return InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; } + bool IsWorldMap() const { return InstanceType == MAP_COMMON; } + + bool GetEntrancePos(int32& mapid, float& x, float& y) const + { + if (CorpseMapID < 0) + return false; + + mapid = CorpseMapID; + x = CorpsePos.X; + y = CorpsePos.Y; + return true; + } + + bool IsContinent() const + { + return ID == 0 || ID == 1 || ID == 530 || ID == 571 || ID == 870 || ID == 1116; + } + + bool IsDynamicDifficultyMap() const { return (Flags & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; } + bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; } +}; + struct ModifierTreeEntry { uint32 Asset[2]; @@ -1181,6 +1350,11 @@ struct OverrideSpellDataEntry uint8 Flags; }; +struct PhaseEntry +{ + uint16 Flags; +}; + struct PhaseXPhaseGroupEntry { uint16 PhaseID; diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 596a67bd35d..58ab1319b98 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -21,6 +21,8 @@ char const AchievementFormat[] = "nssishhhhhhhbbb"; char const AnimKitFormat[] = "dihh"; char const AreaGroupMemberFormat[] = "dhh"; +char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhbbbbbbbbb"; +char const AreaTriggerFormat[] = "nffffffffhhhhhbbb"; char const ArmorLocationFormat[] = "dfffff"; char const AuctionHouseFormat[] = "dshbb"; char const BankBagSlotPricesFormat[] = "di"; @@ -31,6 +33,7 @@ char const BattlePetSpeciesFormat[] = "niiisshbb"; char const BattlePetSpeciesStateFormat[] = "nihb"; char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; +char const CharTitlesFormat[] = "dsshhb"; char const ChatChannelsFormat[] = "dissb"; char const ChrClassesXPowerTypesFormat[] = "dbb"; char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb"; @@ -38,15 +41,19 @@ char const ChrSpecializationFormat[] = "niiiisssShbbbbb"; char const CinematicSequencesFormat[] = "dhhhhhhhhh"; char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb"; char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb"; +char const CreatureFamilyFormat[] = "dffsshhhbbbb"; char const CreatureTypeFormat[] = "dsb"; char const CriteriaFormat[] = "diiihhhbbbbb"; char const CriteriaTreeFormat[] = "dishhhhb"; char const CurrencyTypesFormat[] = "nSSsiiisbbbb"; char const CurvePointFormat[] = "dffhb"; char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb"; +char const DifficultyFormat[] = "nsbbbbbbbbbbbb"; +char const DungeonEncounterFormat[] = "dsihhhbbb"; char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; char const DurabilityQualityFormat[] = "df"; char const EmotesFormat[] = "dSiihhbb"; +char const EmotesTextFormat[] = "dsh"; char const EmotesTextSoundFormat[] = "dhhbbb"; char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; char const GameObjectDisplayInfoFormat[] = "diffffffffh"; @@ -108,6 +115,7 @@ char const ItemXBonusTreeFormat[] = "dih"; char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb"; char const MailTemplateFormat[] = "ds"; +char const MapFormat[] = "nsiifffissshhhhhhbbbbb"; char const ModifierTreeFormat[] = "diihbbbb"; char const MountFormat[] = "niissshhhb"; char const MountCapabilityFormat[] = "niihhhbb"; @@ -118,6 +126,7 @@ char const NamesProfanityFormat[] = "dSb"; char const NamesReservedFormat[] = "dS"; char const NamesReservedLocaleFormat[] = "dSb"; char const OverrideSpellDataFormat[] = "diiiiiiiiiiib"; +char const PhaseFormat[] = "dh"; char const PhaseXPhaseGroupFormat[] = "dhh"; char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const PowerDisplayFormat[] = "dSbbbb"; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 739b4ac51a0..f1f391f39ab 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -415,28 +415,30 @@ enum CriteriaTreeOperator enum Difficulty : uint8 { - DIFFICULTY_NONE = 0, - DIFFICULTY_NORMAL = 1, - DIFFICULTY_HEROIC = 2, - DIFFICULTY_10_N = 3, - DIFFICULTY_25_N = 4, - DIFFICULTY_10_HC = 5, - DIFFICULTY_25_HC = 6, - DIFFICULTY_LFR = 7, - DIFFICULTY_CHALLENGE = 8, - DIFFICULTY_40 = 9, - DIFFICULTY_HC_SCENARIO = 11, - DIFFICULTY_N_SCENARIO = 12, - DIFFICULTY_NORMAL_RAID = 14, - DIFFICULTY_HEROIC_RAID = 15, - DIFFICULTY_MYTHIC_RAID = 16, - DIFFICULTY_LFR_NEW = 17, - DIFFICULTY_EVENT_RAID = 18, - DIFFICULTY_EVENT_DUNGEON = 19, - DIFFICULTY_EVENT_SCENARIO = 20, - DIFFICULTY_MYTHIC = 23, - DIFFICULTY_TIMEWALKER = 24, - DIFFICULTY_PVP_SCENARIO = 25, + DIFFICULTY_NONE = 0, + DIFFICULTY_NORMAL = 1, + DIFFICULTY_HEROIC = 2, + DIFFICULTY_10_N = 3, + DIFFICULTY_25_N = 4, + DIFFICULTY_10_HC = 5, + DIFFICULTY_25_HC = 6, + DIFFICULTY_LFR = 7, + DIFFICULTY_CHALLENGE = 8, + DIFFICULTY_40 = 9, + DIFFICULTY_3_MAN_SCENARIO_HC = 11, + DIFFICULTY_3_MAN_SCENARIO_N = 12, + DIFFICULTY_NORMAL_RAID = 14, + DIFFICULTY_HEROIC_RAID = 15, + DIFFICULTY_MYTHIC_RAID = 16, + DIFFICULTY_LFR_NEW = 17, + DIFFICULTY_EVENT_RAID = 18, + DIFFICULTY_EVENT_DUNGEON = 19, + DIFFICULTY_EVENT_SCENARIO = 20, + DIFFICULTY_MYTHIC = 23, + DIFFICULTY_TIMEWALKER = 24, + DIFFICULTY_PVP_SCENARIO = 25, + DIFFICULTY_5_MAN_SCENARIO_N = 26, + DIFFICULTY_20_MAN_SCENARIO_N = 27, MAX_DIFFICULTY }; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 04313191799..03e1c365bc7 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -46,24 +46,14 @@ typedef std::multimap CharSectionsMap; typedef std::map> FactionTeamMap; typedef std::map WMOAreaInfoByTripple; -DBCStorage sAreaTableStore(AreaTablefmt); -DBCStorage sAreaTriggerStore(AreaTriggerfmt); - DBCStorage sBannedAddOnsStore(BannedAddOnsfmt); DBCStorage sBattlemasterListStore(BattlemasterListfmt); DBCStorage sCharSectionsStore(CharSectionsfmt); CharSectionsMap sCharSectionMap; -DBCStorage sCharTitlesStore(CharTitlesfmt); DBCStorage sChrClassesStore(ChrClassesfmt); -DBCStorage sCreatureFamilyStore(CreatureFamilyfmt); DBCStorage sCreatureModelDataStore(CreatureModelDatafmt); -DBCStorage sDifficultyStore(DifficultyFmt); -DBCStorage sDungeonEncounterStore(DungeonEncounterfmt); - -DBCStorage sEmotesTextStore(EmotesTextfmt); - DBCStorage sFactionStore(Factionfmt); static FactionTeamMap sFactionTeamMap; DBCStorage sFactionTemplateStore(FactionTemplatefmt); @@ -72,12 +62,9 @@ DBCStorage sLFGDungeonStore(LFGDungeonfmt); DBCStorage sLightStore(Lightfmt); DBCStorage sLiquidTypeStore(LiquidTypefmt); -DBCStorage sMapStore(Mapfmt); DBCStorage sMapDifficultyStore(MapDifficultyfmt); // only for loading MapDifficultyMap sMapDifficultyMap; -DBCStorage sPhaseStore(Phasefmt); - DBCStorage sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); DBCStorage sTalentStore(Talentfmt); @@ -224,26 +211,17 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) #define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale) - LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20810 - LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20810 LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810 LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810 LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810 - LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20810 LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810 - LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20810 LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810 - LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20810 - LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20810 - LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20810 LOAD_DBC(sFactionStore, "Faction.dbc");//20810 LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810 LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810 LOAD_DBC(sLightStore, "Light.dbc"); //20810 LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810 LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810 - LOAD_DBC(sMapStore, "Map.dbc");//20810 - LOAD_DBC(sPhaseStore, "Phase.dbc");//20810 LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810 LOAD_DBC(sTalentStore, "Talent.dbc");//20810 LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810 @@ -258,28 +236,11 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) if (entry->Race && ((1 << (entry->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races sCharSectionMap.insert({ entry->GenType | (entry->Gender << 8) | (entry->Race << 16), entry }); - uint32 storageIndex = chrSpec->ClassID; - if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC) - { - ASSERT(!chrSpec->ClassID); - storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX; - } - - sChrSpecializationByIndexStore[storageIndex][chrSpec->OrderIndex] = chrSpec; - } - - ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(), - "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)", - MAX_DIFFICULTY, sDifficultyStore.GetNumRows()); - for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) { FactionEntry const* faction = sFactionStore.LookupEntry(i); if (faction && faction->ParentFactionID) - { - std::vector &flist = sFactionTeamMap[faction->ParentFactionID]; - flist.push_back(i); - } + sFactionTeamMap[faction->ParentFactionID].push_back(i); } // fill data @@ -320,15 +281,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) exit(1); } - // Check loaded DBC files proper version - if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) - !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) - !sMapStore.LookupEntry(1602) ) // last map added in 7.0.1 (20810) - { - TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); - exit(1); - } - TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime)); } @@ -401,18 +353,6 @@ std::vector const* GetFactionTeamList(uint32 faction) return NULL; } -char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 /*locale*/) -{ - if (!petfamily) - return nullptr; - - CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(petfamily); - if (!pet_family) - return nullptr; - - return pet_family->Name_lang ? pet_family->Name_lang : NULL; -} - WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid) { WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid)); diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index b55c9573421..ef8056a06fc 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -30,9 +30,6 @@ TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSection // ChrClasses TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale); -// CreatureFamilty -TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); - // Faction TC_GAME_API std::vector const* GetFactionTeamList(uint32 faction); @@ -93,25 +90,16 @@ private: GameTablesEntry const* _gtEntry; }; -TC_GAME_API extern DBCStorage sAreaTableStore; -TC_GAME_API extern DBCStorage sAreaTriggerStore; TC_GAME_API extern DBCStorage sBannedAddOnsStore; TC_GAME_API extern DBCStorage sBattlemasterListStore; TC_GAME_API extern DBCStorage sCharSectionsStore; -TC_GAME_API extern DBCStorage sCharTitlesStore; TC_GAME_API extern DBCStorage sChrClassesStore; -TC_GAME_API extern DBCStorage sCreatureFamilyStore; TC_GAME_API extern DBCStorage sCreatureModelDataStore; -TC_GAME_API extern DBCStorage sDifficultyStore; -TC_GAME_API extern DBCStorage sDungeonEncounterStore; -TC_GAME_API extern DBCStorage sEmotesTextStore; TC_GAME_API extern DBCStorage sFactionStore; TC_GAME_API extern DBCStorage sFactionTemplateStore; TC_GAME_API extern DBCStorage sLFGDungeonStore; TC_GAME_API extern DBCStorage sLiquidTypeStore; -TC_GAME_API extern DBCStorage sMapStore; TC_GAME_API extern MapDifficultyMap sMapDifficultyMap; -TC_GAME_API extern DBCStorage sPhaseStore; TC_GAME_API extern DBCStorage sSpellItemEnchantmentStore; TC_GAME_API extern DBCStorage sTalentStore; TC_GAME_API extern TalentsByPosition sTalentByPos; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 8dcb1a687a4..d831231cb88 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -26,61 +26,6 @@ // Structures using to access raw DBC data and required packing to portability #pragma pack(push, 1) -struct AreaTableEntry -{ - uint32 ID; // 0 - uint32 MapID; // 1 - uint32 ParentAreaID; // 2 if 0 then it's zone, else it's zone id of this area - int32 AreaBit; // 3 - uint32 Flags[2]; // 4-5, - //uint32 SoundProviderPref; // 6, - //uint32 SoundProviderPrefUnderwater; // 7, - //uint32 AmbienceID; // 8, - //uint32 ZoneMusic; // 9, - //char* ZoneName; // 10 - Internal name - //uint32 IntroSound; // 11 - uint32 ExplorationLevel; // 12 - char* AreaName_lang; // 13 - In-game name - uint32 FactionGroupMask; // 14 - uint32 LiquidTypeID[4]; // 15-18 - //float AmbientMultiplier; // 19 - //uint32 MountFlags; // 20 - //uint32 UWIntroMusic; // 21 - //uint32 UWZoneMusic; // 22 - //uint32 UWAmbience; // 23 - //uint32 PvPCombastWorldStateID; // 25 - //uint32 WildBattlePetLevelMin; // 26 - //uint32 WildBattlePetLevelMax; // 27 - //uint32 WindSettingsID; // 28 - - // helpers - bool IsSanctuary() const - { - if (MapID == 609) - return true; - return (Flags[0] & AREA_FLAG_SANCTUARY) != 0; - } -}; - -struct AreaTriggerEntry -{ - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Pos; // 2-4 - //uint32 PhaseUseFlags // 5 - //uint32 PhaseID // 6 - //uint32 PhaseGroupID // 7 - float Radius; // 8 - float BoxLength; // 9 - float BoxWidth; // 10 - float BoxHeight; // 11 - float BoxYaw; // 12 - //uint32 ShapeType // 13 - //uint32 ShapeID // 14 - //uint32 AreaTriggerActionSetID // 15 - //uint32 Flags // 16 -}; - struct BannedAddOnsEntry { uint32 ID; // 0 @@ -141,16 +86,6 @@ struct CharSectionsEntry uint32 Color; }; -struct CharTitlesEntry -{ - uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId() - //uint32 ConditionID; // 1 - char* NameMale_lang; // 2 m_name_lang - char* NameFemale_lang; // 3 m_name1_lang - uint32 MaskID; // 4 m_mask_ID used in PLAYER_CHOSEN_TITLE and 1<, X - skip, s - char*, f - float, i - uint32, b - uint8, d - index (not included) // n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc -char const AreaTablefmt[] = "niiiiixxxxxxisiiiiixxxxxxxxx"; -char const AreaTriggerfmt[] = "nifffxxxfffffxxxx"; char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; char const CharSectionsfmt[] = "diiixxxiii"; -char const CharTitlesfmt[] = "nxssix"; char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; -char const CreatureFamilyfmt[] = "nfifiiiiixsx"; char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; -char const DifficultyFmt[] = "niiiixiixxxxix"; -char const DungeonEncounterfmt[] = "niiixsxxx"; -char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx"; char const EmotesTextSoundEntryfmt[] = "niiii"; char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; char const Lightfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const Mapfmt[] = "nxiixxsixxixiffxiiiiix"; char const MapDifficultyfmt[] = "diisiiii"; -char const MinorTalentfmt[] = "niii"; -char const Phasefmt[] = "ni"; char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx"; char const Talentfmt[] = "niiiiiiiiix"; char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 6e723a29191..d80c2eabe3b 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -181,12 +181,12 @@ struct TC_GAME_API CreatureTemplate case DIFFICULTY_NORMAL: case DIFFICULTY_10_N: case DIFFICULTY_40: - case DIFFICULTY_N_SCENARIO: + case DIFFICULTY_3_MAN_SCENARIO_N: case DIFFICULTY_NORMAL_RAID: return -1; case DIFFICULTY_HEROIC: case DIFFICULTY_25_N: - case DIFFICULTY_HC_SCENARIO: + case DIFFICULTY_3_MAN_SCENARIO_HC: case DIFFICULTY_HEROIC_RAID: return 0; case DIFFICULTY_10_HC: diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index deefff1423b..a3ca26c99c5 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -753,7 +753,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature) SetDisplayId(creature->GetDisplayId()); if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family)) - SetName(cFamily->Name_lang); + SetName(cFamily->Name->Str[GetOwner()->GetSession()->GetSessionDbcLocale()]); else SetName(creature->GetNameForLocaleIdx(sObjectMgr->GetDBCLocaleIndex())); @@ -766,7 +766,7 @@ bool Pet::CreateBaseAtCreatureInfo(CreatureTemplate const* cinfo, Unit* owner) return false; if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family)) - SetName(cFamily->Name_lang); + SetName(cFamily->Name->Str[GetOwner()->GetSession()->GetSessionDbcLocale()]); Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation()); @@ -1828,7 +1828,7 @@ void Pet::LearnPetPassives() if (!cFamily) return; - PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cFamily->ID); + PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cInfo->family); if (petStore != sPetFamilySpellsStore.end()) { // For general hunter pets skill 270 diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 04d7c07aa3d..303ef5d4c5d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4727,7 +4727,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY) currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY); else - currentNameExt = current_zone->AreaName_lang; + currentNameExt = current_zone->AreaName->Str[GetSession()->GetSessionDbcLocale()]; snprintf(new_channel_name_buf, 100, channel->Name->Str[m_session->GetSessionDbcLocale()], currentNameExt); @@ -6906,9 +6906,9 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) if (sWorld->getBoolConfig(CONFIG_WEATHER) && !HasAuraType(SPELL_AURA_FORCE_WEATHER)) { - if (Weather* weather = WeatherMgr::FindWeather(zone->ID)) + if (Weather* weather = WeatherMgr::FindWeather(newZone)) weather->SendWeatherUpdateToPlayer(this); - else if (!WeatherMgr::AddWeather(zone->ID)) + else if (!WeatherMgr::AddWeather(newZone)) // send fine weather packet to remove old zone's weather WeatherMgr::SendFineWeatherUpdateToPlayer(this); } @@ -18060,7 +18060,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) bool deleteInstance = false; MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); - std::string mapname = mapEntry ? mapEntry->MapName_lang : "Unknown"; + std::string mapname = mapEntry ? mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()] : "Unknown"; if (!mapEntry || !mapEntry->IsDungeon()) { @@ -25792,9 +25792,9 @@ std::string Player::GetMapAreaAndZoneString() const std::string zoneName = "Unknown"; if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { - areaName = area->AreaName_lang; + areaName = area->AreaName->Str[GetSession()->GetSessionDbcLocale()]; if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID)) - zoneName = zone->AreaName_lang; + zoneName = zone->AreaName->Str[GetSession()->GetSessionDbcLocale()]; } std::ostringstream str; diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 33bf14d4c15..7ba412f5a69 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -224,8 +224,8 @@ bool Garrison::Create(uint32 garrSiteId) if (siteLevelItr == sGarrSiteLevelStore.end()) return false; - _siteLevelId = siteLevelItr.Key(); - _siteLevel = siteLevelItr.Value(); + _siteLevelId = siteLevelItr.ID(); + _siteLevel = siteLevelItr.Data(); InitializePlots(); diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index e2cba691910..c07d9a82c45 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -33,7 +33,7 @@ GarrisonMgr& GarrisonMgr::Instance() void GarrisonMgr::Initialize() { for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr) - _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.Key(), itr.Value())); + _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.ID(), itr.Data())); for (GameObjectsEntry const* gameObject : sGameObjectsStore) if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT) @@ -46,7 +46,7 @@ void GarrisonMgr::Initialize() _garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID; for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr) - _garrisonBuildingsByType[itr->Type].push_back(itr.Key()); + _garrisonBuildingsByType[itr->Type].push_back(itr.ID()); for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore) { diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c52622bd966..aec1bba1e65 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1857,8 +1857,7 @@ void ObjectMgr::LoadCreatures() if (data.phaseid) { - PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid); - if (!phase) + if (!sPhaseStore.LookupEntry(data.phaseid)) { TC_LOG_ERROR("sql.sql", "Table `creature` have creature (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid); data.phaseid = 0; @@ -2144,8 +2143,7 @@ void ObjectMgr::LoadGameobjects() if (data.phaseid) { - PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid); - if (!phase) + if (!sPhaseStore.LookupEntry(data.phaseid)) { TC_LOG_ERROR("sql.sql", "Table `gameobject` have gameobject (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid); data.phaseid = 0; @@ -2626,13 +2624,13 @@ void ObjectMgr::LoadItemTemplates() for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr) { - ItemSparseEntry const* sparse = itr->second; - ItemEntry const* db2Data = sItemStore.LookupEntry(itr->first); + ItemSparseEntry const* sparse = itr.Data(); + ItemEntry const* db2Data = sItemStore.LookupEntry(itr.ID()); if (!db2Data) continue; - ItemTemplate& itemTemplate = _itemTemplateStore[itr->first]; - itemTemplate.Id = itr->first; + ItemTemplate& itemTemplate = _itemTemplateStore[itr.ID()]; + itemTemplate.Id = itr.ID(); itemTemplate.BasicData = db2Data; itemTemplate.ExtendedData = sparse; @@ -5284,7 +5282,7 @@ void ObjectMgr::LoadInstanceEncounters() } uint32 count = 0; - std::map dungeonLastBosses; + std::map> dungeonLastBosses; do { Field* fields = result->Fetch(); @@ -5301,20 +5299,22 @@ void ObjectMgr::LoadInstanceEncounters() if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon)) { - TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter %u (%s) marked as final for invalid dungeon id %u, skipped!", entry, dungeonEncounter->Name_lang, lastEncounterDungeon); + TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter %u (%s) marked as final for invalid dungeon id %u, skipped!", + entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()], lastEncounterDungeon); continue; } - std::map::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon); + std::map>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon); if (lastEncounterDungeon) { if (itr != dungeonLastBosses.end()) { - TC_LOG_ERROR("sql.sql", "Table `instance_encounters` specified encounter %u (%s) as last encounter but %u (%s) is already marked as one, skipped!", entry, dungeonEncounter->Name_lang, itr->second->ID, itr->second->Name_lang); + TC_LOG_ERROR("sql.sql", "Table `instance_encounters` specified encounter %u (%s) as last encounter but %u (%s) is already marked as one, skipped!", + entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()], itr->second.first, itr->second.second->Name->Str[sWorld->GetDefaultDbcLocale()]); continue; } - dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter; + dungeonLastBosses[lastEncounterDungeon] = std::make_pair(entry, dungeonEncounter); } switch (creditType) @@ -5324,7 +5324,8 @@ void ObjectMgr::LoadInstanceEncounters() CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry); if (!creatureInfo) { - TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->Name_lang); + TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry %u) linked to the encounter %u (%s), skipped!", + creditEntry, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]); continue; } const_cast(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS; @@ -5333,12 +5334,14 @@ void ObjectMgr::LoadInstanceEncounters() case ENCOUNTER_CREDIT_CAST_SPELL: if (!sSpellMgr->GetSpellInfo(creditEntry)) { - TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->Name_lang); + TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry %u) linked to the encounter %u (%s), skipped!", + creditEntry, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]); continue; } break; default: - TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type (%u) for encounter %u (%s), skipped!", creditType, entry, dungeonEncounter->Name_lang); + TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type (%u) for encounter %u (%s), skipped!", + creditType, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]); continue; } @@ -6894,7 +6897,7 @@ std::string ObjectMgr::GeneratePetName(uint32 entry) if (!cinfo) return std::string(); - char const* petname = GetCreatureFamilyPetName(cinfo->family, sWorld->GetDefaultDbcLocale()); + char const* petname = DB2Manager::GetCreatureFamilyPetName(cinfo->family, sWorld->GetDefaultDbcLocale()); if (petname) return std::string(petname); else @@ -9025,8 +9028,7 @@ void ObjectMgr::LoadTerrainPhaseInfo() uint32 phaseId = fields[0].GetUInt32(); - PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId); - if (!phase) + if (!sPhaseStore.LookupEntry(phaseId)) { TC_LOG_ERROR("sql.sql", "Phase %u defined in `terrain_phase_info` does not exist, skipped.", phaseId); continue; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index a43ec6c2202..a2634390cbc 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -199,7 +199,7 @@ void WorldSession::HandleWhoOpcode(WorldPackets::Who::WhoRequestPkt& whoRequest) { std::string aName; if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(target->GetZoneId())) - aName = areaEntry->AreaName_lang; + aName = areaEntry->AreaName->Str[GetSessionDbcLocale()]; bool show = false; for (size_t i = 0; i < wWords.size(); ++i) diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index dc008aa881e..a8d347a57a7 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -677,11 +677,12 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi DungeonEncounter const* encounter = *itr; if (encounter->creditType == type && encounter->creditEntry == creditEntry) { - completedEncounters |= 1 << encounter->dbcEntry->OrderIndex; + completedEncounters |= 1 << encounter->dbcEntry->Bit; if (encounter->lastEncounterDungeon) { dungeonId = encounter->lastEncounterDungeon; - TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u", instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name_lang, dungeonId); + TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u", + instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name->Str[sWorld->GetDefaultDbcLocale()], dungeonId); break; } } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index be4f71e8b71..2452c8f913e 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1586,10 +1586,9 @@ void LoadLootTemplates_Fishing() uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot - for (uint32 i = 1; i < sAreaTableStore.GetNumRows(); ++i) - if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i)) - if (lootIdSet.find(areaEntry->ID) != lootIdSet.end()) - lootIdSet.erase(areaEntry->ID); + for (auto itr = sAreaTableStore.begin(); itr != sAreaTableStore.end(); ++itr) + if (lootIdSet.find(itr.ID()) != lootIdSet.end()) + lootIdSet.erase(itr.ID()); // output error for any still listed (not referenced from appropriate table) ids LootTemplates_Fishing.ReportUnusedIds(lootIdSet); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 2389d8e0fc1..cce2671b69b 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2438,20 +2438,20 @@ uint32 Map::GetAreaId(float x, float y, float z, bool *isOutdoors) const WMOAreaTableEntry const* wmoEntry = nullptr; AreaTableEntry const* atEntry = nullptr; bool haveAreaInfo = false; + uint32 areaId = 0; if (GetAreaInfo(x, y, z, mogpFlags, adtId, rootId, groupId)) { haveAreaInfo = true; wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId); if (wmoEntry) + { + areaId = wmoEntry->AreaTableID; atEntry = sAreaTableStore.LookupEntry(wmoEntry->AreaTableID); + } } - uint32 areaId = 0; - - if (atEntry) - areaId = atEntry->ID; - else + if (!areaId) { if (GridMap* gmap = const_cast(this)->GetGrid(x, y)) areaId = gmap->getArea(x, y); @@ -2651,7 +2651,7 @@ bool Map::CheckGridIntegrity(Creature* c, bool moved) const char const* Map::GetMapName() const { - return i_mapEntry ? i_mapEntry->MapName_lang : "UNNAMEDMAP\x0"; + return i_mapEntry ? i_mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()] : "UNNAMEDMAP\x0"; } void Map::UpdateObjectVisibility(WorldObject* obj, Cell cell, CellCoord cellpair) diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 3acd04543ad..5a31bb822b4 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -148,7 +148,7 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool if (player->IsGameMaster()) return Map::CAN_ENTER; - char const* mapName = entry->MapName_lang; + char const* mapName = entry->MapName->Str[sWorld->GetDefaultDbcLocale()]; Group* group = player->GetGroup(); if (entry->IsRaid()) // can only enter in a raid group diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d5f3c0c5d77..ebf82122e00 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2386,7 +2386,7 @@ void SpellMgr::LoadPetLevelupSpellMap() if (!spell->SpellLevel) continue; - PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[creatureFamily->ID]; + PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[i]; if (spellSet.empty()) ++family_count; diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 6f59e6e40da..f9aca4b607b 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -270,7 +270,7 @@ public: if (titleInfo && target->HasTitle(titleInfo)) { - std::string name = target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang; + std::string name = (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()]; if (name.empty()) continue; diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 081280532fb..dd048ce3c57 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -504,12 +504,12 @@ public: if (map->Instanceable()) { - handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->AreaName_lang, map->GetId(), map->GetMapName()); + handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaId, areaEntry->AreaName->Str[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName()); handler->SetSentErrorMessage(true); return false; } - Zone2MapCoordinates(x, y, zoneEntry->ID); + Zone2MapCoordinates(x, y, areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId); if (!MapManager::IsValidMapCoord(zoneEntry->MapID, x, y)) { diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 33356409f17..47588000173 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -352,7 +352,7 @@ public: { AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID); if (zone) - zoneName = zone->AreaName_lang; + zoneName = zone->AreaName->Str[handler->GetSessionDbcLocale()]; } } else diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 4ff0d1a70a9..2b3752c00be 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -102,30 +102,48 @@ public: AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i); if (areaEntry) { - std::string name = areaEntry->AreaName_lang; + int32 locale = handler->GetSessionDbcLocale(); + std::string name = areaEntry->AreaName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = areaEntry->AreaName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - // send area in "id - [name]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << i << " - |cffffffff|Harea:" << i << "|h[" << name<< "]|h|r"; - else - ss << i << " - " << name; + if (locale < TOTAL_LOCALES) + { + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - handler->SendSysMessage(ss.str().c_str()); + // send area in "id - [name]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << i << " - |cffffffff|Harea:" << i << "|h[" << name << "]|h|r"; + else + ss << i << " - " << name; - if (!found) - found = true; + handler->SendSysMessage(ss.str().c_str()); + + if (!found) + found = true; + } } } @@ -1091,36 +1109,54 @@ public: if (target && target->getGender() != gender) continue; - std::string name = gender == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang; + int32 locale = handler->GetSessionDbcLocale(); + std::string name = (gender == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && counter == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = (gender == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; + if (locale < TOTAL_LOCALES) + { + if (maxResults && counter == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID - ? handler->GetTrinityString(LANG_ACTIVE) - : ""; + char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; - char titleNameStr[80]; - snprintf(titleNameStr, 80, name.c_str(), targetName); + char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID + ? handler->GetTrinityString(LANG_ACTIVE) + : ""; - // send title in "id (idx:idx) - [namedlink locale]" format - if (handler->GetSession()) - handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr); - else - handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr); + char titleNameStr[80]; + snprintf(titleNameStr, 80, name.c_str(), targetName); - ++counter; + // send title in "id (idx:idx) - [namedlink locale]" format + if (handler->GetSession()) + handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr); + else + handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr); + + ++counter; + } } } } @@ -1145,18 +1181,35 @@ public: uint32 counter = 0; uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS); - uint8 locale = handler->GetSession() ? handler->GetSession()->GetSessionDbcLocale() : sWorld->GetDefaultDbcLocale(); // search in Map.dbc for (uint32 id = 0; id < sMapStore.GetNumRows(); id++) { if (MapEntry const* mapInfo = sMapStore.LookupEntry(id)) { - std::string name = mapInfo->MapName_lang; + int32 locale = handler->GetSessionDbcLocale(); + std::string name = mapInfo->MapName->Str[locale]; if (name.empty()) continue; - if (Utf8FitTo(name, wNamePart) && locale < TOTAL_LOCALES) + if (!Utf8FitTo(name, wNamePart) && handler->GetSession()) + { + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = mapInfo->MapName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } + } + + if (locale < TOTAL_LOCALES) { if (maxResults && counter == maxResults) { diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index e6fb42853e3..d66a6d24cc2 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -235,9 +235,9 @@ public: char const* unknown = handler->GetTrinityString(LANG_UNKNOWN); handler->PSendSysMessage(LANG_MAP_POSITION, - mapId, (mapEntry ? mapEntry->MapName_lang : unknown), - zoneId, (zoneEntry ? zoneEntry->AreaName_lang : unknown), - areaId, (areaEntry ? areaEntry->AreaName_lang : unknown), + mapId, (mapEntry ? mapEntry->MapName->Str[handler->GetSessionDbcLocale()] : unknown), + zoneId, (zoneEntry ? zoneEntry->AreaName->Str[handler->GetSessionDbcLocale()] : unknown), + areaId, (areaEntry ? areaEntry->AreaName->Str[handler->GetSessionDbcLocale()] : unknown), object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); if (Transport* transport = object->GetTransport()) @@ -1816,15 +1816,15 @@ public: AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId); if (area) { - areaName = area->AreaName_lang; + areaName = area->AreaName->Str[handler->GetSessionDbcLocale()]; AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID); if (zone) - zoneName = zone->AreaName_lang; + zoneName = zone->AreaName->Str[handler->GetSessionDbcLocale()]; } if (target) - handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->MapName_lang, + handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->MapName->Str[handler->GetSessionDbcLocale()], (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN))); diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index 85f4a43b3e4..11c9921a90c 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -93,7 +93,9 @@ public: target->SetTitle(titleInfo); // to be sure that title now known target->SetUInt32Value(PLAYER_CHOSEN_TITLE, titleInfo->MaskID); - handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, tNameLink.c_str()); + handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, + (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()], + tNameLink.c_str()); return true; } @@ -135,7 +137,9 @@ public: std::string tNameLink = handler->GetNameLink(target); char titleNameStr[80]; - snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, target->GetName().c_str()); + snprintf(titleNameStr, 80, + (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()], + target->GetName().c_str()); target->SetTitle(titleInfo); handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str()); @@ -183,7 +187,9 @@ public: std::string tNameLink = handler->GetNameLink(target); char titleNameStr[80]; - snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, target->GetName().c_str()); + snprintf(titleNameStr, 80, + (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()], + target->GetName().c_str()); handler->PSendSysMessage(LANG_TITLE_REMOVE_RES, id, titleNameStr, tNameLink.c_str()); diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.h b/src/server/shared/DataStores/DB2SparseStorageLoader.h index 13f31e12d56..ac75e6b82d5 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.h +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h @@ -65,6 +65,7 @@ class DB2SparseFileLoader uint32 GetNumRows() const { return recordCount; } uint32 GetCols() const { return fieldCount; } uint32 GetHash() const { return tableHash; } + uint32 GetBuild() const { return build; } bool IsLoaded() const { return (data != NULL); } char* AutoProduceData(const char* fmt, IndexTable const& indexTable, uint32 locale, std::vector& stringPool); char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index 67525779ef5..c84f38b74b9 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -92,6 +92,7 @@ class TC_SHARED_API DB2FileLoader uint32 GetCols() const { return fieldCount; } uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; } uint32 GetHash() const { return tableHash; } + uint32 GetBuild() const { return build; } bool IsLoaded() const { return (data != NULL); } char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable); char* AutoProduceStringsArrayHolders(const char* fmt, char* dataTable); diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index 570e8174a39..d1542faa194 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -29,7 +29,7 @@ class DB2StorageBase { public: DB2StorageBase(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : _tableHash(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } + : _tableHash(0), _build(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } virtual ~DB2StorageBase() { @@ -41,6 +41,8 @@ public: uint32 GetHash() const { return _tableHash; } + uint32 GetBuild() const { return _build; } + virtual bool HasRecord(uint32 id) const = 0; virtual void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const = 0; @@ -114,6 +116,7 @@ protected: } uint32 _tableHash; + uint32 _build; std::string _fileName; uint32 _fieldCount; char const* _format; @@ -163,6 +166,7 @@ public: _fieldCount = db2.GetCols(); _tableHash = db2.GetHash(); + _build = db2.GetBuild(); // load raw non-string data _dataTable = db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar); @@ -233,7 +237,17 @@ class DB2SparseStorage : public DB2StorageBase static_assert(std::is_pod::value, "T in DB2SparseStorage must be POD-type."); public: - typedef typename std::unordered_map::const_iterator iterator; + typedef struct iterator_wrapper : public std::unordered_map::const_iterator + { + typedef typename std::unordered_map::const_iterator Base; + + iterator_wrapper() = default; + iterator_wrapper(iterator_wrapper const& right) = default; + iterator_wrapper(Base const& baseItr) : Base(baseItr) { } + + uint32 ID() const { return (*this)->first; } + T const* Data() const { return (*this)->second; } + } iterator; DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, format, preparedStmtIndex) @@ -273,6 +287,7 @@ public: _fieldCount = db2.GetCols(); _tableHash = db2.GetHash(); + _build = db2.GetBuild(); // load raw non-string data _dataTable = db2.AutoProduceData(_format, IndexTableAdapter(_indexTable), locale, _stringPool); @@ -312,8 +327,8 @@ public: DB2SparseDatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter(_indexTable), _stringPool); } - iterator begin() const { return _indexTable.begin(); } - iterator end() const { return _indexTable.end(); } + iterator begin() const { return iterator(_indexTable.begin()); } + iterator end() const { return iterator(_indexTable.end()); } private: std::unordered_map _indexTable; diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp index ec3a95f74b9..ace59bb9ebb 100644 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ b/src/server/shared/DataStores/DBCFileLoader.cpp @@ -182,11 +182,11 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** if (i >= 0) { - int32 maxi = 0; + uint32 maxi = 0; //find max index for (uint32 y = 0; y < recordCount; ++y) { - int32 ind = int32(getRecord(y).getUInt(i)); + uint32 ind = getRecord(y).getUInt(i); if (ind > maxi) maxi = ind; } @@ -213,10 +213,7 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** for (uint32 y = 0; y < recordCount; ++y) { if (i >= 0) - { - if (int32(getRecord(y).getUInt(i)) >= 0) - indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; - } + indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; else indexTable[y] = &dataTable[offset]; diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h index 8e7d03f2756..3f9fa6eed24 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -35,8 +35,8 @@ public: } } - uint32 Key() const { return _pos; } - T const* Value() const { return _index[_pos]; } + uint32 ID() const { return _pos; } + T const* Data() const { return _index[_pos]; } T const* operator->() { return _index[_pos]; } T const* operator*() { return _index[_pos]; } -- cgit v1.2.3 From 70102f32fe38ae7d49acbd5ddee0239602d3cb94 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 25 Apr 2016 22:03:34 +0200 Subject: Core/DataStores: Updated opcodes and db2 to 7.0.3.21414 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql | 2 +- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql | 801 ++++++++++ src/common/Define.h | 22 +- .../Database/Implementation/HotfixDatabase.cpp | 192 ++- .../Database/Implementation/HotfixDatabase.h | 49 +- src/server/game/Addons/AddonMgr.cpp | 2 +- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 1 - src/server/game/AuctionHouse/AuctionHouseMgr.h | 1 - .../game/AuctionHouseBot/AuctionHouseBotSeller.cpp | 1 - src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- src/server/game/Chat/ChatLink.cpp | 1 - src/server/game/Combat/HostileRefManager.cpp | 1 - src/server/game/Conditions/DisableMgr.cpp | 8 +- src/server/game/DataStores/DB2Stores.cpp | 344 ++++- src/server/game/DataStores/DB2Stores.h | 62 +- src/server/game/DataStores/DB2Structure.h | 613 +++++++- src/server/game/DataStores/DB2fmt.h | 69 +- src/server/game/DataStores/DBCEnums.h | 21 +- src/server/game/DataStores/DBCStores.cpp | 564 ------- src/server/game/DataStores/DBCStores.h | 131 -- src/server/game/DataStores/DBCStructure.h | 614 -------- src/server/game/DataStores/DBCfmt.h | 18 - src/server/game/DataStores/GameTables.cpp | 133 ++ src/server/game/DataStores/GameTables.h | 228 +++ src/server/game/DungeonFinding/LFGMgr.cpp | 23 +- src/server/game/DungeonFinding/LFGMgr.h | 13 +- src/server/game/DungeonFinding/LFGQueue.cpp | 2 - src/server/game/Entities/Item/Item.cpp | 5 +- .../game/Entities/Item/ItemEnchantmentMgr.cpp | 1 - src/server/game/Entities/Item/ItemTemplate.cpp | 1 - src/server/game/Entities/Item/ItemTemplate.h | 3 +- src/server/game/Entities/Player/Player.cpp | 324 +++-- src/server/game/Entities/Player/Player.h | 4 - src/server/game/Entities/Taxi/TaxiPathGraph.cpp | 1 - src/server/game/Entities/Transport/Transport.cpp | 1 - src/server/game/Entities/Unit/StatSystem.cpp | 13 +- src/server/game/Entities/Unit/Unit.cpp | 27 +- src/server/game/Entities/Unit/Unit.h | 25 +- src/server/game/Garrison/Garrison.cpp | 26 +- src/server/game/Garrison/Garrison.h | 1 - src/server/game/Garrison/GarrisonMgr.cpp | 20 +- src/server/game/Garrison/GarrisonMgr.h | 6 +- src/server/game/Globals/ObjectMgr.cpp | 47 +- src/server/game/Globals/ObjectMgr.h | 2 +- src/server/game/Groups/Group.cpp | 4 +- src/server/game/Groups/GroupMgr.cpp | 1 - src/server/game/Guilds/Guild.cpp | 6 +- src/server/game/Guilds/Guild.h | 1 - src/server/game/Handlers/CharacterHandler.cpp | 16 - src/server/game/Handlers/ItemHandler.cpp | 17 +- src/server/game/Handlers/MailHandler.cpp | 1 - src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 4 +- src/server/game/Handlers/ReferAFriendHandler.cpp | 24 + src/server/game/Handlers/SpellHandler.cpp | 1 - src/server/game/Instances/InstanceSaveMgr.cpp | 18 +- src/server/game/Loot/LootMgr.cpp | 6 +- src/server/game/Maps/Map.cpp | 72 +- src/server/game/Maps/Map.h | 61 +- src/server/game/Maps/MapInstanced.cpp | 2 +- src/server/game/Maps/MapManager.cpp | 2 +- src/server/game/Maps/TransportMgr.h | 1 - src/server/game/Miscellaneous/Formulas.h | 30 +- src/server/game/Reputation/ReputationMgr.cpp | 11 +- src/server/game/Reputation/ReputationMgr.h | 1 - src/server/game/Scripting/ScriptMgr.cpp | 1 - src/server/game/Scripting/ScriptMgr.h | 3 +- .../game/Server/Packets/CharacterPackets.cpp | 10 - src/server/game/Server/Packets/CharacterPackets.h | 20 - src/server/game/Server/Packets/GarrisonPackets.h | 3 +- src/server/game/Server/Packets/TaxiPackets.h | 1 - src/server/game/Server/Protocol/Opcodes.cpp | 2 - src/server/game/Server/Protocol/Opcodes.h | 1534 ++++++++++---------- src/server/game/Server/WorldSession.h | 6 - src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/game/Spells/SpellInfo.cpp | 26 +- src/server/game/Spells/SpellInfo.h | 3 +- src/server/game/Spells/SpellMgr.cpp | 1 - src/server/game/Spells/SpellMgr.h | 1 - src/server/game/Tools/CharacterDatabaseCleaner.cpp | 1 - src/server/game/World/World.cpp | 7 +- src/server/scripts/Commands/cs_character.cpp | 2 +- src/server/scripts/Commands/cs_debug.cpp | 6 +- src/server/scripts/Commands/cs_go.cpp | 2 +- src/server/scripts/Commands/cs_lookup.cpp | 97 +- src/server/scripts/Commands/cs_misc.cpp | 10 +- src/server/scripts/Commands/cs_modify.cpp | 4 +- src/server/scripts/ScriptPCH.h | 3 +- src/server/scripts/Spells/spell_item.cpp | 1 - src/server/scripts/Spells/spell_mage.cpp | 2 + src/server/scripts/Spells/spell_pet.cpp | 24 +- .../shared/DataStores/DB2SparseStorageLoader.cpp | 19 +- src/server/shared/DataStores/DB2StorageLoader.cpp | 65 +- src/server/shared/DataStores/DB2Store.h | 4 +- src/server/shared/DataStores/DBCFileLoader.cpp | 314 ---- src/server/shared/DataStores/DBCFileLoader.h | 105 -- src/server/shared/DataStores/DBCStore.h | 325 ----- src/server/shared/DataStores/DBStorageIterator.h | 3 - 98 files changed, 3721 insertions(+), 3592 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql delete mode 100644 src/server/game/DataStores/DBCStores.cpp delete mode 100644 src/server/game/DataStores/DBCStores.h delete mode 100644 src/server/game/DataStores/DBCStructure.h create mode 100644 src/server/game/DataStores/GameTables.cpp create mode 100644 src/server/game/DataStores/GameTables.h delete mode 100644 src/server/shared/DataStores/DBCFileLoader.cpp delete mode 100644 src/server/shared/DataStores/DBCFileLoader.h delete mode 100644 src/server/shared/DataStores/DBCStore.h (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql index f90c81333a9..5011a0bd29d 100644 --- a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql @@ -2132,7 +2132,7 @@ ALTER TABLE `spell_power` -- Table structure for table `spell_power_difficulty` -- ALTER TABLE `spell_power_difficulty` DROP PRIMARY KEY; -ALTER TABLE `spell_power_difficulty` ADD `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, +ALTER TABLE `spell_power_difficulty` MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellPowerID`, MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; ALTER TABLE `spell_power_difficulty` ADD PRIMARY KEY (`ID`); diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql new file mode 100644 index 00000000000..d8bf16bf9d6 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql @@ -0,0 +1,801 @@ +-- +-- Table structure for table `area_table` +-- +ALTER TABLE `area_table` CHANGE `UWIntroMusic` `UWIntroMusic` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LiquidTypeID4`; + +-- +-- Table structure for table `banned_addons` +-- +DROP TABLE IF EXISTS `banned_addons`; +CREATE TABLE `banned_addons` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Version` text, + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `battlemaster_list` +-- +DROP TABLE IF EXISTS `battlemaster_list`; +CREATE TABLE `battlemaster_list` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `GameType` text, + `MapID1` smallint(6) NOT NULL DEFAULT '0', + `MapID2` smallint(6) NOT NULL DEFAULT '0', + `MapID3` smallint(6) NOT NULL DEFAULT '0', + `MapID4` smallint(6) NOT NULL DEFAULT '0', + `MapID5` smallint(6) NOT NULL DEFAULT '0', + `MapID6` smallint(6) NOT NULL DEFAULT '0', + `MapID7` smallint(6) NOT NULL DEFAULT '0', + `MapID8` smallint(6) NOT NULL DEFAULT '0', + `MapID9` smallint(6) NOT NULL DEFAULT '0', + `MapID10` smallint(6) NOT NULL DEFAULT '0', + `MapID11` smallint(6) NOT NULL DEFAULT '0', + `MapID12` smallint(6) NOT NULL DEFAULT '0', + `MapID13` smallint(6) NOT NULL DEFAULT '0', + `MapID14` smallint(6) NOT NULL DEFAULT '0', + `MapID15` smallint(6) NOT NULL DEFAULT '0', + `MapID16` smallint(6) NOT NULL DEFAULT '0', + `HolidayWorldState` smallint(5) unsigned NOT NULL DEFAULT '0', + `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `InstanceType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GroupsAllowed` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxGroupSize` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RatedPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `battlemaster_list_locale` +-- +DROP TABLE IF EXISTS `battlemaster_list_locale`; +CREATE TABLE `battlemaster_list_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `GameType_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `char_sections` +-- +DROP TABLE IF EXISTS `char_sections`; +CREATE TABLE `char_sections` ( + `Id` int(10) unsigned NOT NULL DEFAULT '0', + `TextureFileDataID1` int(10) unsigned NOT NULL DEFAULT '0', + `TextureFileDataID2` int(10) unsigned NOT NULL DEFAULT '0', + `TextureFileDataID3` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `Race` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Gender` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GenType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Color` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_classes` +-- +DROP TABLE IF EXISTS `chr_classes`; +CREATE TABLE `chr_classes` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PetNameToken` text, + `Name` text, + `NameFemale` text, + `NameMale` text, + `Filename` text, + `CreateScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `SelectScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `LowResScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `CinematicSequenceID` smallint(5) unsigned NOT NULL DEFAULT '0', + `DefaultSpec` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0', + `AttackPowerPerStrength` tinyint(3) unsigned NOT NULL DEFAULT '0', + `AttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RangedAttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0', + `IconFileDataID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Unk1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_classes_locale` +-- +DROP TABLE IF EXISTS `chr_classes_locale`; +CREATE TABLE `chr_classes_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `NameFemale_lang` text, + `NameMale_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_races` +-- +ALTER TABLE `chr_races` ADD `ItemAppearanceFrameRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NeutralRaceID`; + +-- +-- Table structure for table `creature_display_info` +-- +ALTER TABLE `creature_display_info` ADD `InstanceOtherPlayerPetScale` float NOT NULL DEFAULT '0' AFTER `StateSpellVisualKitID`; + +-- +-- Table structure for table `creature_model_data` +-- +DROP TABLE IF EXISTS `creature_model_data`; +CREATE TABLE `creature_model_data` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `FileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `ModelScale` float NOT NULL DEFAULT '0', + `FootprintTextureLength` float NOT NULL DEFAULT '0', + `FootprintTextureWidth` float NOT NULL DEFAULT '0', + `FootprintParticleScale` float NOT NULL DEFAULT '0', + `CollisionWidth` float NOT NULL DEFAULT '0', + `CollisionHeight` float NOT NULL DEFAULT '0', + `MountHeight` float NOT NULL DEFAULT '0', + `GeoBoxMin1` float NOT NULL DEFAULT '0', + `GeoBoxMin2` float NOT NULL DEFAULT '0', + `GeoBoxMin3` float NOT NULL DEFAULT '0', + `GeoBoxMax1` float NOT NULL DEFAULT '0', + `GeoBoxMax2` float NOT NULL DEFAULT '0', + `GeoBoxMax3` float NOT NULL DEFAULT '0', + `WorldEffectScale` float NOT NULL DEFAULT '0', + `AttachedEffectScale` float NOT NULL DEFAULT '0', + `MissileCollisionRadius` float NOT NULL DEFAULT '0', + `MissileCollisionPush` float NOT NULL DEFAULT '0', + `MissileCollisionRaise` float NOT NULL DEFAULT '0', + `OverrideLootEffectScale` float NOT NULL DEFAULT '0', + `OverrideNameScale` float NOT NULL DEFAULT '0', + `OverrideSelectionRadius` float NOT NULL DEFAULT '0', + `TamedPetBaseScale` float NOT NULL DEFAULT '0', + `HoverHeight` float NOT NULL DEFAULT '0', + `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureGeosetDataID` smallint(5) unsigned NOT NULL DEFAULT '0', + `SizeClass` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BloodID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FootprintTextureID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FoleyMaterialID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Unk700_1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Unk700_2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FootstepShakeSize` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DeathThudShakeSize` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `emotes` +-- +ALTER TABLE `emotes` + ADD `Unk703_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EmoteFlags`, + ADD `Unk703_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unk703_1`, + CHANGE `EmoteSpecProcParam` `EmoteSpecProcParam` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AnimID`; + +-- +-- Table structure for table `faction` +-- +DROP TABLE IF EXISTS `faction`; +CREATE TABLE `faction` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ReputationRaceMask1` int(10) unsigned NOT NULL DEFAULT '0', + `ReputationRaceMask2` int(10) unsigned NOT NULL DEFAULT '0', + `ReputationRaceMask3` int(10) unsigned NOT NULL DEFAULT '0', + `ReputationRaceMask4` int(10) unsigned NOT NULL DEFAULT '0', + `ReputationBase1` int(11) NOT NULL DEFAULT '0', + `ReputationBase2` int(11) NOT NULL DEFAULT '0', + `ReputationBase3` int(11) NOT NULL DEFAULT '0', + `ReputationBase4` int(11) NOT NULL DEFAULT '0', + `ParentFactionModIn` float NOT NULL DEFAULT '0', + `ParentFactionModOut` float NOT NULL DEFAULT '0', + `Name` text, + `Description` text, + `ReputationIndex` smallint(6) NOT NULL DEFAULT '0', + `ReputationClassMask1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationClassMask2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationClassMask3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationClassMask4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationFlags1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationFlags2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationFlags3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReputationFlags4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ParentFactionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ParentFactionCapIn` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ParentFactionCapOut` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Expansion` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FriendshipRepID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `faction_locale` +-- +DROP TABLE IF EXISTS `faction_locale`; +CREATE TABLE `faction_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `Description_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `faction_template` +-- +DROP TABLE IF EXISTS `faction_template`; +CREATE TABLE `faction_template` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Faction` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `Enemies1` smallint(5) unsigned NOT NULL DEFAULT '0', + `Enemies2` smallint(5) unsigned NOT NULL DEFAULT '0', + `Enemies3` smallint(5) unsigned NOT NULL DEFAULT '0', + `Enemies4` smallint(5) unsigned NOT NULL DEFAULT '0', + `Friends1` smallint(5) unsigned NOT NULL DEFAULT '0', + `Friends2` smallint(5) unsigned NOT NULL DEFAULT '0', + `Friends3` smallint(5) unsigned NOT NULL DEFAULT '0', + `Friends4` smallint(5) unsigned NOT NULL DEFAULT '0', + `Mask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FriendMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EnemyMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `garr_ability` +-- +ALTER TABLE `garr_ability` CHANGE `Flags` `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +-- +-- Table structure for table `garr_ability` +-- +ALTER TABLE `garr_class_spec` + ADD `Limit` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollItemSetID`, + CHANGE `Unknown700` `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Limit`; + +-- +-- Table structure for table `garr_follower` +-- +ALTER TABLE `garr_follower` + ADD `MaxDurability` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrTypeID`, + ADD `Class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxDurability`; + +-- +-- Table structure for table `garr_plot` +-- +ALTER TABLE `garr_plot` CHANGE `MinCount` `MinCount` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeConstructionGameObjectID`; +ALTER TABLE `garr_plot` CHANGE `MaxCount` `MaxCount` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinCount`; + +-- +-- Table structure for table `gem_properties` +-- +ALTER TABLE `gem_properties` + DROP `MaxCountInv`, + DROP COLUMN `MaxCountItem`; + +-- +-- Table structure for table `glyph_slot` +-- +ALTER TABLE `glyph_slot` MODIFY COLUMN `Tooltip` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +-- +-- Table structure for table `guild_perk_spells` +-- +ALTER TABLE `guild_perk_spells` DROP COLUMN `GuildLevel`; + +-- +-- Table structure for table `item_appearance` +-- +ALTER TABLE `item_appearance` ADD COLUMN `UIOrder` int(10) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +-- +-- Table structure for table `item_modified_appearance` +-- +ALTER TABLE `item_modified_appearance` ADD COLUMN `SourceType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Index`; + +-- +-- Table structure for table `item_set` +-- +ALTER TABLE `item_set` ADD COLUMN `Unknown703` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID17`; + +-- +-- Table structure for table `item_sparse` +-- +ALTER TABLE `item_sparse` ADD COLUMN `RequiredExpansion` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ArtifactID`; + +-- +-- Table structure for table `lfg_dungeons` +-- +DROP TABLE IF EXISTS `lfg_dungeons`; +CREATE TABLE `lfg_dungeons` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `TextureFilename` text, + `Description` text, + `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `TargetLevelMax` smallint(5) unsigned NOT NULL DEFAULT '0', + `MapID` smallint(6) NOT NULL DEFAULT '0', + `RandomID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ScenarioID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LastBossJournalEncounterID` smallint(5) unsigned NOT NULL DEFAULT '0', + `BonusReputationAmount` smallint(5) unsigned NOT NULL DEFAULT '0', + `MentorItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TargetLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TargetLevelMin` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Type` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Faction` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Expansion` tinyint(3) unsigned NOT NULL DEFAULT '0', + `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `GroupID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CountTank` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCountTank` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SubType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MentorCharLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `lfg_dungeons_locale` +-- +DROP TABLE IF EXISTS `lfg_dungeons_locale`; +CREATE TABLE `lfg_dungeons_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `Description_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `light` +-- +DROP TABLE IF EXISTS `light`; +CREATE TABLE `light` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `PosX` float NOT NULL DEFAULT '0', + `PosY` float NOT NULL DEFAULT '0', + `PosZ` float NOT NULL DEFAULT '0', + `FalloffStart` float NOT NULL DEFAULT '0', + `FalloffEnd` float NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID5` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID6` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID7` smallint(5) unsigned NOT NULL DEFAULT '0', + `LightParamsID8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `liquid_type` +-- +DROP TABLE IF EXISTS `liquid_type`; +CREATE TABLE `liquid_type` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `MaxDarkenDepth` float NOT NULL DEFAULT '0', + `FogDarkenIntensity` float NOT NULL DEFAULT '0', + `AmbDarkenIntensity` float NOT NULL DEFAULT '0', + `DirDarkenIntensity` float NOT NULL DEFAULT '0', + `ParticleScale` float NOT NULL DEFAULT '0', + `Texture1` text, + `Texture2` text, + `Texture3` text, + `Texture4` text, + `Texture5` text, + `Texture6` text, + `Color1` int(10) unsigned NOT NULL DEFAULT '0', + `Color2` int(10) unsigned NOT NULL DEFAULT '0', + `Float1` float NOT NULL DEFAULT '0', + `Float2` float NOT NULL DEFAULT '0', + `Float3` float NOT NULL DEFAULT '0', + `Float4` float NOT NULL DEFAULT '0', + `Float5` float NOT NULL DEFAULT '0', + `Float6` float NOT NULL DEFAULT '0', + `Float7` float NOT NULL DEFAULT '0', + `Float8` float NOT NULL DEFAULT '0', + `Float9` float NOT NULL DEFAULT '0', + `Float10` float NOT NULL DEFAULT '0', + `Float11` float NOT NULL DEFAULT '0', + `Float12` float NOT NULL DEFAULT '0', + `Float13` float NOT NULL DEFAULT '0', + `Float14` float NOT NULL DEFAULT '0', + `Float15` float NOT NULL DEFAULT '0', + `Float16` float NOT NULL DEFAULT '0', + `Float17` float NOT NULL DEFAULT '0', + `Float18` float NOT NULL DEFAULT '0', + `Int1` int(10) unsigned NOT NULL DEFAULT '0', + `Int2` int(10) unsigned NOT NULL DEFAULT '0', + `Int3` int(10) unsigned NOT NULL DEFAULT '0', + `Int4` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Type` tinyint(3) unsigned NOT NULL DEFAULT '0', + `LightID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ParticleMovement` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ParticleTexSlots` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaterialID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount4` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount5` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DepthTexCount6` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `liquid_type_locale` +-- +DROP TABLE IF EXISTS `liquid_type_locale`; +CREATE TABLE `liquid_type_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `map` +-- +ALTER TABLE `map` DROP `RaidOffset`; + +-- +-- Table structure for table `map_difficulty` +-- +DROP TABLE IF EXISTS `map_difficulty`; +CREATE TABLE `map_difficulty` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Message` text, + `Context` int(10) unsigned NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RaidDurationType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0', + `LockID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ItemBonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `map_difficulty_locale` +-- +DROP TABLE IF EXISTS `map_difficulty_locale`; +CREATE TABLE `map_difficulty_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Message_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `mount_capability` +-- +ALTER TABLE `mount_capability` MODIFY COLUMN `RequiredAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +-- +-- Table structure for table `quest_sort` +-- +ALTER TABLE `quest_sort` ADD COLUMN `SortOrder` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SortName`; + +-- +-- Table structure for table `rand_prop_points` +-- +ALTER TABLE `rand_prop_points` + CHANGE `EpicPropertiesPoints1` `EpicPropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + CHANGE `EpicPropertiesPoints2` `EpicPropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints1`, + CHANGE `EpicPropertiesPoints3` `EpicPropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints2`, + CHANGE `EpicPropertiesPoints4` `EpicPropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints3`, + CHANGE `EpicPropertiesPoints5` `EpicPropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints4`, + CHANGE `RarePropertiesPoints1` `RarePropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints5`, + CHANGE `RarePropertiesPoints2` `RarePropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints1`, + CHANGE `RarePropertiesPoints3` `RarePropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints2`, + CHANGE `RarePropertiesPoints4` `RarePropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints3`, + CHANGE `RarePropertiesPoints5` `RarePropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints4`, + CHANGE `UncommonPropertiesPoints1` `UncommonPropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints5`, + CHANGE `UncommonPropertiesPoints2` `UncommonPropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints1`, + CHANGE `UncommonPropertiesPoints3` `UncommonPropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints2`, + CHANGE `UncommonPropertiesPoints4` `UncommonPropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints3`, + CHANGE `UncommonPropertiesPoints5` `UncommonPropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints4`; + +-- +-- Table structure for table `skill_race_class_info` +-- +ALTER TABLE `skill_race_class_info` MODIFY COLUMN `ClassMask` int(11) NOT NULL DEFAULT '0' AFTER `RaceMask`; + +-- +-- Table structure for table `sound_kit` +-- +ALTER TABLE `sound_kit` + CHANGE `BusOverwriteID` `BusOverwriteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundEntriesAdvancedID`, + CHANGE `SoundType` `SoundType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BusOverwriteID`; + +-- +-- Table structure for table `spell_category` +-- +ALTER TABLE `spell_category` ADD COLUMN `Unk703` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ChargeRecoveryTime`; + +-- +-- Table structure for table `spell_item_enchantment` +-- +DROP TABLE IF EXISTS `spell_item_enchantment`; +CREATE TABLE `spell_item_enchantment` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellID1` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellID2` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellID3` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `EffectScalingPoints1` float NOT NULL DEFAULT '0', + `EffectScalingPoints2` float NOT NULL DEFAULT '0', + `EffectScalingPoints3` float NOT NULL DEFAULT '0', + `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0', + `TransmogCost` int(10) unsigned NOT NULL DEFAULT '0', + `TextureFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectPointsMin1` smallint(5) unsigned NOT NULL DEFAULT '0', + `EffectPointsMin2` smallint(5) unsigned NOT NULL DEFAULT '0', + `EffectPointsMin3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ItemVisual` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredSkillID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `Charges` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Effect1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Effect2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Effect3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ConditionID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ScalingClass` tinyint(4) NOT NULL DEFAULT '0', + `ScalingClassRestricted` tinyint(4) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_item_enchantment_locale` +-- +DROP TABLE IF EXISTS `spell_item_enchantment_locale`; +CREATE TABLE `spell_item_enchantment_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_scaling` +-- +ALTER TABLE `spell_scaling` ADD COLUMN `MinScalingLevel` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `ScalingClass`; + +-- +-- Table structure for table `talent` +-- +DROP TABLE IF EXISTS `talent`; +CREATE TABLE `talent` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `OverridesSpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Description` text, + `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0', + `TierID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ColumnIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CategoryMask1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CategoryMask2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `talent_locale` +-- +DROP TABLE IF EXISTS `talent_locale`; +CREATE TABLE `talent_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Description_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `vehicle` +-- +DROP TABLE IF EXISTS `vehicle`; +CREATE TABLE `vehicle` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `TurnSpeed` float NOT NULL DEFAULT '0', + `PitchSpeed` float NOT NULL DEFAULT '0', + `PitchMin` float NOT NULL DEFAULT '0', + `PitchMax` float NOT NULL DEFAULT '0', + `MouseLookOffsetPitch` float NOT NULL DEFAULT '0', + `CameraFadeDistScalarMin` float NOT NULL DEFAULT '0', + `CameraFadeDistScalarMax` float NOT NULL DEFAULT '0', + `CameraPitchOffset` float NOT NULL DEFAULT '0', + `FacingLimitRight` float NOT NULL DEFAULT '0', + `FacingLimitLeft` float NOT NULL DEFAULT '0', + `MsslTrgtTurnLingering` float NOT NULL DEFAULT '0', + `MsslTrgtPitchLingering` float NOT NULL DEFAULT '0', + `MsslTrgtMouseLingering` float NOT NULL DEFAULT '0', + `MsslTrgtEndOpacity` float NOT NULL DEFAULT '0', + `MsslTrgtArcSpeed` float NOT NULL DEFAULT '0', + `MsslTrgtArcRepeat` float NOT NULL DEFAULT '0', + `MsslTrgtArcWidth` float NOT NULL DEFAULT '0', + `MsslTrgtImpactRadius1` float NOT NULL DEFAULT '0', + `MsslTrgtImpactRadius2` float NOT NULL DEFAULT '0', + `MsslTrgtArcTexture` text, + `MsslTrgtImpactTexture` text, + `MsslTrgtImpactModel1` text, + `MsslTrgtImpactModel2` text, + `CameraYawOffset` float NOT NULL DEFAULT '0', + `MsslTrgtImpactTexRadius` float NOT NULL DEFAULT '0', + `SeatID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID5` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID6` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID7` smallint(5) unsigned NOT NULL DEFAULT '0', + `SeatID8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VehicleUIIndicatorID` smallint(5) unsigned NOT NULL DEFAULT '0', + `PowerDisplayID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `PowerDisplayID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `PowerDisplayID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `FlagsB` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UILocomotionType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `vehicle_seat` +-- +ALTER TABLE `vehicle_seat` + CHANGE `EnterUISoundID` `EnterUISoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `VehicleExitAnimDelay`, + CHANGE `ExitUISoundID` `ExitUISoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EnterUISoundID`; + +-- +-- Table structure for table `wmo_area_table` +-- +DROP TABLE IF EXISTS `wmo_area_table`; +CREATE TABLE `wmo_area_table` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `WMOGroupID` int(11) NOT NULL DEFAULT '0', + `AreaName` text, + `WMOID` smallint(6) NOT NULL DEFAULT '0', + `AmbienceID` int(10) unsigned NOT NULL DEFAULT '0', + `ZoneMusic` int(10) unsigned NOT NULL DEFAULT '0', + `IntroSound` int(10) unsigned NOT NULL DEFAULT '0', + `AreaTableID` int(10) unsigned NOT NULL DEFAULT '0', + `UWIntroSound` int(10) unsigned NOT NULL DEFAULT '0', + `UWAmbience` int(10) unsigned NOT NULL DEFAULT '0', + `NameSet` tinyint(4) NOT NULL DEFAULT '0', + `SoundProviderPref` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SoundProviderPrefUnderwater` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UWZoneMusic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `wmo_area_table_locale` +-- +DROP TABLE IF EXISTS `wmo_area_table_locale`; +CREATE TABLE `wmo_area_table_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `AreaName_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `world_map_area` +-- +DROP TABLE IF EXISTS `world_map_area`; +CREATE TABLE `world_map_area` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `AreaName` text, + `LocLeft` float NOT NULL DEFAULT '0', + `LocRight` float NOT NULL DEFAULT '0', + `LocTop` float NOT NULL DEFAULT '0', + `LocBottom` float NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AreaID` smallint(5) unsigned NOT NULL DEFAULT '0', + `DisplayMapID` smallint(6) NOT NULL DEFAULT '0', + `DefaultDungeonFloor` smallint(6) NOT NULL DEFAULT '0', + `ParentWorldMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LevelRangeMin` tinyint(3) unsigned NOT NULL DEFAULT '0', + `LevelRangeMax` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BountySetID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BountyBoardLocation` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `world_map_overlay` +-- +ALTER TABLE `world_map_overlay` ADD `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`; + +-- +-- Table structure for table `world_safe_locs` +-- +DROP TABLE IF EXISTS `world_safe_locs`; +CREATE TABLE `world_safe_locs` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `LocX` float NOT NULL DEFAULT '0', + `LocY` float NOT NULL DEFAULT '0', + `LocZ` float NOT NULL DEFAULT '0', + `Facing` float NOT NULL DEFAULT '0', + `AreaName` text, + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `world_safe_locs_locale` +-- +DROP TABLE IF EXISTS `world_safe_locs_locale`; +CREATE TABLE `world_safe_locs_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `AreaName_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +DROP TABLE `game_tables`; +DROP TABLE `game_tables_locale`; +DROP TABLE `item_to_battle_pet_species`; diff --git a/src/common/Define.h b/src/common/Define.h index c9eb42791e9..5bbb77916f5 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -159,19 +159,15 @@ typedef uint8_t uint8; enum DBCFormer { - FT_NA = 'x', //not used or unknown, 4 byte size - FT_NA_BYTE = 'X', //not used or unknown, byte - FT_STRING = 's', //char* - FT_STRING_NOT_LOCALIZED = 'S', //char* but without locale in DB2 - FT_FLOAT = 'f', //float - FT_INT = 'i', //uint32 - FT_BYTE = 'b', //uint8 - FT_LONG = 'l', //uint64 - FT_SHORT = 'h', //uint16 - FT_SORT = 'd', //sorted by this field, field is not included - FT_IND = 'n', //the same, but parsed to data - FT_SQL_PRESENT = 'p', //Used in sql format to mark column present in sql dbc - FT_SQL_ABSENT = 'a' //Used in sql format to mark column absent in sql dbc + FT_STRING = 's', // LocalizedString* + FT_STRING_NOT_LOCALIZED = 'S', // char* + FT_FLOAT = 'f', // float + FT_INT = 'i', // uint32 + FT_BYTE = 'b', // uint8 + FT_LONG = 'l', // uint64 + FT_SHORT = 'h', // uint16 + FT_SORT = 'd', // sorted by this field but not present in DB2 data block (calculated) + FT_IND = 'n' // sorted by this field }; #endif //TRINITY_DEFINE_H diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 9b9363f6724..e40be4e167a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -43,8 +43,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() // AreaTable.db2 PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, Flags1, Flags2, ZoneName, AmbientMultiplier, AreaName, MapID, ParentAreaID, AreaBit, " - "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWZoneMusic, UWAmbience, " - "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, UWIntroMusic, " + "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWIntroMusic, UWZoneMusic, UWAmbience, " + "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, " "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -62,6 +62,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() // BankBagSlotPrices.db2 PrepareStatement(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices ORDER BY ID DESC", CONNECTION_SYNCH); + // BannedAddons.db2 + PrepareStatement(HOTFIX_SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons ORDER BY ID DESC", CONNECTION_SYNCH); + // BarberShopStyle.db2 PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, CostModifier, Type, Race, Sex, Data FROM barber_shop_style" " ORDER BY ID DESC", CONNECTION_SYNCH); @@ -81,11 +84,21 @@ void HotfixDatabaseConnection::DoPrepareStatements() // BattlePetSpeciesState.db2 PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, SpeciesID, State FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); + // BattlemasterList.db2 + PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, IconFileDataID, GameType, MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, " + "MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16, HolidayWorldState, PlayerConditionID, InstanceType, " + "GroupsAllowed, MaxGroupSize, MinLevel, MaxLevel, RatedPlayers, MinPlayers, MaxPlayers, Flags FROM battlemaster_list ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name_lang, GameType_lang FROM battlemaster_list_locale WHERE locale = ?", CONNECTION_SYNCH); + // BroadcastText.db2 PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " "EmoteDelay3, SoundID, UnkEmoteID, Language, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); + // CharSections.db2 + PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT Id, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3, Flags, Race, Gender, GenType, " + "Type, Color FROM char_sections ORDER BY Id DESC", CONNECTION_SYNCH); + // CharStartOutfit.db2 PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " @@ -99,6 +112,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Flags, Name, Shortcut, FactionGroup FROM chat_channels ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); + // ChrClasses.db2 + PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, PowerType, PetNameToken, Name, NameFemale, NameMale, Filename, CreateScreenFileDataID, " + "SelectScreenFileDataID, LowResScreenFileDataID, Flags, CinematicSequenceID, DefaultSpec, SpellClassSet, AttackPowerPerStrength, " + "AttackPowerPerAgility, RangedAttackPowerPerAgility, IconFileDataID, Unk1 FROM chr_classes ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_classes_locale WHERE locale = ?", CONNECTION_SYNCH); + // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); @@ -108,8 +127,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, " "ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, " "UAFemaleCreatureSoundDataID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, " - "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, CharComponentTexLayoutHiResID FROM chr_races" - " ORDER BY ID DESC", CONNECTION_SYNCH); + "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, " + "CharComponentTexLayoutHiResID FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrSpecialization.db2 @@ -125,8 +144,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() // CreatureDisplayInfo.db2 PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, TextureVariation1, " "TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, CreatureGeosetData, StateSpellVisualKitID, " - "ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, SizeClass, BloodID, Flags, " - "Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + "InstanceOtherPlayerPetScale, ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, " + "SizeClass, BloodID, Flags, Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfoExtra.db2 PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, FileDataID, HDFileDataID, DisplayRaceID, DisplaySexID, DisplayClassID, " @@ -138,6 +157,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() "MaxScaleLevel, PetTalentType, CategoryEnumID FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); + // CreatureModelData.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, Flags, FileDataID, ModelScale, FootprintTextureLength, FootprintTextureWidth, " + "FootprintParticleScale, CollisionWidth, CollisionHeight, MountHeight, GeoBoxMin1, GeoBoxMin2, GeoBoxMin3, GeoBoxMax1, GeoBoxMax2, " + "GeoBoxMax3, WorldEffectScale, AttachedEffectScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, " + "OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, HoverHeight, SoundID, CreatureGeosetDataID, " + "SizeClass, BloodID, FootprintTextureID, FoleyMaterialID, Unk700_1, Unk700_2, FootstepShakeSize, DeathThudShakeSize FROM creature_model_data" + " ORDER BY ID DESC", CONNECTION_SYNCH); + // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -190,8 +217,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); // Emotes.db2 - PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSoundID, EmoteSpecProc, " - "EmoteSpecProcParam FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, Unk703_1, Unk703_2, AnimID, EmoteSpecProcParam, " + "EmoteSoundID, EmoteSpecProc FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); // EmotesText.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text ORDER BY ID DESC", CONNECTION_SYNCH); @@ -200,6 +227,18 @@ void HotfixDatabaseConnection::DoPrepareStatements() // EmotesTextSound.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + // Faction.db2 + PrepareStatement(HOTFIX_SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, " + "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ParentFactionModIn, ParentFactionModOut, Name, Description, " + "ReputationIndex, ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, " + "ReputationFlags3, ReputationFlags4, ParentFactionID, ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?", CONNECTION_SYNCH); + + // FactionTemplate.db2 + PrepareStatement(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, Enemies1, Enemies2, Enemies3, Enemies4, Friends1, Friends2, Friends3, " + "Friends4, Mask, FriendMask, EnemyMask FROM faction_template ORDER BY ID DESC", CONNECTION_SYNCH); + // Gameobjects.db2 PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, " "Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type FROM gameobjects" @@ -210,12 +249,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, " "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); - // GameTables.db2 - PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name_lang FROM game_tables_locale WHERE locale = ?", CONNECTION_SYNCH); - // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, Flags, GarrAbilityCategoryID, " + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, Flags, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " "FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -232,7 +267,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 - PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, Unknown700" + PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, `Limit`, Flags" " FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -241,8 +276,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, " "HordePortraitIconID, AlliancePortraitIconID, ItemLevelWeapon, ItemLevelArmor, FollowerTypeID, HordeUiAnimRaceInfoID, " "AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, " - "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID FROM garr_follower" - " ORDER BY ID DESC", CONNECTION_SYNCH); + "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID, MaxDurability, Class" + " FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 @@ -250,8 +285,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, GarrPlotUICategoryID, " - "PlotType, Flags, MinCount, MaxCount FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, MinCount, MaxCount, " + "GarrPlotUICategoryID, PlotType, Flags FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrPlotBuilding.db2 @@ -270,15 +305,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GemProperties.db2 - PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantID, MinItemLevel, MaxCountInv, MaxCountItem FROM gem_properties" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantID, MinItemLevel FROM gem_properties ORDER BY ID DESC", CONNECTION_SYNCH); // GlyphProperties.db2 PrepareStatement(HOTFIX_SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, Type, GlyphExclusiveCategoryID FROM glyph_properties" " ORDER BY ID DESC", CONNECTION_SYNCH); // GlyphSlot.db2 - PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Tooltip, Type FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); // GuildColorBackground.db2 PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); @@ -290,7 +324,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Green, Blue FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH); // GuildPerkSpells.db2 - PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID, GuildLevel FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Heirloom.db2 PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, " @@ -322,7 +356,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, ObjectComponentSlot FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, UIOrder, ObjectComponentSlot FROM item_appearance" + " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemArmorQuality.db2 PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, QualityMod1, QualityMod2, QualityMod3, QualityMod4, QualityMod5, QualityMod6, " @@ -393,8 +428,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index` FROM item_modified_appearance" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index`, SourceType" + " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); // ItemPriceBase.db2 PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ArmorFactor, WeaponFactor, ItemLevel FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); @@ -411,7 +446,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ItemSet.db2 PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " - "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill FROM item_set" + "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, Unknown703, RequiredSkillRank, RequiredSkill FROM item_set" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -431,7 +466,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "HolidayID, ItemNameDescriptionID, Quality, BuyCount, InventoryType, RequiredLevel, RequiredHonorRank, RequiredCityRank, " "RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, " "ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, Material, Sheath, TotemCategory, " - "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); + "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID, RequiredExpansion FROM item_sparse" + " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -442,9 +478,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ItemSpecOverride.db2 PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, ItemID, SpecID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH); - // ItemToBattlePetSpecies.db2 - PrepareStatement(HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, "SELECT ID, BattlePetSpeciesID FROM item_to_battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); - // ItemXBonusTree.db2 PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH); @@ -453,6 +486,25 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain" " ORDER BY ID DESC", CONNECTION_SYNCH); + // LfgDungeons.db2 + PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Flags, TextureFilename, Description, MaxLevel, TargetLevelMax, MapID, RandomID, " + "ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, TargetLevelMin, DifficultyID, Type, " + "Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, SubType, " + "MentorCharLevel FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH); + + // Light.db2 + PrepareStatement(HOTFIX_SEL_LIGHT, "SELECT ID, PosX, PosY, PosZ, FalloffStart, FalloffEnd, MapID, LightParamsID1, LightParamsID2, LightParamsID3, " + "LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light ORDER BY ID DESC", CONNECTION_SYNCH); + + // LiquidType.db2 + PrepareStatement(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name, SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, " + "ParticleScale, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, " + "Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Flags, " + "SoundID, Type, LightID, ParticleMovement, ParticleTexSlots, MaterialID, DepthTexCount1, DepthTexCount2, DepthTexCount3, DepthTexCount4, " + "DepthTexCount5, DepthTexCount6 FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name_lang FROM liquid_type_locale WHERE locale = ?", 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, " @@ -463,11 +515,16 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); // Map.db2 - PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, RaidOffset, MapName, " - "MapDescription0, MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " - "InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, MapName, MapDescription0, " + "MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, InstanceType, unk5, " + "ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH); + // MapDifficulty.db2 + PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, Context, MapID, DifficultyID, RaidDurationType, MaxPlayers, LockID, " + "ItemBonusTreeModID FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); + // ModifierTree.db2 PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); @@ -477,8 +534,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); // MountCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, RequiredMap, Flags, " - "RequiredAura FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredAura, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, " + "RequiredMap, Flags FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); // MountTypeXCapability.db2 PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" @@ -548,7 +605,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); // QuestSort.db2 - PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName, SortOrder FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName_lang FROM quest_sort_locale WHERE locale = ?", CONNECTION_SYNCH); // QuestV2.db2 @@ -579,13 +636,13 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // SkillRaceClassInfo.db2 - PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, SkillTierID, Availability, MinLevel" + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, ClassMask, SkillID, Flags, SkillTierID, Availability, MinLevel" " FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH); // SoundKit.db2 - PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, " - "VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, EAXDef, DialogType, " - "BusOverwriteID, Unk700 FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, VolumeVariationMinus, " + "PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, BusOverwriteID, SoundType, EAXDef, DialogType, Unk700" + " FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name_lang FROM sound_kit_locale WHERE locale = ?", CONNECTION_SYNCH); // SpecializationSpells.db2 @@ -620,7 +677,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCategory.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges FROM spell_category" + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Unk703, Flags, UsesPerWeek, MaxCharges FROM spell_category" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -658,6 +715,13 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT ID, SpellID, AuraInterruptFlags1, AuraInterruptFlags2, ChannelInterruptFlags1, " "ChannelInterruptFlags2, InterruptFlags, DifficultyID FROM spell_interrupts ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellItemEnchantment.db2 + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, EffectSpellID1, EffectSpellID2, EffectSpellID3, Name, EffectScalingPoints1, " + "EffectScalingPoints2, EffectScalingPoints3, PlayerConditionID, TransmogCost, TextureFileDataID, EffectPointsMin1, EffectPointsMin2, " + "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ConditionID, " + "MinLevel, MaxLevel, ScalingClass, ScalingClassRestricted FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang FROM spell_item_enchantment_locale WHERE locale = ?", CONNECTION_SYNCH); + // SpellItemEnchantmentCondition.db2 PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, " "LTOperandType5, LTOperand1, LTOperand2, LTOperand3, LTOperand4, LTOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " @@ -682,8 +746,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() " FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT ID, SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" + " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); // SpellProcsPerMinute.db2 PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); @@ -706,8 +770,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellScaling.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MaxScalingLevel FROM spell_scaling" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MinScalingLevel, MaxScalingLevel" + " FROM spell_scaling ORDER BY ID DESC", CONNECTION_SYNCH); // SpellShapeshift.db2 PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, ShapeshiftMask2, " @@ -735,6 +799,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() // SummonProperties.db2 PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Category, Faction, Type, Slot, Flags FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH); + // Talent.db2 + PrepareStatement(HOTFIX_SEL_TALENT, "SELECT ID, SpellID, OverridesSpellID, Description, SpecID, TierID, ColumnIndex, Flags, CategoryMask1, " + "CategoryMask2, ClassID FROM talent ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_TALENT, "SELECT ID, Description_lang FROM talent_locale WHERE locale = ?", CONNECTION_SYNCH); + // TaxiNodes.db2 PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " "ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); @@ -769,24 +838,45 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); + // Vehicle.db2 + PrepareStatement(HOTFIX_SEL_VEHICLE, "SELECT ID, Flags, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, CameraFadeDistScalarMin, " + "CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, MsslTrgtTurnLingering, MsslTrgtPitchLingering, " + "MsslTrgtMouseLingering, MsslTrgtEndOpacity, MsslTrgtArcSpeed, MsslTrgtArcRepeat, MsslTrgtArcWidth, MsslTrgtImpactRadius1, " + "MsslTrgtImpactRadius2, MsslTrgtArcTexture, MsslTrgtImpactTexture, MsslTrgtImpactModel1, MsslTrgtImpactModel2, CameraYawOffset, " + "MsslTrgtImpactTexRadius, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, VehicleUIIndicatorID, PowerDisplayID1, " + "PowerDisplayID2, PowerDisplayID3, FlagsB, UILocomotionType FROM vehicle ORDER BY ID DESC", CONNECTION_SYNCH); + // VehicleSeat.db2 PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, Flags1, Flags2, Flags3, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, " "EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, EnterMinArcHeight, EnterMaxArcHeight, ExitPreDelay, ExitSpeed, " "ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, PassengerYaw, PassengerPitch, PassengerRoll, " - "VehicleEnterAnimDelay, VehicleExitAnimDelay, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " - "CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, " - "CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " - "ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterUISoundID, ExitUISoundID, " - "EnterAnimKitID, RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, " + "VehicleEnterAnimDelay, VehicleExitAnimDelay, EnterUISoundID, ExitUISoundID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, " + "CameraExitingDuration, CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, " + "CameraSeatZoomMin, CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, " + "RideUpperAnimLoop, ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterAnimKitID, " + "RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, " "PassengerAttachmentID, VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay FROM vehicle_seat" " ORDER BY ID DESC", CONNECTION_SYNCH); + // WmoAreaTable.db2 + PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, WMOGroupID, AreaName, WMOID, AmbienceID, ZoneMusic, IntroSound, AreaTableID, " + "UWIntroSound, UWAmbience, NameSet, SoundProviderPref, SoundProviderPrefUnderwater, Flags, UWZoneMusic FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, AreaName_lang FROM wmo_area_table_locale WHERE locale = ?", CONNECTION_SYNCH); + + // WorldMapArea.db2 + PrepareStatement(HOTFIX_SEL_WORLD_MAP_AREA, "SELECT ID, AreaName, LocLeft, LocRight, LocTop, LocBottom, MapID, AreaID, DisplayMapID, " + "DefaultDungeonFloor, ParentWorldMapID, Flags, PlayerConditionID, LevelRangeMin, LevelRangeMax FROM world_map_area ORDER BY ID DESC", CONNECTION_SYNCH); + // WorldMapOverlay.db2 PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, " - "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay" + "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID, Flags FROM world_map_overlay" " ORDER BY ID DESC", CONNECTION_SYNCH); // WorldMapTransforms.db2 PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, " "RegionOffsetX, RegionOffsetY, RegionScale, MapID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms ORDER BY ID DESC", CONNECTION_SYNCH); + + // WorldSafeLocs.db2 + PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, LocX, LocY, LocZ, Facing, AreaName, MapID FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?", CONNECTION_SYNCH); } diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 0c915c06b92..f9ef5610ca3 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -51,6 +51,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_BANK_BAG_SLOT_PRICES, + HOTFIX_SEL_BANNED_ADDONS, + HOTFIX_SEL_BARBER_SHOP_STYLE, HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, @@ -63,9 +65,14 @@ enum HotfixDatabaseStatements HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, + HOTFIX_SEL_BATTLEMASTER_LIST, + HOTFIX_SEL_BATTLEMASTER_LIST_LOCALE, + HOTFIX_SEL_BROADCAST_TEXT, HOTFIX_SEL_BROADCAST_TEXT_LOCALE, + HOTFIX_SEL_CHAR_SECTIONS, + HOTFIX_SEL_CHAR_START_OUTFIT, HOTFIX_SEL_CHAR_TITLES, @@ -74,6 +81,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CHAT_CHANNELS, HOTFIX_SEL_CHAT_CHANNELS_LOCALE, + HOTFIX_SEL_CHR_CLASSES, + HOTFIX_SEL_CHR_CLASSES_LOCALE, + HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, HOTFIX_SEL_CHR_RACES, @@ -91,6 +101,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CREATURE_FAMILY, HOTFIX_SEL_CREATURE_FAMILY_LOCALE, + HOTFIX_SEL_CREATURE_MODEL_DATA, + HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, @@ -123,14 +135,16 @@ enum HotfixDatabaseStatements HOTFIX_SEL_EMOTES_TEXT_SOUND, + HOTFIX_SEL_FACTION, + HOTFIX_SEL_FACTION_LOCALE, + + HOTFIX_SEL_FACTION_TEMPLATE, + HOTFIX_SEL_GAMEOBJECTS, HOTFIX_SEL_GAMEOBJECTS_LOCALE, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, - HOTFIX_SEL_GAME_TABLES, - HOTFIX_SEL_GAME_TABLES_LOCALE, - HOTFIX_SEL_GARR_ABILITY, HOTFIX_SEL_GARR_ABILITY_LOCALE, @@ -249,12 +263,18 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_SPEC_OVERRIDE, - HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, - HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_KEY_CHAIN, + HOTFIX_SEL_LFG_DUNGEONS, + HOTFIX_SEL_LFG_DUNGEONS_LOCALE, + + HOTFIX_SEL_LIGHT, + + HOTFIX_SEL_LIQUID_TYPE, + HOTFIX_SEL_LIQUID_TYPE_LOCALE, + HOTFIX_SEL_LOCK, HOTFIX_SEL_MAIL_TEMPLATE, @@ -263,6 +283,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MAP, HOTFIX_SEL_MAP_LOCALE, + HOTFIX_SEL_MAP_DIFFICULTY, + HOTFIX_SEL_MAP_DIFFICULTY_LOCALE, + HOTFIX_SEL_MODIFIER_TREE, HOTFIX_SEL_MOUNT, @@ -359,6 +382,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SPELL_INTERRUPTS, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, HOTFIX_SEL_SPELL_LEARN_SPELL, @@ -397,6 +423,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SUMMON_PROPERTIES, + HOTFIX_SEL_TALENT, + HOTFIX_SEL_TALENT_LOCALE, + HOTFIX_SEL_TAXI_NODES, HOTFIX_SEL_TAXI_NODES_LOCALE, @@ -417,12 +446,22 @@ enum HotfixDatabaseStatements HOTFIX_SEL_UNIT_POWER_BAR, HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, + HOTFIX_SEL_VEHICLE, + HOTFIX_SEL_VEHICLE_SEAT, + HOTFIX_SEL_WMO_AREA_TABLE, + HOTFIX_SEL_WMO_AREA_TABLE_LOCALE, + + HOTFIX_SEL_WORLD_MAP_AREA, + HOTFIX_SEL_WORLD_MAP_OVERLAY, HOTFIX_SEL_WORLD_MAP_TRANSFORMS, + HOTFIX_SEL_WORLD_SAFE_LOCS, + HOTFIX_SEL_WORLD_SAFE_LOCS_LOCALE, + MAX_HOTFIXDATABASE_STATEMENTS }; diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp index c9aa3a7966a..55728de5bd1 100644 --- a/src/server/game/Addons/AddonMgr.cpp +++ b/src/server/game/Addons/AddonMgr.cpp @@ -18,7 +18,7 @@ #include "AddonMgr.h" #include "DatabaseEnv.h" -#include "DBCStores.h" +#include "DB2Stores.h" #include "Log.h" #include "Timer.h" diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 3e2ec0ef7ff..53cc4d57033 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -23,7 +23,6 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "DatabaseEnv.h" -#include "DBCStores.h" #include "ScriptMgr.h" #include "AccountMgr.h" #include "AuctionHouseMgr.h" diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 160cab40771..233459de97b 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -21,7 +21,6 @@ #include "Common.h" #include "DatabaseEnv.h" -#include "DBCStructure.h" #include "ObjectGuid.h" #include "AuctionHousePackets.h" #include diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp index d7e17b266f3..d5d5816f4c1 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp @@ -16,7 +16,6 @@ */ #include "Log.h" -#include "DBCStores.h" #include "ObjectMgr.h" #include "AuctionHouseMgr.h" #include "AuctionHouseBotSeller.h" diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index a35d9d3ad5a..8585aa42a03 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -446,7 +446,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate) } bg->SetMapId(bgTemplate->BattlemasterEntry->MapID[0]); - bg->SetName(bgTemplate->BattlemasterEntry->Name_lang); + bg->SetName(bgTemplate->BattlemasterEntry->Name->Str[sWorld->GetDefaultDbcLocale()]); bg->SetInstanceID(0); bg->SetArenaorBGType(bgTemplate->IsArena()); bg->SetMinPlayersPerTeam(bgTemplate->MinPlayersPerTeam); diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index c11c25219a5..483981261be 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -19,7 +19,6 @@ #include "SpellMgr.h" #include "ObjectMgr.h" #include "SpellInfo.h" -#include "DBCStores.h" #include "AchievementMgr.h" // Supported shift-links (client generated and server side) diff --git a/src/server/game/Combat/HostileRefManager.cpp b/src/server/game/Combat/HostileRefManager.cpp index 0265a4c05b2..4da808c83e5 100644 --- a/src/server/game/Combat/HostileRefManager.cpp +++ b/src/server/game/Combat/HostileRefManager.cpp @@ -19,7 +19,6 @@ #include "HostileRefManager.h" #include "ThreatManager.h" #include "Unit.h" -#include "DBCStructure.h" #include "SpellInfo.h" HostileRefManager::~HostileRefManager() diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 62d5ecfa88a..21957198bac 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -144,11 +144,11 @@ void LoadDisables() break; case MAP_INSTANCE: case MAP_RAID: - if (flags & DUNGEON_STATUSFLAG_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_HEROIC)) + if (flags & DUNGEON_STATUSFLAG_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_HEROIC)) flags -= DUNGEON_STATUSFLAG_HEROIC; - if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_10_HC)) + if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_10_HC)) flags -= RAID_STATUSFLAG_10MAN_HEROIC; - if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_25_HC)) + if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_25_HC)) flags -= RAID_STATUSFLAG_25MAN_HEROIC; if (!flags) isFlagInvalid = true; @@ -334,7 +334,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags { uint8 disabledModes = itr->second.flags; Difficulty targetDifficulty = player->GetDifficultyID(mapEntry); - GetDownscaledMapDifficultyData(entry, targetDifficulty); + sDB2Manager.GetDownscaledMapDifficultyData(entry, targetDifficulty); switch (targetDifficulty) { case DIFFICULTY_NORMAL: diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index f985a266e29..7899b4ada83 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -18,8 +18,8 @@ #include "DB2Stores.h" #include "Common.h" #include "Containers.h" -#include "DBCStores.h" #include "DB2fmt.h" +#include "HotfixDatabase.h" #include "Log.h" #include "TransportMgr.h" #include "World.h" @@ -32,15 +32,19 @@ DB2Storage sAreaTriggerStore("AreaTrigger.d DB2Storage sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION); DB2Storage sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); DB2Storage sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES); +DB2Storage sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsFormat, HOTFIX_SEL_BANNED_ADDONS); DB2Storage sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE); DB2Storage sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityFormat, HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); DB2Storage sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateFormat, HOTFIX_SEL_BATTLE_PET_BREED_STATE); DB2Storage sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesFormat, HOTFIX_SEL_BATTLE_PET_SPECIES); DB2Storage sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateFormat, HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); +DB2Storage sBattlemasterListStore("BattlemasterList.db2", BattlemasterListFormat, HOTFIX_SEL_BATTLEMASTER_LIST); DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); -DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS); +DB2Storage sCharSectionsStore("CharSections.db2", CharSectionsFormat, HOTFIX_SEL_CHAR_SECTIONS); DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); DB2Storage sCharTitlesStore("CharTitles.db2", CharTitlesFormat, HOTFIX_SEL_CHAR_TITLES); +DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS); +DB2Storage sChrClassesStore("ChrClasses.db2", ChrClassesFormat, HOTFIX_SEL_CHR_CLASSES); DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); DB2Storage sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationFormat, HOTFIX_SEL_CHR_SPECIALIZATION); @@ -48,6 +52,7 @@ DB2Storage sCinematicSequencesStore("Cinema DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); DB2Storage sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyFormat, HOTFIX_SEL_CREATURE_FAMILY); +DB2Storage sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataFormat, HOTFIX_SEL_CREATURE_MODEL_DATA); DB2Storage sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); DB2Storage sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); DB2Storage sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); @@ -61,9 +66,10 @@ DB2Storage sDurabilityQualityStore("Durabil DB2Storage sEmotesStore("Emotes.db2", EmotesFormat, HOTFIX_SEL_EMOTES); DB2Storage sEmotesTextStore("EmotesText.db2", EmotesTextFormat, HOTFIX_SEL_EMOTES_TEXT); DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); +DB2Storage sFactionStore("Faction.db2", FactionFormat, HOTFIX_SEL_FACTION); +DB2Storage sFactionTemplateStore("FactionTemplate.db2", FactionTemplateFormat, HOTFIX_SEL_FACTION_TEMPLATE); DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); -DB2Storage sGameTablesStore("GameTables.db2", GameTablesFormat, HOTFIX_SEL_GAME_TABLES); DB2Storage sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); DB2Storage sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); DB2Storage sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST); @@ -116,12 +122,15 @@ DB2Storage sItemSetSpellStore("ItemSetSpell DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); DB2Storage sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); DB2Storage sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE); -DB2Storage sItemToBattlePetSpeciesStore("ItemToBattlePetSpecies.db2", ItemToBattlePetSpeciesFormat, HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES); DB2Storage sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); DB2Storage sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); +DB2Storage sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsFormat, HOTFIX_SEL_LFG_DUNGEONS); +DB2Storage sLightStore("Light.db2", LightFormat, HOTFIX_SEL_LIGHT); +DB2Storage sLiquidTypeStore("LiquidType.db2", LiquidTypeFormat, HOTFIX_SEL_LIQUID_TYPE); DB2Storage sLockStore("Lock.db2", LockFormat, HOTFIX_SEL_LOCK); DB2Storage sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); DB2Storage sMapStore("Map.db2", MapFormat, HOTFIX_SEL_MAP); +DB2Storage sMapDifficultyStore("MapDifficulty.db2", MapDifficultyFormat, HOTFIX_SEL_MAP_DIFFICULTY); DB2Storage sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE); DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); DB2Storage sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); @@ -165,6 +174,7 @@ DB2Storage sSpellEffectScalingStore("SpellE DB2Storage sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsFormat, HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); DB2Storage sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectFormat, HOTFIX_SEL_SPELL_FOCUS_OBJECT); DB2Storage sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsFormat, HOTFIX_SEL_SPELL_INTERRUPTS); +DB2Storage sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); DB2Storage sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); DB2Storage sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); DB2Storage sSpellLevelsStore("SpellLevels.db2", SpellLevelsFormat, HOTFIX_SEL_SPELL_LEVELS); @@ -183,6 +193,7 @@ DB2Storage sSpellTargetRestrictionsStore("S DB2Storage sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); DB2Storage sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); DB2Storage sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesFormat, HOTFIX_SEL_SUMMON_PROPERTIES); +DB2Storage sTalentStore("Talent.db2", TalentFormat, HOTFIX_SEL_TALENT); DB2Storage sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); DB2Storage sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); DB2Storage sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); @@ -191,9 +202,13 @@ DB2Storage sToyStore("Toy.db2", ToyFormat, DB2Storage sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION); DB2Storage sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); DB2Storage sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); +DB2Storage sVehicleStore("Vehicle.db2", VehicleFormat, HOTFIX_SEL_VEHICLE); DB2Storage sVehicleSeatStore("VehicleSeat.db2", VehicleSeatFormat, HOTFIX_SEL_VEHICLE_SEAT); +DB2Storage sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableFormat, HOTFIX_SEL_WMO_AREA_TABLE); +DB2Storage sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaFormat, HOTFIX_SEL_WORLD_MAP_AREA); DB2Storage sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); DB2Storage sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS); +DB2Storage sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsFormat, HOTFIX_SEL_WORLD_SAFE_LOCS); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -216,7 +231,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D ++DB2FilesCount; -#define EXPECTED_DB2_BUILD 20950 +#define EXPECTED_DB2_BUILD 21414 if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale)) { @@ -243,7 +258,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D else { // sort problematic db2 to (1) non compatible and (2) nonexistent - if (FILE* f = fopen((db2Path + storage->GetFileName()).c_str(), "rb")) + if (FILE* f = fopen((db2Path + localeNames[defaultLocale] + '/' + storage->GetFileName()).c_str(), "rb")) { std::ostringstream stream; stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << strlen(storage->GetFormat()) @@ -278,21 +293,25 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sAchievementStore); LOAD_DB2(sAnimKitStore); - LOAD_DB2(sArmorLocationStore); LOAD_DB2(sAreaGroupMemberStore); LOAD_DB2(sAreaTableStore); LOAD_DB2(sAreaTriggerStore); + LOAD_DB2(sArmorLocationStore); + LOAD_DB2(sAuctionHouseStore); LOAD_DB2(sBankBagSlotPricesStore); + LOAD_DB2(sBannedAddOnsStore); + LOAD_DB2(sBarberShopStyleStore); LOAD_DB2(sBattlePetBreedQualityStore); LOAD_DB2(sBattlePetBreedStateStore); - LOAD_DB2(sAuctionHouseStore); - LOAD_DB2(sBarberShopStyleStore); LOAD_DB2(sBattlePetSpeciesStore); LOAD_DB2(sBattlePetSpeciesStateStore); + LOAD_DB2(sBattlemasterListStore); LOAD_DB2(sBroadcastTextStore); + LOAD_DB2(sCharSectionsStore); LOAD_DB2(sCharStartOutfitStore); LOAD_DB2(sCharTitlesStore); LOAD_DB2(sChatChannelsStore); + LOAD_DB2(sChrClassesStore); LOAD_DB2(sChrClassesXPowerTypesStore); LOAD_DB2(sChrRacesStore); LOAD_DB2(sChrSpecializationStore); @@ -300,6 +319,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sCreatureDisplayInfoStore); LOAD_DB2(sCreatureDisplayInfoExtraStore); LOAD_DB2(sCreatureFamilyStore); + LOAD_DB2(sCreatureModelDataStore); LOAD_DB2(sCreatureTypeStore); LOAD_DB2(sCriteriaStore); LOAD_DB2(sCriteriaTreeStore); @@ -313,20 +333,21 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sEmotesStore); LOAD_DB2(sEmotesTextStore); LOAD_DB2(sEmotesTextSoundStore); + LOAD_DB2(sFactionStore); + LOAD_DB2(sFactionTemplateStore); LOAD_DB2(sGameObjectsStore); LOAD_DB2(sGameObjectDisplayInfoStore); - LOAD_DB2(sGameTablesStore); LOAD_DB2(sGarrAbilityStore); - LOAD_DB2(sGarrBuildingPlotInstStore); LOAD_DB2(sGarrBuildingStore); + LOAD_DB2(sGarrBuildingPlotInstStore); LOAD_DB2(sGarrClassSpecStore); LOAD_DB2(sGarrFollowerStore); LOAD_DB2(sGarrFollowerXAbilityStore); LOAD_DB2(sGarrPlotBuildingStore); - LOAD_DB2(sGarrPlotInstanceStore); LOAD_DB2(sGarrPlotStore); - LOAD_DB2(sGarrSiteLevelPlotInstStore); + LOAD_DB2(sGarrPlotInstanceStore); LOAD_DB2(sGarrSiteLevelStore); + LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGemPropertiesStore); LOAD_DB2(sGlyphPropertiesStore); LOAD_DB2(sGlyphSlotStore); @@ -350,12 +371,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemClassStore); LOAD_DB2(sItemCurrencyCostStore); LOAD_DB2(sItemDamageAmmoStore); - LOAD_DB2(sItemDamageOneHandCasterStore); LOAD_DB2(sItemDamageOneHandStore); - LOAD_DB2(sItemDamageTwoHandCasterStore); + LOAD_DB2(sItemDamageOneHandCasterStore); LOAD_DB2(sItemDamageTwoHandStore); + LOAD_DB2(sItemDamageTwoHandCasterStore); LOAD_DB2(sItemDisenchantLootStore); LOAD_DB2(sItemEffectStore); + LOAD_DB2(sItemStore); LOAD_DB2(sItemExtendedCostStore); LOAD_DB2(sItemLimitCategoryStore); LOAD_DB2(sItemModifiedAppearanceStore); @@ -365,15 +387,17 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemSetStore); LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); - LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemSpecStore); - LOAD_DB2(sItemStore); - LOAD_DB2(sItemToBattlePetSpeciesStore); + LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeyChainStore); + LOAD_DB2(sLfgDungeonsStore); + LOAD_DB2(sLightStore); + LOAD_DB2(sLiquidTypeStore); LOAD_DB2(sLockStore); LOAD_DB2(sMailTemplateStore); LOAD_DB2(sMapStore); + LOAD_DB2(sMapDifficultyStore); LOAD_DB2(sModifierTreeStore); LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); @@ -395,6 +419,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sQuestSortStore); LOAD_DB2(sQuestV2Store); LOAD_DB2(sQuestXPStore); + LOAD_DB2(sRandPropPointsStore); LOAD_DB2(sScalingStatDistributionStore); LOAD_DB2(sSkillLineStore); LOAD_DB2(sSkillLineAbilityStore); @@ -411,11 +436,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sSpellClassOptionsStore); LOAD_DB2(sSpellCooldownsStore); LOAD_DB2(sSpellDurationStore); - LOAD_DB2(sSpellEffectScalingStore); LOAD_DB2(sSpellEffectStore); + LOAD_DB2(sSpellEffectScalingStore); LOAD_DB2(sSpellEquippedItemsStore); LOAD_DB2(sSpellFocusObjectStore); LOAD_DB2(sSpellInterruptsStore); + LOAD_DB2(sSpellItemEnchantmentStore); LOAD_DB2(sSpellItemEnchantmentConditionStore); LOAD_DB2(sSpellLearnSpellStore); LOAD_DB2(sSpellLevelsStore); @@ -428,29 +454,38 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sSpellRangeStore); LOAD_DB2(sSpellReagentsStore); LOAD_DB2(sSpellScalingStore); - LOAD_DB2(sSpellShapeshiftFormStore); LOAD_DB2(sSpellShapeshiftStore); + LOAD_DB2(sSpellShapeshiftFormStore); LOAD_DB2(sSpellTargetRestrictionsStore); LOAD_DB2(sSpellTotemsStore); LOAD_DB2(sSpellXSpellVisualStore); LOAD_DB2(sSummonPropertiesStore); + LOAD_DB2(sTalentStore); LOAD_DB2(sTaxiNodesStore); - LOAD_DB2(sTaxiPathNodeStore); LOAD_DB2(sTaxiPathStore); + LOAD_DB2(sTaxiPathNodeStore); LOAD_DB2(sTotemCategoryStore); LOAD_DB2(sToyStore); LOAD_DB2(sTransportAnimationStore); LOAD_DB2(sTransportRotationStore); LOAD_DB2(sUnitPowerBarStore); + LOAD_DB2(sVehicleStore); LOAD_DB2(sVehicleSeatStore); + LOAD_DB2(sWMOAreaTableStore); + LOAD_DB2(sWorldMapAreaStore); LOAD_DB2(sWorldMapOverlayStore); LOAD_DB2(sWorldMapTransformsStore); + LOAD_DB2(sWorldSafeLocsStore); #undef LOAD_DB2 for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore) _areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID); + for (CharSectionsEntry const* charSection : sCharSectionsStore) + if (charSection->Race && ((1 << (charSection->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races + _charSections.insert({ charSection->GenType | (charSection->Gender << 8) | (charSection->Race << 16), charSection }); + for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; @@ -476,14 +511,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex)); - for (uint32 i = 0; i < sChrSpecializationStore.GetNumRows(); ++i) + for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore) { - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(i)) - { - ASSERT(chrSpec->ClassID < MAX_CLASSES); - ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); - _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec; - } + ASSERT(chrSpec->ClassID < MAX_CLASSES); + ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); + _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec; } ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(), @@ -493,6 +525,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore) _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound; + for (FactionEntry const* faction : sFactionStore) + if (faction->ParentFactionID) + _factionTeams[faction->ParentFactionID].push_back(faction->ID); + for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore) { if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X) @@ -530,11 +566,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; - for (ItemSetSpellEntry const* entry : sItemSetSpellStore) - _itemSetSpells[entry->ItemSetID].push_back(entry); + for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore) + _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell); - for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) - _itemSpecOverrides[entry->ItemID].push_back(entry); + for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore) + _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride); for (ItemXBonusTreeEntry const* itemBonusTreeAssignment : sItemXBonusTreeStore) _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->BonusTreeID }); @@ -549,14 +585,18 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) _heirloomCurvePoints[curvePoint->CurveID][curvePoint->Index] = curvePoint; } + for (MapDifficultyEntry const* entry : sMapDifficultyStore) + _mapDifficulties[entry->MapID][entry->DifficultyID] = entry; + _mapDifficulties[0][0] = _mapDifficulties[1][0]; // map 0 is missing from MapDifficulty.dbc so we cheat a bit + for (MountEntry const* mount : sMountStore) _mountsBySpellId[mount->SpellId] = mount; - for (MountTypeXCapabilityEntry const* mount : sMountTypeXCapabilityStore) - _mountCapabilitiesByType[mount->MountTypeID].insert(mount); + for (MountTypeXCapabilityEntry const* mountTypeCapability : sMountTypeXCapabilityStore) + _mountCapabilitiesByType[mountTypeCapability->MountTypeID].insert(mountTypeCapability); - for (NameGenEntry const* entry : sNameGenStore) - _nameGenData[entry->Race][entry->Sex].push_back(entry); + for (NameGenEntry const* nameGen : sNameGenStore) + _nameGenData[nameGen->Race][nameGen->Sex].push_back(nameGen); for (NamesProfanityEntry const* namesProfanity : sNamesProfanityStore) { @@ -633,6 +673,15 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (SpellProcsPerMinuteModEntry const* ppmMod : sSpellProcsPerMinuteModStore) _spellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod); + for (TalentEntry const* talentInfo : sTalentStore) + { + ASSERT(talentInfo->ClassID < MAX_CLASSES); + ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", MAX_TALENT_TIERS); + ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", MAX_TALENT_COLUMNS); + + _talentsByPosition[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo); + } + for (TaxiPathEntry const* entry : sTaxiPathStore) sTaxiPathSetBySource[entry->From][entry->To] = TaxiPathBySourceAndDestination(entry->ID, entry->Cost); @@ -699,6 +748,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (ToyEntry const* toy : sToyStore) _toys.insert(toy->ItemID); + for (WMOAreaTableEntry const* entry : sWMOAreaTableStore) + _wmoAreaTableLookup[WMOAreaTableKey(entry->WMOID, entry->NameSet, entry->WMOGroupID)] = entry; + + for (WorldMapAreaEntry const* worldMapArea : sWorldMapAreaStore) + _worldMapAreaByAreaID[worldMapArea->AreaID] = worldMapArea; + // error checks if (bad_db2_files.size() >= DB2FilesCount) { @@ -716,13 +771,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } // Check loaded DB2 files proper version - if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) - !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) - !sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914) - !sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) - !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) - !sMapStore.LookupEntry(1602) || // last map added in 7.0.1 (20810) - !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810) + if (!sAreaTableStore.LookupEntry(8343) || // last area (areaflag) added in 7.0.3 (21414) + !sCharTitlesStore.LookupEntry(480) || // last char title added in 7.0.3 (21414) + !sGemPropertiesStore.LookupEntry(3217) || // last gem property added in 7.0.3 (21414) + !sItemStore.LookupEntry(139410) || // last item added in 7.0.3 (21414) + !sItemExtendedCostStore.LookupEntry(6038) || // last item extended cost added in 7.0.3 (21414) + !sMapStore.LookupEntry(1632) || // last map added in 7.0.3 (21414) + !sSpellStore.LookupEntry(220019)) // last spell added in 7.0.3 (21414) { TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); exit(1); @@ -815,6 +870,16 @@ char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcas return broadcastText->MaleText->Str[DEFAULT_LOCALE]; } +CharSectionsEntry const* DB2Manager::GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) const +{ + auto eqr = _charSections.equal_range(uint32(genType) | uint32(gender << 8) | uint32(race << 16)); + for (auto itr = eqr.first; itr != eqr.second; ++itr) + if (itr->second->Type == type && itr->second->Color == color) + return itr->second; + + return nullptr; +} + CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const { auto itr = _charStartOutfits.find(race | (class_ << 8) | (gender << 16)); @@ -824,9 +889,16 @@ CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint return itr->second; } -ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const +char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/) { - return _chrSpecializationsByIndex[class_][index]; + ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); + if (!classEntry) + return ""; + + if (classEntry->Name->Str[locale][0] != '\0') + return classEntry->Name->Str[locale]; + + return classEntry->Name->Str[DEFAULT_LOCALE]; } uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const @@ -846,6 +918,11 @@ char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEF return raceEntry->Name->Str[DEFAULT_LOCALE]; } +ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const +{ + return _chrSpecializationsByIndex[class_][index]; +} + char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, uint32 locale) { if (!petfamily) @@ -871,6 +948,15 @@ EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8 return nullptr; } +std::vector const* DB2Manager::GetFactionTeamList(uint32 faction) const +{ + auto itr = _factionTeams.find(faction); + if (itr != _factionTeams.end()) + return &itr->second; + + return nullptr; +} + uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const { // Assuming linear item level scaling for heirlooms @@ -964,21 +1050,102 @@ std::vector const* DB2Manager::GetItemSpecOverride return nullptr; } -std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const +LfgDungeonsEntry const* DB2Manager::GetLfgDungeon(uint32 mapId, Difficulty difficulty) { - ASSERT(gender < GENDER_NONE); - auto ritr = _nameGenData.find(race); - if (ritr == _nameGenData.end()) - return ""; + for (LfgDungeonsEntry const* dungeon : sLfgDungeonsStore) + if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty) + return dungeon; - if (ritr->second[gender].empty()) - return ""; + return nullptr; +} - LocalizedString* data = Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name; - if (*data->Str[locale] != '\0') - return data->Str[locale]; +uint32 DB2Manager::GetDefaultMapLight(uint32 mapId) +{ + for (int32 i = sLightStore.GetNumRows(); i >= 0; --i) + { + LightEntry const* light = sLightStore.LookupEntry(uint32(i)); + if (!light) + continue; - return data->Str[sWorld->GetDefaultDbcLocale()]; + if (light->MapID == mapId && light->Pos.X == 0.0f && light->Pos.Y == 0.0f && light->Pos.Z == 0.0f) + return uint32(i); + } + + return 0; +} + +uint32 DB2Manager::GetLiquidFlags(uint32 liquidType) +{ + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType)) + return 1 << liq->Type; + + return 0; +} + +MapDifficultyEntry const* DB2Manager::GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) const +{ + auto itr = _mapDifficulties.find(mapId); + if (itr == _mapDifficulties.end()) + return nullptr; + + if (itr->second.empty()) + return nullptr; + + for (auto& p : itr->second) + { + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(p.first); + if (!difficultyEntry) + continue; + + if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT) + { + if (difficulty) + *difficulty = Difficulty(p.first); + + return p.second; + } + } + + if (difficulty) + *difficulty = Difficulty(itr->second.begin()->first); + + return itr->second.begin()->second; +} + +MapDifficultyEntry const* DB2Manager::GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const +{ + auto itr = _mapDifficulties.find(mapId); + if (itr == _mapDifficulties.end()) + return nullptr; + + auto diffItr = itr->second.find(difficulty); + if (diffItr == itr->second.end()) + return nullptr; + + return diffItr->second; +} + +MapDifficultyEntry const* DB2Manager::GetDownscaledMapDifficultyData(uint32 mapId, Difficulty& difficulty) const +{ + DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty); + if (!diffEntry) + return GetDefaultMapDifficulty(mapId, &difficulty); + + uint32 tmpDiff = difficulty; + MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); + while (!mapDiff) + { + tmpDiff = diffEntry->FallbackDifficultyID; + diffEntry = sDifficultyStore.LookupEntry(tmpDiff); + if (!diffEntry) + return GetDefaultMapDifficulty(mapId, &difficulty); + + // pull new data + mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal + } + + difficulty = Difficulty(tmpDiff); + return mapDiff; } MountEntry const* DB2Manager::GetMount(uint32 spellId) const @@ -1004,6 +1171,23 @@ DB2Manager::MountTypeXCapabilitySet const* DB2Manager::GetMountCapabilities(uint return nullptr; } +std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const +{ + ASSERT(gender < GENDER_NONE); + auto ritr = _nameGenData.find(race); + if (ritr == _nameGenData.end()) + return ""; + + if (ritr->second[gender].empty()) + return ""; + + LocalizedString* data = Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name; + if (*data->Str[locale] != '\0') + return data->Str[locale]; + + return data->Str[sWorld->GetDefaultDbcLocale()]; +} + ResponseCodes DB2Manager::ValidateName(std::string const& name, LocaleConstant locale) const { for (boost::regex const& regex : _nameValidators[locale]) @@ -1155,6 +1339,11 @@ std::vector DB2Manager::GetSpellProcsPerMinu return std::vector(); } +std::vector const& DB2Manager::GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const +{ + return _talentsByPosition[class_][tier][column]; +} + bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) { if (requiredTotemCategoryId == 0) @@ -1180,6 +1369,49 @@ bool DB2Manager::IsToyItem(uint32 toy) const return _toys.count(toy) > 0; } +WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const +{ + auto i = _wmoAreaTableLookup.find(WMOAreaTableKey(int8(rootId), int16(adtId), groupId)); + if (i != _wmoAreaTableLookup.end()) + return i->second; + + return nullptr; +} + +uint32 DB2Manager::GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const +{ + if (mapId != 530 && mapId != 571 && mapId != 732) // speed for most cases + return mapId; + + auto itr = _worldMapAreaByAreaID.find(zoneId); + if (itr != _worldMapAreaByAreaID.end()) + return itr->second->DisplayMapID >= 0 ? itr->second->DisplayMapID : itr->second->MapID; + + return mapId; +} + +void DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const +{ + auto itr = _worldMapAreaByAreaID.find(areaId); + if (itr == _worldMapAreaByAreaID.end()) + return; + + std::swap(x, y); // at client map coords swapped + x = x*((itr->second->LocBottom - itr->second->LocTop) / 100) + itr->second->LocTop; + y = y*((itr->second->LocRight - itr->second->LocLeft) / 100) + itr->second->LocLeft; // client y coord from top to down +} + +void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const +{ + auto itr = _worldMapAreaByAreaID.find(areaId); + if (itr == _worldMapAreaByAreaID.end()) + return; + + x = (x - itr->second->LocTop) / ((itr->second->LocBottom - itr->second->LocTop) / 100); + y = (y - itr->second->LocLeft) / ((itr->second->LocRight - itr->second->LocLeft) / 100); // client y coord from top to down + std::swap(x, y); // client have map coords swapped +} + void DB2Manager::DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/) { ASSERT(newMapId || newPos); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 5dbd24dacf6..59bb91b4a30 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -31,21 +31,25 @@ TC_GAME_API extern DB2Storage sAreaTrigger TC_GAME_API extern DB2Storage sArmorLocationStore; TC_GAME_API extern DB2Storage sAuctionHouseStore; TC_GAME_API extern DB2Storage sBankBagSlotPricesStore; +TC_GAME_API extern DB2Storage sBannedAddOnsStore; TC_GAME_API extern DB2Storage sBarberShopStyleStore; TC_GAME_API extern DB2Storage sBattlePetBreedQualityStore; TC_GAME_API extern DB2Storage sBattlePetBreedStateStore; TC_GAME_API extern DB2Storage sBattlePetSpeciesStore; TC_GAME_API extern DB2Storage sBattlePetSpeciesStateStore; +TC_GAME_API extern DB2Storage sBattlemasterListStore; TC_GAME_API extern DB2Storage sBroadcastTextStore; TC_GAME_API extern DB2Storage sCharStartOutfitStore; TC_GAME_API extern DB2Storage sCharTitlesStore; TC_GAME_API extern DB2Storage sChatChannelsStore; +TC_GAME_API extern DB2Storage sChrClassesStore; TC_GAME_API extern DB2Storage sChrRacesStore; TC_GAME_API extern DB2Storage sChrSpecializationStore; TC_GAME_API extern DB2Storage sCinematicSequencesStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoStore; TC_GAME_API extern DB2Storage sCreatureDisplayInfoExtraStore; TC_GAME_API extern DB2Storage sCreatureFamilyStore; +TC_GAME_API extern DB2Storage sCreatureModelDataStore; TC_GAME_API extern DB2Storage sCreatureTypeStore; TC_GAME_API extern DB2Storage sCriteriaStore; TC_GAME_API extern DB2Storage sCriteriaTreeStore; @@ -57,9 +61,10 @@ TC_GAME_API extern DB2Storage sDurabilityC TC_GAME_API extern DB2Storage sDurabilityQualityStore; TC_GAME_API extern DB2Storage sEmotesStore; TC_GAME_API extern DB2Storage sEmotesTextStore; +TC_GAME_API extern DB2Storage sFactionStore; +TC_GAME_API extern DB2Storage sFactionTemplateStore; TC_GAME_API extern DB2Storage sGameObjectsStore; TC_GAME_API extern DB2Storage sGameObjectDisplayInfoStore; -TC_GAME_API extern DB2Storage sGameTablesStore; TC_GAME_API extern DB2Storage sGarrAbilityStore; TC_GAME_API extern DB2Storage sGarrBuildingStore; TC_GAME_API extern DB2Storage sGarrBuildingPlotInstStore; @@ -106,7 +111,8 @@ TC_GAME_API extern DB2Storage sItemSetSpel TC_GAME_API extern DB2SparseStorage sItemSparseStore; TC_GAME_API extern DB2Storage sItemSpecStore; TC_GAME_API extern DB2Storage sItemSpecOverrideStore; -TC_GAME_API extern DB2Storage sItemToBattlePetSpeciesStore; +TC_GAME_API extern DB2Storage sLfgDungeonsStore; +TC_GAME_API extern DB2Storage sLiquidTypeStore; TC_GAME_API extern DB2Storage sLockStore; TC_GAME_API extern DB2Storage sMailTemplateStore; TC_GAME_API extern DB2Storage sMapStore; @@ -142,6 +148,7 @@ TC_GAME_API extern DB2Storage sSpellEffect TC_GAME_API extern DB2Storage sSpellEquippedItemsStore; TC_GAME_API extern DB2Storage sSpellFocusObjectStore; TC_GAME_API extern DB2Storage sSpellInterruptsStore; +TC_GAME_API extern DB2Storage sSpellItemEnchantmentStore; TC_GAME_API extern DB2Storage sSpellItemEnchantmentConditionStore; TC_GAME_API extern DB2Storage sSpellLearnSpellStore; TC_GAME_API extern DB2Storage sSpellLevelsStore; @@ -158,11 +165,32 @@ TC_GAME_API extern DB2Storage sSpellTarget TC_GAME_API extern DB2Storage sSpellTotemsStore; TC_GAME_API extern DB2Storage sSpellXSpellVisualStore; TC_GAME_API extern DB2Storage sSummonPropertiesStore; +TC_GAME_API extern DB2Storage sTalentStore; TC_GAME_API extern DB2Storage sTaxiNodesStore; TC_GAME_API extern DB2Storage sTaxiPathStore; TC_GAME_API extern DB2Storage sUnitPowerBarStore; +TC_GAME_API extern DB2Storage sVehicleStore; TC_GAME_API extern DB2Storage sVehicleSeatStore; TC_GAME_API extern DB2Storage sWorldMapOverlayStore; +TC_GAME_API extern DB2Storage sWorldSafeLocsStore; + +struct TaxiPathBySourceAndDestination +{ + TaxiPathBySourceAndDestination() : ID(0), price(0) { } + TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } + + uint32 ID; + uint32 price; +}; + +typedef std::map TaxiPathSetForSource; +typedef std::map TaxiPathSetBySource; + +typedef std::vector TaxiPathNodeList; +typedef std::vector TaxiPathNodesByPath; + +#define TaxiMaskSize 232 +typedef std::array TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; TC_GAME_API extern TaxiMask sOldContinentsNodesMask; @@ -196,9 +224,11 @@ public: typedef std::map StorageMap; typedef std::unordered_map> AreaGroupMemberContainer; + typedef std::unordered_multimap CharSectionsContainer; typedef std::unordered_map CharStartOutfitContainer; typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES][MAX_SPECIALIZATIONS]; typedef std::map, EmotesTextSoundEntry const*> EmotesTextSoundContainer; + typedef std::unordered_map> FactionTeamContainer; typedef std::set GlyphSlotContainer; typedef std::map>> HeirloomCurvesContainer; typedef std::unordered_map HeirloomItemsContainer; @@ -209,6 +239,7 @@ public: typedef std::unordered_map> ItemBonusTreeContainer; typedef std::unordered_map> ItemSetSpellContainer; typedef std::unordered_map> ItemSpecOverridesContainer; + typedef std::unordered_map> MapDifficultyContainer; typedef std::unordered_map MountContainer; typedef std::set MountTypeXCapabilitySet; typedef std::unordered_map MountCapabilitiesByTypeContainer; @@ -221,7 +252,11 @@ public: typedef std::unordered_map> SpellPowerContainer; typedef std::unordered_map>> SpellPowerDifficultyContainer; typedef std::unordered_map> SpellProcsPerMinuteModContainer; + typedef std::vector TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; typedef std::unordered_set ToyItemIdsContainer; + typedef std::tuple WMOAreaTableKey; + typedef std::map WMOAreaTableLookupContainer; + typedef std::unordered_map WorldMapAreaByAreaIDContainer; static DB2Manager& Instance(); @@ -234,12 +269,15 @@ public: std::vector GetAreasForGroup(uint32 areaGroupId) const; static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); + CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) const; CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; - ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; + static char const* GetClassName(uint8 class_, LocaleConstant locale = DEFAULT_LOCALE); uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); + ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; + std::vector const* GetFactionTeamList(uint32 faction) const; GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; @@ -249,6 +287,13 @@ public: uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; std::vector const* GetItemSetSpells(uint32 itemSetId) const; std::vector const* GetItemSpecOverrides(uint32 itemId) const; + static LfgDungeonsEntry const* GetLfgDungeon(uint32 mapId, Difficulty difficulty); + static uint32 GetDefaultMapLight(uint32 mapId); + static uint32 GetLiquidFlags(uint32 liquidType); + MapDifficultyContainer const& GetMapDifficulties() const { return _mapDifficulties; } + MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr) const; + MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const; + MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) const; std::string GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const; MountEntry const* GetMount(uint32 spellId) const; MountEntry const* GetMountById(uint32 id) const; @@ -263,8 +308,13 @@ public: std::vector const* GetSpecializationSpells(uint32 specId) const; std::vector GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; std::vector GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; + std::vector const& GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const; static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); bool IsToyItem(uint32 toy) const; + WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const; + uint32 GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const; + void Zone2MapCoordinates(uint32 areaId, float& x, float& y) const; + void Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const; static void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr); private: @@ -272,10 +322,12 @@ private: HotfixData _hotfixData; AreaGroupMemberContainer _areaGroupMembers; + CharSectionsContainer _charSections; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; ChrSpecializationByIndexContainer _chrSpecializationsByIndex; EmotesTextSoundContainer _emoteTextSounds; + FactionTeamContainer _factionTeams; GlyphSlotContainer _glyphSlots; HeirloomItemsContainer _heirlooms; HeirloomCurvesContainer _heirloomCurvePoints; @@ -286,6 +338,7 @@ private: ItemToBonusTreeContainer _itemToBonusTree; ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; + MapDifficultyContainer _mapDifficulties; MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; NameGenContainer _nameGenData; @@ -297,7 +350,10 @@ private: SpellPowerContainer _spellPowers; SpellPowerDifficultyContainer _spellPowerDifficulties; SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods; + TalentsByPosition _talentsByPosition; ToyItemIdsContainer _toys; + WMOAreaTableLookupContainer _wmoAreaTableLookup; + WorldMapAreaByAreaIDContainer _worldMapAreaByAreaID; }; #define sDB2Manager DB2Manager::Instance() diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 692ae88847e..ab29ec77c11 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -45,6 +45,7 @@ struct AchievementEntry struct AnimKitEntry { + uint32 ID; uint32 OneShotDuration; uint16 OneShotStopAnimKitID; uint16 LowDefAnimKitID; @@ -52,12 +53,14 @@ struct AnimKitEntry struct AreaGroupMemberEntry { + uint32 ID; uint16 AreaGroupID; uint16 AreaID; }; struct AreaTableEntry { + uint32 ID; uint32 Flags[2]; char const* ZoneName; float AmbientMultiplier; @@ -69,6 +72,7 @@ struct AreaTableEntry uint16 ZoneMusic; uint16 IntroSound; uint16 LiquidTypeID[4]; + uint16 UWIntroMusic; uint16 UWZoneMusic; uint16 UWAmbience; uint16 PvPCombastWorldStateID; @@ -77,7 +81,6 @@ struct AreaTableEntry uint8 ExplorationLevel; uint8 FactionGroupMask; uint8 MountFlags; - uint8 UWIntroMusic; uint8 WildBattlePetLevelMin; uint8 WildBattlePetLevelMax; uint8 WindSettingsID; @@ -112,11 +115,13 @@ struct AreaTriggerEntry struct ArmorLocationEntry { + uint32 ID; float Modifier[5]; }; struct AuctionHouseEntry { + uint32 ID; LocalizedString* Name; uint16 FactionID; // id of faction.dbc for player factions associated with city uint8 DepositRate; @@ -125,9 +130,18 @@ struct AuctionHouseEntry struct BankBagSlotPricesEntry { + uint32 ID; uint32 Cost; }; +struct BannedAddOnsEntry +{ + uint32 ID; + char const* Name; + char const* Version; + uint8 Flags; +}; + struct BarberShopStyleEntry { uint32 ID; @@ -142,6 +156,7 @@ struct BarberShopStyleEntry struct BattlePetBreedQualityEntry { + uint32 ID; float Modifier; uint8 Quality; }; @@ -175,10 +190,31 @@ struct BattlePetSpeciesStateEntry uint8 State; }; +struct BattlemasterListEntry +{ + uint32 ID; + LocalizedString* Name; + uint32 IconFileDataID; + LocalizedString* GameType; + int16 MapID[16]; + uint16 HolidayWorldState; + uint16 PlayerConditionID; + uint8 InstanceType; + uint8 GroupsAllowed; + uint8 MaxGroupSize; + uint8 MinLevel; + uint8 MaxLevel; + uint8 RatedPlayers; + uint8 MinPlayers; + uint8 MaxPlayers; + uint8 Flags; +}; + #define MAX_BROADCAST_TEXT_EMOTES 3 struct BroadcastTextEntry { + uint32 ID; LocalizedString* MaleText; LocalizedString* FemaleText; uint16 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; @@ -189,10 +225,23 @@ struct BroadcastTextEntry uint8 Type; }; +struct CharSectionsEntry +{ + uint32 Id; + uint32 TextureFileDataID[3]; + uint16 Flags; + uint8 Race; + uint8 Gender; + uint8 GenType; + uint8 Type; + uint8 Color; +}; + #define MAX_OUTFIT_ITEMS 24 struct CharStartOutfitEntry { + uint32 ID; int32 ItemID[MAX_OUTFIT_ITEMS]; uint32 PetDisplayID; // Pet Model ID for starting pet uint8 RaceID; @@ -204,6 +253,7 @@ struct CharStartOutfitEntry struct CharTitlesEntry { + uint32 ID; LocalizedString* NameMale; LocalizedString* NameFemale; uint16 ConditionID; @@ -213,14 +263,39 @@ struct CharTitlesEntry struct ChatChannelsEntry { + uint32 ID; uint32 Flags; LocalizedString* Name; LocalizedString* Shortcut; uint8 FactionGroup; }; +struct ChrClassesEntry +{ + uint32 ID; + uint8 PowerType; + char const* PetNameToken; + LocalizedString* Name; + LocalizedString* NameFemale; + LocalizedString* NameMale; + char const* Filename; + uint32 CreateScreenFileDataID; + uint32 SelectScreenFileDataID; + uint32 LowResScreenFileDataID; + uint16 Flags; + uint16 CinematicSequenceID; + uint16 DefaultSpec; + uint8 SpellClassSet; + uint8 AttackPowerPerStrength; + uint8 AttackPowerPerAgility; + uint8 RangedAttackPowerPerAgility; + uint8 IconFileDataID; + uint8 Unk1; +}; + struct ChrClassesXPowerTypesEntry { + uint32 ID; uint8 ClassID; uint8 PowerType; }; @@ -261,6 +336,7 @@ struct ChrRacesEntry uint8 CharComponentTextureLayoutID; uint8 DefaultClassID; uint8 NeutralRaceID; + uint8 ItemAppearanceFrameRaceID; uint8 CharComponentTexLayoutHiResID; }; @@ -286,6 +362,7 @@ struct ChrSpecializationEntry struct CinematicSequencesEntry { + uint32 ID; uint16 SoundID; uint16 Camera[8]; }; @@ -301,6 +378,7 @@ struct CreatureDisplayInfoEntry uint32 PortraitCreatureDisplayInfoID; uint32 CreatureGeosetData; uint32 StateSpellVisualKitID; + float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios uint16 ModelID; uint16 SoundID; uint16 NPCSoundID; @@ -317,6 +395,7 @@ struct CreatureDisplayInfoEntry struct CreatureDisplayInfoExtraEntry { + uint32 ID; uint32 FileDataID; uint32 HDFileDataID; uint8 DisplayRaceID; @@ -333,6 +412,7 @@ struct CreatureDisplayInfoExtraEntry struct CreatureFamilyEntry { + uint32 ID; float MinScale; float MaxScale; LocalizedString* Name; @@ -345,14 +425,52 @@ struct CreatureFamilyEntry uint8 CategoryEnumID; }; +struct CreatureModelDataEntry +{ + uint32 ID; + uint32 Flags; + uint32 FileDataID; + float ModelScale; + float FootprintTextureLength; + float FootprintTextureWidth; + float FootprintParticleScale; + float CollisionWidth; + float CollisionHeight; + float MountHeight; + float GeoBoxMin[3]; + float GeoBoxMax[3]; + float WorldEffectScale; + float AttachedEffectScale; + float MissileCollisionRadius; + float MissileCollisionPush; + float MissileCollisionRaise; + float OverrideLootEffectScale; + float OverrideNameScale; + float OverrideSelectionRadius; + float TamedPetBaseScale; + float HoverHeight; + uint16 SoundID; + uint16 CreatureGeosetDataID; + uint8 SizeClass; + uint8 BloodID; + uint8 FootprintTextureID; + uint8 FoleyMaterialID; + uint8 Unk700_1; + uint8 Unk700_2; + uint8 FootstepShakeSize; + uint8 DeathThudShakeSize; +}; + struct CreatureTypeEntry { + uint32 ID; LocalizedString* Name; uint8 Flags; // no exp? critters, non-combat pets, gas cloud. }; struct CriteriaEntry { + uint32 ID; union { uint32 ID; @@ -486,6 +604,7 @@ struct CriteriaEntry struct CriteriaTreeEntry { + uint32 ID; uint32 Amount; LocalizedString* Description; uint16 CriteriaID; @@ -512,6 +631,7 @@ struct CurrencyTypesEntry struct CurvePointEntry { + uint32 ID; float X; float Y; uint16 CurveID; @@ -520,6 +640,7 @@ struct CurvePointEntry struct DestructibleModelDataEntry { + uint32 ID; uint16 StateDamagedDisplayID; uint16 StateDestroyedDisplayID; uint16 StateRebuildingDisplayID; @@ -564,6 +685,7 @@ struct DifficultyEntry struct DungeonEncounterEntry { + uint32 ID; LocalizedString* Name; uint32 CreatureDisplayID; uint16 MapID; @@ -576,34 +698,41 @@ struct DungeonEncounterEntry struct DurabilityCostsEntry { + uint32 ID; uint16 WeaponSubClassCost[21]; uint16 ArmorSubClassCost[8]; }; struct DurabilityQualityEntry { + uint32 ID; float QualityMod; }; struct EmotesEntry { + uint32 ID; char const* EmoteSlashCommand; uint32 SpellVisualKitID; uint32 EmoteFlags; + int32 Unk703_1; + int32 Unk703_2; uint16 AnimID; + uint16 EmoteSpecProcParam; uint16 EmoteSoundID; uint8 EmoteSpecProc; - uint8 EmoteSpecProcParam; }; struct EmotesTextEntry { + uint32 ID; LocalizedString* Name; uint16 EmoteID; }; struct EmotesTextSoundEntry { + uint32 ID; uint16 EmotesTextId; uint16 SoundId; uint8 RaceId; @@ -611,6 +740,89 @@ struct EmotesTextSoundEntry uint8 ClassId; }; +struct FactionEntry +{ + uint32 ID; + uint32 ReputationRaceMask[4]; + int32 ReputationBase[4]; + float ParentFactionModIn; // Faction gains incoming rep * ParentFactionModIn + float ParentFactionModOut; // Faction outputs rep * ParentFactionModOut as spillover reputation + LocalizedString* Name; + LocalizedString* Description; + int16 ReputationIndex; + uint16 ReputationClassMask[4]; + uint16 ReputationFlags[4]; + uint16 ParentFactionID; + uint8 ParentFactionCapIn; // The highest rank the faction will profit from incoming spillover + uint8 ParentFactionCapOut; + uint8 Expansion; + uint8 Flags; + uint8 FriendshipRepID; + + // helpers + bool CanHaveReputation() const + { + return ReputationIndex >= 0; + } +}; + +#define MAX_FACTION_RELATIONS 4 + +struct FactionTemplateEntry +{ + uint32 ID; + uint16 Faction; + uint16 Flags; + uint16 Enemies[MAX_FACTION_RELATIONS]; + uint16 Friends[MAX_FACTION_RELATIONS]; + uint8 Mask; + uint8 FriendMask; + uint8 EnemyMask; + + //------------------------------------------------------- end structure + + // helpers + bool IsFriendlyTo(FactionTemplateEntry const* entry) const + { + if (this == entry) + return true; + if (entry->Faction) + { + for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Enemies[i] == entry->Faction) + return false; + for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Friends[i] == entry->Faction) + return true; + } + return (FriendMask & entry->Mask) || (Mask & entry->FriendMask); + } + bool IsHostileTo(FactionTemplateEntry const* entry) const + { + if (this == entry) + return false; + if (entry->Faction) + { + for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Enemies[i] == entry->Faction) + return true; + for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Friends[i] == entry->Faction) + return false; + } + return (EnemyMask & entry->Mask) != 0; + } + bool IsHostileToPlayers() const { return (EnemyMask & FACTION_MASK_PLAYER) !=0; } + bool IsNeutralToAll() const + { + for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) + if (Enemies[i] != 0) + return false; + return EnemyMask == 0 && FriendMask == 0; + } + bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } +}; + struct GameObjectsEntry { uint32 ID; @@ -632,6 +844,7 @@ struct GameObjectsEntry struct GameObjectDisplayInfoEntry { + uint32 ID; uint32 FileDataID; DBCPosition3D GeoBoxMin; DBCPosition3D GeoBoxMax; @@ -640,27 +853,21 @@ struct GameObjectDisplayInfoEntry uint16 ObjectEffectPackageID; }; -struct GameTablesEntry -{ - LocalizedString* Name; - uint16 NumRows; - uint8 NumColumns; -}; - struct GarrAbilityEntry { uint32 ID; LocalizedString* Name; LocalizedString* Description; uint32 IconFileDataID; + uint16 Flags; uint16 OtherFactionGarrAbilityID; - uint8 Flags; uint8 GarrAbilityCategoryID; uint8 FollowerTypeID; }; struct GarrBuildingEntry { + uint32 ID; uint32 HordeGameObjectID; uint32 AllianceGameObjectID; LocalizedString* NameAlliance; @@ -704,11 +911,13 @@ struct GarrClassSpecEntry LocalizedString* NameGenderless; uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref uint8 GarrFollItemSetID; - uint8 Unknown700; + uint8 Limit; + uint8 Flags; }; struct GarrFollowerEntry { + uint32 ID; uint32 HordeCreatureID; uint32 AllianceCreatureID; LocalizedString* HordeSourceText; @@ -733,10 +942,13 @@ struct GarrFollowerEntry uint8 HordeListPortraitTextureKitID; uint8 AllianceListPortraitTextureKitID; uint8 GarrTypeID; + uint8 MaxDurability; + uint8 Class; }; struct GarrFollowerXAbilityEntry { + uint32 ID; uint16 GarrFollowerID; uint16 GarrAbilityID; uint8 FactionIndex; @@ -744,30 +956,34 @@ struct GarrFollowerXAbilityEntry struct GarrPlotEntry { + uint32 ID; LocalizedString* Name; uint32 AllianceConstructionGameObjectID; uint32 HordeConstructionGameObjectID; + uint16 MinCount; + uint16 MaxCount; uint8 GarrPlotUICategoryID; uint8 PlotType; uint8 Flags; - uint8 MinCount; - uint8 MaxCount; }; struct GarrPlotBuildingEntry { + uint32 ID; uint8 GarrPlotID; uint8 GarrBuildingID; }; struct GarrPlotInstanceEntry { + uint32 ID; LocalizedString* Name; uint8 GarrPlotID; }; struct GarrSiteLevelEntry { + uint32 ID; DBCPosition2D TownHall; uint16 MapID; uint16 UpgradeResourceCost; @@ -781,6 +997,7 @@ struct GarrSiteLevelEntry struct GarrSiteLevelPlotInstEntry { + uint32 ID; DBCPosition2D Landmark; uint16 GarrSiteLevelID; uint8 GarrPlotInstanceID; @@ -789,15 +1006,15 @@ struct GarrSiteLevelPlotInstEntry struct GemPropertiesEntry { + uint32 ID; uint32 Type; uint16 EnchantID; uint16 MinItemLevel; - uint8 MaxCountInv; - uint8 MaxCountItem; }; struct GlyphPropertiesEntry { + uint32 ID; uint32 SpellID; uint16 SpellIconID; uint8 Type; @@ -806,12 +1023,14 @@ struct GlyphPropertiesEntry struct GlyphSlotEntry { + uint32 ID; + uint16 Tooltip; uint8 Type; - uint8 Tooltip; }; struct GuildColorBackgroundEntry { + uint32 ID; uint8 Red; uint8 Green; uint8 Blue; @@ -819,6 +1038,7 @@ struct GuildColorBackgroundEntry struct GuildColorBorderEntry { + uint32 ID; uint8 Red; uint8 Green; uint8 Blue; @@ -826,6 +1046,7 @@ struct GuildColorBorderEntry struct GuildColorEmblemEntry { + uint32 ID; uint8 Red; uint8 Green; uint8 Blue; @@ -833,8 +1054,8 @@ struct GuildColorEmblemEntry struct GuildPerkSpellsEntry { + uint32 ID; uint32 SpellID; - uint8 GuildLevel; }; struct HeirloomEntry @@ -856,6 +1077,7 @@ struct HeirloomEntry struct HolidaysEntry { + uint32 ID; uint32 Date[MAX_HOLIDAY_DATES]; // dates in unix time starting at January, 1, 2000 char const* TextureFilename; uint16 Duration[MAX_HOLIDAY_DURATIONS]; @@ -871,6 +1093,7 @@ struct HolidaysEntry struct ImportPriceArmorEntry { + uint32 ID; float ClothFactor; float LeatherFactor; float MailFactor; @@ -879,21 +1102,25 @@ struct ImportPriceArmorEntry struct ImportPriceQualityEntry { + uint32 ID; float Factor; }; struct ImportPriceShieldEntry { + uint32 ID; float Factor; }; struct ImportPriceWeaponEntry { + uint32 ID; float Factor; }; struct ItemEntry { + uint32 ID; uint32 FileDataID; uint8 Class; uint8 SubClass; @@ -906,31 +1133,37 @@ struct ItemEntry struct ItemAppearanceEntry { + uint32 ID; uint32 DisplayID; uint32 IconFileDataID; + uint32 UIOrder; uint8 ObjectComponentSlot; }; struct ItemArmorQualityEntry { + uint32 ID; float QualityMod[7]; uint16 ItemLevel; }; struct ItemArmorShieldEntry { + uint32 ID; float Quality[7]; uint16 ItemLevel; }; struct ItemArmorTotalEntry { + uint32 ID; float Value[4]; uint16 ItemLevel; }; struct ItemBagFamilyEntry { + uint32 ID; LocalizedString* Name; }; @@ -945,6 +1178,7 @@ struct ItemBonusEntry struct ItemBonusTreeNodeEntry { + uint32 ID; uint16 BonusTreeID; uint16 SubTreeID; uint16 BonusListID; @@ -953,6 +1187,7 @@ struct ItemBonusTreeNodeEntry struct ItemClassEntry { + uint32 ID; float PriceMod; LocalizedString* Name; uint8 Flags; @@ -960,41 +1195,48 @@ struct ItemClassEntry struct ItemCurrencyCostEntry { + uint32 ID; uint32 ItemId; }; struct ItemDamageAmmoEntry { + uint32 ID; float DPS[7]; uint16 ItemLevel; }; struct ItemDamageOneHandEntry { + uint32 ID; float DPS[7]; uint16 ItemLevel; }; struct ItemDamageOneHandCasterEntry { + uint32 ID; float DPS[7]; uint16 ItemLevel; }; struct ItemDamageTwoHandEntry { + uint32 ID; float DPS[7]; uint16 ItemLevel; }; struct ItemDamageTwoHandCasterEntry { + uint32 ID; float DPS[7]; uint16 ItemLevel; }; struct ItemDisenchantLootEntry { + uint32 ID; uint16 MinItemLevel; uint16 MaxItemLevel; uint16 RequiredDisenchantSkill; @@ -1005,6 +1247,7 @@ struct ItemDisenchantLootEntry struct ItemEffectEntry { + uint32 ID; uint32 ItemID; uint32 SpellID; int32 Cooldown; @@ -1021,6 +1264,7 @@ struct ItemEffectEntry struct ItemExtendedCostEntry { + uint32 ID; uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count uint32 RequiredMoney; @@ -1036,6 +1280,7 @@ struct ItemExtendedCostEntry struct ItemLimitCategoryEntry { + uint32 ID; LocalizedString* Name; uint8 Quantity; uint8 Flags; @@ -1048,10 +1293,12 @@ struct ItemModifiedAppearanceEntry uint16 AppearanceID; uint8 AppearanceModID; uint8 Index; + uint8 SourceType; }; struct ItemPriceBaseEntry { + uint32 ID; float ArmorFactor; float WeaponFactor; uint16 ItemLevel; @@ -1061,12 +1308,14 @@ struct ItemPriceBaseEntry struct ItemRandomPropertiesEntry { + uint32 ID; LocalizedString* Name; uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; }; struct ItemRandomSuffixEntry { + uint32 ID; LocalizedString* Name; LocalizedString* InternalName; uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; @@ -1077,14 +1326,17 @@ struct ItemRandomSuffixEntry struct ItemSetEntry { + uint32 ID; LocalizedString* Name; uint32 ItemID[MAX_ITEM_SET_ITEMS]; + uint32 Unknown703; uint16 RequiredSkillRank; uint8 RequiredSkill; }; struct ItemSetSpellEntry { + uint32 ID; uint32 SpellID; uint16 ItemSetID; uint16 ChrSpecID; @@ -1097,6 +1349,7 @@ struct ItemSetSpellEntry struct ItemSparseEntry { + uint32 ID; uint32 Flags[MAX_ITEM_PROTO_FLAGS]; float Unk1; float Unk2; @@ -1159,10 +1412,12 @@ struct ItemSparseEntry uint8 CurrencySubstitutionID; uint8 CurrencySubstitutionCount; uint8 ArtifactID; + uint8 RequiredExpansion; }; struct ItemSpecEntry { + uint32 ID; uint16 SpecID; uint8 MinLevel; uint8 MaxLevel; @@ -1173,17 +1428,14 @@ struct ItemSpecEntry struct ItemSpecOverrideEntry { + uint32 ID; uint32 ItemID; uint16 SpecID; }; -struct ItemToBattlePetSpeciesEntry -{ - uint16 BattlePetSpeciesID; -}; - struct ItemXBonusTreeEntry { + uint32 ID; uint32 ItemID; uint16 BonusTreeID; }; @@ -1192,13 +1444,86 @@ struct ItemXBonusTreeEntry struct KeyChainEntry { + uint32 ID; uint8 Key[KEYCHAIN_SIZE]; }; +struct LfgDungeonsEntry +{ + uint32 ID; + LocalizedString* Name; + uint32 Flags; + char const* TextureFilename; + LocalizedString* Description; + uint16 MaxLevel; + uint16 TargetLevelMax; + int16 MapID; + uint16 RandomID; + uint16 ScenarioID; + uint16 LastBossJournalEncounterID; + uint16 BonusReputationAmount; + uint16 MentorItemLevel; + uint8 MinLevel; + uint8 TargetLevel; + uint8 TargetLevelMin; + uint8 DifficultyID; + uint8 Type; + uint8 Faction; + uint8 Expansion; + uint8 OrderIndex; + uint8 GroupID; + uint8 CountTank; + uint8 CountHealer; + uint8 CountDamage; + uint8 MinCountTank; + uint8 MinCountHealer; + uint8 MinCountDamage; + uint8 SubType; + uint8 MentorCharLevel; + + // Helpers + uint32 Entry() const { return ID + (Type << 24); } +}; + +struct LightEntry +{ + uint32 ID; + DBCPosition3D Pos; + float FalloffStart; + float FalloffEnd; + uint16 MapID; + uint16 LightParamsID[8]; +}; + +struct LiquidTypeEntry +{ + uint32 ID; + LocalizedString* Name; + uint32 SpellID; + float MaxDarkenDepth; + float FogDarkenIntensity; + float AmbDarkenIntensity; + float DirDarkenIntensity; + float ParticleScale; + char const* Texture[6]; + uint32 Color[2]; + float Float[18]; + uint32 Int[4]; + uint16 Flags; + uint16 SoundID; + uint8 Type; + uint8 LightID; + uint8 ParticleMovement; + uint8 ParticleTexSlots; + uint8 MaterialID; + uint8 DepthTexCount[6]; +}; + #define MAX_LOCK_CASE 8 struct LockEntry { + uint32 ID; uint32 Index[MAX_LOCK_CASE]; uint16 Skill[MAX_LOCK_CASE]; uint8 Type[MAX_LOCK_CASE]; @@ -1207,6 +1532,7 @@ struct LockEntry struct MailTemplateEntry { + uint32 ID; LocalizedString* Body; }; @@ -1218,7 +1544,6 @@ struct MapEntry uint32 MapType; float MinimapIconScale; DBCPosition2D CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance) - uint32 RaidOffset; LocalizedString* MapName; LocalizedString* MapDescription0; // Horde LocalizedString* MapDescription1; // Alliance @@ -1266,8 +1591,31 @@ struct MapEntry bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; } }; +struct MapDifficultyEntry +{ + uint32 ID; + LocalizedString* Message_lang; // m_message_lang (text showed when transfer to map failed) + uint32 Context; + uint16 MapID; + uint8 DifficultyID; + uint8 RaidDurationType; // 1 means daily reset, 2 means weekly + uint8 MaxPlayers; // m_maxPlayers some heroic versions have 0 when expected same amount as in normal version + uint8 LockID; + uint8 ItemBonusTreeModID; + + uint32 GetRaidDuration() const + { + if (RaidDurationType == 1) + return 86400; + if (RaidDurationType == 2) + return 604800; + return 0; + } +}; + struct ModifierTreeEntry { + uint32 ID; uint32 Asset[2]; uint16 Parent; uint8 Type; @@ -1293,17 +1641,18 @@ struct MountEntry struct MountCapabilityEntry { uint32 ID; + uint32 RequiredAura; uint32 RequiredSpell; uint32 SpeedModSpell; uint16 RequiredRidingSkill; uint16 RequiredArea; int16 RequiredMap; uint8 Flags; - uint8 RequiredAura; }; struct MountTypeXCapabilityEntry { + uint32 ID; uint16 MountTypeID; uint16 MountCapabilityID; uint8 OrderIndex; @@ -1311,6 +1660,7 @@ struct MountTypeXCapabilityEntry struct MovieEntry { + uint32 ID; uint32 AudioFileDataID; uint32 SubtitleFileDataID; uint8 Volume; @@ -1319,6 +1669,7 @@ struct MovieEntry struct NameGenEntry { + uint32 ID; LocalizedString* Name; uint8 Race; uint8 Sex; @@ -1326,17 +1677,20 @@ struct NameGenEntry struct NamesProfanityEntry { + uint32 ID; char const* Name; int8 Language; }; struct NamesReservedEntry { + uint32 ID; char const* Name; }; struct NamesReservedLocaleEntry { + uint32 ID; char const* Name; uint8 LocaleMask; }; @@ -1345,6 +1699,7 @@ struct NamesReservedLocaleEntry struct OverrideSpellDataEntry { + uint32 ID; uint32 SpellID[MAX_OVERRIDE_SPELL]; uint32 PlayerActionbarFileDataID; uint8 Flags; @@ -1352,17 +1707,20 @@ struct OverrideSpellDataEntry struct PhaseEntry { + uint32 ID; uint16 Flags; }; struct PhaseXPhaseGroupEntry { + uint32 ID; uint16 PhaseID; uint16 PhaseGroupID; }; struct PlayerConditionEntry { + uint32 ID; uint32 RaceMask; uint32 SkillLogic; uint32 ReputationLogic; @@ -1447,6 +1805,7 @@ struct PlayerConditionEntry struct PowerDisplayEntry { + uint32 ID; char const* GlobalStringBaseTag; uint8 PowerType; uint8 Red; @@ -1456,6 +1815,7 @@ struct PowerDisplayEntry struct PvPDifficultyEntry { + uint32 ID; uint16 MapID; uint8 BracketID; uint8 MinLevel; @@ -1467,16 +1827,19 @@ struct PvPDifficultyEntry struct QuestFactionRewardEntry { + uint32 ID; int16 QuestRewFactionValue[10]; }; struct QuestMoneyRewardEntry { + uint32 ID; uint32 Money[10]; }; struct QuestPackageItemEntry { + uint32 ID; uint32 ItemID; uint16 QuestPackageID; uint8 ItemCount; @@ -1485,28 +1848,34 @@ struct QuestPackageItemEntry struct QuestSortEntry { + uint32 ID; LocalizedString* SortName; + uint8 SortOrder; }; struct QuestV2Entry { + uint32 ID; uint16 UniqueBitFlag; }; struct QuestXPEntry { + uint32 ID; uint16 Exp[10]; }; struct RandPropPointsEntry { - uint16 EpicPropertiesPoints[5]; - uint16 RarePropertiesPoints[5]; - uint16 UncommonPropertiesPoints[5]; + uint32 ID; + uint32 EpicPropertiesPoints[5]; + uint32 RarePropertiesPoints[5]; + uint32 UncommonPropertiesPoints[5]; }; struct ScalingStatDistributionEntry { + uint32 ID; uint16 ItemLevelCurveID; uint8 MinLevel; uint8 MaxLevel; @@ -1514,6 +1883,7 @@ struct ScalingStatDistributionEntry struct SkillLineEntry { + uint32 ID; LocalizedString* DisplayName; LocalizedString* Description; LocalizedString* AlternateVerb; @@ -1526,6 +1896,7 @@ struct SkillLineEntry struct SkillLineAbilityEntry { + uint32 ID; uint32 SpellID; uint32 RaceMask; uint32 ClassMask; @@ -1542,9 +1913,10 @@ struct SkillLineAbilityEntry struct SkillRaceClassInfoEntry { + uint32 ID; int32 RaceMask; + int32 ClassMask; uint16 SkillID; - int16 ClassMask; uint16 Flags; uint16 SkillTierID; uint8 Availability; @@ -1554,7 +1926,6 @@ struct SkillRaceClassInfoEntry struct SoundKitEntry { uint32 ID; - uint8 SoundType; LocalizedString* Name; float VolumeFloat; float MinDistance; @@ -1566,9 +1937,10 @@ struct SoundKitEntry float PitchAdjust; uint16 Flags; uint16 SoundEntriesAdvancedID; + uint16 BusOverwriteID; + uint8 SoundType; uint8 EAXDef; uint8 DialogType; - uint8 BusOverwriteID; uint8 Unk700; }; @@ -1595,6 +1967,7 @@ struct SpellEntry struct SpellAuraOptionsEntry { + uint32 ID; uint32 SpellID; uint32 ProcCharges; uint32 ProcTypeMask; @@ -1607,6 +1980,7 @@ struct SpellAuraOptionsEntry struct SpellAuraRestrictionsEntry { + uint32 ID; uint32 SpellID; uint32 CasterAuraSpell; uint32 TargetAuraSpell; @@ -1621,6 +1995,7 @@ struct SpellAuraRestrictionsEntry struct SpellCastTimesEntry { + uint32 ID; int32 CastTime; int32 MinCastTime; int16 CastTimePerLevel; @@ -1628,6 +2003,7 @@ struct SpellCastTimesEntry struct SpellCastingRequirementsEntry { + uint32 ID; uint32 SpellID; uint16 MinFactionID; uint16 RequiredAreasID; @@ -1639,6 +2015,7 @@ struct SpellCastingRequirementsEntry struct SpellCategoriesEntry { + uint32 ID; uint32 SpellID; uint16 Category; uint16 StartRecoveryCategory; @@ -1652,8 +2029,10 @@ struct SpellCategoriesEntry struct SpellCategoryEntry { + uint32 ID; LocalizedString* Name; int32 ChargeRecoveryTime; + uint32 Unk703; uint8 Flags; uint8 UsesPerWeek; uint8 MaxCharges; @@ -1661,6 +2040,7 @@ struct SpellCategoryEntry struct SpellClassOptionsEntry { + uint32 ID; uint32 SpellID; flag128 SpellClassMask; uint16 ModalNextSpell; @@ -1669,6 +2049,7 @@ struct SpellClassOptionsEntry struct SpellCooldownsEntry { + uint32 ID; uint32 SpellID; uint32 CategoryRecoveryTime; uint32 RecoveryTime; @@ -1678,6 +2059,7 @@ struct SpellCooldownsEntry struct SpellDurationEntry { + uint32 ID; int32 Duration; int32 MaxDuration; int16 DurationPerLevel; @@ -1719,6 +2101,7 @@ struct SpellEffectEntry struct SpellEffectScalingEntry { + uint32 ID; float Coefficient; float Variance; float ResourceCoefficient; @@ -1727,6 +2110,7 @@ struct SpellEffectScalingEntry struct SpellEquippedItemsEntry { + uint32 ID; uint32 SpellID; int32 EquippedItemInventoryTypeMask; int32 EquippedItemSubClassMask; @@ -1735,11 +2119,13 @@ struct SpellEquippedItemsEntry struct SpellFocusObjectEntry { + uint32 ID; LocalizedString* Name; }; struct SpellInterruptsEntry { + uint32 ID; uint32 SpellID; uint32 AuraInterruptFlags[2]; uint32 ChannelInterruptFlags[2]; @@ -1747,8 +2133,35 @@ struct SpellInterruptsEntry uint8 DifficultyID; }; +#define MAX_ITEM_ENCHANTMENT_EFFECTS 3 + +struct SpellItemEnchantmentEntry +{ + uint32 ID; + uint32 EffectSpellID[MAX_ITEM_ENCHANTMENT_EFFECTS]; + LocalizedString* Name; + float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS]; + uint32 PlayerConditionID; + uint32 TransmogCost; + uint32 TextureFileDataID; + uint16 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS]; + uint16 ItemVisual; + uint16 Flags; + uint16 RequiredSkillID; + uint16 RequiredSkillRank; + uint16 ItemLevel; + uint8 Charges; + uint8 Effect[MAX_ITEM_ENCHANTMENT_EFFECTS]; + uint8 ConditionID; + uint8 MinLevel; + uint8 MaxLevel; + int8 ScalingClass; + int8 ScalingClassRestricted; +}; + struct SpellItemEnchantmentConditionEntry { + uint32 ID; uint8 LTOperandType[5]; uint8 LTOperand[5]; uint8 Operator[5]; @@ -1759,6 +2172,7 @@ struct SpellItemEnchantmentConditionEntry struct SpellLearnSpellEntry { + uint32 ID; uint32 LearnSpellID; uint32 SpellID; uint32 OverridesSpellID; @@ -1766,6 +2180,7 @@ struct SpellLearnSpellEntry struct SpellLevelsEntry { + uint32 ID; uint32 SpellID; uint16 BaseLevel; uint16 MaxLevel; @@ -1776,6 +2191,7 @@ struct SpellLevelsEntry struct SpellMiscEntry { + uint32 ID; uint32 Attributes; uint32 AttributesEx; uint32 AttributesExB; @@ -1844,6 +2260,7 @@ struct SpellProcsPerMinuteModEntry struct SpellRadiusEntry { + uint32 ID; float Radius; float RadiusPerLevel; float RadiusMin; @@ -1852,6 +2269,7 @@ struct SpellRadiusEntry struct SpellRangeEntry { + uint32 ID; float MinRangeHostile; float MinRangeFriend; float MaxRangeHostile; @@ -1865,6 +2283,7 @@ struct SpellRangeEntry struct SpellReagentsEntry { + uint32 ID; uint32 SpellID; int32 Reagent[MAX_SPELL_REAGENTS]; uint16 ReagentCount[MAX_SPELL_REAGENTS]; @@ -1872,14 +2291,17 @@ struct SpellReagentsEntry struct SpellScalingEntry { + uint32 ID; uint32 SpellID; uint16 ScalesFromItemLevel; int8 ScalingClass; + uint8 MinScalingLevel; uint8 MaxScalingLevel; }; struct SpellShapeshiftEntry { + uint32 ID; uint32 SpellID; uint32 ShapeshiftExclude[2]; uint32 ShapeshiftMask[2]; @@ -1890,6 +2312,7 @@ struct SpellShapeshiftEntry struct SpellShapeshiftFormEntry { + uint32 ID; LocalizedString* Name; float WeaponDamageVariance; uint32 Flags; @@ -1904,6 +2327,7 @@ struct SpellShapeshiftFormEntry struct SpellTargetRestrictionsEntry { + uint32 ID; uint32 SpellID; float ConeAngle; float Width; @@ -1918,6 +2342,7 @@ struct SpellTargetRestrictionsEntry struct SpellTotemsEntry { + uint32 ID; uint32 SpellID; uint32 Totem[MAX_SPELL_TOTEMS]; uint8 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; @@ -1936,6 +2361,7 @@ struct SpellXSpellVisualEntry struct SummonPropertiesEntry { + uint32 ID; uint32 Category; uint32 Faction; uint32 Type; @@ -1943,6 +2369,23 @@ struct SummonPropertiesEntry uint32 Flags; }; +#define MAX_TALENT_TIERS 7 +#define MAX_TALENT_COLUMNS 3 + +struct TalentEntry +{ + uint32 ID; + uint32 SpellID; + uint32 OverridesSpellID; + LocalizedString* Description; + uint16 SpecID; + uint8 TierID; + uint8 ColumnIndex; + uint8 Flags; + uint8 CategoryMask[2]; + uint8 ClassID; +}; + struct TaxiNodesEntry { uint32 ID; @@ -1979,6 +2422,7 @@ struct TaxiPathNodeEntry struct TotemCategoryEntry { + uint32 ID; LocalizedString* Name; uint32 CategoryMask; uint8 CategoryType; @@ -1995,6 +2439,7 @@ struct ToyEntry struct TransportAnimationEntry { + uint32 ID; uint32 TransportID; uint32 TimeIndex; DBCPosition3D Pos; @@ -2003,6 +2448,7 @@ struct TransportAnimationEntry struct TransportRotationEntry { + uint32 ID; uint32 TransportID; uint32 TimeIndex; float X; @@ -2013,6 +2459,7 @@ struct TransportRotationEntry struct UnitPowerBarEntry { + uint32 ID; uint32 MaxPower; float RegenerationPeace; float RegenerationCombat; @@ -2031,8 +2478,45 @@ struct UnitPowerBarEntry uint8 BarType; }; +#define MAX_VEHICLE_SEATS 8 + +struct VehicleEntry +{ + uint32 ID; + uint32 Flags; + float TurnSpeed; + float PitchSpeed; + float PitchMin; + float PitchMax; + float MouseLookOffsetPitch; + float CameraFadeDistScalarMin; + float CameraFadeDistScalarMax; + float CameraPitchOffset; + float FacingLimitRight; + float FacingLimitLeft; + float MsslTrgtTurnLingering; + float MsslTrgtPitchLingering; + float MsslTrgtMouseLingering; + float MsslTrgtEndOpacity; + float MsslTrgtArcSpeed; + float MsslTrgtArcRepeat; + float MsslTrgtArcWidth; + float MsslTrgtImpactRadius[2]; + char const* MsslTrgtArcTexture; + char const* MsslTrgtImpactTexture; + char const* MsslTrgtImpactModel[2]; + float CameraYawOffset; + float MsslTrgtImpactTexRadius; + uint16 SeatID[MAX_VEHICLE_SEATS]; + uint16 VehicleUIIndicatorID; + uint16 PowerDisplayID[3]; + uint8 FlagsB; + uint8 UILocomotionType; +}; + struct VehicleSeatEntry { + uint32 ID; uint32 Flags[3]; DBCPosition3D AttachmentOffset; float EnterPreDelay; @@ -2054,6 +2538,8 @@ struct VehicleSeatEntry float PassengerRoll; float VehicleEnterAnimDelay; float VehicleExitAnimDelay; + uint32 EnterUISoundID; + uint32 ExitUISoundID; float CameraEnteringDelay; float CameraEnteringDuration; float CameraExitingDelay; @@ -2077,8 +2563,6 @@ struct VehicleSeatEntry int16 VehicleEnterAnim; int16 VehicleExitAnim; int16 VehicleRideAnimLoop; - uint16 EnterUISoundID; - uint16 ExitUISoundID; uint16 EnterAnimKitID; uint16 RideAnimKitID; uint16 ExitAnimKitID; @@ -2109,10 +2593,51 @@ struct VehicleSeatEntry bool IsEjectable() const { return (Flags[1] & VEHICLE_SEAT_FLAG_B_EJECTABLE) != 0; } }; +struct WMOAreaTableEntry +{ + uint32 ID; + int32 WMOGroupID; // used in group WMO + LocalizedString* AreaName; + int16 WMOID; // used in root WMO + uint16 AmbienceID; + uint16 ZoneMusic; + uint16 IntroSound; + uint16 AreaTableID; + uint16 UWIntroSound; + uint16 UWAmbience; + int8 NameSet; // used in adt file + uint8 SoundProviderPref; + uint8 SoundProviderPrefUnderwater; + uint8 Flags; + uint8 UWZoneMusic; +}; + +struct WorldMapAreaEntry +{ + uint32 ID; + char const* AreaName; + float LocLeft; + float LocRight; + float LocTop; + float LocBottom; + uint16 MapID; + uint16 AreaID; + int16 DisplayMapID; + int16 DefaultDungeonFloor; + uint16 ParentWorldMapID; + uint16 Flags; + uint16 PlayerConditionID; + uint8 LevelRangeMin; + uint8 LevelRangeMax; + uint8 BountySetID; + uint8 BountyBoardLocation; +}; + #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 struct WorldMapOverlayEntry { + uint32 ID; char const* TextureName; uint16 MapAreaID; // idx in WorldMapArea.dbc uint16 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; @@ -2125,10 +2650,12 @@ struct WorldMapOverlayEntry uint16 HitRectBottom; uint16 HitRectRight; uint16 PlayerConditionID; + uint8 Flags; }; struct WorldMapTransformsEntry { + uint32 ID; DBCPosition3D RegionMin; DBCPosition3D RegionMax; DBCPosition2D RegionOffset; @@ -2140,24 +2667,14 @@ struct WorldMapTransformsEntry uint8 Flags; }; -#pragma pack(pop) - -struct TaxiPathBySourceAndDestination +struct WorldSafeLocsEntry { - TaxiPathBySourceAndDestination() : ID(0), price(0) { } - TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } - uint32 ID; - uint32 price; + DBCPosition3D Loc; + float Facing; + LocalizedString* AreaName; + uint16 MapID; }; -typedef std::map TaxiPathSetForSource; -typedef std::map TaxiPathSetBySource; - -typedef std::vector TaxiPathNodeList; -typedef std::vector TaxiPathNodesByPath; - -#define TaxiMaskSize 226 -typedef std::array TaxiMask; - +#pragma pack(pop) #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 58ab1319b98..5e2bf12a12a 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -21,27 +21,32 @@ char const AchievementFormat[] = "nssishhhhhhhbbb"; char const AnimKitFormat[] = "dihh"; char const AreaGroupMemberFormat[] = "dhh"; -char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhbbbbbbbbb"; +char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhhbbbbbbbb"; char const AreaTriggerFormat[] = "nffffffffhhhhhbbb"; char const ArmorLocationFormat[] = "dfffff"; char const AuctionHouseFormat[] = "dshbb"; char const BankBagSlotPricesFormat[] = "di"; +char const BannedAddOnsFormat[] = "dSSb"; char const BarberShopStyleFormat[] = "nssfbbbb"; char const BattlePetBreedQualityFormat[] = "dfb"; char const BattlePetBreedStateFormat[] = "nhbb"; char const BattlePetSpeciesFormat[] = "niiisshbb"; char const BattlePetSpeciesStateFormat[] = "nihb"; +char const BattlemasterListFormat[] = "nsishhhhhhhhhhhhhhhhhhbbbbbbbbb"; char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; +char const CharSectionsFormat[] = "niiihbbbbb"; char const CharTitlesFormat[] = "dsshhb"; char const ChatChannelsFormat[] = "dissb"; +char const ChrClassesFormat[] = "nSsssSiiihhhbbbbbbb"; char const ChrClassesXPowerTypesFormat[] = "dbb"; -char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb"; +char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbbb"; char const ChrSpecializationFormat[] = "niiiisssShbbbbb"; char const CinematicSequencesFormat[] = "dhhhhhhhhh"; -char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb"; +char const CreatureDisplayInfoFormat[] = "diffiiiSiiifhhhhhhbbbbbb"; char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb"; char const CreatureFamilyFormat[] = "dffsshhhbbbb"; +char const CreatureModelDataFormat[] = "diifffffffffffffffffffffffhhbbbbbbbb"; char const CreatureTypeFormat[] = "dsb"; char const CriteriaFormat[] = "diiihhhbbbbb"; char const CriteriaTreeFormat[] = "dishhhhb"; @@ -52,30 +57,31 @@ char const DifficultyFormat[] = "nsbbbbbbbbbbbb"; char const DungeonEncounterFormat[] = "dsihhhbbb"; char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; char const DurabilityQualityFormat[] = "df"; -char const EmotesFormat[] = "dSiihhbb"; +char const EmotesFormat[] = "dSiiiihhhb"; char const EmotesTextFormat[] = "dsh"; char const EmotesTextSoundFormat[] = "dhhbbb"; +char const FactionFormat[] = "diiiiiiiiffsshhhhhhhhhhbbbbb"; +char const FactionTemplateFormat[] = "dhhhhhhhhhhbbb"; char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; char const GameObjectDisplayInfoFormat[] = "diffffffffh"; -char const GameTablesFormat[] = "dshb"; -char const GarrAbilityFormat[] = "nssihbbb"; +char const GarrAbilityFormat[] = "nssihhbb"; char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb"; char const GarrBuildingPlotInstFormat[] = "nffhhb"; -char const GarrClassSpecFormat[] = "nssshbb"; -char const GarrFollowerFormat[] = "diissiihhbbbbbbbbbbbbbbbb"; +char const GarrClassSpecFormat[] = "nssshbbb"; +char const GarrFollowerFormat[] = "niissiihhbbbbbbbbbbbbbbbbbb"; char const GarrFollowerXAbilityFormat[] = "dhhb"; -char const GarrPlotFormat[] = "dsiibbbbb"; +char const GarrPlotFormat[] = "dsiihhbbb"; char const GarrPlotBuildingFormat[] = "dbb"; char const GarrPlotInstanceFormat[] = "dsb"; char const GarrSiteLevelFormat[] = "dffhhhbbbbb"; char const GarrSiteLevelPlotInstFormat[] = "dffhbb"; -char const GemPropertiesFormat[] = "dihhbb"; +char const GemPropertiesFormat[] = "dihh"; char const GlyphPropertiesFormat[] = "dihbb"; -char const GlyphSlotFormat[] = "dbb"; +char const GlyphSlotFormat[] = "dhb"; char const GuildColorBackgroundFormat[] = "dbbb"; char const GuildColorBorderFormat[] = "dbbb"; char const GuildColorEmblemFormat[] = "dbbb"; -char const GuildPerkSpellsFormat[] = "dib"; +char const GuildPerkSpellsFormat[] = "di"; char const HeirloomFormat[] = "nisiiiiihhbb"; char const HolidaysEntryFormat[] = "diiiiiiiiiiiiiiiiShhhhhhhhhhhbbbbbbbbbbbbbbbb"; char const ImportPriceArmorFormat[] = "dffff"; @@ -83,7 +89,7 @@ char const ImportPriceQualityFormat[] = "df"; char const ImportPriceShieldFormat[] = "df"; char const ImportPriceWeaponFormat[] = "df"; char const ItemFormat[] = "dibbbbbbb"; -char const ItemAppearanceFormat[] = "diib"; +char const ItemAppearanceFormat[] = "diiib"; char const ItemArmorQualityFormat[] = "dfffffffh"; char const ItemArmorShieldFormat[] = "dfffffffh"; char const ItemArmorTotalFormat[] = "dffffh"; @@ -101,24 +107,27 @@ char const ItemDisenchantLootFormat[] = "dhhhbbb"; char const ItemEffectFormat[] = "diiiihhhbb"; char const ItemExtendedCostFormat[] = "diiiiiiiiiiihhhhhhhhhhhbbbbb"; char const ItemLimitCategoryFormat[] = "dsbb"; -char const ItemModifiedAppearanceFormat[] = "nihbb"; +char const ItemModifiedAppearanceFormat[] = "nihbbb"; char const ItemPriceBaseFormat[] = "dffh"; char const ItemRandomPropertiesFormat[] = "dshhhhh"; char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh"; -char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiihb"; +char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiiihb"; char const ItemSetSpellFormat[] = "dihhb"; -char const ItemSparseFormat[] = "iiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const ItemSparseFormat[] = "diiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const ItemSpecFormat[] = "dhbbbbb"; char const ItemSpecOverrideFormat[] = "dih"; -char const ItemToBattlePetSpeciesFormat[] = "dh"; char const ItemXBonusTreeFormat[] = "dih"; char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const LfgDungeonsFormat[] = "nsiSshhhhhhhhbbbbbbbbbbbbbbbbb"; +char const LightFormat[] = "dfffffhhhhhhhhh"; +char const LiquidTypeFormat[] = "dsifffffssssssiiffffffffffffffffffiiiihhbbbbbbbbbbb"; char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb"; char const MailTemplateFormat[] = "ds"; -char const MapFormat[] = "nsiifffissshhhhhhbbbbb"; +char const MapFormat[] = "dsiifffssshhhhhhbbbbb"; +char const MapDifficultyFormat[] = "dsihbbbbb"; char const ModifierTreeFormat[] = "diihbbbb"; char const MountFormat[] = "niissshhhb"; -char const MountCapabilityFormat[] = "niihhhbb"; +char const MountCapabilityFormat[] = "niiihhhb"; char const MountTypeXCapabilityFormat[] = "dhhb"; char const MovieFormat[] = "diibb"; char const NameGenFormat[] = "dsbb"; @@ -134,15 +143,15 @@ char const PvpDifficultyFormat[] = "dhbbb"; char const QuestFactionRewardFormat[] = "dhhhhhhhhhh"; char const QuestMoneyRewardFormat[] = "diiiiiiiiii"; char const QuestPackageItemFormat[] = "dihbb"; -char const QuestSortFormat[] = "ds"; +char const QuestSortFormat[] = "dsb"; char const QuestV2Format[] = "dh"; char const QuestXPFormat[] = "dhhhhhhhhhh"; -char const RandPropPointsFormat[] = "dhhhhhhhhhhhhhhh"; +char const RandPropPointsFormat[] = "diiiiiiiiiiiiiii"; char const ScalingStatDistributionFormat[] = "dhbb"; char const SkillLineFormat[] = "dssshhbbb"; char const SkillLineAbilityFormat[] = "diiiihhhhhhbb"; -char const SkillRaceClassInfoFormat[] = "dihhhhbb"; -char const SoundKitFormat[] = "nsffffffffhhbbbbb"; +char const SkillRaceClassInfoFormat[] = "diihhhbb"; +char const SoundKitFormat[] = "nsffffffffhhhbbbb"; char const SpecializationSpellsFormat[] = "niishb"; char const SpellFormat[] = "nssssih"; char const SpellAuraOptionsFormat[] = "diiiihbbb"; @@ -150,7 +159,7 @@ char const SpellAuraRestrictionsFormat[] = "diiiiibbbbb"; char const SpellCastTimesFormat[] = "diih"; char const SpellCastingRequirementsFormat[] = "dihhhbbb"; char const SpellCategoriesFormat[] = "dihhhbbbbb"; -char const SpellCategoryFormat[] = "dsibbb"; +char const SpellCategoryFormat[] = "dsiibbb"; char const SpellClassOptionsFormat[] = "diiiiihb"; char const SpellCooldownsFormat[] = "diiiib"; char const SpellDurationFormat[] = "diih"; @@ -159,6 +168,7 @@ char const SpellEffectScalingFormat[] = "dfffi"; char const SpellEquippedItemsFormat[] = "diiib"; char const SpellFocusObjectFormat[] = "ds"; char const SpellInterruptsFormat[] = "diiiiihb"; +char const SpellItemEnchantmentFormat[] = "diiisfffiiihhhhhhhhbbbbbbbbb"; char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const SpellLearnSpellFormat[] = "diii"; char const SpellLevelsFormat[] = "dihhhbb"; @@ -168,13 +178,14 @@ char const SpellPowerDifficultyFormat[] = "nbb"; char const SpellRadiusFormat[] = "dffff"; char const SpellRangeFormat[] = "dffffssb"; char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh"; -char const SpellScalingFormat[] = "dihbb"; +char const SpellScalingFormat[] = "dihbbb"; char const SpellShapeshiftFormat[] = "diiiiib"; char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb"; char const SpellTargetRestrictionsFormat[] = "diffihhbb"; char const SpellTotemsFormat[] = "diiibb"; char const SpellXSpellVisualFormat[] = "nifhhhbb"; char const SummonPropertiesFormat[] = "diiiii"; +char const TalentFormat[] = "diishbbbbbb"; char const TaxiNodesFormat[] = "nfffsiiffhhhb"; char const TaxiPathFormat[] = "nhhh"; char const TaxiPathNodeFormat[] = "nfffihhhhbb"; @@ -183,8 +194,12 @@ char const ToyFormat[] = "nisbb"; char const TransportAnimationFormat[] = "diifffb"; char const TransportRotationFormat[] = "diiffff"; char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb"; -char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffffffffffffffihhhhhhhhhhhhhhhhhhhhhbbbbbb"; -char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhh"; +char const VehicleFormat[] = "difffffffffffffffffffSSSSffhhhhhhhhhhhhbb"; +char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffiiffffffffffffihhhhhhhhhhhhhhhhhhhbbbbbb"; +char const WMOAreaTableFormat[] = "nishhhhhhhbbbbb"; +char const WorldMapAreaFormat[] = "nSffffhhhhhhhbbbb"; +char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhhb"; char const WorldMapTransformsFormat[] = "dfffffffffhhhhb"; +char const WorldSafeLocsFormat[] = "dffffsh"; #endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index f1f391f39ab..f71e105a62b 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -57,7 +57,7 @@ enum LevelLimit enum BattlegroundBracketId // bracketId for level ranges { BG_BRACKET_ID_FIRST = 0, - BG_BRACKET_ID_LAST = 10, + BG_BRACKET_ID_LAST = 11, // must be max value in PvPDificulty slot + 1 MAX_BATTLEGROUND_BRACKETS @@ -413,6 +413,25 @@ enum CriteriaTreeOperator CRITERIA_TREE_OPERATOR_ANY = 8 }; +enum CharSectionFlags +{ + SECTION_FLAG_PLAYER = 0x01, + SECTION_FLAG_DEATH_KNIGHT = 0x04, + SECTION_FLAG_DEMON_HUNTER = 0x40 +}; + +enum CharSectionType +{ + SECTION_TYPE_SKIN = 0, + SECTION_TYPE_FACE = 1, + SECTION_TYPE_FACIAL_HAIR = 2, + SECTION_TYPE_HAIR = 3, + SECTION_TYPE_UNDERWEAR = 4, + SECTION_TYPE_CUSTOM_DISPLAY_1 = 10, + SECTION_TYPE_CUSTOM_DISPLAY_2 = 12, + SECTION_TYPE_CUSTOM_DISPLAY_3 = 14 +}; + enum Difficulty : uint8 { DIFFICULTY_NONE = 0, diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp deleted file mode 100644 index 03e1c365bc7..00000000000 --- a/src/server/game/DataStores/DBCStores.cpp +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "DBCStores.h" -#include "Log.h" -#include "SharedDefines.h" -#include "SpellInfo.h" -#include "DBCfmt.h" -#include "Timer.h" -#include "DB2Stores.h" -#include - -struct WMOAreaTableTripple -{ - WMOAreaTableTripple(int32 r, int32 a, int32 g) : groupId(g), rootId(r), adtId(a) - { - } - - bool operator <(const WMOAreaTableTripple& b) const - { - return memcmp(this, &b, sizeof(WMOAreaTableTripple))<0; - } - - // ordered by entropy; that way memcmp will have a minimal medium runtime - int32 groupId; - int32 rootId; - int32 adtId; -}; - -typedef std::multimap CharSectionsMap; -typedef std::map> FactionTeamMap; -typedef std::map WMOAreaInfoByTripple; - -DBCStorage sBannedAddOnsStore(BannedAddOnsfmt); -DBCStorage sBattlemasterListStore(BattlemasterListfmt); - -DBCStorage sCharSectionsStore(CharSectionsfmt); -CharSectionsMap sCharSectionMap; -DBCStorage sChrClassesStore(ChrClassesfmt); -DBCStorage sCreatureModelDataStore(CreatureModelDatafmt); - -DBCStorage sFactionStore(Factionfmt); -static FactionTeamMap sFactionTeamMap; -DBCStorage sFactionTemplateStore(FactionTemplatefmt); - -DBCStorage sLFGDungeonStore(LFGDungeonfmt); -DBCStorage sLightStore(Lightfmt); -DBCStorage sLiquidTypeStore(LiquidTypefmt); - -DBCStorage sMapDifficultyStore(MapDifficultyfmt); // only for loading -MapDifficultyMap sMapDifficultyMap; - -DBCStorage sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); - -DBCStorage sTalentStore(Talentfmt); -TalentsByPosition sTalentByPos; - -DBCStorage sVehicleStore(Vehiclefmt); - -DBCStorage sWMOAreaTableStore(WMOAreaTablefmt); -static WMOAreaInfoByTripple sWMOAreaInfoByTripple; -DBCStorage sWorldMapAreaStore(WorldMapAreafmt); -DBCStorage sWorldSafeLocsStore(WorldSafeLocsfmt); - -GameTable sGtBarberShopCostBaseStore; -GameTable sGtChanceToMeleeCritBaseStore; -GameTable sGtChanceToMeleeCritStore; -GameTable sGtChanceToSpellCritBaseStore; -GameTable sGtChanceToSpellCritStore; -GameTable sGtCombatRatingsStore; -GameTable sGtItemSocketCostPerLevelStore; -GameTable sGtNPCManaCostScalerStore; -GameTable sGtNpcTotalHpStore[MAX_EXPANSIONS]; -GameTable sGtNpcDamageByClassStore[MAX_EXPANSIONS]; -GameTable sGtOCTBaseHPByClassStore; -GameTable sGtOCTBaseMPByClassStore; -GameTable sGtOCTHpPerStaminaStore; -GameTable sGtOCTLevelExperienceStore; -GameTable sGtRegenMPPerSptStore; -GameTable sGtSpellScalingStore; - -typedef std::list StoreProblemList; - -uint32 DBCFileCount = 0; -uint32 GameTableCount = 0; - -template -inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage& storage, std::string const& dbcPath, std::string const& filename, uint32 defaultLocale, std::string const* customFormat = NULL, std::string const* customIndexName = NULL) -{ - // compatibility format and C++ structure sizes - ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T), - "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", - filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); - - ++DBCFileCount; - std::string dbcFilename = dbcPath + localeNames[defaultLocale] + '/' + filename; - SqlDbc * sql = NULL; - if (customFormat) - sql = new SqlDbc(&filename, customFormat, customIndexName, storage.GetFormat()); - - if (storage.Load(dbcFilename.c_str(), sql)) - { - for (uint8 i = 0; i < TOTAL_LOCALES; ++i) - { - if (i == LOCALE_none || !(availableDbcLocales & (1 << i))) - continue; - - std::string localizedName(dbcPath); - localizedName.append(localeNames[i]); - localizedName.push_back('/'); - localizedName.append(filename); - - if (!storage.LoadStringsFrom(localizedName.c_str())) - availableDbcLocales &= ~(1< -inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable& storage, std::string const& dbcPath, std::string const& filename) -{ - // compatibility format and C++ structure sizes - ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T), - "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", - filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); - - ++GameTableCount; - std::string dbcFilename = dbcPath + filename; - - if (storage.Load(dbcFilename.c_str())) - { - bool found = false; - // Find table definition in GameTables.db2 - for (uint32 i = 0; i < sGameTablesStore.GetNumRows(); ++i) - { - GameTablesEntry const* gt = sGameTablesStore.LookupEntry(i); - if (!gt) - continue; - - for (uint32 l = 0; l < TOTAL_LOCALES; ++l) - { - if (l != LOCALE_none && tableName == gt->Name->Str[l]) - { - found = true; - storage.SetGameTableEntry(gt); - break; - } - } - - if (found) - break; - } - - ASSERT(found, "Game table %s definition not found in GameTables.db2", tableName.c_str()); - } - else - { - // sort problematic dbc to (1) non compatible and (2) non-existed - if (FILE* f = fopen(dbcFilename.c_str(), "rb")) - { - std::ostringstream stream; - stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten."; - std::string buf = stream.str(); - errors.push_back(buf); - fclose(f); - } - else - errors.push_back(dbcFilename); - } -} - -void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) -{ - uint32 oldMSTime = getMSTime(); - - std::string dbcPath = dataPath + "dbc/"; - - StoreProblemList bad_dbc_files; - uint32 availableDbcLocales = 0xFFFFFFFF; - -#define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale) - - LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810 - LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810 - LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810 - LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810 - LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810 - LOAD_DBC(sFactionStore, "Faction.dbc");//20810 - LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810 - LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810 - LOAD_DBC(sLightStore, "Light.dbc"); //20810 - LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810 - LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810 - LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810 - LOAD_DBC(sTalentStore, "Talent.dbc");//20810 - LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810 - LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20810 - LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20810 - LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20810 - -#undef LOAD_DBC - - for (uint32 i = 0; i < sCharSectionsStore.GetNumRows(); ++i) - if (CharSectionsEntry const* entry = sCharSectionsStore.LookupEntry(i)) - if (entry->Race && ((1 << (entry->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races - sCharSectionMap.insert({ entry->GenType | (entry->Gender << 8) | (entry->Race << 16), entry }); - - for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) - { - FactionEntry const* faction = sFactionStore.LookupEntry(i); - if (faction && faction->ParentFactionID) - sFactionTeamMap[faction->ParentFactionID].push_back(i); - } - - // fill data - for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i) - if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i)) - sMapDifficultyMap[entry->MapID][entry->DifficultyID] = entry; - sMapDifficultyMap[0][0] = sMapDifficultyMap[1][0]; //map 0 is missing from MapDifficulty.dbc use this till its ported to sql - - for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) - { - if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i)) - { - if (talentInfo->ClassID < MAX_CLASSES && talentInfo->TierID < MAX_TALENT_TIERS && talentInfo->ColumnIndex < MAX_TALENT_COLUMNS) - sTalentByPos[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo); - else - TC_LOG_ERROR("server.loading", "Value of class (found: %u, max allowed %u) or (found: %u, max allowed %u) tier or column (found: %u, max allowed %u) is invalid.", - talentInfo->ClassID, MAX_CLASSES, talentInfo->TierID, MAX_TALENT_TIERS, talentInfo->ColumnIndex, MAX_TALENT_COLUMNS); - } - } - - for (uint32 i = 0; i < sWMOAreaTableStore.GetNumRows(); ++i) - if (WMOAreaTableEntry const* entry = sWMOAreaTableStore.LookupEntry(i)) - sWMOAreaInfoByTripple.insert(WMOAreaInfoByTripple::value_type(WMOAreaTableTripple(entry->WMOID, entry->NameSet, entry->WMOGroupID), entry)); - - // error checks - if (bad_dbc_files.size() >= DBCFileCount) - { - TC_LOG_ERROR("misc", "Incorrect DataDir value in worldserver.conf or ALL required *.dbc files (%d) not found by path: %sdbc/%s/", DBCFileCount, dataPath.c_str(), localeNames[defaultLocale]); - exit(1); - } - else if (!bad_dbc_files.empty()) - { - std::string str; - for (StoreProblemList::iterator i = bad_dbc_files.begin(); i != bad_dbc_files.end(); ++i) - str += *i + "\n"; - - TC_LOG_ERROR("misc", "Some required *.dbc files (%u from %d) not found or not compatible:\n%s", (uint32)bad_dbc_files.size(), DBCFileCount, str.c_str()); - exit(1); - } - - TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime)); -} - -void LoadGameTables(const std::string& dataPath, uint32 defaultLocale) -{ - uint32 oldMSTime = getMSTime(); - - std::string dbcPath = dataPath + "dbc/" + localeNames[defaultLocale] + '/'; - - StoreProblemList bad_dbc_files; - -#define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file) - - LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20810 - LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20810 - LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20810 - LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20810 - LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20810 - LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20810 - LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20810 - LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20810 - LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore[0], "gtNpcTotalHp.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpStore[1], "gtNpcTotalHpExp1.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpStore[2], "gtNpcTotalHpExp2.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpStore[3], "gtNpcTotalHpExp3.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpStore[4], "gtNpcTotalHpExp4.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpStore[5], "gtNpcTotalHpExp5.dbc"); // 20810 - LOAD_GT("NpcTotalHpExp6", sGtNpcTotalHpStore[6], "gtNpcTotalHpExp6.dbc"); // 20810 - LOAD_GT("NpcDamageByClass", sGtNpcDamageByClassStore[0], "gtNpcDamageByClass.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp1", sGtNpcDamageByClassStore[1], "gtNpcDamageByClassExp1.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp2", sGtNpcDamageByClassStore[2], "gtNpcDamageByClassExp2.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp3", sGtNpcDamageByClassStore[3], "gtNpcDamageByClassExp3.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp4", sGtNpcDamageByClassStore[4], "gtNpcDamageByClassExp4.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp5", sGtNpcDamageByClassStore[5], "gtNpcDamageByClassExp5.dbc"); // 20810 - LOAD_GT("NpcDamageByClassExp6", sGtNpcDamageByClassStore[6], "gtNpcDamageByClassExp6.dbc"); // 20810 - LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20810 - LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20810 - LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20810 - LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20810 - LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20810 - LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20810 - -#undef LOAD_GT - - // error checks - if (bad_dbc_files.size() >= GameTableCount) - { - TC_LOG_ERROR("misc", "Incorrect DataDir value in worldserver.conf or ALL required *.dbc GameTable files (%d) not found by path: %sdbc/%s/", DBCFileCount, dataPath.c_str(), localeNames[defaultLocale]); - exit(1); - } - else if (!bad_dbc_files.empty()) - { - std::string str; - for (StoreProblemList::iterator i = bad_dbc_files.begin(); i != bad_dbc_files.end(); ++i) - str += *i + "\n"; - - TC_LOG_ERROR("misc", "Some required *.dbc GameTable files (%u from %d) not found or not compatible:\n%s", (uint32)bad_dbc_files.size(), GameTableCount, str.c_str()); - exit(1); - } - - TC_LOG_INFO("server.loading", ">> Initialized %d DBC GameTables data stores in %u ms", GameTableCount, GetMSTimeDiffToNow(oldMSTime)); -} - -std::vector const* GetFactionTeamList(uint32 faction) -{ - FactionTeamMap::const_iterator itr = sFactionTeamMap.find(faction); - if (itr != sFactionTeamMap.end()) - return &itr->second; - - return NULL; -} - -WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid) -{ - WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid)); - if (i == sWMOAreaInfoByTripple.end()) - return NULL; - return i->second; -} - -char const* GetClassName(uint8 class_, uint8 /*locale*/) -{ - ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); - return classEntry ? classEntry->Name_lang : NULL; -} - -uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId) -{ - if (mapid != 530 && mapid != 571 && mapid != 732) // speed for most cases - return mapid; - - if (WorldMapAreaEntry const* wma = sWorldMapAreaStore.LookupEntry(zoneId)) - return wma->DisplayMapID >= 0 ? wma->DisplayMapID : wma->MapID; - - return mapid; -} - -uint32 GetMaxLevelForExpansion(uint32 expansion) -{ - switch (expansion) - { - case EXPANSION_CLASSIC: - return 60; - case EXPANSION_THE_BURNING_CRUSADE: - return 70; - case EXPANSION_WRATH_OF_THE_LICH_KING: - return 80; - case EXPANSION_CATACLYSM: - return 85; - case EXPANSION_MISTS_OF_PANDARIA: - return 90; - case EXPANSION_WARLORDS_OF_DRAENOR: - return 100; - case EXPANSION_LEGION: - return 110; - default: - break; - } - return 0; -} - -uint32 GetExpansionForLevel(uint32 level) -{ - if (level < 60) - return EXPANSION_CLASSIC; - else if (level < 70) - return EXPANSION_THE_BURNING_CRUSADE; - else if (level < 80) - return EXPANSION_WRATH_OF_THE_LICH_KING; - else if (level < 85) - return EXPANSION_CATACLYSM; - else if (level < 90) - return EXPANSION_MISTS_OF_PANDARIA; - else if (level < 100) - return EXPANSION_WARLORDS_OF_DRAENOR; - else - return CURRENT_EXPANSION; -} - -void Zone2MapCoordinates(float& x, float& y, uint32 worldMapAreaId) -{ - WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); - - // if not listed then map coordinates (instance) - if (!maEntry) - return; - - std::swap(x, y); // at client map coords swapped - x = x*((maEntry->LocBottom-maEntry->LocTop)/100)+maEntry->LocTop; - y = y*((maEntry->LocRight-maEntry->LocLeft)/100)+maEntry->LocLeft; // client y coord from top to down -} - -void Map2ZoneCoordinates(float& x, float& y, uint32 worldMapAreaId) -{ - WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); - - // if not listed then map coordinates (instance) - if (!maEntry) - return; - - x = (x - maEntry->LocTop) / ((maEntry->LocBottom - maEntry->LocTop) / 100); - y = (y - maEntry->LocLeft) / ((maEntry->LocRight - maEntry->LocLeft) / 100); // client y coord from top to down - std::swap(x, y); // client have map coords swapped -} - -MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) -{ - auto itr = sMapDifficultyMap.find(mapId); - if (itr == sMapDifficultyMap.end()) - return nullptr; - - if (itr->second.empty()) - return nullptr; - - for (auto& p : itr->second) - { - DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(p.first); - if (!difficultyEntry) - continue; - - if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT) - { - if (difficulty) - *difficulty = Difficulty(p.first); - - return p.second; - } - } - - if (difficulty) - *difficulty = Difficulty(itr->second.begin()->first); - - return itr->second.begin()->second; -} - -MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty) -{ - auto itr = sMapDifficultyMap.find(mapId); - if (itr == sMapDifficultyMap.end()) - return nullptr; - - auto diffItr = itr->second.find(difficulty); - if (diffItr == itr->second.end()) - return nullptr; - - return diffItr->second; -} - -MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) -{ - DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty); - if (!diffEntry) - return GetDefaultMapDifficulty(mapId, &difficulty); - - uint32 tmpDiff = difficulty; - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); - while (!mapDiff) - { - tmpDiff = diffEntry->FallbackDifficultyID; - diffEntry = sDifficultyStore.LookupEntry(tmpDiff); - if (!diffEntry) - return GetDefaultMapDifficulty(mapId, &difficulty); - - // pull new data - mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal - } - - difficulty = Difficulty(tmpDiff); - return mapDiff; -} - -uint32 GetLiquidFlags(uint32 liquidType) -{ - if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType)) - return 1 << liq->Type; - - return 0; -} - -CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) -{ - std::pair eqr = sCharSectionMap.equal_range(uint32(genType) | uint32(gender << 8) | uint32(race << 16)); - for (CharSectionsMap::const_iterator itr = eqr.first; itr != eqr.second; ++itr) - { - if (itr->second->Type == type && itr->second->Color == color) - return itr->second; - } - - return NULL; -} - -/// Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple dungeons use the same map (such as Scarlet Monastery) -LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty) -{ - for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) - { - LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i); - if (!dungeon) - continue; - - if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty) - return dungeon; - } - - return NULL; -} - -uint32 GetDefaultMapLight(uint32 mapId) -{ - for (int32 i = sLightStore.GetNumRows(); i >= 0; --i) - { - LightEntry const* light = sLightStore.LookupEntry(uint32(i)); - if (!light) - continue; - - if (light->MapID == mapId && light->Pos.X == 0.0f && light->Pos.Y == 0.0f && light->Pos.Z == 0.0f) - return light->ID; - } - - return 0; -} diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h deleted file mode 100644 index ef8056a06fc..00000000000 --- a/src/server/game/DataStores/DBCStores.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_DBCSTORES_H -#define TRINITY_DBCSTORES_H - -#include "DBCStore.h" -#include "DBCStructure.h" -#include "DB2Structure.h" -#include "SharedDefines.h" - -// CharSections -TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color); - -// ChrClasses -TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale); - -// Faction -TC_GAME_API std::vector const* GetFactionTeamList(uint32 faction); - -// LfgDungeons -TC_GAME_API LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); - -// Light -TC_GAME_API uint32 GetDefaultMapLight(uint32 mapId); - -// LiquidType -TC_GAME_API uint32 GetLiquidFlags(uint32 liquidType); - -// MapDifficulty -typedef std::unordered_map> MapDifficultyMap; -TC_GAME_API MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr); -TC_GAME_API MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty); -TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty); - -// Talent -typedef std::vector TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; - -// WMOAreaTable -TC_GAME_API WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid); - -// WorldMapArea -TC_GAME_API uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); -TC_GAME_API void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId); -TC_GAME_API void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId); - -TC_GAME_API uint32 GetMaxLevelForExpansion(uint32 expansion); -TC_GAME_API uint32 GetExpansionForLevel(uint32 level); - -template -class GameTable -{ -public: - GameTable() : _storage("df"), _gtEntry(nullptr) { } - - void SetGameTableEntry(GameTablesEntry const* gtEntry) { _gtEntry = gtEntry; } - - T const* EvaluateTable(uint32 row, uint32 column) const - { - ASSERT(row < _gtEntry->NumRows, "Requested row %u from GameTable %s but there are only %u rows!", row, _gtEntry->Name->Str[0], _gtEntry->NumRows); - ASSERT(column < _gtEntry->NumColumns, "Requested column %u from GameTable %s but there are only %u columns!", column, _gtEntry->Name->Str[0], _gtEntry->NumColumns); - - return _storage.LookupEntry(_gtEntry->NumRows * column + row); - } - - char const* GetFormat() const { return _storage.GetFormat(); } - uint32 GetFieldCount() const { return _storage.GetFieldCount(); } - bool Load(char const* fileName) { return _storage.Load(fileName, nullptr); } - - uint32 GetTableRowCount() const { return _gtEntry->NumRows; } - uint32 GetTableColumnCount() const { return _gtEntry->NumColumns; } - -private: - DBCStorage _storage; - GameTablesEntry const* _gtEntry; -}; - -TC_GAME_API extern DBCStorage sBannedAddOnsStore; -TC_GAME_API extern DBCStorage sBattlemasterListStore; -TC_GAME_API extern DBCStorage sCharSectionsStore; -TC_GAME_API extern DBCStorage sChrClassesStore; -TC_GAME_API extern DBCStorage sCreatureModelDataStore; -TC_GAME_API extern DBCStorage sFactionStore; -TC_GAME_API extern DBCStorage sFactionTemplateStore; -TC_GAME_API extern DBCStorage sLFGDungeonStore; -TC_GAME_API extern DBCStorage sLiquidTypeStore; -TC_GAME_API extern MapDifficultyMap sMapDifficultyMap; -TC_GAME_API extern DBCStorage sSpellItemEnchantmentStore; -TC_GAME_API extern DBCStorage sTalentStore; -TC_GAME_API extern TalentsByPosition sTalentByPos; -TC_GAME_API extern DBCStorage sVehicleStore; -TC_GAME_API extern DBCStorage sWMOAreaTableStore; -TC_GAME_API extern DBCStorage sWorldSafeLocsStore; - -TC_GAME_API extern GameTable sGtArmorMitigationByLvlStore; -TC_GAME_API extern GameTable sGtBarberShopCostBaseStore; -TC_GAME_API extern GameTable sGtChanceToMeleeCritBaseStore; -TC_GAME_API extern GameTable sGtChanceToMeleeCritStore; -TC_GAME_API extern GameTable sGtChanceToSpellCritBaseStore; -TC_GAME_API extern GameTable sGtChanceToSpellCritStore; -TC_GAME_API extern GameTable sGtCombatRatingsStore; -TC_GAME_API extern GameTable sGtItemSocketCostPerLevelStore; -TC_GAME_API extern GameTable sGtNPCManaCostScalerStore; -TC_GAME_API extern GameTable sGtNpcTotalHpStore[MAX_EXPANSIONS]; -TC_GAME_API extern GameTable sGtNpcDamageByClassStore[MAX_EXPANSIONS]; -TC_GAME_API extern GameTable sGtOCTBaseHPByClassStore; -TC_GAME_API extern GameTable sGtOCTBaseMPByClassStore; -TC_GAME_API extern GameTable sGtOCTLevelExperienceStore; -TC_GAME_API extern GameTable sGtRegenMPPerSptStore; -TC_GAME_API extern GameTable sGtSpellScalingStore; -TC_GAME_API extern GameTable sGtOCTHpPerStaminaStore; - -TC_GAME_API void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale); -TC_GAME_API void LoadGameTables(const std::string& dataPath, uint32 defaultLocale); - -#endif diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h deleted file mode 100644 index d831231cb88..00000000000 --- a/src/server/game/DataStores/DBCStructure.h +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_DBCSTRUCTURE_H -#define TRINITY_DBCSTRUCTURE_H - -#include "Common.h" -#include "DBCEnums.h" -#include "Util.h" - -// Structures using to access raw DBC data and required packing to portability -#pragma pack(push, 1) - -struct BannedAddOnsEntry -{ - uint32 ID; // 0 - //uint32 NameMD5[4]; // 1 - //uint32 VersionMD5[4]; // 2 - //uint32 LastModified; // 3 - //uint32 Flags; // 4 -}; - -struct BattlemasterListEntry -{ - uint32 ID; // 0 - int32 MapID[16]; // 1-16 mapid - uint32 InstanceType; // 17 map type (3 - BG, 4 - arena) - //uint32 GroupsAllowed; // 18 (0 or 1) - char* Name_lang; // 19 - uint32 MaxGroupSize; // 20 maxGroupSize, used for checking if queue as group - uint32 HolidayWorldState; // 21 new 3.1 - uint32 MinLevel; // 22, min level (sync with PvPDifficulty.dbc content) - uint32 MaxLevel; // 23, max level (sync with PvPDifficulty.dbc content) - //uint32 RatedPlayers; // 24 4.0.1 - //uint32 MinPlayers; // 25 - 4.0.6.13596 - //uint32 MaxPlayers; // 26 4.0.1 - //uint32 Flags; // 27 4.0.3, value 2 for Rated Battlegrounds - //uint32 IconFileDataID; // 28 - //char* GameType_lang; // 29 - //uint32 PlayerConditionID; // 30 -}; - -enum CharSectionFlags -{ - SECTION_FLAG_PLAYER = 0x01, - SECTION_FLAG_DEATH_KNIGHT = 0x04, - SECTION_FLAG_DEMON_HUNTER = 0x40 -}; - -enum CharSectionType -{ - SECTION_TYPE_SKIN = 0, - SECTION_TYPE_FACE = 1, - SECTION_TYPE_FACIAL_HAIR = 2, - SECTION_TYPE_HAIR = 3, - SECTION_TYPE_UNDERWEAR = 4, - SECTION_TYPE_CUSTOM_DISPLAY_1 = 10, - SECTION_TYPE_CUSTOM_DISPLAY_2 = 12, - SECTION_TYPE_CUSTOM_DISPLAY_3 = 14 -}; - -struct CharSectionsEntry -{ - //uint32 Id; - uint32 Race; - uint32 Gender; - uint32 GenType; - //uint32 TextureFileDataID[3]; - uint32 Flags; - uint32 Type; - uint32 Color; -}; - -struct ChrClassesEntry -{ - uint32 ID; // 0 - uint32 PowerType; // 1 - //char* PetNameToken // 2 - char* Name_lang; // 3 - //char* NameFemale_lang; // 4 - //char* NameMale_lang; // 5 - //char* Filename; // 6 - uint32 SpellClassSet; // 7 - //uint32 Flags; // 8 - uint32 CinematicSequenceID; // 9 - uint32 AttackPowerPerStrength; // 10 Attack Power bonus per point of strength - uint32 AttackPowerPerAgility; // 11 Attack Power bonus per point of agility - uint32 RangedAttackPowerPerAgility; // 12 Ranged Attack Power bonus per point of agility - uint32 DefaultSpec; // 13 - //uint32 CreateScreenFileDataID; // 14 - //uint32 SelectScreenFileDataID; // 15 - //uint32 LowResScreenFileDataID; // 16 - //uint32 IconFileDataID; // 17 - //uint32 Unk1; // 18 -}; - -struct CreatureModelDataEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 FileDataID; // 2 - //uint32 SizeClass; // 3 - //float ModelScale; // 4 - //uint32 BloodID; // 5 - //uint32 FootprintTextureID; // 6 - //float FootprintTextureLength; // 7 - //float FootprintTextureWidth; // 8 - //float FootprintParticleScale; // 9 - //uint32 FoleyMaterialID; // 10 - //uint32 Unk700_1; // 11 - //uint32 Unk700_2; // 12 - //uint32 FootstepShakeSize; // 13 - //uint32 DeathThudShakeSize; // 14 - //uint32 SoundID; // 15 - //float CollisionWidth; // 16 - float CollisionHeight; // 17 - float MountHeight; // 18 - //float GeoBoxMin[3]; // 19-21 - //float GeoBoxMax[3]; // 22-24 - //float WorldEffectScale; // 25 - //float AttachedEffectScale; // 26 - //float MissileCollisionRadius; // 27 - //float MissileCollisionPush; // 28 - //float MissileCollisionRaise; // 29 - //float OverrideLootEffectScale; // 30 - //float OverrideNameScale; // 31 - //float OverrideSelectionRadius; // 32 - //float TamedPetBaseScale; // 33 - //uint32 CreatureGeosetDataID; // 34 - //float HoverHeight; // 35 -}; - -/* not used -struct CurrencyCategoryEntry -{ - uint32 ID; // 0 - uint32 Unk1; // 1 0 for known categories and 3 for unknown one (3.0.9) - char* Name[16]; // 2-17 name - // // 18 string flags -}; -*/ - -struct FactionEntry -{ - uint32 ID; // 0 - int32 ReputationIndex; // 1 - uint32 ReputationRaceMask[4]; // 2-5 - uint32 ReputationClassMask[4]; // 6-9 - int32 ReputationBase[4]; // 10-13 - uint32 ReputationFlags[4]; // 14-17 - uint32 ParentFactionID; // 18 - float ParentFactionModIn; // 19 Faction gains incoming rep * ParentFactionModIn - float ParentFactionModOut; // 20 Faction outputs rep * ParentFactionModOut as spillover reputation - uint32 ParentFactionCapIn; // 21 The highest rank the faction will profit from incoming spillover - //uint32 ParentFactionCapOut; // 22 - char* Name_lang; // 23 - //char* Description_lang; // 24 - uint32 Expansion; // 25 - //uint32 Flags; // 26 - //uint32 FriendshipRepID; // 27 - - // helpers - bool CanHaveReputation() const - { - return ReputationIndex >= 0; - } -}; - -#define MAX_FACTION_RELATIONS 4 - -struct FactionTemplateEntry -{ - uint32 ID; // 0 - uint32 Faction; // 1 - uint32 Flags; // 2 - uint32 Mask; // 3 m_factionGroup - uint32 FriendMask; // 4 m_friendGroup - uint32 EnemyMask; // 5 m_enemyGroup - uint32 Enemies[MAX_FACTION_RELATIONS]; // 6 - uint32 Friends[MAX_FACTION_RELATIONS]; // 10 - //------------------------------------------------------- end structure - - // helpers - bool IsFriendlyTo(FactionTemplateEntry const& entry) const - { - if (ID == entry.ID) - return true; - if (entry.Faction) - { - for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Enemies[i] == entry.Faction) - return false; - for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Friends[i] == entry.Faction) - return true; - } - return (FriendMask & entry.Mask) || (Mask & entry.FriendMask); - } - bool IsHostileTo(FactionTemplateEntry const& entry) const - { - if (ID == entry.ID) - return false; - if (entry.Faction) - { - for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Enemies[i] == entry.Faction) - return true; - for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Friends[i] == entry.Faction) - return false; - } - return (EnemyMask & entry.Mask) != 0; - } - bool IsHostileToPlayers() const { return (EnemyMask & FACTION_MASK_PLAYER) !=0; } - bool IsNeutralToAll() const - { - for (int i = 0; i < MAX_FACTION_RELATIONS; ++i) - if (Enemies[i] != 0) - return false; - return EnemyMask == 0 && FriendMask == 0; - } - bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } -}; - -struct GtArmorMitigationByLvlEntry -{ - //uint32 level; - float KFactor; -}; - -struct GtBarberShopCostBaseEntry -{ - //uint32 level; - float cost; -}; - -struct GtCombatRatingsEntry -{ - //uint32 level; - float ratio; -}; - -struct GtChanceToMeleeCritBaseEntry -{ - //uint32 level; - float base; -}; - -struct GtChanceToMeleeCritEntry -{ - //uint32 level; - float ratio; -}; - -struct GtChanceToSpellCritBaseEntry -{ - float base; -}; - -struct GtItemSocketCostPerLevelEntry -{ - float ratio; -}; - -struct GtNPCManaCostScalerEntry -{ - float ratio; -}; - -struct GtNpcDamageByClassEntry -{ - float Damage; -}; - -struct GtNpcTotalHpEntry -{ - float HP; -}; - -struct GtChanceToSpellCritEntry -{ - float ratio; -}; - -struct GtOCTLevelExperienceEntry -{ - float Data; -}; - -struct GtOCTRegenHPEntry -{ - float ratio; -}; - -struct GtOCTRegenMPEntry -{ - float ratio; -}; - -struct GtOCTHpPerStaminaEntry -{ - float ratio; -}; - -struct GtRegenHPPerSptEntry -{ - float ratio; -}; - -struct GtRegenMPPerSptEntry -{ - float ratio; -}; - -struct GtSpellScalingEntry -{ - float value; -}; - -struct GtOCTBaseHPByClassEntry -{ - float ratio; -}; - -struct GtOCTBaseMPByClassEntry -{ - float ratio; -}; - -struct ItemDisplayInfoEntry -{ - uint32 ID; // 0 - //char* ModelName[2]; // 1-2 - //char* ModelTexture[2]; // 3-4 - //uint32 GeoSetGroup[3]; // 5-7 - //uint32 Flags; // 8 - //uint32 SpellVisualID; // 9 - //uint32 HelmetGeosetVis[2]; // 10-11 - //char* Texture[9]; // 12-20 - //uint32 ItemVisual; // 21 - //uint32 ParticleColorID; // 22 -}; - -struct LFGDungeonEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - uint32 MinLevel; // 2 - uint32 MaxLevel; // 3 - uint32 TargetLevel; // 4 - //uint32 TargetLevelMin; // 5 - //uint32 TargetLevelMax; // 6 - int32 MapID; // 7 - uint32 DifficultyID; // 8 - uint32 Flags; // 9 - uint32 Type; // 10 - //uint32 Faction; // 11 - //char* TextureFilename; // 12 - uint32 Expansion; // 13 - //uint32 OrderIndex; // 14 - uint32 GroupID; // 15 - //char* Description_lang; // 16 - //uint32 RandomID; // 17 - //uint32 CountTank; // 18 - //uint32 CountHealer; // 19 - //uint32 CountDamage; // 20 - //uint32 MinCountTank; // 21 - //uint32 MinCountHealer; // 22 - //uint32 MinCountDamage; // 23 - //uint32 ScenarioID; // 24 - //uint32 SubType; // 25 - //uint32 LastBossJournalEncounterID; // 26 - //uint32 BonusReputationAmount; // 27 - //uint32 MentorCharLevel; // 28 - //uint32 MentorItemLevel; // 29 - - // Helpers - uint32 Entry() const { return ID + (Type << 24); } -}; - -struct LightEntry -{ - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Pos; // 2-4 - //float FalloffStart; // 5 - //float FalloffEnd; // 6 - //uint32 LightParamsID[8]; // 7-14 -}; - -struct LiquidTypeEntry -{ - uint32 ID; // 0 - //char* Name; // 1 - //uint32 Flags; // 2 - uint32 Type; // 3 m_soundBank - //uint32 SoundID; // 4 - uint32 SpellID; // 5 - //float MaxDarkenDepth; // 6 - //float FogDarkenIntensity; // 7 - //float AmbDarkenIntensity; // 8 - //float DirDarkenIntensity; // 9 - //uint32 LightID; // 10 - //float ParticleScale; // 11 - //uint32 ParticleMovement; // 12 - //uint32 ParticleTexSlots; // 13 - //uint32 MaterialID; // 14 - //char* Texture[6]; // 15-20 - //uint32 DepthTexCount[6] // 21-26 - //uint32 Color[2]; // 27-28 - //float Float[18]; // 29-46 - //uint32 Int[4]; // 47-50 -}; - -struct MapDifficultyEntry -{ - //uint32 ID; // 0 - uint32 MapID; // 1 - uint32 DifficultyID; // 2 (for arenas: arena slot) - char* Message_lang; // 3 m_message_lang (text showed when transfer to map failed) - uint32 RaidDuration; // 4 m_raidDuration in secs, 0 if no fixed reset time - uint32 MaxPlayers; // 5 m_maxPlayers some heroic versions have 0 when expected same amount as in normal version - uint32 LockID; // 6 - uint32 ItemBonusTreeModID; // 7 - - bool HasMessage() const { return Message_lang[0] != '\0'; } -}; - -#define MAX_ITEM_ENCHANTMENT_EFFECTS 3 - -struct SpellItemEnchantmentEntry -{ - uint32 ID; // 0 - uint32 Charges; // 1 - uint32 Effect[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 2-4 - uint32 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 5-7 - uint32 EffectSpellID[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 8-10 - //char* Name_lang // 11 - uint32 ItemVisual; // 12 - uint32 Flags; // 13 - uint32 ConditionID; // 14 - uint32 RequiredSkillID; // 15 - uint32 RequiredSkillRank; // 16 - uint32 MinLevel; // 17 - uint32 MaxLevel; // 18 - uint32 ItemLevel; // 19 - int32 ScalingClass; // 20 - int32 ScalingClassRestricted; // 21 - float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//22-24 - //uint32 PlayerConditionID; // 25 - //uint32 TransmogCost; // 26 - //uint32 TextureFileDataID; // 27 -}; - -struct StableSlotPricesEntry -{ - uint32 Slot; - uint32 Price; -}; - -#define MAX_TALENT_TIERS 7 -#define MAX_TALENT_COLUMNS 3 - -struct TalentEntry -{ - uint32 ID; // 0 - uint32 SpecID; // 1 0 - any specialization - uint32 TierID; // 2 0-6 - uint32 ColumnIndex; // 3 0-2 - uint32 SpellID; // 4 - uint32 Flags; // 5 All 0 - uint32 CategoryMask[2]; // 6 All 0 - uint32 ClassID; // 7 - uint32 OverridesSpellID; // 8 spellid that is replaced by talent - //char* Description_lang -}; - -#define MAX_VEHICLE_SEATS 8 - -struct VehicleEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 FlagsB; // 2 - float TurnSpeed; // 3 - float PitchSpeed; // 4 - float PitchMin; // 5 - float PitchMax; // 6 - uint32 SeatID[MAX_VEHICLE_SEATS]; // 7-14 - float MouseLookOffsetPitch; // 15 - float CameraFadeDistScalarMin; // 16 - float CameraFadeDistScalarMax; // 17 - float CameraPitchOffset; // 18 - float FacingLimitRight; // 19 - float FacingLimitLeft; // 20 - float MsslTrgtTurnLingering; // 21 - float MsslTrgtPitchLingering; // 22 - float MsslTrgtMouseLingering; // 23 - float MsslTrgtEndOpacity; // 24 - float MsslTrgtArcSpeed; // 25 - float MsslTrgtArcRepeat; // 26 - float MsslTrgtArcWidth; // 27 - float MsslTrgtImpactRadius[2]; // 28-29 - //char* MsslTrgtArcTexture; // 30 - //char* MsslTrgtImpactTexture; // 31 - //char* MsslTrgtImpactModel; // 32-33 - float CameraYawOffset; // 34 - uint32 UILocomotionType; // 35 - float MsslTrgtImpactTexRadius; // 36 - uint32 VehicleUIIndicatorID; // 37 - uint32 PowerDisplayID[3]; // 38-40 -}; - -struct WMOAreaTableEntry -{ - uint32 ID; // 0 index - int32 WMOID; // 1 used in root WMO - int32 NameSet; // 2 used in adt file - int32 WMOGroupID; // 3 used in group WMO - //uint32 SoundProviderPref; // 4 - //uint32 SoundProviderPrefUnderwater; // 5 - //uint32 AmbienceID; // 6 - //uint32 ZoneMusic; // 7 - //uint32 IntroSound; // 8 - uint32 Flags; // 9 used for indoor/outdoor determination - uint32 AreaTableID; // 10 link to AreaTableEntry.ID - //char* AreaName_lang; // 11 m_AreaName_lang - //uint32 UWIntroSound; // 12 - //uint32 UWZoneMusic; // 13 - //uint32 UWAmbience; // 14 -}; - -struct WorldMapAreaEntry -{ - //uint32 ID; // 0 - uint32 MapID; // 1 - uint32 AreaID; // 2 index (continent 0 areas ignored) - //char* AreaName // 3 - float LocLeft; // 4 - float LocRight; // 5 - float LocTop; // 6 - float LocBottom; // 7 - int32 DisplayMapID; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally) - //int32 DefaultDungeonFloor; // 9 pointer to DungeonMap.dbc (owerride loc coordinates) - //uint32 ParentWorldMapID; // 10 - //uint32 Flags; // 11 - //uint32 LevelRangeMin; // 12 Minimum recommended level displayed on world map - //uint32 LevelRangeMax; // 13 Maximum recommended level displayed on world map -}; - -struct WorldSafeLocsEntry -{ - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Loc; // 2-4 - float Facing; // 5 values are in degrees - //char* AreaName_lang; // 6 -}; - -/* -struct WorldStateSounds -{ - uint32 ID; // 0 Worldstate - uint32 unk; // 1 - uint32 areaTable; // 2 - uint32 WMOAreaTable; // 3 - uint32 zoneIntroMusicTable; // 4 - uint32 zoneIntroMusic; // 5 - uint32 zoneMusic; // 6 - uint32 soundAmbience; // 7 - uint32 soundProviderPreferences; // 8 -}; -*/ - -/* -struct WorldStateUI -{ - uint32 ID; // 0 - uint32 map_id; // 1 Can be -1 to show up everywhere. - uint32 zone; // 2 Can be zero for "everywhere". - uint32 phaseMask; // 3 Phase this WorldState is avaliable in - uint32 icon; // 4 The icon that is used in the interface. - char* textureFilename; // 5 - char* text; // 6-21 The worldstate text - char* description; // 22-38 Text shown when hovering mouse on icon - uint32 worldstateID; // 39 This is the actual ID used - uint32 type; // 40 0 = unknown, 1 = unknown, 2 = not shown in ui, 3 = wintergrasp - uint32 unk1; // 41 - uint32 unk2; // 43 - uint32 unk3; // 44-58 - uint32 unk4; // 59-61 Used for some progress bars. - uint32 unk7; // 62 Unused in 3.3.5a -}; -*/ - -#pragma pack(pop) - -typedef std::map TalentSpellPosMap; -#endif diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 8b2e729a2be..3027402f596 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -22,23 +22,5 @@ // x - skip, X - skip, s - char*, f - float, i - uint32, b - uint8, d - index (not included) // n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc -char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; -char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; -char const CharSectionsfmt[] = "diiixxxiii"; -char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; -char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; -char const EmotesTextSoundEntryfmt[] = "niiii"; -char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; -char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; -char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; -char const Lightfmt[] = "nifffxxxxxxxxxx"; -char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const MapDifficultyfmt[] = "diisiiii"; -char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx"; -char const Talentfmt[] = "niiiiiiiiix"; -char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; -char const WMOAreaTablefmt[] = "niiixxxxxiixxxx"; -char const WorldMapAreafmt[] = "xinxffffixxxxx"; -char const WorldSafeLocsfmt[] = "niffffx"; #endif diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp new file mode 100644 index 00000000000..23319e27734 --- /dev/null +++ b/src/server/game/DataStores/GameTables.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "GameTables.h" +#include "Timer.h" +#include "Log.h" +#include "Util.h" +#include +#include + +GameTable sBarberShopCostBaseGameTable; +GameTable sBaseMPGameTable; +GameTable sCombatRatingsGameTable; +GameTable sHpPerStaGameTable; +GameTable sItemSocketCostPerLevelGameTable; +GameTable sNpcDamageByClassGameTable[MAX_EXPANSIONS]; +GameTable sNpcManaCostScalerGameTable; +GameTable sNpcTotalHpGameTable[MAX_EXPANSIONS]; +GameTable sSpellScalingGameTable; +GameTable sXpGameTable; + +template +inline uint32 LoadGameTable(std::vector& errors, GameTable& storage, boost::filesystem::path const& path) +{ + std::ifstream stream(path.string()); + if (!stream) + { + errors.push_back(Trinity::StringFormat("GameTable file %s cannot be opened.", path.string().c_str())); + return 0; + } + + std::string headers; + if (!std::getline(stream, headers)) + { + errors.push_back(Trinity::StringFormat("GameTable file %s is empty.", path.string().c_str())); + return 0; + } + + Tokenizer columnDefs(headers, '\t'); + + ASSERT(columnDefs.size() - 1 == sizeof(T) / sizeof(float), + "GameTable '%s' has different count of columns " SZFMTD " than expected by size of C++ structure (" SZFMTD ").", + path.string().c_str(), columnDefs.size() - 1, sizeof(T) / sizeof(float)); + + std::vector data; + data.emplace_back(); // row id 0, unused + + std::string line; + while (std::getline(stream, line)) + { + if (line.empty()) + break; + + Tokenizer values(line, '\t', columnDefs.size()); + ASSERT(values.size() == columnDefs.size()); + + ASSERT(strtol(values[0], nullptr, 10) == data.size(), + "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")", + strtol(values[0], nullptr, 10), data.size(), data.size()); + + data.emplace_back(); + float* row = reinterpret_cast(&data.back()); + for (std::size_t col = 1; col < columnDefs.size(); ++col) + *row++ = strtof(values[col], nullptr); + } + + storage.SetData(std::move(data)); + return 1; +} + +void LoadGameTables(std::string const& dataPath) +{ + uint32 oldMSTime = getMSTime(); + + boost::filesystem::path gtPath(dataPath); + gtPath /= "gt"; + + std::vector bad_gt_files; + uint32 gameTableCount = 0; + +#define LOAD_GT(store, file) gameTableCount += LoadGameTable(bad_gt_files, store, gtPath / file) + + LOAD_GT(sBarberShopCostBaseGameTable, "BarberShopCostBase.txt"); + LOAD_GT(sBaseMPGameTable, "BaseMp.txt"); + LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt"); + LOAD_GT(sItemSocketCostPerLevelGameTable, "ItemSocketCostPerLevel.txt"); + LOAD_GT(sHpPerStaGameTable, "HpPerSta.txt"); + LOAD_GT(sNpcDamageByClassGameTable[0], "NpcDamageByClass.txt"); + LOAD_GT(sNpcDamageByClassGameTable[1], "NpcDamageByClassExp1.txt"); + LOAD_GT(sNpcDamageByClassGameTable[2], "NpcDamageByClassExp2.txt"); + LOAD_GT(sNpcDamageByClassGameTable[3], "NpcDamageByClassExp3.txt"); + LOAD_GT(sNpcDamageByClassGameTable[4], "NpcDamageByClassExp4.txt"); + LOAD_GT(sNpcDamageByClassGameTable[5], "NpcDamageByClassExp5.txt"); + LOAD_GT(sNpcDamageByClassGameTable[6], "NpcDamageByClassExp6.txt"); + LOAD_GT(sNpcManaCostScalerGameTable, "NpcManaCostScaler.txt"); + LOAD_GT(sNpcTotalHpGameTable[0], "NpcTotalHp.txt"); + LOAD_GT(sNpcTotalHpGameTable[1], "NpcTotalHpExp1.txt"); + LOAD_GT(sNpcTotalHpGameTable[2], "NpcTotalHpExp2.txt"); + LOAD_GT(sNpcTotalHpGameTable[3], "NpcTotalHpExp3.txt"); + LOAD_GT(sNpcTotalHpGameTable[4], "NpcTotalHpExp4.txt"); + LOAD_GT(sNpcTotalHpGameTable[5], "NpcTotalHpExp5.txt"); + LOAD_GT(sNpcTotalHpGameTable[6], "NpcTotalHpExp6.txt"); + LOAD_GT(sSpellScalingGameTable, "SpellScaling.txt"); + LOAD_GT(sXpGameTable, "xp.txt"); + +#undef LOAD_GT + + // error checks + if (!bad_gt_files.empty()) + { + std::ostringstream str; + for (std::string const& err : bad_gt_files) + str << err << std::endl; + + WPFatal("misc", "Some required *.txt GameTable files (" SZFMTD ") not found or not compatible:\n%s", bad_gt_files.size(), str.str().c_str()); + } + + TC_LOG_INFO("server.loading", ">> Initialized %d GameTables in %u ms", gameTableCount, GetMSTimeDiffToNow(oldMSTime)); +} diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h new file mode 100644 index 00000000000..ad79a7e699a --- /dev/null +++ b/src/server/game/DataStores/GameTables.h @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef GameTables_h__ +#define GameTables_h__ + +#include "SharedDefines.h" +#include "Common.h" + +struct GtBarberShopCostBaseEntry +{ + float Cost = 0.0f; +}; + +struct GtBaseMPEntry +{ + float Rogue = 0.0f; + float Druid = 0.0f; + float Hunter = 0.0f; + float Mage = 0.0f; + float Paladin = 0.0f; + float Priest = 0.0f; + float Shaman = 0.0f; + float Warlock = 0.0f; + float Warrior = 0.0f; + float DeathKnight = 0.0f; + float Monk = 0.0f; + float DemonHunter = 0.0f; +}; + +struct GtCombatRatingsEntry +{ + float Amplify = 0.0f; + float DefenseSkill = 0.0f; + float Dodge = 0.0f; + float Parry = 0.0f; + float Block = 0.0f; + float HitMelee = 0.0f; + float HitRanged = 0.0f; + float HitSpell = 0.0f; + float CritMelee = 0.0f; + float CritRanged = 0.0f; + float CritSpell = 0.0f; + float MultiStrike = 0.0f; + float Readiness = 0.0f; + float Speed = 0.0f; + float ResilienceCritTaken = 0.0f; + float ResiliencePlayerDamage = 0.0f; + float Lifesteal = 0.0f; + float HasteMelee = 0.0f; + float HasteRanged = 0.0f; + float HasteSpell = 0.0f; + float Avoidance = 0.0f; + float Sturdiness = 0.0f; + float Unused7 = 0.0f; + float Expertise = 0.0f; + float ArmorPenetration = 0.0f; + float Mastery = 0.0f; + float PvPPower = 0.0f; + float Cleave = 0.0f; + float VersatilityDamageDone = 0.0f; + float VersatilityHealingDone = 0.0f; + float VersatilityDamageTaken = 0.0f; + float Unused12 = 0.0f; +}; + +struct GtHpPerStaEntry +{ + float Health = 0.0f; +}; + +struct GtItemSocketCostPerLevelEntry +{ + float SocketCost = 0.0f; +}; + +struct GtNpcDamageByClassEntry +{ + float Rogue = 0.0f; + float Druid = 0.0f; + float Hunter = 0.0f; + float Mage = 0.0f; + float Paladin = 0.0f; + float Priest = 0.0f; + float Shaman = 0.0f; + float Warlock = 0.0f; + float Warrior = 0.0f; + float DeathKnight = 0.0f; + float Monk = 0.0f; + float DemonHunter = 0.0f; +}; + +struct GtNpcManaCostScalerEntry +{ + float Scaler = 0.0f; +}; + +struct GtNpcTotalHpEntry +{ + float Rogue = 0.0f; + float Druid = 0.0f; + float Hunter = 0.0f; + float Mage = 0.0f; + float Paladin = 0.0f; + float Priest = 0.0f; + float Shaman = 0.0f; + float Warlock = 0.0f; + float Warrior = 0.0f; + float DeathKnight = 0.0f; + float Monk = 0.0f; + float DemonHunter = 0.0f; +}; + +struct GtSpellScalingEntry +{ + float Rogue = 0.0f; + float Druid = 0.0f; + float Hunter = 0.0f; + float Mage = 0.0f; + float Paladin = 0.0f; + float Priest = 0.0f; + float Shaman = 0.0f; + float Warlock = 0.0f; + float Warrior = 0.0f; + float DeathKnight = 0.0f; + float Monk = 0.0f; + float DemonHunter = 0.0f; + float Item = 0.0f; + float Consumable = 0.0f; + float Gem1 = 0.0f; + float Gem2 = 0.0f; + float Gem3 = 0.0f; + float Health = 0.0f; +}; + +struct GtXpEntry +{ + float Total = 0.0f; + float PerKill = 0.0f; + float Junk = 0.0f; + float Stats = 0.0f; + float Divisor = 0.0f; +}; + +template +class GameTable +{ +public: + T const* GetRow(uint32 row) const + { + if (row >= _data.size()) + return nullptr; + + return &_data[row]; + } + + std::size_t GetTableRowCount() const { return _data.size(); } + + void SetData(std::vector data) { _data = std::move(data); } + +private: + std::vector _data; +}; + +TC_GAME_API extern GameTable sBarberShopCostBaseGameTable; +TC_GAME_API extern GameTable sBaseMPGameTable; +TC_GAME_API extern GameTable sCombatRatingsGameTable; +TC_GAME_API extern GameTable sHpPerStaGameTable; +TC_GAME_API extern GameTable sItemSocketCostPerLevelGameTable; +TC_GAME_API extern GameTable sNpcDamageByClassGameTable[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable sNpcManaCostScalerGameTable; +TC_GAME_API extern GameTable sNpcTotalHpGameTable[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable sSpellScalingGameTable; +TC_GAME_API extern GameTable sXpGameTable; + +TC_GAME_API void LoadGameTables(std::string const& dataPath); + +template +inline float GetGameTableColumnForClass(T const* row, uint32 class_) +{ + switch (class_) + { + case CLASS_WARRIOR: + return row->Warrior; + case CLASS_PALADIN: + return row->Paladin; + case CLASS_HUNTER: + return row->Hunter; + case CLASS_ROGUE: + return row->Rogue; + case CLASS_PRIEST: + return row->Priest; + case CLASS_DEATH_KNIGHT: + return row->DeathKnight; + case CLASS_SHAMAN: + return row->Shaman; + case CLASS_MAGE: + return row->Mage; + case CLASS_WARLOCK: + return row->Warlock; + case CLASS_MONK: + return row->Monk; + case CLASS_DRUID: + return row->Druid; + case CLASS_DEMON_HUNTER: + return row->DemonHunter; + default: + break; + } + + return 0.0f; +} + +#endif // GameTables_h__ diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 94885deeffe..7cd1751d589 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -17,7 +17,6 @@ #include "Common.h" #include "SharedDefines.h" -#include "DBCStores.h" #include "DisableMgr.h" #include "ObjectMgr.h" #include "SocialMgr.h" @@ -37,7 +36,21 @@ namespace lfg { -LFGMgr::LFGMgr(): m_QueueTimer(0), m_lfgProposalId(1), +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(LfgDungeonsEntry const* dbc) : id(dbc->ID), name(dbc->Name->Str[sWorld->GetDefaultDbcLocale()]), map(dbc->MapID), +type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)), +minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)), +seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f), +requiredItemLevel(0) +{ +} + +LFGMgr::LFGMgr() : m_QueueTimer(0), m_lfgProposalId(1), m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)) { } @@ -174,9 +187,9 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */) LfgDungeonStore.clear(); // Initialize Dungeon map with data from dbcs - for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) + for (uint32 i = 0; i < sLfgDungeonsStore.GetNumRows(); ++i) { - LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i); + LfgDungeonsEntry const* dungeon = sLfgDungeonsStore.LookupEntry(i); if (!dungeon) continue; @@ -1597,7 +1610,7 @@ LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid) for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it) { LFGDungeonData const* dungeon = GetLFGDungeon(*it); - if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore + if (!dungeon) // should never happen - We provide a list from sLfgDungeonsStore continue; uint32 lockStatus = 0; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index f38812549a6..63770e31d8f 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -18,7 +18,6 @@ #ifndef _LFGMGR_H #define _LFGMGR_H -#include "DBCStructure.h" #include "Field.h" #include "LFG.h" #include "LFGQueue.h" @@ -267,16 +266,8 @@ struct LfgPlayerBoot struct 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(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->Name_lang), map(dbc->MapID), - type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)), - minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)), - seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f), - requiredItemLevel(0) - { } + LFGDungeonData(); + LFGDungeonData(LfgDungeonsEntry const* dbc); uint32 id; std::string name; diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index d80485afbf4..9288b7404fb 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -17,8 +17,6 @@ #include "ObjectDefines.h" #include "Containers.h" -#include "DBCStructure.h" -#include "DBCStores.h" #include "Group.h" #include "LFGQueue.h" #include "LFGMgr.h" diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 3eba4d58d80..84138cf0b45 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -31,6 +31,7 @@ #include "WorldSession.h" #include "ItemPackets.h" #include "TradeData.h" +#include "GameTables.h" void AddItemsSetItem(Player* player, Item* item) { @@ -1856,8 +1857,8 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const if (uint32 randomPropPoints = GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate()->GetInventoryType(), GetTemplate()->GetSubClass())) { float statValue = float(_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f; - if (GtItemSocketCostPerLevelEntry const* gtCost = sGtItemSocketCostPerLevelStore.EvaluateTable(itemLevel - 1, 0)) - statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->ratio)); + if (GtItemSocketCostPerLevelEntry const* gtCost = sItemSocketCostPerLevelGameTable.GetRow(itemLevel)) + statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->SocketCost)); return int32(std::floor(statValue + 0.5f)); } diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 2f82071f66f..a36a4a4c246 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -21,7 +21,6 @@ #include "Log.h" #include "ObjectMgr.h" #include "Util.h" -#include "DBCStores.h" #include #include diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index 04873bdddcf..67f683849a9 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -16,7 +16,6 @@ * with this program. If not, see . */ -#include "DBCStores.h" #include "DB2Stores.h" #include "World.h" #include "ItemTemplate.h" diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 38265cc9fed..5fa6b5583af 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -660,11 +660,10 @@ class Player; struct TC_GAME_API ItemTemplate { - uint32 Id; ItemEntry const* BasicData; ItemSparseEntry const* ExtendedData; - uint32 GetId() const { return Id; } + uint32 GetId() const { return BasicData->ID; } uint32 GetClass() const { return BasicData->Class; } uint32 GetSubClass() const { return BasicData->SubClass; } uint32 GetQuality() const { return ExtendedData->Quality; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 303ef5d4c5d..2809cf121d1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -101,7 +101,6 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" -#include "DBCStructure.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -2402,12 +2401,12 @@ void Player::GiveLevel(uint8 level) PlayerLevelInfo info; sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), level, &info); - uint32 basehp = 0, basemana = 0; - sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basehp, basemana); + uint32 basemana = 0; + sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basemana); WorldPackets::Misc::LevelUpInfo packet; packet.Level = level; - packet.HealthDelta = int32(basehp) - int32(GetCreateHealth()); + packet.HealthDelta = 0; /// @todo find some better solution // for (int i = 0; i < MAX_STORED_POWERS; ++i) @@ -2444,7 +2443,7 @@ void Player::GiveLevel(uint8 level) for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetCreateStat(Stats(i), info.stats[i]); - SetCreateHealth(basehp); + SetCreateHealth(0); SetCreateMana(basemana); InitTalentForLevel(); @@ -2522,7 +2521,7 @@ void Player::InitTalentForLevel() if (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED)) for (uint32 t = talentTiers; t < MAX_TALENT_TIERS; ++t) for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - for (TalentEntry const* talent : sTalentByPos[getClass()][t][c]) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), t, c)) RemoveTalent(talent); } @@ -2537,8 +2536,8 @@ void Player::InitStatsForLevel(bool reapplyMods) if (reapplyMods) //reapply stats values only on .reset stats (level) command _RemoveAllStatBonuses(); - uint32 basehp = 0, basemana = 0; - sObjectMgr->GetPlayerClassLevelInfo(getClass(), getLevel(), basehp, basemana); + uint32 basemana = 0; + sObjectMgr->GetPlayerClassLevelInfo(getClass(), getLevel(), basemana); PlayerLevelInfo info; sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), getLevel(), &info); @@ -2568,7 +2567,7 @@ void Player::InitStatsForLevel(bool reapplyMods) for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetStat(Stats(i), info.stats[i]); - SetCreateHealth(basehp); + SetCreateHealth(0); //set create powers SetCreateMana(basemana); @@ -2662,7 +2661,7 @@ void Player::InitStatsForLevel(bool reapplyMods) for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i) SetMaxPower(Powers(i), GetCreatePowers(Powers(i))); - SetMaxHealth(basehp); // stamina bonus will applied later + SetMaxHealth(0); // stamina bonus will applied later // cleanup mounted state (it will set correctly at aura loading if player saved at mount. SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); @@ -4831,111 +4830,151 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD]; } -float Player::GetMeleeCritFromAgility() const -{ - uint8 level = getLevel(); - uint32 pclass = getClass(); - - if (level >= sGtChanceToMeleeCritStore.GetTableRowCount()) - level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1; - - GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.EvaluateTable(pclass - 1, 0); - GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1); - if (critBase == nullptr || critRatio == nullptr) - return 0.0f; - - float crit = critBase->base + GetStat(STAT_AGILITY)*critRatio->ratio; - return crit*100.0f; -} - void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) const { - // Table for base dodge values - const float dodge_base[MAX_CLASSES] = - { - 0.037580f, // Warrior - 0.036520f, // Paladin - -0.054500f, // Hunter - -0.005900f, // Rogue - 0.031830f, // Priest - 0.036640f, // DK - 0.016750f, // Shaman - 0.034575f, // Mage - 0.020350f, // Warlock - 0.0f, // ?? - 0.049510f // Druid - }; - // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15% - const float crit_to_dodge[MAX_CLASSES] = - { - 0.85f/1.15f, // Warrior - 1.00f/1.15f, // Paladin - 1.11f/1.15f, // Hunter - 2.00f/1.15f, // Rogue - 1.00f/1.15f, // Priest - 0.85f/1.15f, // DK - 1.60f/1.15f, // Shaman - 1.00f/1.15f, // Mage - 0.97f/1.15f, // Warlock (?) - 0.0f, // ?? - 2.00f/1.15f // Druid - }; + //// Table for base dodge values + //const float dodge_base[MAX_CLASSES] = + //{ + // 0.037580f, // Warrior + // 0.036520f, // Paladin + // -0.054500f, // Hunter + // -0.005900f, // Rogue + // 0.031830f, // Priest + // 0.036640f, // DK + // 0.016750f, // Shaman + // 0.034575f, // Mage + // 0.020350f, // Warlock + // 0.0f, // ?? + // 0.049510f // Druid + //}; + //// Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15% + //const float crit_to_dodge[MAX_CLASSES] = + //{ + // 0.85f/1.15f, // Warrior + // 1.00f/1.15f, // Paladin + // 1.11f/1.15f, // Hunter + // 2.00f/1.15f, // Rogue + // 1.00f/1.15f, // Priest + // 0.85f/1.15f, // DK + // 1.60f/1.15f, // Shaman + // 1.00f/1.15f, // Mage + // 0.97f/1.15f, // Warlock (?) + // 0.0f, // ?? + // 2.00f/1.15f // Druid + //}; - uint8 level = getLevel(); - uint32 pclass = getClass(); + //uint8 level = getLevel(); + //uint32 pclass = getClass(); - if (level >= sGtChanceToMeleeCritStore.GetTableRowCount()) - level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1; + //if (level >= sGtChanceToMeleeCritStore.GetTableRowCount()) + // level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1; - // Dodge per agility is proportional to crit per agility, which is available from DBC files - GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1); - if (dodgeRatio == nullptr || pclass > MAX_CLASSES) - return; + //// Dodge per agility is proportional to crit per agility, which is available from DBC files + //GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1); + //if (dodgeRatio == nullptr || pclass > MAX_CLASSES) + // return; - /// @todo research if talents/effects that increase total agility by x% should increase non-diminishing part - float base_agility = GetCreateStat(STAT_AGILITY) * m_auraModifiersGroup[UNIT_MOD_STAT_START + STAT_AGILITY][BASE_PCT]; - float bonus_agility = GetStat(STAT_AGILITY) - base_agility; + ///// @todo research if talents/effects that increase total agility by x% should increase non-diminishing part + //float base_agility = GetCreateStat(STAT_AGILITY) * m_auraModifiersGroup[UNIT_MOD_STAT_START + STAT_AGILITY][BASE_PCT]; + //float bonus_agility = GetStat(STAT_AGILITY) - base_agility; - // calculate diminishing (green in char screen) and non-diminishing (white) contribution - diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]; - nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]); + //// calculate diminishing (green in char screen) and non-diminishing (white) contribution + //diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]; + //nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]); } -float Player::GetSpellCritFromIntellect() const +inline float GetGameTableColumnForCombatRating(GtCombatRatingsEntry const* row, uint32 rating) { - uint8 level = getLevel(); - uint32 pclass = getClass(); - - if (level >= sGtChanceToSpellCritStore.GetTableRowCount()) - level = sGtChanceToSpellCritStore.GetTableRowCount() - 1; - - GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.EvaluateTable(pclass - 1, 0); - GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.EvaluateTable(level - 1, pclass - 1); - if (critBase == nullptr || critRatio == nullptr) - return 0.0f; + switch (rating) + { + case CR_AMPLIFY: + return row->Amplify; + case CR_DEFENSE_SKILL: + return row->DefenseSkill; + case CR_DODGE: + return row->Dodge; + case CR_PARRY: + return row->Parry; + case CR_BLOCK: + return row->Block; + case CR_HIT_MELEE: + return row->HitMelee; + case CR_HIT_RANGED: + return row->HitRanged; + case CR_HIT_SPELL: + return row->HitSpell; + case CR_CRIT_MELEE: + return row->CritMelee; + case CR_CRIT_RANGED: + return row->CritRanged; + case CR_CRIT_SPELL: + return row->CritSpell; + case CR_MULTISTRIKE: + return row->MultiStrike; + case CR_READINESS: + return row->Readiness; + case CR_SPEED: + return row->Speed; + case CR_RESILIENCE_CRIT_TAKEN: + return row->ResilienceCritTaken; + case CR_RESILIENCE_PLAYER_DAMAGE: + return row->ResiliencePlayerDamage; + case CR_LIFESTEAL: + return row->Lifesteal; + case CR_HASTE_MELEE: + return row->HasteMelee; + case CR_HASTE_RANGED: + return row->HasteRanged; + case CR_HASTE_SPELL: + return row->HasteSpell; + case CR_AVOIDANCE: + return row->Avoidance; + case CR_STURDINESS: + return row->Sturdiness; + case CR_UNUSED_7: + return row->Unused7; + case CR_EXPERTISE: + return row->Expertise; + case CR_ARMOR_PENETRATION: + return row->ArmorPenetration; + case CR_MASTERY: + return row->Mastery; + case CR_PVP_POWER: + return row->PvPPower; + case CR_CLEAVE: + return row->Cleave; + case CR_VERSATILITY_DAMAGE_DONE: + return row->VersatilityDamageDone; + case CR_VERSATILITY_HEALING_DONE: + return row->VersatilityHealingDone; + case CR_VERSATILITY_DAMAGE_TAKEN: + return row->VersatilityDamageTaken; + case CR_UNUSED_12: + return row->Unused12; + default: + break; + } - float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio; - return crit * 100.0f; + return 1.0f; } float Player::GetRatingMultiplier(CombatRating cr) const { - uint8 level = getLevel(); - - if (level >= sGtCombatRatingsStore.GetTableRowCount()) - level = sGtCombatRatingsStore.GetTableRowCount() - 1; + GtCombatRatingsEntry const* Rating = sCombatRatingsGameTable.GetRow(getLevel()); + if (!Rating) + return 1.0f; - GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.EvaluateTable(level - 1, cr); - if (!Rating || !Rating->ratio) + float value = GetGameTableColumnForCombatRating(Rating, cr); + if (!value) return 1.0f; // By default use minimum coefficient (not must be called) - return 1.0f / Rating->ratio; + return 1.0f / value; } float Player::GetRatingBonusValue(CombatRating cr) const { float baseResult = float(GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr)) * GetRatingMultiplier(cr); - if (cr != CR_RESILIENCE_PLAYER_DAMAGE_TAKEN) + if (cr != CR_RESILIENCE_PLAYER_DAMAGE) return baseResult; return float(1.0f - pow(0.99f, baseResult)) * 100.0f; } @@ -4955,24 +4994,6 @@ float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const return 0.0f; } -float Player::OCTRegenMPPerSpirit() const -{ - uint8 level = getLevel(); - uint32 pclass = getClass(); - - if (level >= sGtRegenMPPerSptStore.GetTableRowCount()) - level = sGtRegenMPPerSptStore.GetTableRowCount() - 1; - - GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.EvaluateTable(level - 1, pclass - 1); - if (moreRatio == nullptr) - return 0.0f; - - // Formula get from PaperDollFrame script - float spirit = GetStat(STAT_SPIRIT); - float regen = spirit * moreRatio->ratio; - return regen; -} - void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply) { float oldRating = m_baseRatingValue[combatRating]; @@ -5024,7 +5045,7 @@ void Player::UpdateRating(CombatRating cr) switch (cr) { - case CR_UNUSED_1: + case CR_AMPLIFY: case CR_DEFENSE_SKILL: break; case CR_DODGE: @@ -5063,7 +5084,7 @@ void Player::UpdateRating(CombatRating cr) case CR_MULTISTRIKE: case CR_READINESS: case CR_SPEED: - case CR_RESILIENCE_PLAYER_DAMAGE_TAKEN: + case CR_RESILIENCE_PLAYER_DAMAGE: case CR_RESILIENCE_CRIT_TAKEN: case CR_LIFESTEAL: break; @@ -5072,8 +5093,8 @@ void Player::UpdateRating(CombatRating cr) case CR_HASTE_SPELL: break; case CR_AVOIDANCE: - case CR_UNUSED_2: - case CR_WEAPON_SKILL_RANGED: + case CR_STURDINESS: + case CR_UNUSED_7: break; case CR_EXPERTISE: if (affectStats) @@ -5089,8 +5110,8 @@ void Player::UpdateRating(CombatRating cr) case CR_MASTERY: UpdateMastery(); break; - case CR_UNUSED_3: - case CR_UNUSED_4: + case CR_PVP_POWER: + case CR_CLEAVE: case CR_VERSATILITY_DAMAGE_DONE: case CR_VERSATILITY_DAMAGE_TAKEN: break; @@ -6085,7 +6106,7 @@ void Player::RewardReputation(Unit* victim, float rate) // support for: Championing - http://www.wowwiki.com/Championing Map const* map = GetMap(); if (map->IsNonRaidDungeon()) - if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficultyID())) + if (LfgDungeonsEntry const* dungeon = DB2Manager::GetLfgDungeon(map->GetId(), map->GetDifficultyID())) if (dungeon->TargetLevel == 80) ChampioningFaction = GetChampioningFaction(); } @@ -7235,7 +7256,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, int32(val), apply); // break; case ITEM_MOD_CRIT_TAKEN_RANGED_RATING: - ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, int32(val), apply); + ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val), apply); break; // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING: // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply); @@ -7270,7 +7291,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply); // break; case ITEM_MOD_RESILIENCE_RATING: - ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, int32(val), apply); + ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val), apply); break; case ITEM_MOD_HASTE_RATING: ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply); @@ -7723,7 +7744,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 if (!spellInfo) { TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell: Player '%s' (%s) cast unknown spell (EnchantID: %u, SpellID: %i), ignoring", - GetName().c_str(), GetGUID().ToString().c_str(), pEnchant->ID, pEnchant->EffectSpellID[s]); + GetName().c_str(), GetGUID().ToString().c_str(), enchant_id, pEnchant->EffectSpellID[s]); continue; } @@ -7823,7 +7844,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->EffectSpellID[s]); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->EffectSpellID[s]); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Enchant %i, cast unknown spell %i", enchant_id, pEnchant->EffectSpellID[s]); continue; } @@ -13011,7 +13032,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply); // break; case ITEM_MOD_RESILIENCE_RATING: - ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, enchant_amount, apply); + ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, enchant_amount, apply); TC_LOG_DEBUG("entities.player.items", "+ %u RESILIENCE", enchant_amount); break; case ITEM_MOD_HASTE_RATING: @@ -18076,7 +18097,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) } else { - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty)); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapId, Difficulty(difficulty)); if (!mapDiff) { TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: player '%s' (%s) has bind to not existed difficulty %d instance for map %u (%s)", @@ -18114,7 +18135,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired) { // some instances only have one difficulty - MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, difficulty); if (!mapDiff) return nullptr; @@ -18128,7 +18149,7 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty InstancePlayerBind const* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty) const { // some instances only have one difficulty - MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, difficulty); if (!mapDiff) return nullptr; @@ -18360,14 +18381,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report missingAchievement = ar->achievement; Difficulty target_difficulty = GetDifficultyID(mapEntry); - MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(target_map, target_difficulty); if (LevelMin || LevelMax || missingItem || missingQuest || missingAchievement) { if (report) { if (missingQuest && !ar->questFailedText.empty()) ChatHandler(GetSession()).PSendSysMessage("%s", ar->questFailedText.c_str()); - else if (mapDiff->HasMessage()) // if (missingAchievement) covered by this case + else if (mapDiff->Message_lang->Str[sWorld->GetDefaultDbcLocale()][0] != '\0') // if (missingAchievement) covered by this case SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty); else if (missingItem) GetSession()->SendNotification(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, ASSERT_NOTNULL(sObjectMgr->GetItemTemplate(missingItem))->GetName(GetSession()->GetSessionDbcLocale())); @@ -19608,7 +19629,7 @@ void Player::_SaveStats(SQLTransaction& trans) const stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_ATTACK_POWER)); stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER)); stmt->setUInt32(index++, GetBaseSpellPowerBonus()); - stmt->setUInt32(index, GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_RESILIENCE_PLAYER_DAMAGE_TAKEN)); + stmt->setUInt32(index, GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_RESILIENCE_PLAYER_DAMAGE)); trans->Append(stmt); } @@ -23789,7 +23810,7 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z) if (uint32 liqEntry = liquid_status.entry) { LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry); - if (_lastLiquid && _lastLiquid->SpellID && _lastLiquid->ID != liqEntry) + if (_lastLiquid && _lastLiquid->SpellID && _lastLiquid != liquid) RemoveAurasDueToSpell(_lastLiquid->SpellID); if (liquid && liquid->SpellID) @@ -23940,7 +23961,7 @@ bool Player::CanUseBattlegroundObject(GameObject* gameobject) const FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry(); FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION)); - if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction)) + if (playerFaction && faction && !playerFaction->IsFriendlyTo(faction)) return false; } @@ -23960,11 +23981,6 @@ bool Player::CanCaptureTowerPoint() const uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin /*= nullptr*/, BarberShopStyleEntry const* newFace /*= nullptr*/) const { - uint8 level = getLevel(); - - if (level >= sGtBarberShopCostBaseStore.GetTableRowCount()) - level = sGtBarberShopCostBaseStore.GetTableRowCount() - 1; - uint8 hairstyle = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID); uint8 haircolor = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID); uint8 facialhair = GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE); @@ -23974,26 +23990,26 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 if ((hairstyle == newHairStyle->Data) && (haircolor == newHairColor) && (facialhair == newFacialHair->Data) && (!newSkin || (newSkin->Data == skincolor)) && (!newFace || (newFace->Data == face))) return 0; - GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.EvaluateTable(level - 1, 0); + 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); + cost += uint32(bsc->Cost * newHairStyle->CostModifier); if ((haircolor != newHairColor) && (hairstyle == newHairStyle->Data)) - cost += uint32(bsc->cost * 0.5f); // +1/2 of price + cost += uint32(bsc->Cost * 0.5f); // +1/2 of price if (facialhair != newFacialHair->Data) - cost += uint32(bsc->cost * newFacialHair->CostModifier); + cost += uint32(bsc->Cost * newFacialHair->CostModifier); if (newSkin && skincolor != newSkin->Data) - cost += uint32(bsc->cost * newSkin->CostModifier); + cost += uint32(bsc->Cost * newSkin->CostModifier); if (newFace && face != newFace->Data) - cost += uint32(bsc->cost * newFace->CostModifier); + cost += uint32(bsc->Cost * newFace->CostModifier); return cost; } @@ -24302,7 +24318,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) bool Player::CanFlyInZone(uint32 mapid, uint32 zone) const { // continent checked in SpellInfo::CheckLocation at cast and area update - uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone); + uint32 v_map = sDB2Manager.GetVirtualMapForMapAndZone(mapid, zone); return v_map != 571 || HasSpell(54197); // 54197 = Cold Weather Flying } @@ -24632,7 +24648,7 @@ bool Player::LearnTalent(uint32 talentId) // but only 2 out of 3 have SpecID != 0 // We need to make sure that if player is in one of these defined specs he will not learn the other choice TalentEntry const* bestSlotMatch = nullptr; - for (TalentEntry const* talent : sTalentByPos[getClass()][talentInfo->TierID][talentInfo->ColumnIndex]) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, talentInfo->ColumnIndex)) { if (!talent->SpecID) bestSlotMatch = talent; @@ -24648,7 +24664,7 @@ bool Player::LearnTalent(uint32 talentId) // Check if player doesn't have any talent in current tier for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - for (TalentEntry const* talent : sTalentByPos[getClass()][talentInfo->TierID][c]) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, c)) if (HasTalent(talent->ID, GetActiveTalentGroup())) return false; @@ -24686,8 +24702,8 @@ void Player::LearnTalentSpecialization(uint32 talentSpec) uint32 class_ = getClass(); for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t) for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - if (sTalentByPos[class_][t][c].size() > 1) - for (TalentEntry const* talent : sTalentByPos[class_][t][c]) + if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c)) RemoveTalent(talent); LearnSpecializationSpells(); @@ -24707,8 +24723,8 @@ void Player::ResetTalentSpecialization() uint32 class_ = getClass(); for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t) for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - if (sTalentByPos[class_][t][c].size() > 1) - for (TalentEntry const* talent : sTalentByPos[class_][t][c]) + if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c)) RemoveTalent(talent); RemoveSpecializationSpells(); @@ -26042,7 +26058,7 @@ Difficulty Player::GetDifficultyID(MapEntry const* mapEntry) const if (!mapEntry->IsRaid()) return m_dungeonDifficulty; - MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID); + MapDifficultyEntry const* defaultDifficulty = sDB2Manager.GetDefaultMapDifficulty(mapEntry->ID); if (!defaultDifficulty) return m_legacyRaidDifficulty; @@ -26191,9 +26207,9 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha { // Check skin color // For Skin type is always 0 - if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_SKIN, gender, 0, skinColor)) + if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_SKIN, gender, 0, skinColor)) { // Skin Color defined as Face color, too, we check skin & face in one pass - if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor)) + if (CharSectionsEntry const* entry2 = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor)) { if (!IsSectionFlagValid(entry, class_, create)) return false; @@ -26210,14 +26226,14 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha bool excludeCheck = (race == RACE_TAUREN) || (race == RACE_DRAENEI) || (gender == GENDER_FEMALE && race != RACE_NIGHTELF && race != RACE_UNDEAD_PLAYER); // Check Hair - if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor)) + if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor)) { if (!IsSectionFlagValid(entry, class_, create)) return false; if (!excludeCheck) { - if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor)) + if (CharSectionsEntry const* entry2 = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor)) { if (!IsSectionFlagValid(entry2, class_, create)) return false; @@ -26235,7 +26251,7 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha return false; for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - if (CharSectionsEntry const* entry = GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0)) + if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0)) if (!IsSectionFlagValid(entry, class_, create)) return false; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b538bbbe05c..e943672c4f0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -19,7 +19,6 @@ #ifndef _PLAYER_H #define _PLAYER_H -#include "DBCStores.h" #include "DB2Stores.h" #include "GroupReference.h" #include "MapReference.h" @@ -1940,10 +1939,7 @@ class TC_GAME_API Player : public Unit, public GridObject void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) override; void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} - float GetMeleeCritFromAgility() const; void GetDodgeFromAgility(float &diminishing, float &nondiminishing) const; - float GetSpellCritFromIntellect() const; - float OCTRegenMPPerSpirit() const; float GetRatingMultiplier(CombatRating cr) const; float GetRatingBonusValue(CombatRating cr) const; diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index 22af722d592..709a5debf4d 100644 --- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp +++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp @@ -18,7 +18,6 @@ #include "TaxiPathGraph.h" #include "ObjectMgr.h" #include "Player.h" -#include "DBCStores.h" #include "DB2Stores.h" #include "Config.h" #include "Util.h" diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index d2a8a31817d..58a9b68e0e5 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -21,7 +21,6 @@ #include "MapManager.h" #include "ObjectMgr.h" #include "ScriptMgr.h" -#include "DBCStores.h" #include "GameObjectAI.h" #include "Vehicle.h" #include "Player.h" diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index da04c39c289..ed6b9ec3696 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -20,6 +20,7 @@ #include "Player.h" #include "Pet.h" #include "Creature.h" +#include "GameTables.h" #include "SharedDefines.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" @@ -265,8 +266,8 @@ float Player::GetHealthBonusFromStamina() { // Taken from PaperDollFrame.lua - 6.0.3.19085 float ratio = 10.0f; - if (GtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0)) - ratio = hpBase->ratio; + if (GtHpPerStaEntry const* hpBase = sHpPerStaGameTable.GetRow(getLevel())) + ratio = hpBase->Health; float stamina = GetStat(STAT_STAMINA); @@ -512,7 +513,7 @@ void Player::UpdateCritPercentage(WeaponAttackType attType) void Player::UpdateAllCritPercentages() { - float value = GetMeleeCritFromAgility(); + float value = 5.0f; SetBaseModValue(CRIT_PERCENTAGE, PCT_MOD, value); SetBaseModValue(OFFHAND_CRIT_PERCENTAGE, PCT_MOD, value); @@ -654,9 +655,7 @@ void Player::UpdateSpellCritChance(uint32 school) return; } // For others recalculate it from: - float crit = 0.0f; - // Crit from Intellect - crit += GetSpellCritFromIntellect(); + float crit = 5.0f; // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE crit += GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -754,7 +753,7 @@ void Player::UpdateManaRegen() return; // Mana regen from spirit - float spirit_regen = OCTRegenMPPerSpirit(); + float spirit_regen = 0.0f; // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen spirit_regen *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2bf8d161798..964572e5f02 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1430,7 +1430,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id) SendMessageToSet(packet.Write(), true); } -bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo, uint8 effIndex) +bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo /*= nullptr*/, int8 effIndex /*= -1*/) { // only physical spells damage gets reduced by armor if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) @@ -1441,13 +1441,16 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR)) return false; - // bleeding effects are not reduced by armor - if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficultyID(), effIndex)) + if (effIndex != -1) { - if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || - effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE) - if (spellInfo->GetEffectMechanicMask(effIndex) & (1<GetEffect(GetMap()->GetDifficultyID(), effIndex)) + { + if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || + effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE) + if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED)) + return false; + } } } return true; @@ -6733,11 +6736,11 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem } // common faction based check - if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry)) + if (factionTemplateEntry->IsHostileTo(targetFactionTemplateEntry)) return REP_HOSTILE; - if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry)) + if (factionTemplateEntry->IsFriendlyTo(targetFactionTemplateEntry)) return REP_FRIENDLY; - if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry)) + if (targetFactionTemplateEntry->IsFriendlyTo(factionTemplateEntry)) return REP_FRIENDLY; if (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_HOSTILE_BY_DEFAULT) return REP_HOSTILE; @@ -8952,7 +8955,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT { if (Player* player = ToPlayer()) { - float mod = player->GetRatingBonusValue(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN) * (-8.0f); + float mod = player->GetRatingBonusValue(CR_RESILIENCE_PLAYER_DAMAGE) * (-8.0f); AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount()))); } } @@ -15739,7 +15742,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) { FactionTemplateEntry const* ft1 = GetFactionTemplateEntry(); FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry(); - if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2)) + if (ft1 && ft2 && !ft1->IsFriendlyTo(ft2)) { if (index == UNIT_FIELD_BYTES_2) // Allow targetting opposite faction in party when enabled in config diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5ba84c271be..68b27049f71 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -19,7 +19,6 @@ #ifndef __UNIT_H #define __UNIT_H -#include "DBCStructure.h" #include "EventProcessor.h" #include "FollowerReference.h" #include "FollowerRefManager.h" @@ -381,6 +380,7 @@ enum InventorySlot }; struct FactionTemplateEntry; +struct LiquidTypeEntry; struct MountCapabilityEntry; struct SpellValue; @@ -623,8 +623,8 @@ enum WeaponAttackType : uint8 enum CombatRating { - CR_UNUSED_1 = 0, - CR_DEFENSE_SKILL = 1, // Removed in 4.0.1 + CR_AMPLIFY = 0, + CR_DEFENSE_SKILL = 1, CR_DODGE = 2, CR_PARRY = 3, CR_BLOCK = 4, @@ -638,22 +638,23 @@ enum CombatRating CR_READINESS = 12, CR_SPEED = 13, CR_RESILIENCE_CRIT_TAKEN = 14, - CR_RESILIENCE_PLAYER_DAMAGE_TAKEN = 15, + CR_RESILIENCE_PLAYER_DAMAGE = 15, CR_LIFESTEAL = 16, CR_HASTE_MELEE = 17, CR_HASTE_RANGED = 18, CR_HASTE_SPELL = 19, CR_AVOIDANCE = 20, - CR_UNUSED_2 = 21, - CR_WEAPON_SKILL_RANGED = 22, + CR_STURDINESS = 21, + CR_UNUSED_7 = 22, CR_EXPERTISE = 23, CR_ARMOR_PENETRATION = 24, CR_MASTERY = 25, - CR_UNUSED_3 = 26, - CR_UNUSED_4 = 27, + CR_PVP_POWER = 26, + CR_CLEAVE = 27, CR_VERSATILITY_DAMAGE_DONE = 28, - // placeholder = 29, - CR_VERSATILITY_DAMAGE_TAKEN = 30 + CR_VERSATILITY_HEALING_DONE = 29, + CR_VERSATILITY_DAMAGE_TAKEN = 30, + CR_UNUSED_12 = 31 }; #define MAX_COMBAT_RATING 31 @@ -1539,7 +1540,7 @@ class TC_GAME_API Unit : public WorldObject void DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss); // player or player's pet resilience (-1%) - uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, 1.0f, 100.0f, damage); } + uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE, 1.0f, 100.0f, damage); } void ApplyResilience(Unit const* victim, int32* damage) const; @@ -2079,7 +2080,7 @@ class TC_GAME_API Unit : public WorldObject bool IsImmunedToDamage(SpellInfo const* spellInfo) const; virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature - bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); + bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = nullptr, int8 effIndex = -1); uint32 CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); uint32 CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const; void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, uint32 const damage, uint32* absorb, uint32* resist, SpellInfo const* spellInfo = NULL); diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 7ba412f5a69..2789978a7fe 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -23,7 +23,7 @@ #include "ObjectMgr.h" #include "VehicleDefines.h" -Garrison::Garrison(Player* owner) : _owner(owner), _siteLevelId(0), _siteLevel(nullptr), _followerActivationsRemainingToday(1) +Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1) { } @@ -34,8 +34,7 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue return false; Field* fields = garrison->Fetch(); - _siteLevelId = fields[0].GetUInt32(); - _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevelId); + _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevel->ID); _followerActivationsRemainingToday = fields[1].GetUInt32(); if (!_siteLevel) return false; @@ -142,7 +141,7 @@ void Garrison::SaveToDB(SQLTransaction trans) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - stmt->setUInt32(1, _siteLevelId); + stmt->setUInt32(1, _siteLevel->ID); stmt->setUInt32(2, _followerActivationsRemainingToday); trans->Append(stmt); @@ -220,17 +219,16 @@ void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) bool Garrison::Create(uint32 garrSiteId) { - DBStorageIterator siteLevelItr = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); - if (siteLevelItr == sGarrSiteLevelStore.end()) + GarrSiteLevelEntry const* siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); + if (!siteLevel) return false; - _siteLevelId = siteLevelItr.ID(); - _siteLevel = siteLevelItr.Data(); + _siteLevel = siteLevel; InitializePlots(); WorldPackets::Garrison::GarrisonCreateResult garrisonCreateResult; - garrisonCreateResult.GarrSiteLevelID = _siteLevelId; + garrisonCreateResult.GarrSiteLevelID = _siteLevel->ID; _owner->SendDirectMessage(garrisonCreateResult.Write()); _owner->SendUpdatePhasing(); SendRemoteInfo(); @@ -251,11 +249,11 @@ void Garrison::Delete() void Garrison::InitializePlots() { - if (std::vector> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevelId)) + if (std::vector const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID)) { for (std::size_t i = 0; i < plots->size(); ++i) { - uint32 garrPlotInstanceId = plots->at(i).second->GarrPlotInstanceID; + uint32 garrPlotInstanceId = plots->at(i)->GarrPlotInstanceID; GarrPlotInstanceEntry const* plotInstance = sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId); GameObjectsEntry const* gameObject = sGarrisonMgr.GetPlotGameObject(_siteLevel->MapID, garrPlotInstanceId); if (!plotInstance || !gameObject) @@ -270,7 +268,7 @@ void Garrison::InitializePlots() plotInfo.PacketInfo.PlotPos.Relocate(gameObject->Position.X, gameObject->Position.Y, gameObject->Position.Z, 2 * std::acos(gameObject->RotationW)); plotInfo.PacketInfo.PlotType = plot->PlotType; plotInfo.EmptyGameObjectId = gameObject->ID; - plotInfo.GarrSiteLevelPlotInstId = plots->at(i).first; + plotInfo.GarrSiteLevelPlotInstId = plots->at(i)->ID; } } } @@ -531,7 +529,7 @@ void Garrison::SendInfo() { WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo; garrisonInfo.GarrSiteID = _siteLevel->SiteID; - garrisonInfo.GarrSiteLevelID = _siteLevelId; + garrisonInfo.GarrSiteLevelID = _siteLevel->ID; garrisonInfo.FactionIndex = GetFaction(); garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; for (auto& p : _plots) @@ -558,7 +556,7 @@ void Garrison::SendRemoteInfo() const remoteInfo.Sites.resize(1); WorldPackets::Garrison::GarrisonRemoteSiteInfo& remoteSiteInfo = remoteInfo.Sites[0]; - remoteSiteInfo.GarrSiteLevelID = _siteLevelId; + remoteSiteInfo.GarrSiteLevelID = _siteLevel->ID; for (auto const& p : _plots) if (p.second.BuildingInfo.PacketInfo) remoteSiteInfo.Buildings.emplace_back(p.first, p.second.BuildingInfo.PacketInfo->GarrBuildingID); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 68ebbc4c0b9..2aa38ee6ad3 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -157,7 +157,6 @@ private: GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const; GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const; Player* _owner; - uint32 _siteLevelId; GarrSiteLevelEntry const* _siteLevel; uint32 _followerActivationsRemainingToday; diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index c07d9a82c45..5836ee2da4b 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -32,8 +32,8 @@ GarrisonMgr& GarrisonMgr::Instance() void GarrisonMgr::Initialize() { - for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr) - _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.ID(), itr.Data())); + for (GarrSiteLevelPlotInstEntry const* siteLevelPlotInst : sGarrSiteLevelPlotInstStore) + _garrisonPlotInstBySiteLevel[siteLevelPlotInst->GarrSiteLevelID].push_back(siteLevelPlotInst); for (GameObjectsEntry const* gameObject : sGameObjectsStore) if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT) @@ -45,8 +45,8 @@ void GarrisonMgr::Initialize() for (GarrBuildingPlotInstEntry const* buildingPlotInst : sGarrBuildingPlotInstStore) _garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID; - for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr) - _garrisonBuildingsByType[itr->Type].push_back(itr.ID()); + for (GarrBuildingEntry const* building : sGarrBuildingStore) + _garrisonBuildingsByType[building->Type].push_back(building->ID); for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore) { @@ -73,16 +73,16 @@ void GarrisonMgr::Initialize() LoadFollowerClassSpecAbilities(); } -DBStorageIterator GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const +GarrSiteLevelEntry const* GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const { - for (auto itr = sGarrSiteLevelStore.begin(); itr != sGarrSiteLevelStore.end(); ++itr) - if (itr->SiteID == garrSiteId && itr->Level == level) - return itr; + for (GarrSiteLevelEntry const* siteLevel : sGarrSiteLevelStore) + if (siteLevel->SiteID == garrSiteId && siteLevel->Level == level) + return siteLevel; - return sGarrSiteLevelStore.end(); + return nullptr; } -std::vector> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const +std::vector const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const { auto itr = _garrisonPlotInstBySiteLevel.find(garrSiteLevelId); if (itr != _garrisonPlotInstBySiteLevel.end()) diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h index 7a93941d59b..b5bb0628ab1 100644 --- a/src/server/game/Garrison/GarrisonMgr.h +++ b/src/server/game/Garrison/GarrisonMgr.h @@ -45,8 +45,8 @@ public: void Initialize(); - DBStorageIterator GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; - std::vector> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; + GarrSiteLevelEntry const* GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; + std::vector const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; GameObjectsEntry const* GetPlotGameObject(uint32 mapId, uint32 garrPlotInstanceId) const; bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const; uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const; @@ -61,7 +61,7 @@ private: void LoadPlotFinalizeGOInfo(); void LoadFollowerClassSpecAbilities(); - std::unordered_map>> _garrisonPlotInstBySiteLevel; + std::unordered_map> _garrisonPlotInstBySiteLevel; std::unordered_map> _garrisonPlots; std::unordered_map> _garrisonBuildingsByPlot; std::unordered_map _garrisonBuildingPlotInstances; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index aec1bba1e65..0e93e93a136 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -16,6 +16,7 @@ * with this program. If not, see . */ +#include "ObjectMgr.h" #include "AccountMgr.h" #include "AchievementMgr.h" #include "ArenaTeam.h" @@ -24,9 +25,9 @@ #include "Chat.h" #include "Common.h" #include "DatabaseEnv.h" -#include "DB2Structure.h" #include "DB2Stores.h" #include "DisableMgr.h" +#include "GameTables.h" #include "GossipDef.h" #include "GroupMgr.h" #include "GuildMgr.h" @@ -36,7 +37,6 @@ #include "Log.h" #include "MapManager.h" #include "Object.h" -#include "ObjectMgr.h" #include "PoolMgr.h" #include "ReputationMgr.h" #include "ScriptMgr.h" @@ -1734,7 +1734,7 @@ void ObjectMgr::LoadCreatures() // Build single time for check spawnmask std::map spawnMasks; - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) for (auto& difficultyPair : mapDifficultyPair.second) spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first); @@ -2046,7 +2046,7 @@ void ObjectMgr::LoadGameobjects() // build single time for check spawnmask std::map spawnMasks; - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) for (auto& difficultyPair : mapDifficultyPair.second) spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first); @@ -2622,15 +2622,13 @@ void ObjectMgr::LoadItemTemplates() uint32 oldMSTime = getMSTime(); uint32 sparseCount = 0; - for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr) + for (ItemSparseEntry const* sparse : sItemSparseStore) { - ItemSparseEntry const* sparse = itr.Data(); - ItemEntry const* db2Data = sItemStore.LookupEntry(itr.ID()); + ItemEntry const* db2Data = sItemStore.LookupEntry(sparse->ID); if (!db2Data) continue; - ItemTemplate& itemTemplate = _itemTemplateStore[itr.ID()]; - itemTemplate.Id = itr.ID(); + ItemTemplate& itemTemplate = _itemTemplateStore[sparse->ID]; itemTemplate.BasicData = db2Data; itemTemplate.ExtendedData = sparse; @@ -2644,7 +2642,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; - if (std::vector const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(itemTemplate.Id)) + if (std::vector const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) { for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) itemTemplate.Specializations[0].insert(itemSpecOverride->SpecID); @@ -3481,18 +3479,14 @@ void ObjectMgr::LoadPlayerInfo() { uint32 oldMSTime = getMSTime(); - _playerXPperLevel.resize(sGtOCTLevelExperienceStore.GetTableRowCount() + 1, 0); + _playerXPperLevel.resize(sXpGameTable.GetTableRowCount() + 1, 0); // 0 1 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level"); // load the DBC's levels at first... - GtOCTLevelExperienceEntry const* exp; - for (uint32 level = 0; level < sGtOCTLevelExperienceStore.GetTableRowCount(); ++level) - { - exp = sGtOCTLevelExperienceStore.EvaluateTable(level, 0); - _playerXPperLevel[level + 1] = exp->Data; - } + for (uint32 level = 0; level < sXpGameTable.GetTableRowCount(); ++level) + _playerXPperLevel[level + 1] = sXpGameTable.GetRow(level)->Total; uint32 count = 0; @@ -3537,7 +3531,7 @@ void ObjectMgr::LoadPlayerInfo() } } -void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseHP, uint32& baseMana) const +void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const { if (level < 1 || class_ >= MAX_CLASSES) return; @@ -3545,17 +3539,14 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); - GtOCTBaseHPByClassEntry const* hp = sGtOCTBaseHPByClassStore.EvaluateTable(level - 1, class_ - 1); - GtOCTBaseMPByClassEntry const* mp = sGtOCTBaseMPByClassStore.EvaluateTable(level - 1, class_ - 1); - - if (!hp || !mp) + GtBaseMPEntry const* mp = sBaseMPGameTable.GetRow(level); + if (!mp) { TC_LOG_ERROR("misc", "Tried to get non-existant Class-Level combination data for base hp/mp. Class %u Level %u", class_, level); return; } - baseHP = uint32(hp->ratio); - baseMana = uint32(mp->ratio); + baseMana = uint32(GetGameTableColumnForClass(mp, class_)); } void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const @@ -5349,7 +5340,7 @@ void ObjectMgr::LoadInstanceEncounters() { for (uint32 i = 0; i < MAX_DIFFICULTY; ++i) { - if (GetMapDifficultyData(dungeonEncounter->MapID, Difficulty(i))) + if (sDB2Manager.GetMapDifficultyData(dungeonEncounter->MapID, Difficulty(i))) { DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR64(dungeonEncounter->MapID, i)]; encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon)); @@ -6242,7 +6233,7 @@ void ObjectMgr::LoadAccessRequirements() } uint32 difficulty = fields[1].GetUInt8(); - if (!GetMapDifficultyData(mapid, Difficulty(difficulty))) + if (!sDB2Manager.GetMapDifficultyData(mapid, Difficulty(difficulty))) { TC_LOG_ERROR("sql.sql", "Map %u referenced in `access_requirement` does not have difficulty %u, skipped", mapid, difficulty); continue; @@ -8718,8 +8709,8 @@ void ObjectMgr::LoadCreatureClassLevelStats() for (uint8 i = 0; i < MAX_EXPANSIONS; ++i) { - stats.BaseHealth[0] = sGtNpcTotalHpStore[i].EvaluateTable(Level - 1, Class - 1)->HP; - stats.BaseDamage[0] = sGtNpcDamageByClassStore[i].EvaluateTable(Level - 1, Class - 1)->Damage; + stats.BaseHealth[i] = GetGameTableColumnForClass(sNpcTotalHpGameTable[i].GetRow(Level), Class); + stats.BaseDamage[i] = GetGameTableColumnForClass(sNpcDamageByClassGameTable[i].GetRow(Level), Class); if (stats.BaseDamage[i] < 0.0f) { TC_LOG_ERROR("sql.sql", "Creature base stats for class %u, level %u has invalid negative base damage[%u] - set to 0.0", Class, Level, i); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 31eff02b3dc..c1a77bdd6f9 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -762,7 +762,7 @@ class TC_GAME_API ObjectMgr PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const; - void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseHP, uint32& baseMana) const; + void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const; PlayerInfo const* GetPlayerInfo(uint32 race, uint32 class_) const; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 93e301bf548..7883a445ebd 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -2082,7 +2082,7 @@ Difficulty Group::GetDifficultyID(MapEntry const* mapEntry) const if (!mapEntry->IsRaid()) return m_dungeonDifficulty; - MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID); + MapDifficultyEntry const* defaultDifficulty = sDB2Manager.GetDefaultMapDifficulty(mapEntry->ID); if (!defaultDifficulty) return m_legacyRaidDifficulty; @@ -2212,7 +2212,7 @@ InstanceGroupBind* Group::GetBoundInstance(MapEntry const* mapEntry) InstanceGroupBind* Group::GetBoundInstance(Difficulty difficulty, uint32 mapId) { // some instances only have one difficulty - GetDownscaledMapDifficultyData(mapId, difficulty); + sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty); BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapId); if (itr != m_boundInstances[difficulty].end()) diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index c6046c3a9aa..ad112c59a61 100644 --- a/src/server/game/Groups/GroupMgr.cpp +++ b/src/server/game/Groups/GroupMgr.cpp @@ -19,7 +19,6 @@ #include "GroupMgr.h" #include "InstanceSaveMgr.h" #include "World.h" -#include "DBCStores.h" GroupMgr::GroupMgr() { diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index e0d15e8def0..9c217ea6888 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2159,8 +2159,7 @@ void Guild::SendLoginInfo(WorldSession* session) } for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore) - if (entry->GuildLevel <= GetLevel()) - player->LearnSpell(entry->SpellID, true); + player->LearnSpell(entry->SpellID, true); m_achievementMgr.SendAllData(player); @@ -2696,8 +2695,7 @@ void Guild::DeleteMember(ObjectGuid guid, bool isDisbanding, bool isKicked, bool player->SetGuildLevel(0); for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore) - if (entry->GuildLevel <= GetLevel()) - player->RemoveSpell(entry->SpellID, false, false); + player->RemoveSpell(entry->SpellID, false, false); } _DeleteMemberFromDB(guid.GetCounter()); diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index db20f48c3e7..c365a4bbcbb 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -25,7 +25,6 @@ #include "WorldPacket.h" #include "ObjectMgr.h" #include "Player.h" -#include "DBCStore.h" class Item; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 95a99736563..d4ea3927f6c 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1243,22 +1243,6 @@ void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation:: _player->GetReputationMgr().SendForceReactions(); } -void WorldSession::HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet) -{ - if (packet.ShowHelm) - _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM); - else - _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM); -} - -void WorldSession::HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet) -{ - if (packet.ShowCloak) - _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); - else - _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); -} - void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request) { if (!IsLegitCharacterForAccount(request.RenameInfo->Guid)) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 80ee0918616..54bbfddb5fa 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1278,14 +1278,19 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC if (!item) return; - ItemToBattlePetSpeciesEntry const* itemToBattlePetSpecies = sItemToBattlePetSpeciesStore.LookupEntry(item->GetEntry()); - if (!itemToBattlePetSpecies) + if (item->GetTemplate()->Effects.size() < 2) return; - BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(itemToBattlePetSpecies->BattlePetSpeciesID); - if (!battlePetSpecies) - return; + uint32 spellToLearn = item->GetTemplate()->Effects[1]->SpellID; + for (BattlePetSpeciesEntry const* entry : sBattlePetSpeciesStore) + { + if (entry->SummonSpellID == spellToLearn) + { + GetBattlePetMgr()->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID)); + _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT); + break; + } + } - GetBattlePetMgr()->AddPet(battlePetSpecies->ID, battlePetSpecies->CreatureID, BattlePetMgr::RollPetBreed(battlePetSpecies->ID), BattlePetMgr::GetDefaultPetQuality(battlePetSpecies->ID)); _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 81221599b2c..69bafe9bc11 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -26,7 +26,6 @@ #include "Player.h" #include "MailPackets.h" #include "Language.h" -#include "DBCStores.h" #include "Item.h" #include "AccountMgr.h" #include "BattlenetAccountMgr.h" diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index a2634390cbc..0d37806d170 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -577,7 +577,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& pack case Map::CANNOT_ENTER_INSTANCE_BIND_MISMATCH: if (MapEntry const* entry = sMapStore.LookupEntry(at->target_mapId)) { - char const* mapName = entry->MapName_lang; + char const* mapName = entry->MapName->Str[player->GetSession()->GetSessionDbcLocale()]; TC_LOG_DEBUG("maps", "MAP: Player '%s' cannot enter instance map '%s' because their permanent bind is incompatible with their group's", player->GetName().c_str(), mapName); // is there a special opcode for this? // @todo figure out how to get player localized difficulty string (e.g. "10 player", "Heroic" etc) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index ae0dcc586ef..0349fad420a 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -170,9 +170,9 @@ void WorldSession::HandleMoveWorldportAckOpcode() { // check if this instance has a reset time and send it to player if so Difficulty diff = GetPlayer()->GetDifficultyID(mEntry); - if (MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mEntry->ID, diff)) + if (MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mEntry->ID, diff)) { - if (mapDiff->RaidDuration) + if (mapDiff->GetRaidDuration()) { if (time_t timeReset = sInstanceSaveMgr->GetResetTimeFor(mEntry->ID, diff)) { diff --git a/src/server/game/Handlers/ReferAFriendHandler.cpp b/src/server/game/Handlers/ReferAFriendHandler.cpp index 23d432ed67c..d4b57b366be 100644 --- a/src/server/game/Handlers/ReferAFriendHandler.cpp +++ b/src/server/game/Handlers/ReferAFriendHandler.cpp @@ -21,6 +21,30 @@ #include "Log.h" #include "ReferAFriendPackets.h" +inline uint32 GetMaxLevelForExpansion(uint32 expansion) +{ + switch (expansion) + { + case EXPANSION_CLASSIC: + return 60; + case EXPANSION_THE_BURNING_CRUSADE: + return 70; + case EXPANSION_WRATH_OF_THE_LICH_KING: + return 80; + case EXPANSION_CATACLYSM: + return 85; + case EXPANSION_MISTS_OF_PANDARIA: + return 90; + case EXPANSION_WARLORDS_OF_DRAENOR: + return 100; + case EXPANSION_LEGION: + return 110; + default: + break; + } + return 0; +} + void WorldSession::HandleGrantLevel(WorldPackets::RaF::GrantLevel& grantLevel) { Player* target = ObjectAccessor::GetPlayer(*_player, grantLevel.Target); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 7d639d57f80..12dcfcb77df 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -19,7 +19,6 @@ #include "WorldSession.h" #include "Common.h" #include "Config.h" -#include "DBCStores.h" #include "GameObjectAI.h" #include "GameObjectPackets.h" #include "GuildMgr.h" diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 4d979ecb9b3..3a5c65a0932 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -376,7 +376,7 @@ void InstanceSaveManager::LoadResetTimes() Difficulty difficulty = Difficulty(fields[1].GetUInt8()); uint64 oldresettime = fields[2].GetUInt32(); - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty); if (!mapDiff) { TC_LOG_ERROR("misc", "InstanceSaveManager::LoadResetTimes: invalid mapid(%u)/difficulty(%u) pair in instance_reset!", mapid, difficulty); @@ -395,7 +395,7 @@ void InstanceSaveManager::LoadResetTimes() // calculate new global reset times for expired instances and those that have never been reset yet // add the global reset times to the priority queue - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) { uint32 mapid = mapDifficultyPair.first; @@ -403,11 +403,11 @@ void InstanceSaveManager::LoadResetTimes() { Difficulty difficulty = Difficulty(difficultyPair.first); MapDifficultyEntry const* mapDiff = difficultyPair.second; - if (!mapDiff->RaidDuration) + if (!mapDiff->GetRaidDuration()) continue; // the reset_delay must be at least one day - uint32 period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); + uint32 period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); if (period < DAY) period = DAY; @@ -447,15 +447,15 @@ void InstanceSaveManager::LoadResetTimes() time_t InstanceSaveManager::GetSubsequentResetTime(uint32 mapid, Difficulty difficulty, time_t resetTime) const { - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty); - if (!mapDiff || !mapDiff->RaidDuration) + MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty); + if (!mapDiff || !mapDiff->GetRaidDuration()) { TC_LOG_ERROR("misc", "InstanceSaveManager::GetSubsequentResetTime: not valid difficulty or no reset delay for map %u", mapid); return 0; } time_t diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR; - time_t period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); + time_t period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); if (period < DAY) period = DAY; @@ -501,7 +501,7 @@ void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent ev void InstanceSaveManager::ForceGlobalReset(uint32 mapId, Difficulty difficulty) { - if (!GetDownscaledMapDifficultyData(mapId, difficulty)) + if (!sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty)) return; // remove currently scheduled reset times ScheduleReset(false, 0, InstResetEvent(1, mapId, difficulty, 0)); @@ -627,7 +627,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b MapEntry const* mapEntry = sMapStore.LookupEntry(mapid); if (!mapEntry->Instanceable()) return; - TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName_lang, mapid, uint8(difficulty), warn); + TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()], mapid, uint8(difficulty), warn); time_t now = time(NULL); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 2452c8f913e..f110425c1a4 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1586,9 +1586,9 @@ void LoadLootTemplates_Fishing() uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot - for (auto itr = sAreaTableStore.begin(); itr != sAreaTableStore.end(); ++itr) - if (lootIdSet.find(itr.ID()) != lootIdSet.end()) - lootIdSet.erase(itr.ID()); + for (AreaTableEntry const* areaTable : sAreaTableStore) + if (lootIdSet.find(areaTable->ID) != lootIdSet.end()) + lootIdSet.erase(areaTable->ID); // output error for any still listed (not referenced from appropriate table) ids LootTemplates_Fishing.ReportUnusedIds(lootIdSet); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cce2671b69b..37321344782 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -239,7 +239,7 @@ m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD), m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()), i_gridExpiry(expiry), -i_scriptLock(false), _defaultLight(GetDefaultMapLight(id)) +i_scriptLock(false), _defaultLight(DB2Manager::GetDefaultMapLight(id)) { m_parentMap = (_parent ? _parent : this); for (unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx) @@ -2403,7 +2403,7 @@ bool Map::IsOutdoors(float x, float y, float z) const return true; AreaTableEntry const* atEntry = nullptr; - WMOAreaTableEntry const* wmoEntry= GetWMOAreaTableEntryByTripple(rootId, adtId, groupId); + WMOAreaTableEntry const* wmoEntry= sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId); if (wmoEntry) { TC_LOG_DEBUG("maps", "Got WMOAreaTableEntry! flag %u, areaid %u", wmoEntry->Flags, wmoEntry->AreaTableID); @@ -2443,7 +2443,7 @@ uint32 Map::GetAreaId(float x, float y, float z, bool *isOutdoors) const if (GetAreaInfo(x, y, z, mogpFlags, adtId, rootId, groupId)) { haveAreaInfo = true; - wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId); + wmoEntry = sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId); if (wmoEntry) { areaId = wmoEntry->AreaTableID; @@ -3413,7 +3413,7 @@ void InstanceMap::SetResetSchedule(bool on) MapDifficultyEntry const* Map::GetMapDifficulty() const { - return GetMapDifficultyData(GetId(), GetDifficultyID()); + return sDB2Manager.GetMapDifficultyData(GetId(), GetDifficultyID()); } uint32 Map::GetDifficultyLootBonusTreeMod() const @@ -3428,6 +3428,36 @@ uint32 Map::GetDifficultyLootBonusTreeMod() const return 0; } +uint32 Map::GetId() const +{ + return i_mapEntry->ID; +} + +bool Map::Instanceable() const +{ + return i_mapEntry && i_mapEntry->Instanceable(); +} + +bool Map::IsDungeon() const +{ + return i_mapEntry && i_mapEntry->IsDungeon(); +} + +bool Map::IsNonRaidDungeon() const +{ + return i_mapEntry && i_mapEntry->IsNonRaidDungeon(); +} + +bool Map::IsRaid() const +{ + return i_mapEntry && i_mapEntry->IsRaid(); +} + +bool Map::IsRaidOrHeroicDungeon() const +{ + return IsRaid() || IsHeroic(); +} + bool Map::IsHeroic() const { if (DifficultyEntry const* difficulty = sDifficultyStore.LookupEntry(i_spawnMode)) @@ -3435,6 +3465,38 @@ bool Map::IsHeroic() const return false; } +bool Map::Is25ManRaid() const +{ + return IsRaid() && (i_spawnMode == DIFFICULTY_25_N || i_spawnMode == DIFFICULTY_25_HC); +} + +bool Map::IsBattleground() const +{ + return i_mapEntry && i_mapEntry->IsBattleground(); +} + +bool Map::IsBattleArena() const +{ + return i_mapEntry && i_mapEntry->IsBattleArena(); +} + +bool Map::IsBattlegroundOrArena() const +{ + return i_mapEntry && i_mapEntry->IsBattlegroundOrArena(); +} + +bool Map::IsGarrison() const +{ + return i_mapEntry && i_mapEntry->IsGarrison(); +} + +bool Map::GetEntrancePos(int32 &mapid, float &x, float &y) +{ + if (!i_mapEntry) + return false; + return i_mapEntry->GetEntrancePos(mapid, x, y); +} + bool InstanceMap::HasPermBoundPlayers() const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE); @@ -3454,7 +3516,7 @@ uint32 InstanceMap::GetMaxPlayers() const uint32 InstanceMap::GetMaxResetDelay() const { MapDifficultyEntry const* mapDiff = GetMapDifficulty(); - return mapDiff ? mapDiff->RaidDuration : 0; + return mapDiff ? mapDiff->GetRaidDuration() : 0; } /* ******* Battleground Instance Maps ******* */ diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 7d73d9b6625..89edf9823b7 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -21,8 +21,6 @@ #include "Define.h" -#include "DBCStructure.h" -#include "DB2Structure.h" #include "GridDefines.h" #include "Cell.h" #include "Timer.h" @@ -37,24 +35,28 @@ #include #include -class Unit; -class WorldPacket; -class InstanceScript; +class Battleground; +class BattlegroundMap; +class CreatureGroup; class Group; +class InstanceMap; class InstanceSave; +class InstanceScript; +class MapInstanced; class Object; -class WorldObject; -class TempSummon; class Player; -class CreatureGroup; -struct ScriptInfo; -struct ScriptAction; +class TempSummon; +class Unit; +class WorldObject; +class WorldPacket; +struct MapDifficultyEntry; +struct MapEntry; struct Position; -class Battleground; -class MapInstanced; -class BattlegroundMap; -class InstanceMap; +struct ScriptAction; +struct ScriptInfo; +struct SummonPropertiesEntry; class Transport; +enum Difficulty : uint8; enum WeatherState : uint32; namespace Trinity { struct ObjectUpdater; } @@ -323,8 +325,7 @@ class TC_GAME_API Map : public GridRefManager grid.ResetTimeTracker(time_t(float(i_gridExpiry)*factor)); } - time_t GetGridExpiry(void) const { return i_gridExpiry; } - uint32 GetId(void) const { return i_mapEntry->ID; } + time_t GetGridExpiry() const { return i_gridExpiry; } static bool ExistMap(uint32 mapid, int gx, int gy); static bool ExistVMap(uint32 mapid, int gx, int gy); @@ -393,23 +394,19 @@ class TC_GAME_API Map : public GridRefManager MapDifficultyEntry const* GetMapDifficulty() const; uint32 GetDifficultyLootBonusTreeMod() const; - bool Instanceable() const { return i_mapEntry && i_mapEntry->Instanceable(); } - bool IsDungeon() const { return i_mapEntry && i_mapEntry->IsDungeon(); } - bool IsNonRaidDungeon() const { return i_mapEntry && i_mapEntry->IsNonRaidDungeon(); } - bool IsRaid() const { return i_mapEntry && i_mapEntry->IsRaid(); } - bool IsRaidOrHeroicDungeon() const { return IsRaid() || IsHeroic(); } + uint32 GetId() const; + bool Instanceable() const; + bool IsDungeon() const; + bool IsNonRaidDungeon() const; + bool IsRaid() const; + bool IsRaidOrHeroicDungeon() const; bool IsHeroic() const; - bool Is25ManRaid() const { return IsRaid() && (i_spawnMode == DIFFICULTY_25_N || i_spawnMode == DIFFICULTY_25_HC); } // since 25man difficulties are 1 and 3, we can check them like that - bool IsBattleground() const { return i_mapEntry && i_mapEntry->IsBattleground(); } - bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); } - bool IsBattlegroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattlegroundOrArena(); } - bool IsGarrison() const { return i_mapEntry && i_mapEntry->IsGarrison(); } - bool GetEntrancePos(int32 &mapid, float &x, float &y) - { - if (!i_mapEntry) - return false; - return i_mapEntry->GetEntrancePos(mapid, x, y); - } + bool Is25ManRaid() const; // since 25man difficulties are 1 and 3, we can check them like that + bool IsBattleground() const; + bool IsBattleArena() const; + bool IsBattlegroundOrArena() const; + bool IsGarrison() const; + bool GetEntrancePos(int32 &mapid, float &x, float &y); void AddObjectToRemoveList(WorldObject* obj); void AddObjectToSwitchList(WorldObject* obj, bool on); diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 12cec6d8633..f80c04d7c8c 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -225,7 +225,7 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save, } // some instances only have one difficulty - GetDownscaledMapDifficultyData(GetId(), difficulty); + sDB2Manager.GetDownscaledMapDifficultyData(GetId(), difficulty); TC_LOG_DEBUG("maps", "MapInstanced::CreateInstance: %s map instance %d for %d created with difficulty %s", save ? "" : "new ", InstanceId, GetId(), difficulty ? "heroic" : "normal"); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 5a31bb822b4..d85d198fe9c 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -140,7 +140,7 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool Difficulty targetDifficulty, requestedDifficulty; targetDifficulty = requestedDifficulty = player->GetDifficultyID(entry); // Get the highest available difficulty if current setting is higher than the instance allows - MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(entry->ID, targetDifficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, targetDifficulty); if (!mapDiff) return Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE; diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index d058c0bb111..625f78b53bd 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -20,7 +20,6 @@ #include #include "Spline.h" -#include "DBCStores.h" #include "DB2Stores.h" #include "ObjectGuid.h" diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 94aa48168da..41d0e4b8a15 100644 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -23,9 +23,28 @@ #include "SharedDefines.h" #include "ScriptMgr.h" #include "Player.h" +#include "GameTables.h" namespace Trinity { + inline uint32 GetExpansionForLevel(uint32 level) + { + if (level < 60) + return EXPANSION_CLASSIC; + else if (level < 70) + return EXPANSION_THE_BURNING_CRUSADE; + else if (level < 80) + return EXPANSION_WRATH_OF_THE_LICH_KING; + else if (level < 85) + return EXPANSION_CATACLYSM; + else if (level < 90) + return EXPANSION_MISTS_OF_PANDARIA; + else if (level < 100) + return EXPANSION_WARLORDS_OF_DRAENOR; + else + return CURRENT_EXPANSION; + } + namespace Honor { inline float hk_honor_at_level_f(uint8 level, float multiplier = 1.0f) @@ -120,11 +139,8 @@ namespace Trinity { uint32 baseGain; - GtOCTLevelExperienceEntry const* BaseExpPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 1); - GtOCTLevelExperienceEntry const* BaseExpMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 1); - - GtOCTLevelExperienceEntry const* CoefPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 4); - GtOCTLevelExperienceEntry const* CoefMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 4); + GtXpEntry const* xpPlayer = sXpGameTable.GetRow(pl_level); + GtXpEntry const* xpMob = sXpGameTable.GetRow(mob_level); if (mob_level >= pl_level) { @@ -132,7 +148,7 @@ namespace Trinity if (nLevelDiff > 4) nLevelDiff = 4; - baseGain = uint32(round(BaseExpPlayer->Data * (1 + 0.05f * nLevelDiff))); + baseGain = uint32(round(xpPlayer->PerKill * (1 + 0.05f * nLevelDiff))); } else { @@ -140,7 +156,7 @@ namespace Trinity if (mob_level > gray_level) { uint8 ZD = GetZeroDifference(pl_level); - baseGain = uint32(round(BaseExpMob->Data * ((1 - ((pl_level - mob_level) / float(ZD))) * (CoefMob->Data / CoefPlayer->Data)))); + baseGain = uint32(round(xpMob->PerKill * ((1 - ((pl_level - mob_level) / float(ZD))) * (xpMob->Divisor / xpPlayer->Divisor)))); } else baseGain = 0; diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index ceecf1a9b85..46ceb14df3d 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -19,7 +19,6 @@ #include "DatabaseEnv.h" #include "ReputationMgr.h" #include "ReputationPackets.h" -#include "DBCStores.h" #include "Player.h" #include "WorldPacket.h" #include "World.h" @@ -235,11 +234,9 @@ void ReputationMgr::Initialize() _exaltedFactionCount = 0; _sendFactionIncreased = false; - for (unsigned int i = 1; i < sFactionStore.GetNumRows(); i++) + for (FactionEntry const* factionEntry : sFactionStore) { - FactionEntry const* factionEntry = sFactionStore.LookupEntry(i); - - if (factionEntry && factionEntry->CanHaveReputation()) + if (factionEntry->CanHaveReputation()) { FactionState newFaction; newFaction.ID = factionEntry->ID; @@ -283,7 +280,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi { float spillOverRepOut = float(standing); // check for sub-factions that receive spillover - std::vector const* flist = GetFactionTeamList(factionEntry->ID); + std::vector const* flist = sDB2Manager.GetFactionTeamList(factionEntry->ID); // if has no sub-factions, check for factions with same parent if (!flist && factionEntry->ParentFactionID && factionEntry->ParentFactionModOut != 0.0f) { @@ -298,7 +295,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi } else // spill to "sister" factions { - flist = GetFactionTeamList(factionEntry->ParentFactionID); + flist = sDB2Manager.GetFactionTeamList(factionEntry->ParentFactionID); } } } diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index f2a5f3ba1f3..3486a533d54 100644 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -22,7 +22,6 @@ #include "Common.h" #include "SharedDefines.h" #include "Language.h" -#include "DBCStructure.h" #include "QueryResult.h" #include diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 5d3297b009d..70f0e717e7c 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -20,7 +20,6 @@ #include "ScriptReloadMgr.h" #include "Config.h" #include "DatabaseEnv.h" -#include "DBCStores.h" #include "ObjectMgr.h" #include "OutdoorPvPMgr.h" #include "ScriptSystem.h" diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index c3deab43ee6..17583bd9b5e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -21,7 +21,6 @@ #include "Common.h" #include -#include "DBCStores.h" #include "QuestDef.h" #include "SharedDefines.h" #include "World.h" @@ -62,10 +61,12 @@ class WorldSocket; class WorldObject; class WorldSession; +struct AreaTriggerEntry; struct AuctionEntry; struct ConditionSourceInfo; struct Condition; struct ItemTemplate; +struct MapEntry; struct OutdoorPvPData; #define VISIBLE_RANGE 166.0f //MAX visible range (size of grid) diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index dfa4bbb3bfa..a12818f2281 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -434,16 +434,6 @@ WorldPacket const* WorldPackets::Character::PlayedTime::Write() return &_worldPacket; } -void WorldPackets::Character::ShowingCloak::Read() -{ - ShowCloak = _worldPacket.ReadBit(); -} - -void WorldPackets::Character::ShowingHelm::Read() -{ - ShowHelm = _worldPacket.ReadBit(); -} - void WorldPackets::Character::SetTitle::Read() { _worldPacket >> TitleID; diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 6edf7bc097c..be4f1153ab2 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -570,26 +570,6 @@ namespace WorldPackets bool TriggerEvent = false; }; - class ShowingCloak final : public ClientPacket - { - public: - ShowingCloak(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_CLOAK, std::move(packet)) { } - - void Read() override; - - bool ShowCloak = false; - }; - - class ShowingHelm final : public ClientPacket - { - public: - ShowingHelm(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_HELM, std::move(packet)) { } - - void Read() override; - - bool ShowHelm = false; - }; - class SetTitle final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index a5ce42d7488..2b92ab1311f 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -22,7 +22,8 @@ #include "ObjectGuid.h" #include "Position.h" #include "PacketUtilities.h" -#include "DB2Structure.h" + +struct GarrAbilityEntry; namespace WorldPackets { diff --git a/src/server/game/Server/Packets/TaxiPackets.h b/src/server/game/Server/Packets/TaxiPackets.h index c4d4cac3046..0f5bd82d079 100644 --- a/src/server/game/Server/Packets/TaxiPackets.h +++ b/src/server/game/Server/Packets/TaxiPackets.h @@ -20,7 +20,6 @@ #include "Packet.h" #include "ObjectGuid.h" -#include "DB2Structure.h" namespace WorldPackets { diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 900092c126b..23f6a576876 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -710,8 +710,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode); DEFINE_HANDLER(CMSG_SET_USING_PARTY_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetWatchedFaction, &WorldSession::HandleSetWatchedFactionOpcode); - DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode); - DEFINE_HANDLER(CMSG_SHOWING_HELM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingHelm, &WorldSession::HandleShowingHelmOpcode); DEFINE_HANDLER(CMSG_SHOW_TRADE_SKILL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SIGN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::SignPetition, &WorldSession::HandleSignPetition); DEFINE_HANDLER(CMSG_SILENCE_PARTY_TALKER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 715799294de..01d5134a472 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -49,77 +49,80 @@ enum OpcodeClient : uint32 CMSG_ACCEPT_LEVEL_GRANT = 0x34E8, CMSG_ACCEPT_TRADE = 0x315A, CMSG_ACCEPT_WARGAME_INVITE = 0x35DF, - CMSG_ACTIVATE_TAXI = 0x34A4, - CMSG_ADD_BATTLENET_FRIEND = 0x365F, - CMSG_ADD_FRIEND = 0x36D4, - CMSG_ADD_IGNORE = 0x36D8, + CMSG_ACTIVATE_TAXI = 0x34A6, CMSG_ADDON_LIST = 0x35D7, - CMSG_ADD_TOY = 0x3270, + CMSG_ADD_BATTLENET_FRIEND = 0x365F, + CMSG_ADD_FRIEND = 0x36D5, + CMSG_ADD_IGNORE = 0x36D9, + CMSG_ADD_TOY = 0x3274, CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31EA, - CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x3308, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x331B, CMSG_ALTER_APPEARANCE = 0x34E4, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34A9, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34AA, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34AB, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34AC, CMSG_AREA_TRIGGER = 0x31C1, CMSG_ARTIFACT_ADD_POWER = 0x31A5, - CMSG_ARTIFACT_REMOVE_ALL_POWERS = 0x31A6, CMSG_ARTIFACT_SET_APPEARANCE = 0x31A7, - CMSG_ATTACK_STOP = 0x3237, - CMSG_ATTACK_SWING = 0x3236, - CMSG_AUCTION_HELLO_REQUEST = 0x34B9, - CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34BF, - CMSG_AUCTION_LIST_ITEMS = 0x34BC, - CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34BE, - CMSG_AUCTION_LIST_PENDING_SALES = 0x34C1, - CMSG_AUCTION_PLACE_BID = 0x34C0, - CMSG_AUCTION_REMOVE_ITEM = 0x34BB, - CMSG_AUCTION_REPLICATE_ITEMS = 0x34BD, - CMSG_AUCTION_SELL_ITEM = 0x34BA, + CMSG_ATTACK_STOP = 0x323A, + CMSG_ATTACK_SWING = 0x3239, + CMSG_AUCTION_HELLO_REQUEST = 0x34BB, + CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34C1, + CMSG_AUCTION_LIST_ITEMS = 0x34BE, + CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34C0, + CMSG_AUCTION_LIST_PENDING_SALES = 0x34C3, + CMSG_AUCTION_PLACE_BID = 0x34C2, + CMSG_AUCTION_REMOVE_ITEM = 0x34BD, + CMSG_AUCTION_REPLICATE_ITEMS = 0x34BF, + CMSG_AUCTION_SELL_ITEM = 0x34BC, CMSG_AUTH_CONTINUED_SESSION = 0x3766, CMSG_AUTH_SESSION = 0x3765, - CMSG_AUTOBANK_ITEM = 0x3997, - CMSG_AUTOBANK_REAGENT = 0x3999, - CMSG_AUTOSTORE_BANK_ITEM = 0x3996, - CMSG_AUTOSTORE_BANK_REAGENT = 0x3998, + CMSG_AUTOBANK_ITEM = 0x3996, + CMSG_AUTOBANK_REAGENT = 0x3998, + CMSG_AUTOSTORE_BANK_ITEM = 0x3997, + CMSG_AUTOSTORE_BANK_REAGENT = 0x3999, CMSG_AUTO_EQUIP_ITEM = 0x399A, CMSG_AUTO_EQUIP_ITEM_SLOT = 0x399F, CMSG_AUTO_STORE_BAG_ITEM = 0x399B, - CMSG_BANKER_ACTIVATE = 0x34AC, + CMSG_BANKER_ACTIVATE = 0x34AE, CMSG_BATTLEFIELD_LEAVE = 0x3171, CMSG_BATTLEFIELD_LIST = 0x317C, - CMSG_BATTLEFIELD_PORT = 0x350E, - CMSG_BATTLEMASTER_HELLO = 0x3285, - CMSG_BATTLEMASTER_JOIN = 0x350B, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x350C, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x350D, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D7, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CE, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CD, + CMSG_BATTLEFIELD_PORT = 0x3512, + CMSG_BATTLEMASTER_HELLO = 0x3289, + CMSG_BATTLEMASTER_JOIN = 0x350F, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3510, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3511, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D8, + CMSG_BATTLENET_REQUEST = 0x36FC, + CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FD, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CF, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CE, CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C7, CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36C2, CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36C3, - CMSG_BATTLE_PAY_START_PURCHASE = 0x36CC, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F8, - CMSG_BATTLE_PET_DELETE_PET = 0x3625, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3626, - CMSG_BATTLE_PET_MODIFY_NAME = 0x3628, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3624, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3623, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362C, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36F8, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F9, + CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C8, + CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, + CMSG_BATTLE_PET_DELETE_PET = 0x3624, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3625, + CMSG_BATTLE_PET_MODIFY_NAME = 0x3627, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3623, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3622, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362B, CMSG_BATTLE_PET_SET_FLAGS = 0x362F, - CMSG_BATTLE_PET_SUMMON = 0x3629, + CMSG_BATTLE_PET_SUMMON = 0x3628, CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31CA, CMSG_BEGIN_TRADE = 0x3157, - CMSG_BINDER_ACTIVATE = 0x34AB, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3515, - CMSG_BLACK_MARKET_OPEN = 0x3513, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3514, + CMSG_BINDER_ACTIVATE = 0x34AD, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3519, + CMSG_BLACK_MARKET_OPEN = 0x3517, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3518, CMSG_BUG_REPORT = 0x368C, CMSG_BUSY_TRADE = 0x3158, - CMSG_BUY_BACK_ITEM = 0x349D, - CMSG_BUY_BANK_SLOT = 0x34AD, - CMSG_BUY_ITEM = 0x349C, - CMSG_BUY_REAGENT_BANK = 0x34AE, + CMSG_BUY_BACK_ITEM = 0x349F, + CMSG_BUY_BANK_SLOT = 0x34AF, + CMSG_BUY_ITEM = 0x349E, + CMSG_BUY_REAGENT_BANK = 0x34B0, CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1, CMSG_BUY_WOW_TOKEN_START = 0x36F0, CMSG_CAGE_BATTLE_PET = 0x31DA, @@ -139,22 +142,22 @@ enum OpcodeClient : uint32 CMSG_CALENDAR_REMOVE_INVITE = 0x3679, CMSG_CALENDAR_UPDATE_EVENT = 0x3684, CMSG_CANCEL_AURA = 0x31A9, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D4, - CMSG_CANCEL_CAST = 0x3275, - CMSG_CANCEL_CHANNELLING = 0x3244, - CMSG_CANCEL_GROWTH_AURA = 0x3249, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F6, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D6, + CMSG_CANCEL_CAST = 0x3279, + CMSG_CANCEL_CHANNELLING = 0x3247, + CMSG_CANCEL_GROWTH_AURA = 0x324C, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F8, CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31A8, - CMSG_CANCEL_MOUNT_AURA = 0x3259, + CMSG_CANCEL_MOUNT_AURA = 0x325D, CMSG_CANCEL_QUEUED_SPELL = 0x317D, CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34E1, CMSG_CANCEL_TRADE = 0x315C, CMSG_CAN_DUEL = 0x3668, - CMSG_CAST_SPELL = 0x3273, + CMSG_CAST_SPELL = 0x3277, CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x32EE, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32D0, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x32FD, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32DD, CMSG_CHANGE_SUB_GROUP = 0x364D, CMSG_CHARACTER_RENAME_REQUEST = 0x36C5, CMSG_CHAR_CUSTOMIZE = 0x3694, @@ -208,13 +211,13 @@ enum OpcodeClient : uint32 CMSG_CHAT_REPORT_FILTERED = 0x37CC, CMSG_CHAT_REPORT_IGNORED = 0x37CB, CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36CF, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36D0, CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EF, - CMSG_CHOICE_RESPONSE = 0x3277, + CMSG_CHOICE_RESPONSE = 0x327B, CMSG_CLEAR_RAID_MARKER = 0x319F, CMSG_CLEAR_TRADE_ITEM = 0x315E, - CMSG_CLIENT_PORT_GRAVEYARD = 0x3510, - CMSG_CLOSE_INTERACTION = 0x348A, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3514, + CMSG_CLOSE_INTERACTION = 0x348B, CMSG_COMMENTATOR_ENABLE = 0x35EF, CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F2, CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F3, @@ -222,95 +225,99 @@ enum OpcodeClient : uint32 CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F1, CMSG_COMMENTATOR_START_WARGAME = 0x35EE, CMSG_COMPLAINT = 0x3672, - CMSG_COMPLETE_CINEMATIC = 0x352D, - CMSG_COMPLETE_MOVIE = 0x34CB, - CMSG_CONFIRM_RESPEC_WIPE = 0x31F0, + CMSG_COMPLETE_CINEMATIC = 0x3531, + CMSG_COMPLETE_MOVIE = 0x34CD, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A6, + CMSG_CONFIRM_RESPEC_WIPE = 0x31F2, CMSG_CONNECT_TO_FAILED = 0x35D4, CMSG_CONVERT_RAID = 0x364F, CMSG_CREATE_CHARACTER = 0x3644, - CMSG_CREATE_SHIPMENT = 0x32BF, + CMSG_CREATE_SHIPMENT = 0x32C9, CMSG_DB_QUERY_BULK = 0x35E5, - CMSG_DECLINE_GUILD_INVITES = 0x3509, - CMSG_DECLINE_PETITION = 0x351C, - CMSG_DELETE_EQUIPMENT_SET = 0x34FA, - CMSG_DEL_FRIEND = 0x36D5, - CMSG_DEL_IGNORE = 0x36D9, - CMSG_DEPOSIT_REAGENT_BANK = 0x32F7, - CMSG_DESTROY_ITEM = 0x326A, - CMSG_DF_BOOT_PLAYER_VOTE = 0x3616, - CMSG_DF_GET_JOIN_STATUS = 0x3614, - CMSG_DF_GET_SYSTEM_INFO = 0x3613, - CMSG_DF_JOIN = 0x3607, - CMSG_DF_LEAVE = 0x3612, - CMSG_DF_PROPOSAL_RESPONSE = 0x3606, - CMSG_DF_READY_CHECK_RESPONSE = 0x3619, - CMSG_DF_SET_ROLES = 0x3615, - CMSG_DF_TELEPORT = 0x3617, + CMSG_DECLINE_GUILD_INVITES = 0x350D, + CMSG_DECLINE_PETITION = 0x3520, + CMSG_DELETE_EQUIPMENT_SET = 0x34FB, + CMSG_DEL_FRIEND = 0x36D6, + CMSG_DEL_IGNORE = 0x36DA, + CMSG_DEPOSIT_REAGENT_BANK = 0x3306, + CMSG_DESTROY_ITEM = 0x326E, + CMSG_DF_BOOT_PLAYER_VOTE = 0x3615, + CMSG_DF_GET_JOIN_STATUS = 0x3613, + CMSG_DF_GET_SYSTEM_INFO = 0x3612, + CMSG_DF_JOIN = 0x3606, + CMSG_DF_LEAVE = 0x3611, + CMSG_DF_PROPOSAL_RESPONSE = 0x3605, + CMSG_DF_READY_CHECK_RESPONSE = 0x3618, + CMSG_DF_SET_ROLES = 0x3614, + CMSG_DF_TELEPORT = 0x3616, CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3C, CMSG_DISMISS_CRITTER = 0x34EA, - CMSG_DO_MASTER_LOOT_ROLL = 0x31F5, + CMSG_DO_MASTER_LOOT_ROLL = 0x31F7, CMSG_DO_READY_CHECK = 0x3634, - CMSG_DUEL_RESPONSE = 0x34D0, - CMSG_EJECT_PASSENGER = 0x321D, - CMSG_EMOTE = 0x3529, + CMSG_DUEL_RESPONSE = 0x34D2, + CMSG_EJECT_PASSENGER = 0x3220, + CMSG_EMOTE = 0x352D, CMSG_ENABLE_NAGLE = 0x376A, - CMSG_ENABLE_TAXI_NODE = 0x34A2, + CMSG_ENABLE_TAXI_NODE = 0x34A4, CMSG_ENGINE_SURVEY = 0x36E9, CMSG_ENUM_CHARACTERS = 0x35E7, CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3, - CMSG_FAR_SIGHT = 0x34D5, + CMSG_FAR_SIGHT = 0x34D7, CMSG_GAME_OBJ_REPORT_USE = 0x34DE, CMSG_GAME_OBJ_USE = 0x34DD, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B0, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A2, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32EA, - CMSG_GARRISON_COMPLETE_MISSION = 0x32DD, - CMSG_GARRISON_GENERATE_RECRUITS = 0x32B3, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32BB, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32DF, - CMSG_GARRISON_PURCHASE_BUILDING = 0x329E, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32B5, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x32D4, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B1, - CMSG_GARRISON_RENAME_FOLLOWER = 0x32B2, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x329D, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32BE, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32BD, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x329F, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32AF, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AB, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B4, - CMSG_GARRISON_START_MISSION = 0x32DC, - CMSG_GARRISON_SWAP_BUILDINGS = 0x32A3, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B5, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A6, + CMSG_GARRISON_CHANGE_ZONE_SUPPORT_SPELL_FOR_FOLLOWER = 0x32B4, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32F9, + CMSG_GARRISON_COMPLETE_MISSION = 0x32EA, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32B8, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32C5, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32EC, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32A2, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32BA, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x32E1, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B6, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32B7, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32A1, + CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32BE, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32C8, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32C7, + CMSG_GARRISON_RESEARCH_TALENT = 0x32BB, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32A3, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32B3, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AF, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B9, + CMSG_GARRISON_START_MISSION = 0x32E9, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32A7, CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E6, CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3091, - CMSG_GET_GARRISON_INFO = 0x3298, - CMSG_GET_ITEM_PURCHASE_DATA = 0x3517, - CMSG_GET_MIRROR_IMAGE_DATA = 0x326E, + CMSG_GET_GARRISON_INFO = 0x329C, + CMSG_GET_ITEM_PURCHASE_DATA = 0x351B, + CMSG_GET_MIRROR_IMAGE_DATA = 0x3272, CMSG_GET_PVP_OPTIONS_ENABLED = 0x35ED, CMSG_GET_REMAINING_GAME_TIME = 0x36F2, - CMSG_GET_TROPHY_LIST = 0x32CD, + CMSG_GET_TROPHY_LIST = 0x32DA, CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E5, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3698, CMSG_GM_TICKET_GET_CASE_STATUS = 0x3697, CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3696, - CMSG_GOSSIP_SELECT_OPTION = 0x348B, + CMSG_GOSSIP_SELECT_OPTION = 0x348C, CMSG_GRANT_LEVEL = 0x34E6, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D, CMSG_GUILD_ADD_RANK = 0x3064, CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x305F, CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x3061, - CMSG_GUILD_BANK_ACTIVATE = 0x34AF, - CMSG_GUILD_BANK_BUY_TAB = 0x34B2, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34B4, + CMSG_GUILD_BANK_ACTIVATE = 0x34B1, + CMSG_GUILD_BANK_BUY_TAB = 0x34B4, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34B6, CMSG_GUILD_BANK_LOG_QUERY = 0x3082, - CMSG_GUILD_BANK_QUERY_TAB = 0x34B1, + CMSG_GUILD_BANK_QUERY_TAB = 0x34B3, CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3083, CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3086, - CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B0, + CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B2, CMSG_GUILD_BANK_TEXT_QUERY = 0x3087, - CMSG_GUILD_BANK_UPDATE_TAB = 0x34B3, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34B5, + CMSG_GUILD_BANK_UPDATE_TAB = 0x34B5, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34B7, CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307B, CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307E, CMSG_GUILD_DECLINE_INVITATION = 0x3060, @@ -321,7 +328,7 @@ enum OpcodeClient : uint32 CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x3071, CMSG_GUILD_GET_RANKS = 0x306D, CMSG_GUILD_GET_ROSTER = 0x3073, - CMSG_GUILD_INVITE_BY_NAME = 0x3605, + CMSG_GUILD_INVITE_BY_NAME = 0x3604, CMSG_GUILD_LEAVE = 0x3062, CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x308C, CMSG_GUILD_NEWS_UPDATE_STICKY = 0x306E, @@ -335,77 +342,78 @@ enum OpcodeClient : uint32 CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3088, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x306F, CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3070, - CMSG_GUILD_SET_GUILD_MASTER = 0x36C9, + CMSG_GUILD_SET_GUILD_MASTER = 0x36CA, CMSG_GUILD_SET_MEMBER_NOTE = 0x3072, CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3067, CMSG_GUILD_SHIFT_RANK = 0x3066, CMSG_GUILD_UPDATE_INFO_TEXT = 0x3075, CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3074, - CMSG_HEARTH_AND_RESURRECT = 0x34F6, + CMSG_HEARTH_AND_RESURRECT = 0x34F7, CMSG_IGNORE_TRADE = 0x3159, CMSG_INITIATE_ROLE_POLL = 0x35D9, CMSG_INITIATE_TRADE = 0x3156, - CMSG_INSPECT = 0x3512, + CMSG_INSPECT = 0x3516, CMSG_INSPECT_PVP = 0x36A7, - CMSG_INSTANCE_LOCK_RESPONSE = 0x34FB, - CMSG_ITEM_PURCHASE_REFUND = 0x3518, - CMSG_ITEM_TEXT_QUERY = 0x32EB, + CMSG_INSTANCE_LOCK_RESPONSE = 0x34FC, + CMSG_ITEM_PURCHASE_REFUND = 0x351C, + CMSG_ITEM_TEXT_QUERY = 0x32FA, CMSG_JOIN_PET_BATTLE_QUEUE = 0x31C8, CMSG_JOIN_RATED_BATTLEGROUND = 0x3175, CMSG_KEEP_ALIVE = 0x3685, - CMSG_KEYBOUND_OVERRIDE = 0x3207, + CMSG_KEYBOUND_OVERRIDE = 0x3209, CMSG_LEARN_PVP_TALENTS = 0x31A4, CMSG_LEARN_TALENTS = 0x31A3, CMSG_LEAVE_GROUP = 0x364A, CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31C9, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360D, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360E, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360F, - CMSG_LFG_LIST_GET_STATUS = 0x360B, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x3610, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x3611, - CMSG_LFG_LIST_JOIN = 0x3608, - CMSG_LFG_LIST_LEAVE = 0x360A, - CMSG_LFG_LIST_SEARCH = 0x360C, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x3609, - CMSG_LF_GUILD_ADD_RECRUIT = 0x361C, - CMSG_LF_GUILD_BROWSE = 0x361E, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360C, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360D, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360E, + CMSG_LFG_LIST_GET_STATUS = 0x360A, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x360F, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x3610, + CMSG_LFG_LIST_JOIN = 0x3607, + CMSG_LFG_LIST_LEAVE = 0x3609, + CMSG_LFG_LIST_SEARCH = 0x360B, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x3608, + CMSG_LF_GUILD_ADD_RECRUIT = 0x361B, + CMSG_LF_GUILD_BROWSE = 0x361D, CMSG_LF_GUILD_DECLINE_RECRUIT = 0x3078, CMSG_LF_GUILD_GET_APPLICATIONS = 0x3079, CMSG_LF_GUILD_GET_GUILD_POST = 0x3076, CMSG_LF_GUILD_GET_RECRUITS = 0x3077, CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307A, - CMSG_LF_GUILD_SET_GUILD_POST = 0x361D, - CMSG_LIST_INVENTORY = 0x349A, + CMSG_LF_GUILD_SET_GUILD_POST = 0x361C, + CMSG_LIST_INVENTORY = 0x349C, CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36C1, CMSG_LIVE_REGION_CHARACTER_COPY = 0x36C0, CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BF, CMSG_LOADING_SCREEN_NOTIFY = 0x35F6, - CMSG_LOAD_SELECTED_TROPHY = 0x32CE, - CMSG_LOGOUT_CANCEL = 0x34C6, - CMSG_LOGOUT_INSTANT = 0x34C7, - CMSG_LOGOUT_REQUEST = 0x34C5, + CMSG_LOAD_SELECTED_TROPHY = 0x32DB, + CMSG_LOGOUT_CANCEL = 0x34C8, + CMSG_LOGOUT_INSTANT = 0x34C9, + CMSG_LOGOUT_REQUEST = 0x34C7, CMSG_LOG_DISCONNECT = 0x3768, CMSG_LOG_STREAMING_ERROR = 0x376C, - CMSG_LOOT_ITEM = 0x31F3, - CMSG_LOOT_MONEY = 0x31F2, - CMSG_LOOT_RELEASE = 0x31F7, - CMSG_LOOT_ROLL = 0x31F8, - CMSG_LOOT_UNIT = 0x31F1, + CMSG_LOOT_ITEM = 0x31F5, + CMSG_LOOT_MONEY = 0x31F4, + CMSG_LOOT_RELEASE = 0x31F9, + CMSG_LOOT_ROLL = 0x31FA, + CMSG_LOOT_UNIT = 0x31F3, CMSG_LOW_LEVEL_RAID1 = 0x36A5, - CMSG_LOW_LEVEL_RAID2 = 0x3501, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x3523, - CMSG_MAIL_DELETE = 0x3209, - CMSG_MAIL_GET_LIST = 0x351E, - CMSG_MAIL_MARK_AS_READ = 0x3522, + CMSG_LOW_LEVEL_RAID2 = 0x3502, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x3527, + CMSG_MAIL_DELETE = 0x320B, + CMSG_MAIL_GET_LIST = 0x3522, + CMSG_MAIL_MARK_AS_READ = 0x3526, CMSG_MAIL_RETURN_TO_SENDER = 0x3659, - CMSG_MAIL_TAKE_ITEM = 0x3520, - CMSG_MAIL_TAKE_MONEY = 0x351F, - CMSG_MASTER_LOOT_ITEM = 0x31F4, + CMSG_MAIL_TAKE_ITEM = 0x3524, + CMSG_MAIL_TAKE_MONEY = 0x3523, + CMSG_MASTER_LOOT_ITEM = 0x31F6, CMSG_MINIMAP_PING = 0x364C, CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3188, + CMSG_MOUNT_CLEAR_FANFARE = 0x312D, CMSG_MOUNT_SET_FAVORITE = 0x3631, - CMSG_MOUNT_SPECIAL_ANIM = 0x325A, + CMSG_MOUNT_SPECIAL_ANIM = 0x325E, CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A12, CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2C, CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31, @@ -469,28 +477,28 @@ enum OpcodeClient : uint32 CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A05, CMSG_MOVE_WATER_WALK_ACK = 0x3A1A, CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31BE, - CMSG_NEXT_CINEMATIC_CAMERA = 0x352C, + CMSG_NEXT_CINEMATIC_CAMERA = 0x3530, CMSG_OBJECT_UPDATE_FAILED = 0x317E, CMSG_OBJECT_UPDATE_RESCUED = 0x317F, CMSG_OFFER_PETITION = 0x36B6, - CMSG_OPENING_CINEMATIC = 0x352B, - CMSG_OPEN_ITEM = 0x32EC, - CMSG_OPEN_MISSION_NPC = 0x32B7, - CMSG_OPEN_SHIPMENT_NPC = 0x32BC, - CMSG_OPEN_TRADESKILL_NPC = 0x32C4, + CMSG_OPENING_CINEMATIC = 0x352F, + CMSG_OPEN_ITEM = 0x32FB, + CMSG_OPEN_MISSION_NPC = 0x32C0, + CMSG_OPEN_SHIPMENT_NPC = 0x32C6, + CMSG_OPEN_TRADESKILL_NPC = 0x32D1, CMSG_OPT_OUT_OF_LOOT = 0x34E5, CMSG_PARTY_INVITE = 0x3600, CMSG_PARTY_INVITE_RESPONSE = 0x3601, CMSG_PARTY_UNINVITE = 0x3648, - CMSG_PETITION_BUY = 0x34B7, - CMSG_PETITION_RENAME_GUILD = 0x36CA, - CMSG_PETITION_SHOW_LIST = 0x34B6, - CMSG_PETITION_SHOW_SIGNATURES = 0x34B8, - CMSG_PET_ABANDON = 0x3484, - CMSG_PET_ACTION = 0x3482, + CMSG_PETITION_BUY = 0x34B9, + CMSG_PETITION_RENAME_GUILD = 0x36CB, + CMSG_PETITION_SHOW_LIST = 0x34B8, + CMSG_PETITION_SHOW_SIGNATURES = 0x34BA, + CMSG_PET_ABANDON = 0x3485, + CMSG_PET_ACTION = 0x3483, CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31CC, CMSG_PET_BATTLE_INPUT = 0x3641, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3208, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x320A, CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31CB, CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3642, CMSG_PET_BATTLE_REQUEST_PVP = 0x31C6, @@ -498,163 +506,163 @@ enum OpcodeClient : uint32 CMSG_PET_BATTLE_REQUEST_WILD = 0x31C4, CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31CD, CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31C5, - CMSG_PET_CANCEL_AURA = 0x3485, - CMSG_PET_CAST_SPELL = 0x3272, + CMSG_PET_CANCEL_AURA = 0x3486, + CMSG_PET_CAST_SPELL = 0x3276, CMSG_PET_RENAME = 0x368B, - CMSG_PET_SET_ACTION = 0x3481, - CMSG_PET_SPELL_AUTOCAST = 0x3486, - CMSG_PET_STOP_ATTACK = 0x3483, + CMSG_PET_SET_ACTION = 0x3482, + CMSG_PET_SPELL_AUTOCAST = 0x3487, + CMSG_PET_STOP_ATTACK = 0x3484, CMSG_PING = 0x3767, CMSG_PLAYER_LOGIN = 0x35E9, CMSG_PROTOCOL_MISMATCH = 0x376D, - CMSG_PUSH_QUEST_TO_PARTY = 0x3498, + CMSG_PUSH_QUEST_TO_PARTY = 0x349A, CMSG_PVP_LOG_DATA = 0x3179, - CMSG_PVP_PRESTIGE_RANK_UP = 0x330C, - CMSG_QUERY_BATTLE_PET_NAME = 0x3250, + CMSG_PVP_PRESTIGE_RANK_UP = 0x331F, + CMSG_QUERY_BATTLE_PET_NAME = 0x3253, CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3666, CMSG_QUERY_CORPSE_TRANSPORT = 0x3667, CMSG_QUERY_COUNTDOWN_TIMER = 0x31A2, - CMSG_QUERY_CREATURE = 0x324A, - CMSG_QUERY_GAME_OBJECT = 0x324B, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3251, + CMSG_QUERY_CREATURE = 0x324D, + CMSG_QUERY_GAME_OBJECT = 0x324E, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3254, CMSG_QUERY_GUILD_INFO = 0x3693, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x34F1, - CMSG_QUERY_NEXT_MAIL_TIME = 0x3521, - CMSG_QUERY_NPC_TEXT = 0x324C, - CMSG_QUERY_PAGE_TEXT = 0x324E, - CMSG_QUERY_PETITION = 0x3252, - CMSG_QUERY_PET_NAME = 0x324F, + CMSG_QUERY_NEXT_MAIL_TIME = 0x3525, + CMSG_QUERY_NPC_TEXT = 0x324F, + CMSG_QUERY_PAGE_TEXT = 0x3251, + CMSG_QUERY_PETITION = 0x3255, + CMSG_QUERY_PET_NAME = 0x3252, CMSG_QUERY_PLAYER_NAME = 0x3691, CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3172, - CMSG_QUERY_QUEST_INFO = 0x324D, + CMSG_QUERY_QUEST_INFO = 0x3250, + CMSG_QUERY_QUEST_REWARDS = 0x3322, CMSG_QUERY_REALM_NAME = 0x3692, CMSG_QUERY_SCENARIO_POI = 0x365A, - CMSG_QUERY_TIME = 0x34C4, + CMSG_QUERY_TIME = 0x34C6, CMSG_QUERY_VOID_STORAGE = 0x319B, - CMSG_QUEST_CONFIRM_ACCEPT = 0x3497, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3490, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3493, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3491, - CMSG_QUEST_GIVER_HELLO = 0x348D, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x348E, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3494, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3496, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x3495, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x3516, + CMSG_QUEST_CONFIRM_ACCEPT = 0x3499, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3491, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3495, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3493, + CMSG_QUEST_GIVER_HELLO = 0x348E, + CMSG_QUEST_GIVER_INGORE_QUEST = 0x3492, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x348F, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3496, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3498, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x3497, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x351A, CMSG_QUEST_POI_QUERY = 0x36B7, - CMSG_QUEST_PUSH_RESULT = 0x3499, + CMSG_QUEST_PUSH_RESULT = 0x349B, CMSG_QUEUED_MESSAGES_END = 0x376B, CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, CMSG_RANDOM_ROLL = 0x3655, CMSG_READY_CHECK_RESPONSE = 0x3635, - CMSG_READ_ITEM = 0x32ED, - CMSG_RECLAIM_CORPSE = 0x34C9, - CMSG_RECRUIT_A_FRIEND = 0x36D0, + CMSG_READ_ITEM = 0x32FC, + CMSG_RECLAIM_CORPSE = 0x34CB, + CMSG_RECRUIT_A_FRIEND = 0x36D1, CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4, CMSG_REDEEM_WOW_TOKEN_START = 0x36F3, CMSG_REORDER_CHARACTERS = 0x35E8, - CMSG_REPAIR_ITEM = 0x34D9, - CMSG_REPLACE_TROPHY = 0x32CF, - CMSG_REPOP_REQUEST = 0x350F, + CMSG_REPAIR_ITEM = 0x34DB, + CMSG_REPLACE_TROPHY = 0x32DC, + CMSG_REPOP_REQUEST = 0x3513, CMSG_REPORT_PVP_PLAYER_AFK = 0x34E3, CMSG_REQUEST_ACCOUNT_DATA = 0x369B, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DB, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317B, CMSG_REQUEST_CEMETERY_LIST = 0x3173, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x3288, - CMSG_REQUEST_FORCED_REACTIONS = 0x31EE, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x328C, + CMSG_REQUEST_FORCED_REACTIONS = 0x31EF, CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A1, CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A0, CMSG_REQUEST_HONOR_STATS = 0x3178, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x3279, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x327D, CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F5, CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3654, - CMSG_REQUEST_PET_INFO = 0x3487, - CMSG_REQUEST_PLAYED_TIME = 0x3255, + CMSG_REQUEST_PET_INFO = 0x3488, + CMSG_REQUEST_PLAYED_TIME = 0x3258, CMSG_REQUEST_PVP_REWARDS = 0x318F, - CMSG_REQUEST_RAID_INFO = 0x36CB, + CMSG_REQUEST_RAID_INFO = 0x36CC, CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3, CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, - CMSG_REQUEST_STABLED_PETS = 0x3488, - CMSG_REQUEST_VEHICLE_EXIT = 0x3218, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321A, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3219, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321B, + CMSG_REQUEST_STABLED_PETS = 0x3489, + CMSG_REQUEST_VEHICLE_EXIT = 0x321B, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321D, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321C, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321E, CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, CMSG_RESET_CHALLENGE_MODE = 0x31EC, CMSG_RESET_INSTANCES = 0x366E, CMSG_RESURRECT_RESPONSE = 0x368A, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x32D1, - CMSG_RIDE_VEHICLE_INTERACT = 0x321C, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x32DE, + CMSG_RIDE_VEHICLE_INTERACT = 0x321F, CMSG_SAVE_CUF_PROFILES = 0x3189, - CMSG_SAVE_EQUIPMENT_SET = 0x34F9, - CMSG_SAVE_GUILD_EMBLEM = 0x327D, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3204, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x3203, - CMSG_SCENE_TRIGGER_EVENT = 0x3205, - CMSG_SELF_RES = 0x3519, - CMSG_SELL_ITEM = 0x349B, + CMSG_SAVE_EQUIPMENT_SET = 0x34FA, + CMSG_SAVE_GUILD_EMBLEM = 0x3281, + CMSG_SCENE_PLAYBACK_CANCELED = 0x3206, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x3205, + CMSG_SCENE_TRIGGER_EVENT = 0x3207, + CMSG_SELF_RES = 0x351D, + CMSG_SELL_ITEM = 0x349D, CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE, CMSG_SELL_WOW_TOKEN_START = 0x36ED, - CMSG_SEND_CONTACT_LIST = 0x36D3, + CMSG_SEND_CONTACT_LIST = 0x36D4, CMSG_SEND_MAIL = 0x35F8, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3621, - CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x3622, - CMSG_SEND_TEXT_EMOTE = 0x347E, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320A, - CMSG_SET_ACTION_BAR_TOGGLES = 0x351A, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3620, + CMSG_SEND_TEXT_EMOTE = 0x347F, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320C, + CMSG_SET_ACTION_BAR_TOGGLES = 0x351E, CMSG_SET_ACTION_BUTTON = 0x3636, CMSG_SET_ACTIVE_MOVER = 0x3A37, CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3656, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x3289, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x328D, CMSG_SET_ASSISTANT_LEADER = 0x3650, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32F0, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x32F1, - CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32EF, - CMSG_SET_CONTACT_NOTES = 0x36D6, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32FF, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3300, + CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32FE, + CMSG_SET_CONTACT_NOTES = 0x36D7, CMSG_SET_CURRENCY_FLAGS = 0x3169, - CMSG_SET_DIFFICULTY_ID = 0x3206, + CMSG_SET_DIFFICULTY_ID = 0x3208, CMSG_SET_DUNGEON_DIFFICULTY = 0x3688, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3618, - CMSG_SET_FACTION_AT_WAR = 0x34CC, - CMSG_SET_FACTION_INACTIVE = 0x34CE, - CMSG_SET_FACTION_NOT_AT_WAR = 0x34CD, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x32F3, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x3278, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617, + CMSG_SET_FACTION_AT_WAR = 0x34CE, + CMSG_SET_FACTION_INACTIVE = 0x34D0, + CMSG_SET_FACTION_NOT_AT_WAR = 0x34CF, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3302, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x327C, CMSG_SET_LOOT_METHOD = 0x3649, - CMSG_SET_LOOT_SPECIALIZATION = 0x3527, + CMSG_SET_LOOT_SPECIALIZATION = 0x352B, CMSG_SET_PARTY_ASSIGNMENT = 0x3652, CMSG_SET_PARTY_LEADER = 0x364B, CMSG_SET_PET_SLOT = 0x3168, CMSG_SET_PLAYER_DECLINED_NAMES = 0x3690, CMSG_SET_PREFERRED_CEMETERY = 0x3174, - CMSG_SET_PVP = 0x3281, + CMSG_SET_PVP = 0x3285, CMSG_SET_RAID_DIFFICULTY = 0x36E1, CMSG_SET_ROLE = 0x35D8, CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368E, - CMSG_SET_SELECTION = 0x3511, - CMSG_SET_SHEATHED = 0x347F, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x32F2, + CMSG_SET_SELECTION = 0x3515, + CMSG_SET_SHEATHED = 0x3480, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3301, CMSG_SET_TAXI_BENCHMARK_MODE = 0x34E2, - CMSG_SET_TITLE = 0x3258, + CMSG_SET_TITLE = 0x325C, CMSG_SET_TRADE_CURRENCY = 0x3160, CMSG_SET_TRADE_GOLD = 0x315F, CMSG_SET_TRADE_ITEM = 0x315D, - CMSG_SET_USING_PARTY_GARRISON = 0x32B8, - CMSG_SET_WATCHED_FACTION = 0x34CF, - CMSG_SHOWING_CLOAK = 0x34DB, - CMSG_SHOWING_HELM = 0x34DA, + CMSG_SET_USING_PARTY_GARRISON = 0x32C2, + CMSG_SET_WATCHED_FACTION = 0x34D1, CMSG_SHOW_TRADE_SKILL = 0x36C6, - CMSG_SIGN_PETITION = 0x351B, + CMSG_SIGN_PETITION = 0x351F, CMSG_SILENCE_PARTY_TALKER = 0x3653, - CMSG_SOCKET_GEMS = 0x34D8, - CMSG_SORT_BAGS = 0x32F4, - CMSG_SORT_BANK_BAGS = 0x32F5, - CMSG_SORT_REAGENT_BANK_BAGS = 0x32F6, - CMSG_SPELL_CLICK = 0x348C, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x34A8, + CMSG_SOCKET_GEMS = 0x34DA, + CMSG_SORT_BAGS = 0x3303, + CMSG_SORT_BANK_BAGS = 0x3304, + CMSG_SORT_REAGENT_BANK_BAGS = 0x3305, + CMSG_SPELL_CLICK = 0x348D, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AA, CMSG_SPLIT_ITEM = 0x399E, CMSG_STAND_STATE_CHANGE = 0x3187, + CMSG_START_CHALLENGE_MODE = 0x3536, CMSG_START_SPECTATOR_WAR_GAME = 0x35DE, CMSG_START_WAR_GAME = 0x35DD, CMSG_SUMMON_RESPONSE = 0x3670, @@ -667,11 +675,11 @@ enum OpcodeClient : uint32 CMSG_SWAP_ITEM = 0x399C, CMSG_SWAP_SUB_GROUPS = 0x364E, CMSG_SWAP_VOID_ITEM = 0x319D, - CMSG_TABARD_VENDOR_ACTIVATE = 0x327E, - CMSG_TALK_TO_GOSSIP = 0x3489, - CMSG_TAXI_NODE_STATUS_QUERY = 0x34A1, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A3, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A5, + CMSG_TABARD_VENDOR_ACTIVATE = 0x3282, + CMSG_TALK_TO_GOSSIP = 0x348A, + CMSG_TAXI_NODE_STATUS_QUERY = 0x34A3, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A5, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A7, CMSG_TELEPORT_TO_GUID = 0x39F5, CMSG_TELEPORT_TO_UNIT = 0x3669, CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3B, @@ -679,40 +687,40 @@ enum OpcodeClient : uint32 CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A, CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A39, CMSG_TOGGLE_DIFFICULTY = 0x365B, - CMSG_TOGGLE_PVP = 0x3280, + CMSG_TOGGLE_PVP = 0x3284, CMSG_TOTEM_DESTROYED = 0x34E9, CMSG_TOY_SET_FAVORITE = 0x3632, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x330E, - CMSG_TRAINER_BUY_SPELL = 0x34A7, - CMSG_TRAINER_LIST = 0x34A6, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3321, + CMSG_TRAINER_BUY_SPELL = 0x34A9, + CMSG_TRAINER_LIST = 0x34A8, CMSG_TRANSMOGRIFY_ITEMS = 0x3190, CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE = 0x3633, - CMSG_TURN_IN_PETITION = 0x351D, + CMSG_TURN_IN_PETITION = 0x3521, CMSG_TUTORIAL = 0x36E2, CMSG_TWITTER_CHECK_STATUS = 0x312A, CMSG_TWITTER_CONNECT = 0x3127, CMSG_TWITTER_DISCONNECT = 0x312B, - CMSG_TWITTER_POST = 0x32F8, + CMSG_TWITTER_POST = 0x3307, CMSG_UI_TIME_REQUEST = 0x36A0, CMSG_UNACCEPT_TRADE = 0x315B, CMSG_UNDELETE_CHARACTER = 0x36E4, - CMSG_UNLEARN_SKILL = 0x34D2, + CMSG_UNLEARN_SKILL = 0x34D4, CMSG_UNLEARN_SPECIALIZATION = 0x319E, CMSG_UNLOCK_VOID_STORAGE = 0x319A, CMSG_UPDATE_ACCOUNT_DATA = 0x369C, CMSG_UPDATE_CLIENT_SETTINGS = 0x366A, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, CMSG_UPDATE_RAID_TARGET = 0x3651, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F9, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA, CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5, CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB, - CMSG_UPGRADE_GARRISON = 0x3291, - CMSG_UPGRADE_ITEM = 0x320B, + CMSG_UPGRADE_GARRISON = 0x3295, + CMSG_UPGRADE_ITEM = 0x320D, CMSG_USED_FOLLOW = 0x3184, - CMSG_USE_CRITTER_ITEM = 0x3223, + CMSG_USE_CRITTER_ITEM = 0x3226, CMSG_USE_EQUIPMENT_SET = 0x3995, - CMSG_USE_ITEM = 0x326F, - CMSG_USE_TOY = 0x3271, + CMSG_USE_ITEM = 0x3273, + CMSG_USE_TOY = 0x3275, CMSG_VIOLENCE_LEVEL = 0x3182, CMSG_VOICE_ADD_IGNORE = 0x3657, CMSG_VOICE_DEL_IGNORE = 0x3658, @@ -733,93 +741,96 @@ enum OpcodeClient : uint32 enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x25AC, + SMSG_ABORT_NEW_WORLD = 0x25AB, SMSG_ACCOUNT_CRITERIA_UPDATE = 0x264F, - SMSG_ACCOUNT_DATA_TIMES = 0x2746, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C2, - SMSG_ACCOUNT_TOYS_UPDATE = 0x25C3, - SMSG_ACHIEVEMENT_DELETED = 0x271C, + SMSG_ACCOUNT_DATA_TIMES = 0x2745, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C1, + SMSG_ACCOUNT_TOYS_UPDATE = 0x25C2, + SMSG_ACHIEVEMENT_DELETED = 0x271B, SMSG_ACHIEVEMENT_EARNED = 0x265D, SMSG_ACTIVATE_TAXI_REPLY = 0x26A3, - SMSG_ADDON_INFO = 0x277A, SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2657, - SMSG_ADD_ITEM_PASSIVE = 0x25BE, + SMSG_ADD_ITEM_PASSIVE = 0x25BD, SMSG_ADD_LOSS_OF_CONTROL = 0x2693, SMSG_ADD_RUNE_POWER = 0x26E0, - SMSG_ADJUST_SPLINE_DURATION = 0x25E6, + SMSG_ADJUST_SPLINE_DURATION = 0x25E5, SMSG_AE_LOOT_TARGETS = 0x262A, SMSG_AE_LOOT_TARGET_ACK = 0x262B, SMSG_AI_REACTION = 0x26DD, - SMSG_ALL_ACCOUNT_CRITERIA = 0x2571, - SMSG_ALL_ACHIEVEMENT_DATA = 0x2570, + SMSG_ALL_ACCOUNT_CRITERIA = 0x2570, + SMSG_ALL_ACHIEVEMENT_DATA = 0x256F, SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2587, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, SMSG_AREA_SPIRIT_HEALER_TIME = 0x277F, SMSG_AREA_TRIGGER_DENIED = 0x269A, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x2752, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2751, SMSG_AREA_TRIGGER_RE_PATH = 0x263D, SMSG_AREA_TRIGGER_RE_SHAPE = 0x263B, - SMSG_ARENA_ERROR = 0x270F, + SMSG_ARENA_ERROR = 0x270E, SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2662, - SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DC, - SMSG_ARTIFACT_FORGE_OPENED = 0x27DA, - SMSG_ARTIFACT_POWERS_UPDATED = 0x27DB, - SMSG_ARTIFACT_XP_GAIN = 0x2819, - SMSG_ATTACKER_STATE_UPDATE = 0x27C7, + SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DF, + SMSG_ARTIFACT_FORGE_OPENED = 0x27DD, + SMSG_ARTIFACT_POWERS_UPDATED = 0x27DE, + SMSG_ARTIFACT_XP_GAIN = 0x281D, + SMSG_ATTACKER_STATE_UPDATE = 0x27CA, SMSG_ATTACK_START = 0x266A, SMSG_ATTACK_STOP = 0x266B, - SMSG_ATTACK_SWING_ERROR = 0x2731, - SMSG_ATTACK_SWING_LANDED_LOG = 0x2732, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2726, - SMSG_AUCTION_COMMAND_RESULT = 0x2723, - SMSG_AUCTION_HELLO_RESPONSE = 0x2721, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x272A, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2728, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2729, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272B, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2725, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2727, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x2722, - SMSG_AUCTION_WON_NOTIFICATION = 0x2724, + SMSG_ATTACK_SWING_ERROR = 0x2730, + SMSG_ATTACK_SWING_LANDED_LOG = 0x2731, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2725, + SMSG_AUCTION_COMMAND_RESULT = 0x2722, + SMSG_AUCTION_HELLO_RESPONSE = 0x2720, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x2729, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2727, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2728, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272A, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2724, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2726, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x2721, + SMSG_AUCTION_WON_NOTIFICATION = 0x2723, SMSG_AURA_POINTS_DEPLETED = 0x2C22, SMSG_AURA_UPDATE = 0x2C21, SMSG_AUTH_CHALLENGE = 0x3048, - SMSG_AUTH_RESPONSE = 0x256D, + SMSG_AUTH_RESPONSE = 0x256C, SMSG_AVAILABLE_VOICE_CHANNEL = 0x2BB2, - SMSG_BAN_REASON = 0x281C, - SMSG_BARBER_SHOP_RESULT = 0x26E7, - SMSG_BATTLEFIELD_LIST = 0x2595, - SMSG_BATTLEFIELD_PORT_DENIED = 0x259B, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2591, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x2594, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x2590, - SMSG_BATTLEFIELD_STATUS_NONE = 0x2593, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2592, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A4, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259C, - SMSG_BATTLEGROUND_INIT = 0x279C, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2599, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x259A, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2596, - SMSG_BATTLEGROUND_POINTS = 0x279B, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C6, - SMSG_BATTLENET_CHALLENGE_START = 0x27C5, - SMSG_BATTLE_PAY_ACK_FAILED = 0x27BE, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27BD, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B4, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B3, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B2, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B0, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27AE, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27AF, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BC, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BA, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27B9, - SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B1, - SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x281D, - SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x281F, - SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2820, - SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x281E, + SMSG_BAN_REASON = 0x26AF, + SMSG_BARBER_SHOP_RESULT = 0x26E6, + SMSG_BATTLEFIELD_LIST = 0x2594, + SMSG_BATTLEFIELD_PORT_DENIED = 0x259A, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2590, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x2593, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x258F, + SMSG_BATTLEFIELD_STATUS_NONE = 0x2592, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2591, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A3, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259B, + SMSG_BATTLEGROUND_INIT = 0x279D, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, + SMSG_BATTLEGROUND_POINTS = 0x279C, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C9, + SMSG_BATTLENET_CHALLENGE_START = 0x27C8, + SMSG_BATTLENET_NOTIFICATION = 0x2831, + SMSG_BATTLENET_REALM_LIST_TICKET = 0x2833, + SMSG_BATTLENET_RESPONSE = 0x2830, + SMSG_BATTLENET_SET_SESSION_STATE = 0x2832, + SMSG_BATTLE_PAY_ACK_FAILED = 0x27C1, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C0, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B7, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B6, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B5, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B3, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B1, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B2, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BF, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BD, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27BC, + SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B4, + SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2821, + SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2824, + SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2825, + SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2823, SMSG_BATTLE_PETS_HEALED = 0x2608, SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269D, SMSG_BATTLE_PET_DELETED = 0x2605, @@ -828,23 +839,24 @@ enum OpcodeServer : uint32 SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2602, SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2603, SMSG_BATTLE_PET_LICENSE_CHANGED = 0x2609, + SMSG_BATTLE_PET_MAX_COUNT_CHANGED = 0x2600, SMSG_BATTLE_PET_RESTORED = 0x2607, SMSG_BATTLE_PET_REVOKED = 0x2606, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x2600, - SMSG_BATTLE_PET_UPDATES = 0x25FF, - SMSG_BINDER_CONFIRM = 0x2737, - SMSG_BIND_POINT_UPDATE = 0x257D, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x25FF, + SMSG_BATTLE_PET_UPDATES = 0x25FE, + SMSG_BINDER_CONFIRM = 0x2736, + SMSG_BIND_POINT_UPDATE = 0x257C, SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2642, SMSG_BLACK_MARKET_OPEN_RESULT = 0x2640, SMSG_BLACK_MARKET_OUTBID = 0x2643, SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2641, SMSG_BLACK_MARKET_WON = 0x2644, SMSG_BONUS_ROLL_EMPTY = 0x265F, - SMSG_BOSS_KILL_CREDIT = 0x27B8, + SMSG_BOSS_KILL_CREDIT = 0x27BB, SMSG_BREAK_TARGET = 0x2669, - SMSG_BUY_FAILED = 0x26F0, - SMSG_BUY_SUCCEEDED = 0x26EF, - SMSG_CACHE_VERSION = 0x2740, + SMSG_BUY_FAILED = 0x26EF, + SMSG_BUY_SUCCEEDED = 0x26EE, + SMSG_CACHE_VERSION = 0x273F, SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C3, SMSG_CALENDAR_COMMAND_RESULT = 0x26C4, SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B3, @@ -867,8 +879,8 @@ enum OpcodeServer : uint32 SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C2, SMSG_CAMERA_EFFECT = 0x2763, SMSG_CAMERA_SHAKE = 0x2764, - SMSG_CANCEL_AUTO_REPEAT = 0x2710, - SMSG_CANCEL_COMBAT = 0x272F, + SMSG_CANCEL_AUTO_REPEAT = 0x270F, + SMSG_CANCEL_COMBAT = 0x272E, SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45, SMSG_CANCEL_SCENE = 0x2651, SMSG_CANCEL_SPELL_VISUAL = 0x2C43, @@ -884,21 +896,21 @@ enum OpcodeServer : uint32 SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2622, SMSG_CHALLENGE_MODE_RESET = 0x261D, SMSG_CHALLENGE_MODE_START = 0x261C, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2733, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2732, SMSG_CHANNEL_LIST = 0x2BC8, SMSG_CHANNEL_NOTIFY = 0x2BC5, SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC6, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC7, - SMSG_CHARACTER_LOGIN_FAILED = 0x2741, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C4, - SMSG_CHARACTER_RENAME_RESULT = 0x27A2, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F3, - SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F2, - SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F4, - SMSG_CHARACTER_UPGRADE_STARTED = 0x27F1, - SMSG_CHAR_CUSTOMIZE = 0x2717, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x2716, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E0, + SMSG_CHARACTER_LOGIN_FAILED = 0x2740, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C7, + SMSG_CHARACTER_RENAME_RESULT = 0x27A3, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F7, + SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F6, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F3, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27F5, + SMSG_CHAR_CUSTOMIZE = 0x2716, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x2715, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E4, SMSG_CHAT = 0x2BAD, SMSG_CHAT_AUTO_RESPONDED = 0x2BBD, SMSG_CHAT_DOWN = 0x2BC2, @@ -911,57 +923,57 @@ enum OpcodeServer : uint32 SMSG_CHAT_RESTRICTED = 0x2BB8, SMSG_CHAT_SERVER_MESSAGE = 0x2BC9, SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2C12, - SMSG_CHECK_WARGAME_ENTRY = 0x259F, + SMSG_CHECK_WARGAME_ENTRY = 0x259E, SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C26, - SMSG_CLEAR_BOSS_EMOTES = 0x25CC, - SMSG_CLEAR_COOLDOWN = 0x26E3, + SMSG_CLEAR_BOSS_EMOTES = 0x25CA, + SMSG_CLEAR_COOLDOWN = 0x26E2, SMSG_CLEAR_COOLDOWNS = 0x2C25, SMSG_CLEAR_LOSS_OF_CONTROL = 0x2695, SMSG_CLEAR_SPELL_CHARGES = 0x2C27, SMSG_CLEAR_TARGET = 0x26D9, SMSG_COIN_REMOVED = 0x2629, SMSG_COMBAT_EVENT_FAILED = 0x266C, - SMSG_COMMENTATOR_MAP_INFO = 0x2743, - SMSG_COMMENTATOR_PLAYER_INFO = 0x2744, - SMSG_COMMENTATOR_STATE_CHANGED = 0x2742, + SMSG_COMMENTATOR_MAP_INFO = 0x2742, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2743, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2741, SMSG_COMPLAINT_RESULT = 0x26D1, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D6, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D9, SMSG_CONNECT_TO = 0x304C, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27BF, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C2, SMSG_CONSOLE_WRITE = 0x264E, - SMSG_CONTACT_LIST = 0x27C2, + SMSG_CONTACT_LIST = 0x27C5, SMSG_CONTROL_UPDATE = 0x2661, - SMSG_COOLDOWN_CHEAT = 0x2777, - SMSG_COOLDOWN_EVENT = 0x26E2, + SMSG_COOLDOWN_CHEAT = 0x2778, + SMSG_COOLDOWN_EVENT = 0x26E1, SMSG_CORPSE_LOCATION = 0x2668, - SMSG_CORPSE_RECLAIM_DELAY = 0x278A, - SMSG_CORPSE_TRANSPORT_QUERY = 0x274E, - SMSG_CREATE_CHAR = 0x273C, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D5, - SMSG_CRITERIA_DELETED = 0x271B, - SMSG_CRITERIA_UPDATE = 0x2715, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26EB, - SMSG_CUSTOM_LOAD_SCREEN = 0x25E2, + SMSG_CORPSE_RECLAIM_DELAY = 0x278B, + SMSG_CORPSE_TRANSPORT_QUERY = 0x274D, + SMSG_CREATE_CHAR = 0x273B, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D8, + SMSG_CRITERIA_DELETED = 0x271A, + SMSG_CRITERIA_UPDATE = 0x2714, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26EA, + SMSG_CUSTOM_LOAD_SCREEN = 0x25E0, SMSG_DAILY_QUESTS_RESET = 0x2A80, - SMSG_DAMAGE_CALC_LOG = 0x27FA, - SMSG_DANCE_STUDIO_CREATE_RESULT = 0x279F, - SMSG_DB_REPLY = 0x25A1, - SMSG_DEATH_RELEASE_LOC = 0x2703, + SMSG_DAMAGE_CALC_LOG = 0x27FE, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x27A0, + SMSG_DB_REPLY = 0x25A0, + SMSG_DEATH_RELEASE_LOC = 0x2702, SMSG_DEFENSE_MESSAGE = 0x2BBB, - SMSG_DELETE_CHAR = 0x273D, + SMSG_DELETE_CHAR = 0x273C, SMSG_DESTROY_ARENA_UNIT = 0x2781, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x2730, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258B, - SMSG_DISENCHANT_CREDIT = 0x25BB, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272F, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, + SMSG_DISENCHANT_CREDIT = 0x25BA, SMSG_DISMOUNT = 0x26D8, - SMSG_DISMOUNT_RESULT = 0x257C, + SMSG_DISMOUNT_RESULT = 0x257B, SMSG_DISPEL_FAILED = 0x2C2F, - SMSG_DISPLAY_GAME_ERROR = 0x25B4, + SMSG_DISPLAY_GAME_ERROR = 0x25B3, SMSG_DISPLAY_PLAYER_CHOICE = 0x269E, SMSG_DISPLAY_PROMOTION = 0x2665, SMSG_DISPLAY_QUEST_POPUP = 0x2A9B, SMSG_DISPLAY_TOAST = 0x2637, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F6, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F5, SMSG_DROP_NEW_CONNECTION = 0x304B, SMSG_DUEL_COMPLETE = 0x2671, SMSG_DUEL_COUNTDOWN = 0x2670, @@ -969,238 +981,242 @@ enum OpcodeServer : uint32 SMSG_DUEL_OUT_OF_BOUNDS = 0x266E, SMSG_DUEL_REQUESTED = 0x266D, SMSG_DUEL_WINNER = 0x2672, - SMSG_DURABILITY_DAMAGE_DEATH = 0x2786, - SMSG_EMOTE = 0x27FB, - SMSG_ENABLE_BARBER_SHOP = 0x26E6, - SMSG_ENCHANTMENT_LOG = 0x274F, - SMSG_ENCOUNTER_END = 0x27B7, - SMSG_ENCOUNTER_START = 0x27B6, - SMSG_ENUM_CHARACTERS_RESULT = 0x2583, + SMSG_DURABILITY_DAMAGE_DEATH = 0x2787, + SMSG_EMOTE = 0x27FF, + SMSG_ENABLE_BARBER_SHOP = 0x26E5, + SMSG_ENCHANTMENT_LOG = 0x274E, + SMSG_ENCOUNTER_END = 0x27BA, + SMSG_ENCOUNTER_START = 0x27B9, + SMSG_ENUM_CHARACTERS_RESULT = 0x2582, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C20, SMSG_EQUIPMENT_SET_ID = 0x26DA, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, - SMSG_EXPLORATION_EXPERIENCE = 0x279E, + SMSG_EXPLORATION_EXPERIENCE = 0x279F, SMSG_FACTION_BONUS_INFO = 0x2762, - SMSG_FAILED_PLAYER_CONDITION = 0x25E1, - SMSG_FEATURE_SYSTEM_STATUS = 0x25D1, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D2, - SMSG_FEIGN_DEATH_RESISTED = 0x2783, - SMSG_FISH_ESCAPED = 0x26F8, - SMSG_FISH_NOT_HOOKED = 0x26F7, + SMSG_FAILED_PLAYER_CONDITION = 0x25DF, + SMSG_FEATURE_SYSTEM_STATUS = 0x25CF, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D0, + SMSG_FEIGN_DEATH_RESISTED = 0x2784, + SMSG_FISH_ESCAPED = 0x26F7, + SMSG_FISH_NOT_HOOKED = 0x26F6, SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, - SMSG_FORCED_DEATH_UPDATE = 0x2704, - SMSG_FORCE_ANIM = 0x2790, + SMSG_FORCED_DEATH_UPDATE = 0x2703, + SMSG_FORCE_ANIM = 0x2791, SMSG_FORCE_OBJECT_RELINK = 0x2664, - SMSG_FRIEND_STATUS = 0x27C3, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D5, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D6, - SMSG_GAME_OBJECT_DESPAWN = 0x25D7, + SMSG_FRIEND_STATUS = 0x27C6, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D3, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D4, + SMSG_GAME_OBJECT_DESPAWN = 0x25D5, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4A, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C49, SMSG_GAME_OBJECT_RESET_STATE = 0x2759, + SMSG_GAME_OBJECT_SET_STATE = 0x282F, SMSG_GAME_OBJECT_UI_ACTION = 0x2756, SMSG_GAME_SPEED_SET = 0x26A7, - SMSG_GAME_TIME_SET = 0x2748, - SMSG_GAME_TIME_UPDATE = 0x2747, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x28FE, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x2901, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2912, + SMSG_GAME_TIME_SET = 0x2747, + SMSG_GAME_TIME_UPDATE = 0x2746, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918, SMSG_GARRISON_BUILDING_ACTIVATED = 0x28FB, - SMSG_GARRISON_BUILDING_LANDMARKS = 0x2925, + SMSG_GARRISON_BUILDING_LANDMARKS = 0x292C, SMSG_GARRISON_BUILDING_REMOVED = 0x28F4, SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x28F6, - SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2910, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2903, + SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2916, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2909, SMSG_GARRISON_CREATE_RESULT = 0x28FC, - SMSG_GARRISON_DELETE_RESULT = 0x2919, - SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x290E, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x290D, - SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x290F, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x290C, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2922, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27D8, + SMSG_GARRISON_DELETE_RESULT = 0x2920, + SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x2914, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x2913, + SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912, + SMSG_GARRISON_FOLLOWER_DURABILITY_CHANGED = 0x2904, + SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27DB, SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7, SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2900, - SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x2923, - SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x290A, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x2907, - SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x290B, - SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2911, - SMSG_GARRISON_OPEN_ARCHITECT = 0x291A, - SMSG_GARRISON_OPEN_MISSION_NPC = 0x291C, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x2916, - SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x291B, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2905, + SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x292A, + SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2910, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x290C, + SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2911, + SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2917, + SMSG_GARRISON_OPEN_ARCHITECT = 0x2921, + SMSG_GARRISON_OPEN_MISSION_NPC = 0x2923, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x291C, + SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x2922, SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x28F3, SMSG_GARRISON_PLOT_PLACED = 0x28F1, SMSG_GARRISON_PLOT_REMOVED = 0x28F2, - SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x2905, - SMSG_GARRISON_RECALL_PORTAL_USED = 0x2906, - SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x2917, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2918, + SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x290A, + SMSG_GARRISON_RECALL_PORTAL_USED = 0x290B, + SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x291E, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x291F, SMSG_GARRISON_REMOTE_INFO = 0x28FA, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2913, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x28FF, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2919, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x2903, SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x28F9, - SMSG_GARRISON_START_MISSION_RESULT = 0x2902, + SMSG_GARRISON_START_MISSION_RESULT = 0x2907, SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2584, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A0, - SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2921, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1, + SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27D7, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D3, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x27F6, - SMSG_GM_PLAYER_INFO = 0x2776, - SMSG_GM_REQUEST_PLAYER_INFO = 0x25EB, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27DA, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D6, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FA, + SMSG_GM_PLAYER_INFO = 0x2777, + SMSG_GM_REQUEST_PLAYER_INFO = 0x25EA, SMSG_GM_TICKET_CASE_STATUS = 0x26CA, SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C9, - SMSG_GOD_MODE = 0x2736, + SMSG_GOD_MODE = 0x2735, SMSG_GOSSIP_COMPLETE = 0x2A95, SMSG_GOSSIP_MESSAGE = 0x2A96, - SMSG_GOSSIP_POI = 0x27D0, - SMSG_GROUP_ACTION_THROTTLED = 0x259D, - SMSG_GROUP_DECLINE = 0x27CB, - SMSG_GROUP_DESTROYED = 0x27CD, + SMSG_GOSSIP_POI = 0x27D3, + SMSG_GROUP_ACTION_THROTTLED = 0x259C, + SMSG_GROUP_DECLINE = 0x27CE, + SMSG_GROUP_DESTROYED = 0x27D0, SMSG_GROUP_NEW_LEADER = 0x2647, - SMSG_GROUP_UNINVITE = 0x27CC, + SMSG_GROUP_UNINVITE = 0x27CF, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x29DE, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x29DD, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x29DF, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x29E2, + SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x29DF, + SMSG_GUILD_BANK_QUERY_RESULTS = 0x29DE, + SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x29E0, + SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x29E3, SMSG_GUILD_CHALLENGE_COMPLETED = 0x29D3, SMSG_GUILD_CHALLENGE_UPDATE = 0x29D2, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x29DC, + SMSG_GUILD_CHANGE_NAME_RESULT = 0x29DD, SMSG_GUILD_COMMAND_RESULT = 0x29BA, SMSG_GUILD_CRITERIA_DELETED = 0x29C6, SMSG_GUILD_CRITERIA_UPDATE = 0x29C3, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F4, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F3, - SMSG_GUILD_EVENT_DISBANDED = 0x29EA, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x29E1, - SMSG_GUILD_EVENT_MOTD = 0x29EB, - SMSG_GUILD_EVENT_NEW_LEADER = 0x29E9, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29E7, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29E8, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29EC, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29ED, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x29EE, - SMSG_GUILD_EVENT_TAB_ADDED = 0x29EF, - SMSG_GUILD_EVENT_TAB_DELETED = 0x29F0, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F1, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F2, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x29DB, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F5, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F4, + SMSG_GUILD_EVENT_DISBANDED = 0x29EB, + SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x29E2, + SMSG_GUILD_EVENT_MOTD = 0x29EC, + SMSG_GUILD_EVENT_NEW_LEADER = 0x29EA, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29E8, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29E9, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29ED, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29EE, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x29EF, + SMSG_GUILD_EVENT_TAB_ADDED = 0x29F0, + SMSG_GUILD_EVENT_TAB_DELETED = 0x29F1, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F2, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F3, + SMSG_GUILD_FLAGGED_FOR_RENAME = 0x29DC, SMSG_GUILD_INVITE = 0x29CA, - SMSG_GUILD_INVITE_DECLINED = 0x29E5, - SMSG_GUILD_INVITE_EXPIRED = 0x29E6, + SMSG_GUILD_INVITE_DECLINED = 0x29E6, + SMSG_GUILD_INVITE_EXPIRED = 0x29E7, + SMSG_GUILD_ITEM_LOOTED = 0x29D4, SMSG_GUILD_KNOWN_RECIPES = 0x29BE, SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x29BF, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x29E3, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x29E4, SMSG_GUILD_MEMBER_RECIPES = 0x29BD, SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x29C9, - SMSG_GUILD_MOVED = 0x29D9, - SMSG_GUILD_MOVE_STARTING = 0x29D8, - SMSG_GUILD_NAME_CHANGED = 0x29DA, + SMSG_GUILD_MOVED = 0x29DA, + SMSG_GUILD_MOVE_STARTING = 0x29D9, + SMSG_GUILD_NAME_CHANGED = 0x29DB, SMSG_GUILD_NEWS = 0x29C1, SMSG_GUILD_NEWS_DELETED = 0x29C2, SMSG_GUILD_PARTY_STATE = 0x29CB, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x29E0, + SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x29E1, SMSG_GUILD_RANKS = 0x29C8, SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x29CC, - SMSG_GUILD_RESET = 0x29D7, + SMSG_GUILD_RESET = 0x29D8, SMSG_GUILD_REWARD_LIST = 0x29C0, SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x26FB, - SMSG_HIGHEST_THREAT_UPDATE = 0x270A, - SMSG_HOTFIX_NOTIFY = 0x25A2, - SMSG_HOTFIX_NOTIFY_BLOB = 0x25A3, + SMSG_HEALTH_UPDATE = 0x26FA, + SMSG_HIGHEST_THREAT_UPDATE = 0x2709, + SMSG_HOTFIX_NOTIFY = 0x25A1, + SMSG_HOTFIX_NOTIFY_BLOB = 0x25A2, SMSG_INITIALIZE_FACTIONS = 0x2761, - SMSG_INITIAL_SETUP = 0x2580, - SMSG_INIT_WORLD_STATES = 0x2787, - SMSG_INSPECT_HONOR_STATS = 0x25B1, + SMSG_INITIAL_SETUP = 0x257F, + SMSG_INIT_WORLD_STATES = 0x2788, + SMSG_INSPECT_HONOR_STATS = 0x25B0, SMSG_INSPECT_PVP = 0x275D, SMSG_INSPECT_RESULT = 0x264B, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27E6, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E5, - SMSG_INSTANCE_ENCOUNTER_END = 0x27EC, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E4, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27EE, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27ED, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27E9, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27E8, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EB, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27EF, - SMSG_INSTANCE_ENCOUNTER_START = 0x27EA, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27E7, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2734, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27EA, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E9, + SMSG_INSTANCE_ENCOUNTER_END = 0x27F0, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E8, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F2, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F1, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27ED, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27EC, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EF, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F3, + SMSG_INSTANCE_ENCOUNTER_START = 0x27EE, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EB, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2733, SMSG_INSTANCE_INFO = 0x264D, SMSG_INSTANCE_RESET = 0x26AC, SMSG_INSTANCE_RESET_FAILED = 0x26AD, - SMSG_INSTANCE_SAVE_CREATED = 0x27B5, + SMSG_INSTANCE_SAVE_CREATED = 0x27B8, SMSG_INVALIDATE_PLAYER = 0x26D0, - SMSG_INVALID_PROMOTION_CODE = 0x2791, + SMSG_INVALID_PROMOTION_CODE = 0x2792, SMSG_INVENTORY_CHANGE_FAILURE = 0x275F, SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, - SMSG_ITEM_CHANGED = 0x271E, - SMSG_ITEM_COOLDOWN = 0x27F9, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2793, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B0, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AE, + SMSG_ITEM_CHANGED = 0x271D, + SMSG_ITEM_COOLDOWN = 0x27FD, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2794, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25AF, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AD, SMSG_ITEM_PUSH_RESULT = 0x2636, - SMSG_ITEM_TIME_UPDATE = 0x2792, - SMSG_KICK_REASON = 0x26AF, + SMSG_ITEM_TIME_UPDATE = 0x2793, + SMSG_KICK_REASON = 0x2820, SMSG_LEARNED_SPELLS = 0x2C4C, - SMSG_LEARN_PVP_TALENT_FAILED = 0x25E8, - SMSG_LEARN_TALENT_FAILED = 0x25E7, - SMSG_LEVEL_UPDATE = 0x2588, - SMSG_LEVEL_UP_INFO = 0x271D, - SMSG_LFG_BOOT_PLAYER = 0x2A35, - SMSG_LFG_DISABLED = 0x2A33, + SMSG_LEARN_PVP_TALENT_FAILED = 0x25E7, + SMSG_LEARN_TALENT_FAILED = 0x25E6, + SMSG_LEVEL_UPDATE = 0x2587, + SMSG_LEVEL_UP_INFO = 0x271C, + SMSG_LFG_BOOT_PLAYER = 0x2A36, + SMSG_LFG_DISABLED = 0x2A34, + SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x2A25, SMSG_LFG_JOIN_RESULT = 0x2A1C, SMSG_LFG_LIST_JOIN_RESULT = 0x2A1D, SMSG_LFG_LIST_SEARCH_RESULTS = 0x2A1E, SMSG_LFG_LIST_SEARCH_STATUS = 0x2A1F, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x2A29, - SMSG_LFG_LIST_UPDATE_STATUS = 0x2A25, - SMSG_LFG_OFFER_CONTINUE = 0x2A34, - SMSG_LFG_PARTY_INFO = 0x2A36, - SMSG_LFG_PLAYER_INFO = 0x2A37, - SMSG_LFG_PLAYER_REWARD = 0x2A38, - SMSG_LFG_PROPOSAL_UPDATE = 0x2A2C, + SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x2A2A, + SMSG_LFG_LIST_UPDATE_STATUS = 0x2A26, + SMSG_LFG_OFFER_CONTINUE = 0x2A35, + SMSG_LFG_PARTY_INFO = 0x2A37, + SMSG_LFG_PLAYER_INFO = 0x2A38, + SMSG_LFG_PLAYER_REWARD = 0x2A39, + SMSG_LFG_PROPOSAL_UPDATE = 0x2A2D, SMSG_LFG_QUEUE_STATUS = 0x2A20, - SMSG_LFG_READY_CHECK_RESULT = 0x2A3A, + SMSG_LFG_READY_CHECK_RESULT = 0x2A3B, SMSG_LFG_READY_CHECK_UPDATE = 0x2A22, SMSG_LFG_ROLE_CHECK_UPDATE = 0x2A21, - SMSG_LFG_SLOT_INVALID = 0x2A2F, - SMSG_LFG_TELEPORT_DENIED = 0x2A32, + SMSG_LFG_SLOT_INVALID = 0x2A30, + SMSG_LFG_TELEPORT_DENIED = 0x2A33, SMSG_LFG_UPDATE_STATUS = 0x2A24, - SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D4, + SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D5, SMSG_LF_GUILD_APPLICATIONS = 0x29D1, - SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x29D5, + SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x29D6, SMSG_LF_GUILD_BROWSE = 0x29CE, SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0, SMSG_LF_GUILD_POST = 0x29CD, SMSG_LF_GUILD_RECRUITS = 0x29CF, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AC, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AA, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1, - SMSG_LOAD_CUF_PROFILES = 0x25CD, - SMSG_LOAD_EQUIPMENT_SET = 0x274A, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27F7, - SMSG_LOGIN_SET_TIME_SPEED = 0x2749, - SMSG_LOGIN_VERIFY_WORLD = 0x25AB, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AF, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AD, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A2, + SMSG_LOAD_CUF_PROFILES = 0x25CB, + SMSG_LOAD_EQUIPMENT_SET = 0x2749, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27FB, + SMSG_LOGIN_SET_TIME_SPEED = 0x2748, + SMSG_LOGIN_VERIFY_WORLD = 0x25AA, SMSG_LOGOUT_CANCEL_ACK = 0x26AB, SMSG_LOGOUT_COMPLETE = 0x26AA, SMSG_LOGOUT_RESPONSE = 0x26A9, - SMSG_LOG_XP_GAIN = 0x2719, + SMSG_LOG_XP_GAIN = 0x2718, SMSG_LOOT_ALL_PASSED = 0x2634, - SMSG_LOOT_CONTENTS = 0x25EF, + SMSG_LOOT_CONTENTS = 0x25EE, SMSG_LOOT_ITEM_LIST = 0x2632, SMSG_LOOT_LIST = 0x2780, SMSG_LOOT_MONEY_NOTIFY = 0x262E, @@ -1213,19 +1229,19 @@ enum OpcodeServer : uint32 SMSG_LOOT_ROLL_WON = 0x2635, SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2692, SMSG_MAIL_COMMAND_RESULT = 0x2655, - SMSG_MAIL_LIST_RESULT = 0x2794, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2795, - SMSG_MAP_OBJECTIVES_INIT = 0x279D, - SMSG_MAP_OBJ_EVENTS = 0x25D8, + SMSG_MAIL_LIST_RESULT = 0x2795, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2796, + SMSG_MAP_OBJECTIVES_INIT = 0x279E, + SMSG_MAP_OBJ_EVENTS = 0x25D6, SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2631, - SMSG_MESSAGE_BOX = 0x2576, - SMSG_MINIMAP_PING = 0x26F6, + SMSG_MESSAGE_BOX = 0x2575, + SMSG_MINIMAP_PING = 0x26F5, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, - SMSG_MISSILE_CANCEL = 0x25D9, - SMSG_MODIFY_COOLDOWN = 0x27A3, + SMSG_MISSILE_CANCEL = 0x25D7, + SMSG_MODIFY_COOLDOWN = 0x27A4, SMSG_MOTD = 0x2BAF, - SMSG_MOUNT_RESULT = 0x257B, + SMSG_MOUNT_RESULT = 0x257A, SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, SMSG_MOVE_DISABLE_COLLISION = 0x2DDD, SMSG_MOVE_DISABLE_GRAVITY = 0x2DDB, @@ -1306,37 +1322,37 @@ enum OpcodeServer : uint32 SMSG_MOVE_UPDATE_TELEPORT = 0x2DAF, SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F1, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F0, SMSG_NEW_TAXI_PATH = 0x26A4, - SMSG_NEW_WORLD = 0x25AA, + SMSG_NEW_WORLD = 0x25A9, SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42, SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CF, - SMSG_NOTIFY_MONEY = 0x25AD, + SMSG_NOTIFY_MONEY = 0x25AC, SMSG_NOTIFY_RECEIVED_MAIL = 0x2656, SMSG_OFFER_PETITION_ERROR = 0x26DE, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x271A, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2719, SMSG_ON_MONSTER_MOVE = 0x2DA2, SMSG_OPEN_CONTAINER = 0x2760, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D2, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D4, - SMSG_OVERRIDE_LIGHT = 0x26E5, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D5, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D7, + SMSG_OVERRIDE_LIGHT = 0x26E4, SMSG_PAGE_TEXT = 0x2755, - SMSG_PARTY_COMMAND_RESULT = 0x27CF, - SMSG_PARTY_INVITE = 0x25CF, - SMSG_PARTY_KILL_LOG = 0x2799, - SMSG_PARTY_MEMBER_STATE = 0x2797, + SMSG_PARTY_COMMAND_RESULT = 0x27D2, + SMSG_PARTY_INVITE = 0x25CD, + SMSG_PARTY_KILL_LOG = 0x279A, + SMSG_PARTY_MEMBER_STATE = 0x2798, SMSG_PARTY_UPDATE = 0x260A, - SMSG_PAUSE_MIRROR_TIMER = 0x274C, - SMSG_PENDING_RAID_LOCK = 0x272E, - SMSG_PETITION_ALREADY_SIGNED = 0x25B7, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F6, - SMSG_PETITION_SHOW_LIST = 0x26E8, - SMSG_PETITION_SHOW_SIGNATURES = 0x26E9, - SMSG_PETITION_SIGN_RESULTS = 0x278B, - SMSG_PET_ACTION_FEEDBACK = 0x2789, + SMSG_PAUSE_MIRROR_TIMER = 0x274B, + SMSG_PENDING_RAID_LOCK = 0x272D, + SMSG_PETITION_ALREADY_SIGNED = 0x25B6, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7, + SMSG_PETITION_SHOW_LIST = 0x26E7, + SMSG_PETITION_SHOW_SIGNATURES = 0x26E8, + SMSG_PETITION_SIGN_RESULTS = 0x278C, + SMSG_PET_ACTION_FEEDBACK = 0x278A, SMSG_PET_ACTION_SOUND = 0x26C6, - SMSG_PET_ADDED = 0x25A7, + SMSG_PET_ADDED = 0x25A6, SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2617, SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2699, SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2610, @@ -1356,55 +1372,57 @@ enum OpcodeServer : uint32 SMSG_PET_CLEAR_SPELLS = 0x2C23, SMSG_PET_DISMISS_SOUND = 0x26C7, SMSG_PET_GOD_MODE = 0x26A1, - SMSG_PET_GUIDS = 0x273F, + SMSG_PET_GUIDS = 0x273E, SMSG_PET_LEARNED_SPELLS = 0x2C4E, - SMSG_PET_MODE = 0x258A, - SMSG_PET_NAME_INVALID = 0x26ED, - SMSG_PET_SLOT_UPDATED = 0x2589, + SMSG_PET_MODE = 0x2589, + SMSG_PET_NAME_INVALID = 0x26EC, + SMSG_PET_SLOT_UPDATED = 0x2588, SMSG_PET_SPELLS_MESSAGE = 0x2C24, - SMSG_PET_STABLE_LIST = 0x25A8, - SMSG_PET_STABLE_RESULT = 0x25A9, + SMSG_PET_STABLE_LIST = 0x25A7, + SMSG_PET_STABLE_RESULT = 0x25A8, SMSG_PET_TAME_FAILURE = 0x26DB, SMSG_PET_UNLEARNED_SPELLS = 0x2C4F, - SMSG_PHASE_SHIFT_CHANGE = 0x2578, - SMSG_PLAYED_TIME = 0x2706, - SMSG_PLAYER_BOUND = 0x257E, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F5, - SMSG_PLAYER_SKINNED = 0x2784, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2798, - SMSG_PLAY_MUSIC = 0x27A6, - SMSG_PLAY_OBJECT_SOUND = 0x27A7, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276E, + SMSG_PHASE_SHIFT_CHANGE = 0x2577, + SMSG_PLAYED_TIME = 0x2705, + SMSG_PLAYER_BOUND = 0x257D, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, + SMSG_PLAYER_SKINNED = 0x2785, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2799, + SMSG_PLAY_MUSIC = 0x27A9, + SMSG_PLAY_OBJECT_SOUND = 0x27AA, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276F, SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46, SMSG_PLAY_SCENE = 0x2650, - SMSG_PLAY_SOUND = 0x27A5, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x27A8, + SMSG_PLAY_SOUND = 0x27A8, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AB, SMSG_PLAY_SPELL_VISUAL = 0x2C44, SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48, - SMSG_PLAY_TIME_WARNING = 0x2738, + SMSG_PLAY_TIME_WARNING = 0x2737, SMSG_PONG = 0x304D, - SMSG_POWER_UPDATE = 0x26FC, - SMSG_PRE_RESSURECT = 0x27A4, - SMSG_PRINT_NOTIFICATION = 0x25E0, - SMSG_PROC_RESIST = 0x279A, - SMSG_PROPOSE_LEVEL_GRANT = 0x270E, - SMSG_PVP_CREDIT = 0x2714, - SMSG_PVP_LOG_DATA = 0x25B2, - SMSG_PVP_OPTIONS_ENABLED = 0x25B5, - SMSG_PVP_SEASON = 0x25D3, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2701, - SMSG_QUERY_CREATURE_RESPONSE = 0x26F9, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26FA, - SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x2924, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E4, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27F8, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FD, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FF, - SMSG_QUERY_PETITION_RESPONSE = 0x2702, - SMSG_QUERY_PET_NAME_RESPONSE = 0x2700, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FE, + SMSG_POWER_UPDATE = 0x26FB, + SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2754, + SMSG_PRE_RESSURECT = 0x27A7, + SMSG_PRINT_NOTIFICATION = 0x25DE, + SMSG_PROC_RESIST = 0x279B, + SMSG_PROPOSE_LEVEL_GRANT = 0x270D, + SMSG_PVP_CREDIT = 0x2713, + SMSG_PVP_LOG_DATA = 0x25B1, + SMSG_PVP_OPTIONS_ENABLED = 0x25B4, + SMSG_PVP_SEASON = 0x25D1, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2700, + SMSG_QUERY_CREATURE_RESPONSE = 0x26F8, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F9, + SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27FC, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FC, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FE, + SMSG_QUERY_PETITION_RESPONSE = 0x2701, + SMSG_QUERY_PET_NAME_RESPONSE = 0x26FF, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FD, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A94, - SMSG_QUERY_TIME_RESPONSE = 0x2718, + SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2834, + SMSG_QUERY_TIME_RESPONSE = 0x2717, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8D, SMSG_QUEST_FORCE_REMOVED = 0x2A99, @@ -1427,65 +1445,64 @@ enum OpcodeServer : uint32 SMSG_QUEST_UPDATE_COMPLETE = 0x2A87, SMSG_QUEST_UPDATE_FAILED = 0x2A88, SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A89, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C0, - SMSG_RAID_DIFFICULTY_SET = 0x27E1, - SMSG_RAID_GROUP_ONLY = 0x27E3, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C3, + SMSG_RAID_DIFFICULTY_SET = 0x27E5, + SMSG_RAID_GROUP_ONLY = 0x27E7, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB9, - SMSG_RAID_MARKERS_CHANGED = 0x25B8, + SMSG_RAID_MARKERS_CHANGED = 0x25B7, SMSG_RANDOM_ROLL = 0x264A, - SMSG_RATED_BATTLEFIELD_INFO = 0x25A5, + SMSG_RATED_BATTLEFIELD_INFO = 0x25A4, SMSG_READY_CHECK_COMPLETED = 0x260D, SMSG_READY_CHECK_RESPONSE = 0x260C, SMSG_READY_CHECK_STARTED = 0x260B, - SMSG_READ_ITEM_RESULT_FAILED = 0x27DD, - SMSG_READ_ITEM_RESULT_OK = 0x27D9, - SMSG_REALM_QUERY_RESPONSE = 0x26E4, - SMSG_REALM_SPLIT = 0x26E1, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C1, + SMSG_READ_ITEM_RESULT_FAILED = 0x27E1, + SMSG_READ_ITEM_RESULT_OK = 0x27DC, + SMSG_REALM_QUERY_RESPONSE = 0x26E3, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C4, SMSG_REFER_A_FRIEND_EXPIRED = 0x275E, - SMSG_REFER_A_FRIEND_FAILURE = 0x26EA, + SMSG_REFER_A_FRIEND_FAILURE = 0x26E9, SMSG_REFRESH_COMPONENT = 0x2675, SMSG_REFRESH_SPELL_HISTORY = 0x2C2B, - SMSG_REMOVE_ITEM_PASSIVE = 0x25BF, + SMSG_REMOVE_ITEM_PASSIVE = 0x25BE, SMSG_REMOVE_LOSS_OF_CONTROL = 0x2694, - SMSG_REPLACE_TROPHY_RESPONSE = 0x27F5, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27F9, SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D7, SMSG_REQUEST_ADDON_LIST = 0x265C, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259E, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D4, - SMSG_RESEARCH_COMPLETE = 0x2586, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D2, + SMSG_RESEARCH_COMPLETE = 0x2585, SMSG_RESET_AREA_TRIGGER = 0x263E, SMSG_RESET_COMPRESSION_CONTEXT = 0x304E, SMSG_RESET_FAILED_NOTIFY = 0x26DF, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x2711, - SMSG_RESET_WEEKLY_CURRENCY = 0x2575, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x2710, + SMSG_RESET_WEEKLY_CURRENCY = 0x2574, SMSG_RESPEC_WIPE_CONFIRM = 0x2624, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2572, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571, SMSG_RESUME_CAST_BAR = 0x2C3D, SMSG_RESUME_COMMS = 0x304A, - SMSG_RESUME_TOKEN = 0x25BD, - SMSG_RESURRECT_REQUEST = 0x257F, - SMSG_RESYNC_RUNES = 0x273B, - SMSG_ROLE_CHANGED_INFORM = 0x258D, - SMSG_ROLE_CHOSEN = 0x2A39, - SMSG_ROLE_POLL_INFORM = 0x258E, - SMSG_RUNE_REGEN_DEBUG = 0x25C7, - SMSG_SCENARIO_BOOT = 0x27DE, - SMSG_SCENARIO_COMPLETED = 0x2818, + SMSG_RESUME_TOKEN = 0x25BC, + SMSG_RESURRECT_REQUEST = 0x257E, + SMSG_RESYNC_RUNES = 0x273A, + SMSG_ROLE_CHANGED_INFORM = 0x258C, + SMSG_ROLE_CHOSEN = 0x2A3A, + SMSG_ROLE_POLL_INFORM = 0x258D, + SMSG_RUNE_REGEN_DEBUG = 0x25C5, + SMSG_SCENARIO_BOOT = 0x27E2, + SMSG_SCENARIO_COMPLETED = 0x281C, SMSG_SCENARIO_POIS = 0x264C, SMSG_SCENARIO_PROGRESS_UPDATE = 0x2646, - SMSG_SCENARIO_SPELL_UPDATE = 0x2823, + SMSG_SCENARIO_SPELL_UPDATE = 0x2828, SMSG_SCENARIO_STATE = 0x2645, - SMSG_SCENE_OBJECT_EVENT = 0x25F7, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FC, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FD, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F9, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F8, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FB, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25FA, + SMSG_SCENE_OBJECT_EVENT = 0x25F6, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FB, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FC, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F8, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F7, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FA, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25F9, SMSG_SCRIPT_CAST = 0x2C53, - SMSG_SELL_RESPONSE = 0x26EE, - SMSG_SEND_ITEM_PASSIVES = 0x25C0, + SMSG_SELL_RESPONSE = 0x26ED, + SMSG_SEND_ITEM_PASSIVES = 0x25BF, SMSG_SEND_KNOWN_SPELLS = 0x2C29, SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2648, SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2649, @@ -1495,45 +1512,46 @@ enum OpcodeServer : uint32 SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2BC1, SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2667, SMSG_SERVER_TIME = 0x26A8, - SMSG_SETUP_CURRENCY = 0x2573, - SMSG_SETUP_RESEARCH_HISTORY = 0x2585, - SMSG_SET_ACTIVE_SPEC_ID = 0x263F, - SMSG_SET_AI_ANIM_KIT = 0x276D, - SMSG_SET_ALL_TASK_PROGRESS = 0x27C9, - SMSG_SET_ANIM_TIER = 0x2771, - SMSG_SET_CURRENCY = 0x2574, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2D, + SMSG_SETUP_CURRENCY = 0x2572, + SMSG_SETUP_RESEARCH_HISTORY = 0x2584, + SMSG_SET_AI_ANIM_KIT = 0x276E, + SMSG_SET_ALL_TASK_PROGRESS = 0x27CC, + SMSG_SET_ANIM_TIER = 0x2772, + SMSG_SET_CURRENCY = 0x2573, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, SMSG_SET_DUNGEON_DIFFICULTY = 0x26CB, - SMSG_SET_FACTION_AT_WAR = 0x273A, - SMSG_SET_FACTION_NOT_VISIBLE = 0x2768, - SMSG_SET_FACTION_STANDING = 0x2769, - SMSG_SET_FACTION_VISIBLE = 0x2767, + SMSG_SET_FACTION_AT_WAR = 0x2739, + SMSG_SET_FACTION_NOT_VISIBLE = 0x2769, + SMSG_SET_FACTION_STANDING = 0x276A, + SMSG_SET_FACTION_VISIBLE = 0x2768, SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, SMSG_SET_FORCED_REACTIONS = 0x2758, - SMSG_SET_ITEM_PURCHASE_DATA = 0x25AF, - SMSG_SET_LOOT_METHOD_FAILED = 0x2804, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B6, - SMSG_SET_MELEE_ANIM_KIT = 0x2770, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x276F, + SMSG_SET_ITEM_PURCHASE_DATA = 0x25AE, + SMSG_SET_LOOT_METHOD_FAILED = 0x2808, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B5, + SMSG_SET_MELEE_ANIM_KIT = 0x2771, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x2770, SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x25EA, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2705, - SMSG_SET_PLAY_HOVER_ANIM = 0x25CB, - SMSG_SET_PROFICIENCY = 0x2772, + SMSG_SET_PET_SPECIALIZATION = 0x263F, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2704, + SMSG_SET_PLAY_HOVER_ANIM = 0x25C9, + SMSG_SET_PROFICIENCY = 0x2773, SMSG_SET_SPELL_CHARGES = 0x2C28, - SMSG_SET_TASK_COMPLETE = 0x27CA, + SMSG_SET_TASK_COMPLETE = 0x27CD, SMSG_SET_TIME_ZONE_INFORMATION = 0x269C, - SMSG_SET_VEHICLE_REC_ID = 0x272D, - SMSG_SHOW_ADVENTURE_MAP = 0x2821, + SMSG_SET_VEHICLE_REC_ID = 0x272C, + SMSG_SHOW_ADVENTURE_MAP = 0x2826, SMSG_SHOW_BANK = 0x26A5, - SMSG_SHOW_MAILBOX = 0x27DF, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25F0, - SMSG_SHOW_TAXI_NODES = 0x26F5, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27AD, + SMSG_SHOW_MAILBOX = 0x27E3, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25EF, + SMSG_SHOW_TAXI_NODES = 0x26F4, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B0, SMSG_SOCKET_GEMS = 0x2765, - SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F2, + SMSG_SOCKET_GEMS_FAILURE = 0x2766, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F1, + SMSG_SPECIALIZATION_CHANGED = 0x25E9, SMSG_SPECIAL_MOUNT_ANIM = 0x26C5, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2754, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2753, SMSG_SPELL_ABSORB_LOG = 0x2C1E, SMSG_SPELL_CHANNEL_START = 0x2C34, SMSG_SPELL_CHANNEL_UPDATE = 0x2C35, @@ -1555,103 +1573,106 @@ enum OpcodeServer : uint32 SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C1B, SMSG_SPELL_START = 0x2C3A, SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2C33, - SMSG_SPIRIT_HEALER_CONFIRM = 0x2751, + SMSG_SPIRIT_HEALER_CONFIRM = 0x2750, SMSG_STAND_STATE_UPDATE = 0x2757, SMSG_START_ELAPSED_TIMER = 0x2619, SMSG_START_ELAPSED_TIMERS = 0x261B, SMSG_START_LOOT_ROLL = 0x262F, - SMSG_START_MIRROR_TIMER = 0x274B, - SMSG_START_TIMER = 0x25BA, + SMSG_START_MIRROR_TIMER = 0x274A, + SMSG_START_TIMER = 0x25B9, SMSG_STOP_ELAPSED_TIMER = 0x261A, - SMSG_STOP_MIRROR_TIMER = 0x274D, - SMSG_STOP_SPEAKERBOT_SOUND = 0x27A9, - SMSG_STREAMING_MOVIES = 0x25B9, + SMSG_STOP_MIRROR_TIMER = 0x274C, + SMSG_STOP_SPEAKERBOT_SOUND = 0x27AC, + SMSG_STREAMING_MOVIES = 0x25B8, SMSG_SUMMON_CANCEL = 0x26D6, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258F, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, SMSG_SUMMON_REQUEST = 0x275C, SMSG_SUPERCEDED_SPELLS = 0x2C4B, - SMSG_SUPPRESS_NPC_GREETINGS = 0x25CE, + SMSG_SUPPRESS_NPC_GREETINGS = 0x25CC, SMSG_SUSPEND_COMMS = 0x3049, - SMSG_SUSPEND_TOKEN = 0x25BC, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2753, + SMSG_SUSPEND_TOKEN = 0x25BB, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2752, SMSG_TAXI_NODE_STATUS = 0x26A2, SMSG_TEXT_EMOTE = 0x26A0, - SMSG_THREAT_CLEAR = 0x270D, - SMSG_THREAT_REMOVE = 0x270C, - SMSG_THREAT_UPDATE = 0x270B, + SMSG_THREAT_CLEAR = 0x270C, + SMSG_THREAT_REMOVE = 0x270B, + SMSG_THREAT_UPDATE = 0x270A, SMSG_TIME_ADJUSTMENT = 0x2DA1, SMSG_TIME_SYNC_REQUEST = 0x2DA0, - SMSG_TITLE_EARNED = 0x2708, - SMSG_TITLE_LOST = 0x2709, - SMSG_TOTEM_CREATED = 0x26F1, - SMSG_TOTEM_MOVED = 0x26F2, - SMSG_TRADE_STATUS = 0x2582, - SMSG_TRADE_UPDATED = 0x2581, - SMSG_TRAINER_BUY_FAILED = 0x2713, - SMSG_TRAINER_LIST = 0x2712, - SMSG_TRANSFER_ABORTED = 0x273E, - SMSG_TRANSFER_PENDING = 0x25E3, - SMSG_TRIGGER_CINEMATIC = 0x27FC, - SMSG_TRIGGER_MOVIE = 0x26F3, - SMSG_TURN_IN_PETITION_RESULT = 0x278D, - SMSG_TUTORIAL_FLAGS = 0x27F0, + SMSG_TITLE_EARNED = 0x2707, + SMSG_TITLE_LOST = 0x2708, + SMSG_TOTEM_CREATED = 0x26F0, + SMSG_TOTEM_MOVED = 0x26F1, + SMSG_TRADE_STATUS = 0x2581, + SMSG_TRADE_UPDATED = 0x2580, + SMSG_TRAINER_BUY_FAILED = 0x2712, + SMSG_TRAINER_LIST = 0x2711, + SMSG_TRANSFER_ABORTED = 0x273D, + SMSG_TRANSFER_PENDING = 0x25E2, + SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C4, + SMSG_TRIGGER_CINEMATIC = 0x2800, + SMSG_TRIGGER_MOVIE = 0x26F2, + SMSG_TURN_IN_PETITION_RESULT = 0x278E, + SMSG_TUTORIAL_FLAGS = 0x27F4, + SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x282E, + SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x282D, SMSG_TWITTER_STATUS = 0x2FFD, - SMSG_UI_TIME = 0x2750, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27FF, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2800, + SMSG_UI_TIME = 0x274F, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2803, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2804, SMSG_UNLEARNED_SPELLS = 0x2C4D, - SMSG_UPDATE_ACCOUNT_DATA = 0x2745, - SMSG_UPDATE_ACTION_BUTTONS = 0x25F5, - SMSG_UPDATE_CHARACTER_FLAGS = 0x27F4, - SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A30, + SMSG_UPDATE_ACCOUNT_DATA = 0x2744, + SMSG_UPDATE_ACTION_BUTTONS = 0x25F4, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27F8, + SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A31, SMSG_UPDATE_EXPANSION_LEVEL = 0x2660, SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26CE, SMSG_UPDATE_LAST_INSTANCE = 0x26AE, - SMSG_UPDATE_OBJECT = 0x27FD, - SMSG_UPDATE_TALENT_DATA = 0x25E9, - SMSG_UPDATE_TASK_PROGRESS = 0x27C8, + SMSG_UPDATE_OBJECT = 0x2801, + SMSG_UPDATE_TALENT_DATA = 0x25E8, + SMSG_UPDATE_TASK_PROGRESS = 0x27CB, SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, - SMSG_UPDATE_WORLD_STATE = 0x2788, + SMSG_UPDATE_WORLD_STATE = 0x2789, SMSG_USERLIST_ADD = 0x2BBE, SMSG_USERLIST_REMOVE = 0x2BBF, SMSG_USERLIST_UPDATE = 0x2BC0, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x278E, - SMSG_VENDOR_INVENTORY = 0x25C9, - SMSG_VIGNETTE_UPDATE = 0x27AB, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x278F, + SMSG_VENDOR_INVENTORY = 0x25C7, + SMSG_VIGNETTE_UPDATE = 0x27AE, SMSG_VOICE_CHAT_STATUS = 0x2BB3, SMSG_VOICE_PARENTAL_CONTROLS = 0x2BB4, SMSG_VOICE_SESSION_LEAVE = 0x2BB6, SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2BB5, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DE, - SMSG_VOID_STORAGE_CONTENTS = 0x25DB, - SMSG_VOID_STORAGE_FAILED = 0x25DA, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DC, - SMSG_VOID_TRANSFER_RESULT = 0x25DD, - SMSG_WAIT_QUEUE_FINISH = 0x256F, - SMSG_WAIT_QUEUE_UPDATE = 0x256E, - SMSG_WARDEN_DATA = 0x2577, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B3, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DC, + SMSG_VOID_STORAGE_CONTENTS = 0x25D9, + SMSG_VOID_STORAGE_FAILED = 0x25D8, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DA, + SMSG_VOID_TRANSFER_RESULT = 0x25DB, + SMSG_WAIT_QUEUE_FINISH = 0x256E, + SMSG_WAIT_QUEUE_UPDATE = 0x256D, + SMSG_WARDEN_DATA = 0x2576, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B2, SMSG_WEATHER = 0x26CD, SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, SMSG_WHO_IS = 0x26CC, - SMSG_WORLD_SERVER_INFO = 0x25C1, - SMSG_WORLD_TEXT = 0x281A, - SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280A, - SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x280C, - SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x280D, - SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280B, - SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2805, - SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x2806, - SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x2807, - SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x280E, - SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x280F, - SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2810, - SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x2808, - SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x2809, - SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2811, - SMSG_XP_GAIN_ABORTED = 0x25DF, - SMSG_XP_GAIN_ENABLED = 0x27E2, + SMSG_WORLD_SERVER_INFO = 0x25C0, + SMSG_WORLD_TEXT = 0x281E, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280E, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2810, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2811, + SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280F, + SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2809, + SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280A, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x280B, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2812, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2813, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2814, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x280C, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x280D, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2815, + SMSG_XP_GAIN_ABORTED = 0x25DD, + SMSG_XP_GAIN_ENABLED = 0x27E6, SMSG_ZONE_UNDER_ATTACK = 0x2BBA, SMSG_ZZZ_GLYPH_RELATED_LEGION = 0x2C51, @@ -1661,6 +1682,7 @@ enum OpcodeServer : uint32 SMSG_MULTIPLE_PACKETS = 0x3050, // Deleted opcodes, here only to allow compile + SMSG_ADDON_INFO = 0xBADD, SMSG_ARENA_TEAM_STATS = 0xBADD, SMSG_BUY_BANK_SLOT_RESULT = 0xBADD, SMSG_BF_MGR_EJECTED = 0xBADD, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 3d661e1a8ff..5becf594568 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -201,8 +201,6 @@ namespace WorldPackets class LoadingScreenNotify; class SetActionBarToggles; class RequestPlayedTime; - class ShowingCloak; - class ShowingHelm; class SetTitle; class SetFactionAtWar; class SetFactionNotAtWar; @@ -1162,10 +1160,6 @@ class TC_GAME_API WorldSession void HandleMountSpecialAnimOpcode(WorldPackets::Misc::MountSpecial& mountSpecial); - // character view - void HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet); - void HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet); - // repair void HandleRepairItemOpcode(WorldPackets::Item::RepairItem& packet); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 31e0b126be6..d22b6df71e4 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5291,7 +5291,7 @@ void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/) FactionTemplateEntry const* casterFaction = caster->GetFactionTemplateEntry(); FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION)); // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons) - if (!targetFaction || (casterFaction && targetFaction && !casterFaction->IsFriendlyTo(*targetFaction))) + if (!targetFaction || (casterFaction && targetFaction && !casterFaction->IsFriendlyTo(targetFaction))) gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 031ab5bdbdf..ec1c63076aa 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -20,8 +20,8 @@ #include "SpellAuraEffects.h" #include "SpellMgr.h" #include "Spell.h" -#include "DBCStores.h" #include "ConditionMgr.h" +#include "GameTables.h" #include "Player.h" #include "Battleground.h" #include "Vehicle.h" @@ -468,6 +468,9 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING)) level = _spellInfo->BaseLevel; + if (_spellInfo->Scaling.MinScalingLevel && _spellInfo->Scaling.MinScalingLevel > level) + level = _spellInfo->Scaling.MinScalingLevel; + if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel < level) level = _spellInfo->Scaling.MaxScalingLevel; @@ -481,8 +484,11 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* { if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL)) { - if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.EvaluateTable(level - 1, (_spellInfo->Scaling.Class > 0 ? _spellInfo->Scaling.Class : ((MAX_CLASSES - 1 /*last class*/) - _spellInfo->Scaling.Class)) - 1)) - value = gtScaling->value; + GtSpellScalingEntry const* gtScaling = sSpellScalingGameTable.GetRow(level); + if (_spellInfo->Scaling.Class > 0) + value = GetGameTableColumnForClass(gtScaling, _spellInfo->Scaling.Class); + else + value = gtScaling->Item; } else value = GetRandomPropertyPoints(itemLevel != -1 ? uint32(itemLevel) : 1u, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); @@ -600,10 +606,10 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* if (canEffectScale) { - GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(_spellInfo->SpellLevel - 1, 0); - GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0); + GtNpcManaCostScalerEntry const* spellScaler = sNpcManaCostScalerGameTable.GetRow(_spellInfo->SpellLevel); + GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(caster->getLevel()); if (spellScaler && casterScaler) - value *= casterScaler->ratio / spellScaler->ratio; + value *= casterScaler->Scaler / spellScaler->Scaler; } } } @@ -1729,7 +1735,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a // continent limitation (virtual continent) if (AttributesEx4 & SPELL_ATTR4_CAST_ONLY_IN_OUTLAND) { - uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id); + uint32 v_map = sDB2Manager.GetVirtualMapForMapAndZone(map_id, zone_id); MapEntry const* mapEntry = sMapStore.LookupEntry(v_map); if (!mapEntry || mapEntry->ExpansionID < 1 || !mapEntry->IsContinent()) return SPELL_FAILED_INCORRECT_AREA; @@ -2676,10 +2682,10 @@ std::vector SpellInfo::CalcPowerCost(Unit const* caster, Sp { if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION) { - GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(SpellLevel - 1, 0); - GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0); + GtNpcManaCostScalerEntry const* spellScaler = sNpcManaCostScalerGameTable.GetRow(SpellLevel); + GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(caster->getLevel()); if (spellScaler && casterScaler) - powerCost *= casterScaler->ratio / spellScaler->ratio; + powerCost *= casterScaler->Scaler / spellScaler->Scaler; } } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 764760ddffa..a5d620571a3 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -20,8 +20,6 @@ #include "SharedDefines.h" #include "Util.h" -#include "DBCStructure.h" -#include "DB2Structure.h" #include "Object.h" #include "SpellAuraDefines.h" @@ -409,6 +407,7 @@ public: struct ScalingInfo { int32 Class; + uint32 MinScalingLevel; uint32 MaxScalingLevel; uint32 ScalesFromItemLevel; } Scaling; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ebf82122e00..a7ad0e55d5b 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -21,7 +21,6 @@ #include "ObjectMgr.h" #include "SpellAuraDefines.h" #include "SharedDefines.h" -#include "DBCStores.h" #include "Chat.h" #include "BattlegroundMgr.h" #include "BattlefieldWG.h" diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index e9488d8ecbb..4d15043a220 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -22,7 +22,6 @@ // For static or at-server-startup loaded spell data #include "Define.h" -#include "DBCStructure.h" #include "SharedDefines.h" #include "Util.h" diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 255900b5414..04614d65ded 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -23,7 +23,6 @@ #include "Database/DatabaseEnv.h" #include "SpellMgr.h" #include "SpellInfo.h" -#include "DBCStores.h" void CharacterDatabaseCleaner::CleanDatabase() { diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 61e1755b4e4..28dabaefeb6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -41,6 +41,7 @@ #include "DatabaseEnv.h" #include "DisableMgr.h" #include "GameEventMgr.h" +#include "GameTables.h" #include "GarrisonMgr.h" #include "GridNotifiersImpl.h" #include "GroupMgr.h" @@ -1468,7 +1469,7 @@ void World::SetInitialWorldSettings() ///- Initialize VMapManager function pointers (to untangle game/collision circular deps) if (VMAP::VMapManager2* vmmgr2 = dynamic_cast(VMAP::VMapFactory::createOrGetVMapManager())) { - vmmgr2->GetLiquidFlagsPtr = &GetLiquidFlags; + vmmgr2->GetLiquidFlagsPtr = &DB2Manager::GetLiquidFlags; vmmgr2->IsVMAPDisabledForPtr = &DisableMgr::IsVMAPDisabledFor; } @@ -1518,8 +1519,6 @@ void World::SetInitialWorldSettings() LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realm.Id.Realm); // One-time query TC_LOG_INFO("server.loading", "Initialize data stores..."); - ///- Load DBCs - LoadDBCStores(m_dataPath, m_defaultDbcLocale); ///- Load DB2s sDB2Manager.LoadStores(m_dataPath, m_defaultDbcLocale); TC_LOG_INFO("misc", "Loading hotfix info..."); @@ -1527,7 +1526,7 @@ void World::SetInitialWorldSettings() ///- Close hotfix database - it is only used during DB2 loading HotfixDatabase.Close(); ///- Load GameTables - LoadGameTables(m_dataPath, m_defaultDbcLocale); + LoadGameTables(m_dataPath); //Load weighted graph on taxi nodes path sTaxiPathGraph.Initialize(); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index f9aca4b607b..b482716e059 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -559,7 +559,7 @@ public: { FactionState const& faction = itr->second; FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID); - char const* factionName = factionEntry ? factionEntry->Name_lang : "#Not found#"; + char const* factionName = factionEntry ? factionEntry->Name->Str[loc] : "#Not found#"; ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry); std::string rankName = handler->GetTrinityString(ReputationRankStrIndex[rank]); std::ostringstream ss; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 59eb97d1476..245aa60b846 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1540,11 +1540,11 @@ public: if (difficulty == -1) for (uint8 diff = 0; diff < MAX_DIFFICULTY; ++diff) { - if (GetMapDifficultyData(mEntry->ID, Difficulty(diff))) - sInstanceSaveMgr->ForceGlobalReset(mEntry->ID, Difficulty(diff)); + if (sDB2Manager.GetMapDifficultyData(map, Difficulty(diff))) + sInstanceSaveMgr->ForceGlobalReset(map, Difficulty(diff)); } else - sInstanceSaveMgr->ForceGlobalReset(mEntry->ID, Difficulty(difficulty)); + sInstanceSaveMgr->ForceGlobalReset(map, Difficulty(difficulty)); return true; } }; diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index dd048ce3c57..05b6a5c9713 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -509,7 +509,7 @@ public: return false; } - Zone2MapCoordinates(x, y, areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId); + sDB2Manager.Zone2MapCoordinates(areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId, x, y); if (!MapManager::IsValidMapCoord(zoneEntry->MapID, x, y)) { diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 2b3752c00be..01844aa937e 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -309,58 +309,77 @@ public: for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id) { - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(id)) + FactionEntry const* factionEntry = sFactionStore.LookupEntry(id); + if (factionEntry) { FactionState const* factionState = target ? target->GetReputationMgr().GetState(factionEntry) : NULL; - std::string name = factionEntry->Name_lang; + int locale = handler->GetSessionDbcLocale(); + std::string name = factionEntry->Name->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; - } + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; - // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format - // or "id - [faction] [no reputation]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << "]|h|r"; - else - ss << id << " - " << name; + name = factionEntry->Name->Str[locale]; + if (name.empty()) + continue; - if (factionState) // and then target != NULL also - { - uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry); - std::string rankName = handler->GetTrinityString(index); - - ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; - - if (factionState->Flags & FACTION_FLAG_VISIBLE) - ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); - if (factionState->Flags & FACTION_FLAG_AT_WAR) - ss << handler->GetTrinityString(LANG_FACTION_ATWAR); - if (factionState->Flags & FACTION_FLAG_PEACE_FORCED) - ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); - if (factionState->Flags & FACTION_FLAG_HIDDEN) - ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); - if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED) - ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); - if (factionState->Flags & FACTION_FLAG_INACTIVE) - ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); + if (Utf8FitTo(name, wNamePart)) + break; + } } - else - ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION); - handler->SendSysMessage(ss.str().c_str()); + if (locale < TOTAL_LOCALES) + { + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - if (!found) - found = true; + // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format + // or "id - [faction] [no reputation]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << ' ' << localeNames[locale] << "]|h|r"; + else + ss << id << " - " << name << ' ' << localeNames[locale]; + + if (factionState) // and then target != NULL also + { + uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry); + std::string rankName = handler->GetTrinityString(index); + + ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; + + if (factionState->Flags & FACTION_FLAG_VISIBLE) + ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); + if (factionState->Flags & FACTION_FLAG_AT_WAR) + ss << handler->GetTrinityString(LANG_FACTION_ATWAR); + if (factionState->Flags & FACTION_FLAG_PEACE_FORCED) + ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); + if (factionState->Flags & FACTION_FLAG_HIDDEN) + ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); + if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED) + ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); + if (factionState->Flags & FACTION_FLAG_INACTIVE) + ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); + } + else + ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION); + + handler->SendSysMessage(ss.str().c_str()); + + if (!found) + found = true; + } } } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index d66a6d24cc2..236197b84c9 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -207,7 +207,7 @@ public: float zoneX = object->GetPositionX(); float zoneY = object->GetPositionY(); - Map2ZoneCoordinates(zoneX, zoneY, zoneId); + sDB2Manager.Map2ZoneCoordinates(zoneId, zoneX, zoneY); Map const* map = object->GetMap(); float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT); @@ -1168,10 +1168,10 @@ public: if (itemNameStr && itemNameStr[0]) { std::string itemName = itemNameStr+1; - auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](std::pair kv) + auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](ItemSparseEntry const* sparse) { for (uint32 i = 0; i < MAX_LOCALES; ++i) - if (itemName == kv.second->Name->Str[i]) + if (itemName == sparse->Name->Str[i]) return true; return false; }); @@ -1183,7 +1183,7 @@ public: return false; } - itemId = itr->first; + itemId = itr->ID; } else return false; @@ -1795,7 +1795,7 @@ public: // Output XI. LANG_PINFO_CHR_RACE raceStr = DB2Manager::GetChrRaceName(raceid, locale); - classStr = GetClassName(classid, locale); + classStr = DB2Manager::GetClassName(classid, locale); handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str()); // Output XII. LANG_PINFO_CHR_ALIVE diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 47f1212f80a..435c3c74231 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1008,14 +1008,14 @@ public: if (factionEntry->ReputationIndex < 0) { - handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name_lang, factionId); + handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name->Str[handler->GetSessionDbcLocale()], factionId); handler->SetSentErrorMessage(true); return false; } target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false); target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry)); - handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->Name_lang, factionId, + handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->Name->Str[handler->GetSessionDbcLocale()], factionId, handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; } diff --git a/src/server/scripts/ScriptPCH.h b/src/server/scripts/ScriptPCH.h index 1cd25309055..cf31742f830 100644 --- a/src/server/scripts/ScriptPCH.h +++ b/src/server/scripts/ScriptPCH.h @@ -19,8 +19,7 @@ #include "CombatAI.h" #include "PassiveAI.h" #include "Chat.h" -#include "DBCStructure.h" -#include "DBCStores.h" +#include "DB2Stores.h" #include "ObjectMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 7dcd3a4fbb9..6619a108009 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -29,7 +29,6 @@ #include "SpellHistory.h" #include "SkillDiscovery.h" #include "Battleground.h" -#include "DBCStores.h" // Generic script for handling item dummy effects which trigger another spell. class spell_item_trigger_spell : public SpellScriptLoader diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index a13d6da8fae..31c20ccece9 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -745,6 +745,8 @@ class spell_mage_living_bomb : public SpellScriptLoader bool Validate(SpellInfo const* spellInfo) override { + if (!spellInfo->GetEffect(EFFECT_1)) + return false; if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->GetEffect(EFFECT_1)->CalcValue()))) return false; return true; diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp index 7852043a796..a56001cfe6a 100644 --- a/src/server/scripts/Spells/spell_pet.cpp +++ b/src/server/scripts/Spells/spell_pet.cpp @@ -107,9 +107,7 @@ class spell_gen_pet_calculate : public SpellScriptLoader if (Player* owner = GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritSpell = 0.0f; - // Crit from Intellect - CritSpell += owner->GetSpellCritFromIntellect(); + float CritSpell = 5.0f; // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -126,9 +124,7 @@ class spell_gen_pet_calculate : public SpellScriptLoader if (Player* owner = GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritMelee = 0.0f; - // Crit from Agility - CritMelee += owner->GetMeleeCritFromAgility(); + float CritMelee = 5.0f; // Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -676,9 +672,7 @@ public: if (Player* owner = GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritSpell = 0.0f; - // Crit from Intellect - CritSpell += owner->GetSpellCritFromIntellect(); + float CritSpell = 5.0f; // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -698,9 +692,7 @@ public: if (Player* owner = GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritMelee = 0.0f; - // Crit from Agility - CritMelee += owner->GetMeleeCritFromAgility(); + float CritMelee = 5.0f; // Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -1266,9 +1258,7 @@ public: if (GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritSpell = 0.0f; - // Crit from Intellect - // CritSpell += owner->GetSpellCritFromIntellect(); + float CritSpell = 5.0f; // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE // CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE); // Increase crit from SPELL_AURA_MOD_CRIT_PCT @@ -1287,9 +1277,7 @@ public: if (GetCaster()->GetOwner()->ToPlayer()) { // For others recalculate it from: - float CritMelee = 0.0f; - // Crit from Agility - // CritMelee += owner->GetMeleeCritFromAgility(); + float CritMelee = 5.0f; // Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT // CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT); // Increase crit from SPELL_AURA_MOD_CRIT_PCT diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp index 42914b4da17..2d5c11b9d5d 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -17,7 +17,7 @@ #include "Common.h" #include "DB2SparseStorageLoader.h" -#include "Database/DatabaseEnv.h" +#include "DatabaseEnv.h" #include "Log.h" DB2SparseFileLoader::DB2SparseFileLoader() @@ -201,6 +201,7 @@ uint32 DB2SparseFileLoader::GetFormatRecordSize(const char * format) { case FT_FLOAT: case FT_INT: + case FT_SORT: recordsize += 4; break; case FT_STRING: @@ -247,7 +248,7 @@ static char const* const nullStr = ""; char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable, uint32 locale, std::vector& stringPool) { typedef char* ptr; - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return NULL; //get struct size and index pos @@ -283,8 +284,8 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) ((char const**)stringHoldersPool)[i] = nullStr; - char* stringTable = new char[expandedDataSize - records * (recordsize - stringFields * sizeof(char*))]; - memset(stringTable, 0, expandedDataSize - records * (recordsize - stringFields * sizeof(char*))); + char* stringTable = new char[expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*))]; + memset(stringTable, 0, expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*))); stringPool.push_back(stringTable); char* stringPtr = stringTable; @@ -298,7 +299,7 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable.Insert(y + minIndex, &dataTable[offset]); uint32 fieldOffset = 0; uint32 stringFieldOffset = 0; - for (uint32 x = 0; x < fieldCount; x++) + for (uint32 x = 0; x < (fieldCount + (format[0] == FT_SORT ? 1 : 0)); x++) { switch (format[x]) { @@ -352,6 +353,10 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& offset += sizeof(char*); break; } + case FT_SORT: + *((uint32*)(&dataTable[offset])) = y + minIndex; + offset += 4; + break; } } @@ -363,7 +368,7 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) { - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return nullptr; if (!(localeMask & (1 << locale))) @@ -513,6 +518,7 @@ char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements break; case FT_IND: case FT_INT: + case FT_SORT: *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); offset += 4; break; @@ -617,6 +623,7 @@ void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStat case FT_FLOAT: case FT_IND: case FT_INT: + case FT_SORT: offset += 4; break; case FT_BYTE: diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index d101d12a52e..56a8dbbed65 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -253,8 +253,6 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) recordsize += sizeof(char*); break; case FT_SORT: - i = x; - break; case FT_IND: i = x; recordsize += 4; @@ -322,7 +320,6 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** } else { - ASSERT(indexField == 0); for (uint32 y = 0; y < recordCount; ++y) { uint32 ind = ((uint32*)idTable)[y]; @@ -353,48 +350,51 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** uint32 offset = 0; - if (idTableSize) - { - ASSERT(format[0] == 'd'); - ++format; - } - for (uint32 y = 0; y < recordCount; y++) { + uint32 indexVal; if (indexField >= 0) - indexTable[!idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]] = &dataTable[offset]; + indexVal = !idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]; else - indexTable[y] = &dataTable[offset]; + indexVal = y; - for (uint32 x = 0; x < fieldCount; x++) + indexTable[indexVal] = &dataTable[offset]; + + uint32 x = 0; + for (char const* fmt = format; *fmt != '\0'; ++fmt) { - switch (format[x]) + switch (*fmt) { case FT_FLOAT: - *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x); + *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x++); offset += 4; break; case FT_IND: case FT_INT: - *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x); + *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x++); offset += 4; break; case FT_BYTE: - *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x); + *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x++); offset += 1; break; case FT_LONG: - *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x); + *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x++); offset += 8; break; case FT_SHORT: - *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x); + *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x++); offset += 2; break; case FT_STRING: case FT_STRING_NOT_LOCALIZED: *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings offset += sizeof(char*); + ++x; + break; + case FT_SORT: + *((uint32*)(&dataTable[offset])) = indexVal; + offset += 4; break; } } @@ -444,21 +444,19 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da uint32 offset = 0; - if (idTableSize) - ++format; - // assign string holders to string field slots for (uint32 y = 0; y < recordCount; y++) { uint32 stringFieldOffset = 0; - for (uint32 x = 0; x < fieldCount; x++) + for (char const* fmt = format; *fmt != '\0'; ++fmt) { - switch (format[x]) + switch (*fmt) { case FT_FLOAT: case FT_IND: case FT_INT: + case FT_SORT: offset += 4; break; case FT_BYTE: @@ -476,7 +474,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da // init db2 string field slots by pointers to string holders char const*** slot = (char const***)(&dataTable[offset]); *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); - if (format[x] == FT_STRING) + if (*fmt == FT_STRING) stringFieldOffset += stringHolderSize; else ++stringFieldOffset; @@ -485,7 +483,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da break; } default: - ASSERT(false, "unknown format character %c", format[x]); + ASSERT(false, "unknown format character %c", *fmt); } } } @@ -521,18 +519,17 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin uint32 offset = 0; - if (idTableSize) - ++format; - for (uint32 y = 0; y < recordCount; y++) { - for (uint32 x = 0; x < fieldCount; x++) + uint32 x = 0; + for (char const* fmt = format; *fmt != '\0'; ++fmt) { - switch (format[x]) + switch (*fmt) { case FT_FLOAT: case FT_IND: case FT_INT: + case FT_SORT: offset += 4; break; case FT_BYTE: @@ -566,6 +563,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin break; } } + + if (*fmt != FT_SORT) + ++x; } } @@ -705,6 +705,10 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa offset += sizeof(char*); break; } + case FT_SORT: + *((int32*)(&dataValue[offset])) = indexValue; + offset += 4; + break; } } @@ -769,6 +773,7 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements case FT_FLOAT: case FT_IND: case FT_INT: + case FT_SORT: offset += 4; break; case FT_BYTE: diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index d1542faa194..e1c05cfbbe7 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -245,8 +245,8 @@ public: iterator_wrapper(iterator_wrapper const& right) = default; iterator_wrapper(Base const& baseItr) : Base(baseItr) { } - uint32 ID() const { return (*this)->first; } - T const* Data() const { return (*this)->second; } + T const* operator->() const { return Base::operator->()->second; } + T const* operator*() const { return Base::operator*().second; } } iterator; DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp deleted file mode 100644 index ace59bb9ebb..00000000000 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include -#include -#include - -#include "DBCFileLoader.h" -#include "Errors.h" - -DBCFileLoader::DBCFileLoader() : recordSize(0), recordCount(0), fieldCount(0), stringSize(0), fieldsOffset(NULL), data(NULL), stringTable(NULL) { } - -bool DBCFileLoader::Load(const char* filename, const char* fmt) -{ - uint32 header; - if (data) - { - delete [] data; - data = NULL; - } - - FILE* f = fopen(filename, "rb"); - if (!f) - return false; - - if (fread(&header, 4, 1, f) != 1) // Number of records - { - fclose(f); - return false; - } - - - EndianConvert(header); - - if (header != 0x43424457) //'WDBC' - { - fclose(f); - return false; - } - - if (fread(&recordCount, 4, 1, f) != 1) // Number of records - { - fclose(f); - return false; - } - - EndianConvert(recordCount); - - if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields - { - fclose(f); - return false; - } - - EndianConvert(fieldCount); - - if (fread(&recordSize, 4, 1, f) != 1) // Size of a record - { - fclose(f); - return false; - } - - EndianConvert(recordSize); - - if (fread(&stringSize, 4, 1, f) != 1) // String size - { - fclose(f); - return false; - } - - EndianConvert(stringSize); - - fieldsOffset = new uint32[fieldCount]; - fieldsOffset[0] = 0; - for (uint32 i = 1; i < fieldCount; ++i) - { - fieldsOffset[i] = fieldsOffset[i - 1]; - if (fmt[i - 1] == FT_BYTE || fmt[i - 1] == FT_NA_BYTE) // byte fields - fieldsOffset[i] += sizeof(uint8); - else if (fmt[i - 1] == FT_LONG) - fieldsOffset[i] += sizeof(uint64); - else // 4 byte fields (int32/float/strings) - fieldsOffset[i] += sizeof(uint32); - } - - data = new unsigned char[recordSize * recordCount + stringSize]; - stringTable = data + recordSize*recordCount; - - if (fread(data, recordSize * recordCount + stringSize, 1, f) != 1) - { - fclose(f); - return false; - } - - fclose(f); - - return true; -} - -DBCFileLoader::~DBCFileLoader() -{ - delete[] data; - - delete[] fieldsOffset; -} - -DBCFileLoader::Record DBCFileLoader::getRecord(size_t id) -{ - assert(data); - return Record(*this, data + id * recordSize); -} - -uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos) -{ - uint32 recordsize = 0; - int32 i = -1; - for (uint32 x = 0; format[x]; ++x) - { - switch (format[x]) - { - case FT_FLOAT: - recordsize += sizeof(float); - break; - case FT_INT: - recordsize += sizeof(uint32); - break; - case FT_STRING: - recordsize += sizeof(char*); - break; - case FT_SORT: - i = x; - break; - case FT_IND: - i = x; - recordsize += sizeof(uint32); - break; - case FT_BYTE: - recordsize += sizeof(uint8); - break; - case FT_LONG: - recordsize += sizeof(uint64); - break; - case FT_NA: - case FT_NA_BYTE: - break; - default: - ASSERT(false && "Unknown field format character in DBCfmt.h"); - break; - } - } - - if (index_pos) - *index_pos = i; - - return recordsize; -} - -char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable) -{ - typedef char* ptr; - if (strlen(format) != fieldCount) - return NULL; - - //get struct size and index pos - int32 i; - uint32 recordsize = GetFormatRecordSize(format, &i); - - if (i >= 0) - { - uint32 maxi = 0; - //find max index - for (uint32 y = 0; y < recordCount; ++y) - { - uint32 ind = getRecord(y).getUInt(i); - if (ind > maxi) - maxi = ind; - } - - // If higher index avalible from sql - use it instead of dbcs - if (sqlHighestIndex > maxi) - maxi = sqlHighestIndex; - - ++maxi; - records = maxi; - indexTable = new ptr[maxi]; - memset(indexTable, 0, maxi * sizeof(ptr)); - } - else - { - records = recordCount + sqlRecordCount; - indexTable = new ptr[recordCount + sqlRecordCount]; - } - - char* dataTable = new char[(recordCount + sqlRecordCount) * recordsize]; - - uint32 offset = 0; - - for (uint32 y = 0; y < recordCount; ++y) - { - if (i >= 0) - indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; - else - indexTable[y] = &dataTable[offset]; - - for (uint32 x=0; x < fieldCount; ++x) - { - switch (format[x]) - { - case FT_FLOAT: - *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x); - offset += sizeof(float); - break; - case FT_IND: - case FT_INT: - *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x); - offset += sizeof(uint32); - break; - case FT_BYTE: - *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x); - offset += sizeof(uint8); - break; - case FT_LONG: - *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x); - offset += sizeof(uint64); - break; - case FT_STRING: - *((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings - offset += sizeof(char*); - break; - case FT_NA: - case FT_NA_BYTE: - case FT_SORT: - break; - default: - ASSERT(false && "Unknown field format character in DBCfmt.h"); - break; - } - } - } - - sqlDataTable = dataTable + offset; - - return dataTable; -} - -char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable) -{ - if (strlen(format) != fieldCount) - return NULL; - - char* stringPool = new char[stringSize]; - memcpy(stringPool, stringTable, stringSize); - - uint32 offset = 0; - - for (uint32 y = 0; y < recordCount; ++y) - { - for (uint32 x = 0; x < fieldCount; ++x) - { - switch (format[x]) - { - case FT_FLOAT: - offset += sizeof(float); - break; - case FT_IND: - case FT_INT: - offset += sizeof(uint32); - break; - case FT_BYTE: - offset += sizeof(uint8); - break; - case FT_LONG: - offset += sizeof(uint64); - break; - case FT_STRING: - { - // fill only not filled entries - char** slot = (char**)(&dataTable[offset]); - if (!*slot || !**slot) - { - const char * st = getRecord(y).getString(x); - *slot=stringPool+(st-(const char*)stringTable); - } - offset += sizeof(char*); - break; - } - case FT_NA: - case FT_NA_BYTE: - case FT_SORT: - break; - default: - ASSERT(false && "Unknown field format character in DBCfmt.h"); - break; - } - } - } - - return stringPool; -} diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h deleted file mode 100644 index e58031e6ccc..00000000000 --- a/src/server/shared/DataStores/DBCFileLoader.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef DBC_FILE_LOADER_H -#define DBC_FILE_LOADER_H - -#include "Define.h" -#include "Utilities/ByteConverter.h" -#include - -class TC_SHARED_API DBCFileLoader -{ - public: - DBCFileLoader(); - ~DBCFileLoader(); - - bool Load(const char *filename, const char *fmt); - - class Record - { - public: - float getFloat(size_t field) const - { - assert(field < file.fieldCount); - float val = *reinterpret_cast(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - uint32 getUInt(size_t field) const - { - assert(field < file.fieldCount); - uint32 val = *reinterpret_cast(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - uint8 getUInt8(size_t field) const - { - assert(field < file.fieldCount); - return *reinterpret_cast(offset + file.GetOffset(field)); - } - uint64 getUInt64(size_t field) const - { - assert(field < file.fieldCount); - uint64 val = *reinterpret_cast(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - const char *getString(size_t field) const - { - assert(field < file.fieldCount); - size_t stringOffset = getUInt(field); - assert(stringOffset < file.stringSize); - return reinterpret_cast(file.stringTable + stringOffset); - } - - private: - Record(DBCFileLoader &file_, unsigned char *offset_): offset(offset_), file(file_) { } - unsigned char* offset; - DBCFileLoader& file; - - friend class DBCFileLoader; - - }; - - // Get record by id - Record getRecord(size_t id); - /// Get begin iterator over records - - uint32 GetNumRows() const { return recordCount; } - uint32 GetRowSize() const { return recordSize; } - uint32 GetCols() const { return fieldCount; } - uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; } - bool IsLoaded() const { return data != NULL; } - char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char *& sqlDataTable); - char* AutoProduceStrings(const char* fmt, char* dataTable); - static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL); - private: - - uint32 recordSize; - uint32 recordCount; - uint32 fieldCount; - uint32 stringSize; - uint32 *fieldsOffset; - unsigned char *data; - unsigned char *stringTable; - - DBCFileLoader(DBCFileLoader const& right) = delete; - DBCFileLoader& operator=(DBCFileLoader const& right) = delete; -}; -#endif diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h deleted file mode 100644 index c53d2a563fe..00000000000 --- a/src/server/shared/DataStores/DBCStore.h +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef DBCSTORE_H -#define DBCSTORE_H - -#include "DBCFileLoader.h" -#include "DBStorageIterator.h" -#include "Log.h" -#include "Field.h" -#include "DatabaseWorkerPool.h" -#include "Implementation/WorldDatabase.h" -#include "DatabaseEnv.h" - -struct SqlDbc -{ - std::string const* formatString; - std::string const* indexName; - std::string sqlTableName; - int32 indexPos; - int32 sqlIndexPos; - SqlDbc(std::string const* _filename, std::string const* _format, std::string const* _idname, char const* fmt) - : formatString(_format), indexName (_idname), sqlIndexPos(0) - { - // Convert dbc file name to sql table name - sqlTableName = *_filename; - for (uint32 i = 0; i< sqlTableName.size(); ++i) - { - if (isalpha(sqlTableName[i])) - sqlTableName[i] = char(tolower(sqlTableName[i])); - else if (sqlTableName[i] == '.') - sqlTableName[i] = '_'; - } - - // Get sql index position - DBCFileLoader::GetFormatRecordSize(fmt, &indexPos); - if (indexPos >= 0) - { - uint32 uindexPos = uint32(indexPos); - for (uint32 x = 0; x < formatString->size(); ++x) - { - // Count only fields present in sql - if ((*formatString)[x] == FT_SQL_PRESENT) - { - if (x == uindexPos) - break; - ++sqlIndexPos; - } - } - } - } - -private: - SqlDbc(SqlDbc const& right) = delete; - SqlDbc& operator=(SqlDbc const& right) = delete; -}; - -template -class DBCStorage -{ - typedef std::list StringPoolList; - - public: - typedef DBStorageIterator iterator; - - explicit DBCStorage(char const* f) - : fmt(f), nCount(0), fieldCount(0), dataTable(NULL) - { - indexTable.asT = NULL; - } - - ~DBCStorage() { Clear(); } - - T const* LookupEntry(uint32 id) const - { - return (id >= nCount) ? NULL : indexTable.asT[id]; - } - - T const* AssertEntry(uint32 id) const - { - T const* entry = LookupEntry(id); - ASSERT(entry); - return entry; - } - - uint32 GetNumRows() const { return nCount; } - char const* GetFormat() const { return fmt; } - uint32 GetFieldCount() const { return fieldCount; } - - bool Load(char const* fn, SqlDbc* sql) - { - DBCFileLoader dbc; - // Check if load was successful, only then continue - if (!dbc.Load(fn, fmt)) - return false; - - uint32 sqlRecordCount = 0; - uint32 sqlHighestIndex = 0; - Field* fields = NULL; - QueryResult result = QueryResult(NULL); - // Load data from sql - if (sql) - { - std::string query = "SELECT * FROM " + sql->sqlTableName; - if (sql->indexPos >= 0) - query +=" ORDER BY " + *sql->indexName + " DESC"; - query += ';'; - - - result = WorldDatabase.Query(query.c_str()); - if (result) - { - sqlRecordCount = uint32(result->GetRowCount()); - if (sql->indexPos >= 0) - { - fields = result->Fetch(); - sqlHighestIndex = fields[sql->sqlIndexPos].GetUInt32(); - } - - // Check if sql index pos is valid - if (int32(result->GetFieldCount() - 1) < sql->sqlIndexPos) - { - TC_LOG_ERROR("server.loading", "Invalid index pos for dbc:'%s'", sql->sqlTableName.c_str()); - return false; - } - } - } - - char* sqlDataTable = NULL; - fieldCount = dbc.GetCols(); - - dataTable = reinterpret_cast(dbc.AutoProduceData(fmt, nCount, indexTable.asChar, - sqlRecordCount, sqlHighestIndex, sqlDataTable)); - - stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast(dataTable))); - - // Insert sql data into arrays - if (result) - { - if (indexTable.asT) - { - uint32 offset = 0; - uint32 rowIndex = dbc.GetNumRows(); - do - { - if (!fields) - fields = result->Fetch(); - - if (sql->indexPos >= 0) - { - uint32 id = fields[sql->sqlIndexPos].GetUInt32(); - if (indexTable.asT[id]) - { - TC_LOG_ERROR("server.loading", "Index %d already exists in dbc:'%s'", id, sql->sqlTableName.c_str()); - return false; - } - - indexTable.asT[id] = reinterpret_cast(&sqlDataTable[offset]); - } - else - indexTable.asT[rowIndex]= reinterpret_cast(&sqlDataTable[offset]); - - uint32 columnNumber = 0; - uint32 sqlColumnNumber = 0; - - for (; columnNumber < sql->formatString->size(); ++columnNumber) - { - if ((*sql->formatString)[columnNumber] == FT_SQL_ABSENT) - { - switch (fmt[columnNumber]) - { - case FT_FLOAT: - *reinterpret_cast(&sqlDataTable[offset]) = 0.0f; - offset += 4; - break; - case FT_IND: - case FT_INT: - *reinterpret_cast(&sqlDataTable[offset]) = uint32(0); - offset += 4; - break; - case FT_BYTE: - *reinterpret_cast(&sqlDataTable[offset]) = uint8(0); - offset += 1; - break; - case FT_LONG: - *reinterpret_cast(&sqlDataTable[offset]) = uint64(0); - offset += 8; - break; - case FT_STRING: - // Beginning of the pool - empty string - *reinterpret_cast(&sqlDataTable[offset]) = stringPoolList.back(); - offset += sizeof(char*); - break; - } - } - else if ((*sql->formatString)[columnNumber] == FT_SQL_PRESENT) - { - bool validSqlColumn = true; - switch (fmt[columnNumber]) - { - case FT_FLOAT: - *reinterpret_cast(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetFloat(); - offset += 4; - break; - case FT_IND: - case FT_INT: - *reinterpret_cast(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt32(); - offset += 4; - break; - case FT_BYTE: - *reinterpret_cast(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt8(); - offset += 1; - break; - case FT_LONG: - *reinterpret_cast(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt64(); - offset += 8; - break; - case FT_STRING: - TC_LOG_ERROR("server.loading", "Unsupported data type in table '%s' at char %d", sql->sqlTableName.c_str(), columnNumber); - return false; - case FT_SORT: - break; - default: - validSqlColumn = false; - break; - } - if (validSqlColumn && (columnNumber != (sql->formatString->size()-1))) - sqlColumnNumber++; - } - else - { - TC_LOG_ERROR("server.loading", "Incorrect sql format string '%s' at char %d", sql->sqlTableName.c_str(), columnNumber); - return false; - } - } - - if (sqlColumnNumber != (result->GetFieldCount() - 1)) - { - TC_LOG_ERROR("server.loading", "SQL and DBC format strings are not matching for table: '%s'", sql->sqlTableName.c_str()); - return false; - } - - fields = NULL; - ++rowIndex; - } while (result->NextRow()); - } - } - - // error in dbc file at loading if NULL - return indexTable.asT != NULL; - } - - bool LoadStringsFrom(char const* fn) - { - // DBC must be already loaded using Load - if (!indexTable.asT) - return false; - - DBCFileLoader dbc; - // Check if load was successful, only then continue - if (!dbc.Load(fn, fmt)) - return false; - - stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast(dataTable))); - - return true; - } - - void Clear() - { - if (!indexTable.asT) - return; - - delete[] reinterpret_cast(indexTable.asT); - indexTable.asT = NULL; - delete[] reinterpret_cast(dataTable); - dataTable = NULL; - - while (!stringPoolList.empty()) - { - delete[] stringPoolList.front(); - stringPoolList.pop_front(); - } - - nCount = 0; - } - - iterator begin() { return iterator(indexTable.asT, nCount); } - iterator end() { return iterator(indexTable.asT, nCount, nCount); } - - private: - char const* fmt; - uint32 nCount; - uint32 fieldCount; - - union - { - T** asT; - char** asChar; - } - indexTable; - - T* dataTable; - StringPoolList stringPoolList; - - DBCStorage(DBCStorage const& right) = delete; - DBCStorage& operator=(DBCStorage const& right) = delete; -}; - -#endif diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h index 3f9fa6eed24..5568397b245 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -35,9 +35,6 @@ public: } } - uint32 ID() const { return _pos; } - T const* Data() const { return _index[_pos]; } - T const* operator->() { return _index[_pos]; } T const* operator*() { return _index[_pos]; } -- cgit v1.2.3 From df6d557a4d778093ec522d2c39c6c01acc41d978 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 26 Apr 2016 18:56:35 +0200 Subject: Core/Entities: Updated updatefields to 7.0.3.21414 --- sql/base/characters_database.sql | 1 - .../2016_xx_xx_xx_characters_legion_03.sql | 1 + .../world/2016_xx_xx_xx_world_legion_01.sql | 1 + .../Database/Implementation/CharacterDatabase.cpp | 4 +- src/server/game/Entities/Creature/Creature.cpp | 9 +- .../Entities/Object/Updates/UpdateFieldFlags.cpp | 65 ++++- .../game/Entities/Object/Updates/UpdateFields.h | 280 +++++++++++---------- src/server/game/Entities/Pet/Pet.cpp | 1 - src/server/game/Entities/Player/Player.cpp | 20 +- src/server/game/Entities/Player/Player.h | 2 +- src/server/game/Entities/Unit/StatSystem.cpp | 5 +- src/server/game/Entities/Unit/Unit.cpp | 7 +- src/server/game/Entities/Unit/Unit.h | 15 +- src/server/game/Globals/ObjectMgr.cpp | 9 - src/server/game/Miscellaneous/SharedDefines.h | 3 +- 15 files changed, 231 insertions(+), 192 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_03.sql create mode 100644 sql/updates/world/2016_xx_xx_xx_world_legion_01.sql (limited to 'src/server/database') diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 1d9fc2dcfcc..1f20780bc92 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1460,7 +1460,6 @@ CREATE TABLE `character_stats` ( `agility` int(10) unsigned NOT NULL DEFAULT '0', `stamina` int(10) unsigned NOT NULL DEFAULT '0', `intellect` int(10) unsigned NOT NULL DEFAULT '0', - `spirit` int(10) unsigned NOT NULL DEFAULT '0', `armor` int(10) unsigned NOT NULL DEFAULT '0', `resHoly` int(10) unsigned NOT NULL DEFAULT '0', `resFire` int(10) unsigned NOT NULL DEFAULT '0', diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_03.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_03.sql new file mode 100644 index 00000000000..03320194c94 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_03.sql @@ -0,0 +1 @@ +ALTER TABLE `character_stats` DROP `spirit`; diff --git a/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql b/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql new file mode 100644 index 00000000000..44e87058b38 --- /dev/null +++ b/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sha_mana_tide_totem'; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6399b588b5d..6055abdd08d 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -578,9 +578,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, strength, agility, stamina, intellect, spirit, " + PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, strength, agility, stamina, intellect, " "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, " - "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 979390baaeb..553b4f0babc 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -702,9 +702,8 @@ void Creature::RegenerateMana() if (IsInCombat() || !GetCharmerOrOwnerGUID().IsEmpty()) { float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA); - float Spirit = GetStat(STAT_SPIRIT); - addvalue = uint32((Spirit / 5.0f + 17.0f) * ManaIncreaseRate); + addvalue = uint32((27.0f / 5.0f + 17.0f) * ManaIncreaseRate); } else addvalue = maxValue / 3; @@ -737,12 +736,8 @@ void Creature::RegenerateHealth() if (!GetCharmerOrOwnerGUID().IsEmpty()) { float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH); - float Spirit = GetStat(STAT_SPIRIT); - if (GetPower(POWER_MANA) > 0) - addvalue = uint32(Spirit * 0.25 * HealthIncreaseRate); - else - addvalue = uint32(Spirit * 0.80 * HealthIncreaseRate); + addvalue = 0.015f * ((float)GetMaxHealth()) * HealthIncreaseRate; } else addvalue = maxValue/3; diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp index bafdac92251..52a975d6032 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -393,17 +393,14 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT+1 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT+2 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT+3 - UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT+4 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT+1 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT+2 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT+3 - UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT+4 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT+1 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT+2 UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT+3 - UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT+4 UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+1 UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+2 @@ -437,6 +434,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_ATTACK_SPEED_AURA UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_MINRANGEDDAMAGE UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_MAXRANGEDDAMAGE UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER @@ -1249,6 +1247,56 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+747 UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+748 UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+749 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+750 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+751 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+752 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+753 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+754 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+755 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+756 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+757 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+758 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+759 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+760 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+761 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+762 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+763 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+764 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+765 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+766 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+767 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+768 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+769 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+770 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+771 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+772 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+773 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+774 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+775 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+776 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+777 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+778 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+779 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+780 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+781 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+782 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+783 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+784 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+785 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+786 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+787 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+788 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+789 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+790 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+791 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+792 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+793 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+794 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+795 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+796 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+797 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+798 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG+799 UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+1 UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+2 @@ -2051,6 +2099,10 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FARSIGHT+1 UF_FLAG_PRIVATE, // PLAYER_FARSIGHT+2 UF_FLAG_PRIVATE, // PLAYER_FARSIGHT+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID + UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+3 UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+1 UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+2 @@ -2939,6 +2991,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+35 UF_FLAG_PRIVATE, // PLAYER_FIELD_MAX_LEVEL UF_FLAG_PRIVATE, // PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA + UF_FLAG_PRIVATE, // PLAYER_FIELD_MAX_CREATURE_SCALING_LEVEL UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1 UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1+1 UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1+2 @@ -2960,10 +3013,6 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_UI_SPELL_HIT_MODIFIER UF_FLAG_PRIVATE, // PLAYER_FIELD_HOME_REALM_TIME_OFFSET UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_PET_HASTE - UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID - UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+1 - UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+2 - UF_FLAG_PRIVATE, // PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+3 UF_FLAG_PRIVATE | UF_FLAG_URGENT_SELF_ONLY, // PLAYER_FIELD_BYTES2 UF_FLAG_PRIVATE, // PLAYER_FIELD_LFG_BONUS_FACTION_ID UF_FLAG_PRIVATE, // PLAYER_FIELD_LOOT_SPEC_ID @@ -3872,6 +3921,7 @@ uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END] = UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_TOYS UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_TRANSMOG UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG + UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS }; uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END] = @@ -4030,6 +4080,7 @@ uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END] = UF_FLAG_DYNAMIC, // AREATRIGGER_SPELLVISUALID UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // AREATRIGGER_BOUNDS_RADIUS_2D UF_FLAG_PUBLIC, // AREATRIGGER_DECAL_PROPERTIES_ID + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_VISUAL_ANIMATION }; uint32 SceneObjectUpdateFieldFlags[SCENEOBJECT_END] = diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 12de8ccd7b7..f599c8e5a04 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_H #define _UPDATEFIELDS_H -// Auto generated for version 7, 0, 1, 20810 +// Auto generated for version 7, 0, 3, 21414 enum ObjectFields { @@ -142,46 +142,47 @@ enum UnitFields UNIT_CREATED_BY_SPELL = OBJECT_END + 0x071, // Size: 1, Flags: PUBLIC UNIT_NPC_FLAGS = OBJECT_END + 0x072, // Size: 2, Flags: PUBLIC, DYNAMIC UNIT_NPC_EMOTESTATE = OBJECT_END + 0x074, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STAT = OBJECT_END + 0x075, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT = OBJECT_END + 0x07A, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT = OBJECT_END + 0x07F, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x084, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x08B, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x092, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x099, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BASE_MANA = OBJECT_END + 0x09A, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x09B, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BYTES_2 = OBJECT_END + 0x09C, // Size: 1, Flags: PUBLIC - UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09F, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A0, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0A1, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x0A2, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x0A3, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A4, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x0A5, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x0A6, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x0A7, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0AE, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x0B5, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x0B6, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF = OBJECT_END + 0x0B7, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL = OBJECT_END + 0x0B8, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MAXITEMLEVEL = OBJECT_END + 0x0B9, // Size: 1, Flags: PUBLIC - UNIT_FIELD_WILD_BATTLEPET_LEVEL = OBJECT_END + 0x0BA, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP = OBJECT_END + 0x0BB, // Size: 1, Flags: PUBLIC - UNIT_FIELD_INTERACT_SPELLID = OBJECT_END + 0x0BC, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x0BD, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_ID = OBJECT_END + 0x0BE, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_KIT_ID = OBJECT_END + 0x0BF, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_WORLD_EFFECT_ID = OBJECT_END + 0x0C0, // Size: 4, Flags: DYNAMIC, URGENT - UNIT_FIELD_SCALE_DURATION = OBJECT_END + 0x0C4, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_MOUNT_ID = OBJECT_END + 0x0C5, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_CREATURE_ID = OBJECT_END + 0x0C6, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_ID = OBJECT_END + 0x0C7, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET = OBJECT_END + 0x0C8, // Size: 4, Flags: PUBLIC - UNIT_END = OBJECT_END + 0x0CC, + UNIT_FIELD_STAT = OBJECT_END + 0x075, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT = OBJECT_END + 0x079, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT = OBJECT_END + 0x07D, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCES = OBJECT_END + 0x081, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x088, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x08F, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x096, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BASE_MANA = OBJECT_END + 0x097, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x098, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BYTES_2 = OBJECT_END + 0x099, // Size: 1, Flags: PUBLIC + UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x09A, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09B, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09C, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09F, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x0A0, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A1, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_SPEED_AURA = OBJECT_END + 0x0A2, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x0A3, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x0A4, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x0A5, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0AC, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x0B3, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x0B4, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF = OBJECT_END + 0x0B5, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MIN_ITEM_LEVEL = OBJECT_END + 0x0B6, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MAXITEMLEVEL = OBJECT_END + 0x0B7, // Size: 1, Flags: PUBLIC + UNIT_FIELD_WILD_BATTLEPET_LEVEL = OBJECT_END + 0x0B8, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP = OBJECT_END + 0x0B9, // Size: 1, Flags: PUBLIC + UNIT_FIELD_INTERACT_SPELLID = OBJECT_END + 0x0BA, // Size: 1, Flags: PUBLIC + UNIT_FIELD_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x0BB, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_ANIM_ID = OBJECT_END + 0x0BC, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_ANIM_KIT_ID = OBJECT_END + 0x0BD, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_WORLD_EFFECT_ID = OBJECT_END + 0x0BE, // Size: 4, Flags: DYNAMIC, URGENT + UNIT_FIELD_SCALE_DURATION = OBJECT_END + 0x0C2, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOKS_LIKE_MOUNT_ID = OBJECT_END + 0x0C3, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOKS_LIKE_CREATURE_ID = OBJECT_END + 0x0C4, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOK_AT_CONTROLLER_ID = OBJECT_END + 0x0C5, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET = OBJECT_END + 0x0C6, // Size: 4, Flags: PUBLIC + UNIT_END = OBJECT_END + 0x0CA, }; enum UnitDynamicFields @@ -207,101 +208,102 @@ enum PlayerFields PLAYER_BYTES_4 = UNIT_END + 0x014, // Size: 1, Flags: PUBLIC PLAYER_DUEL_TEAM = UNIT_END + 0x015, // Size: 1, Flags: PUBLIC PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x016, // Size: 1, Flags: PUBLIC - PLAYER_QUEST_LOG = UNIT_END + 0x017, // Size: 750, Flags: PARTY_MEMBER - PLAYER_VISIBLE_ITEM = UNIT_END + 0x305, // Size: 38, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x32B, // Size: 1, Flags: PUBLIC - PLAYER_FAKE_INEBRIATION = UNIT_END + 0x32C, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_VIRTUAL_PLAYER_REALM = UNIT_END + 0x32D, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_CURRENT_SPEC_ID = UNIT_END + 0x32E, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID = UNIT_END + 0x32F, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_AVG_ITEM_LEVEL = UNIT_END + 0x330, // Size: 4, Flags: PUBLIC - PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY = UNIT_END + 0x334, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_PRESTIGE = UNIT_END + 0x335, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_HONOR_LEVEL = UNIT_END + 0x336, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x337, // Size: 748, Flags: PRIVATE - PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x337, - PLAYER_FARSIGHT = UNIT_END + 0x623, // Size: 4, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x627, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x633, // Size: 2, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x635, // Size: 1, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x636, // Size: 1, Flags: PRIVATE - PLAYER_SKILL_LINEID = UNIT_END + 0x637, // Size: 448, Flags: PRIVATE - PLAYER_CHARACTER_POINTS = UNIT_END + 0x7F7, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7F8, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x7F9, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x7FA, // Size: 1, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x7FB, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7FC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x805, // Size: 1, Flags: PRIVATE - PLAYER_SHIELD_BLOCK = UNIT_END + 0x806, // Size: 1, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x807, // Size: 1, Flags: PRIVATE - PLAYER_MASTERY = UNIT_END + 0x808, // Size: 1, Flags: PRIVATE - PLAYER_SPEED = UNIT_END + 0x809, // Size: 1, Flags: PRIVATE - PLAYER_LIFESTEAL = UNIT_END + 0x80A, // Size: 1, Flags: PRIVATE - PLAYER_AVOIDANCE = UNIT_END + 0x80B, // Size: 1, Flags: PRIVATE - PLAYER_STURDINESS = UNIT_END + 0x80C, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY = UNIT_END + 0x80D, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY_BONUS = UNIT_END + 0x80E, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x80F, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x810, // Size: 1, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x811, // Size: 256, Flags: PRIVATE - PLAYER_FIELD_REST_INFO = UNIT_END + 0x911, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x915, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x91C, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x923, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x92A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x92B, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x92C, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x92D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x92E, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x931, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x934, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x935, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x936, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x937, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x938, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x939, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x93A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x93B, // Size: 1, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x93C, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x93D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x93E, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x94A, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x956, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x957, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x958, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x959, // Size: 32, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x979, // Size: 36, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x99D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA = UNIT_END + 0x99E, // Size: 1, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x99F, // Size: 4, Flags: PRIVATE - PLAYER_PET_SPELL_POWER = UNIT_END + 0x9A3, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9A4, // Size: 10, Flags: PRIVATE - PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9AE, // Size: 2, Flags: PRIVATE - PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9B0, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9B1, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9B2, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9B3, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x9B4, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x9B8, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9B9, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9BA, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9BB, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9BC, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9C0, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9C7, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9C8, // Size: 875, Flags: PRIVATE - PLAYER_FIELD_HONOR = UNIT_END + 0xD33, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_HONOR_NEXT_LEVEL = UNIT_END + 0xD34, // Size: 1, Flags: PRIVATE - PLAYER_END = UNIT_END + 0xD35, + PLAYER_QUEST_LOG = UNIT_END + 0x017, // Size: 800, Flags: PARTY_MEMBER + PLAYER_VISIBLE_ITEM = UNIT_END + 0x337, // Size: 38, Flags: PUBLIC + PLAYER_CHOSEN_TITLE = UNIT_END + 0x35D, // Size: 1, Flags: PUBLIC + PLAYER_FAKE_INEBRIATION = UNIT_END + 0x35E, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_VIRTUAL_PLAYER_REALM = UNIT_END + 0x35F, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_CURRENT_SPEC_ID = UNIT_END + 0x360, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID = UNIT_END + 0x361, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_AVG_ITEM_LEVEL = UNIT_END + 0x362, // Size: 4, Flags: PUBLIC + PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY = UNIT_END + 0x366, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_PRESTIGE = UNIT_END + 0x367, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_HONOR_LEVEL = UNIT_END + 0x368, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x369, // Size: 748, Flags: PRIVATE + PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x369, + PLAYER_FARSIGHT = UNIT_END + 0x655, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x659, // Size: 4, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x65D, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x669, // Size: 2, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x66B, // Size: 1, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x66C, // Size: 1, Flags: PRIVATE + PLAYER_SKILL_LINEID = UNIT_END + 0x66D, // Size: 448, Flags: PRIVATE + PLAYER_CHARACTER_POINTS = UNIT_END + 0x82D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x82E, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x82F, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x830, // Size: 1, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x831, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x832, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x833, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x834, // Size: 1, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x835, // Size: 1, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x836, // Size: 1, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x837, // Size: 1, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x838, // Size: 1, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x839, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x83A, // Size: 1, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x83B, // Size: 1, Flags: PRIVATE + PLAYER_SHIELD_BLOCK = UNIT_END + 0x83C, // Size: 1, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x83D, // Size: 1, Flags: PRIVATE + PLAYER_MASTERY = UNIT_END + 0x83E, // Size: 1, Flags: PRIVATE + PLAYER_SPEED = UNIT_END + 0x83F, // Size: 1, Flags: PRIVATE + PLAYER_LIFESTEAL = UNIT_END + 0x840, // Size: 1, Flags: PRIVATE + PLAYER_AVOIDANCE = UNIT_END + 0x841, // Size: 1, Flags: PRIVATE + PLAYER_STURDINESS = UNIT_END + 0x842, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY = UNIT_END + 0x843, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY_BONUS = UNIT_END + 0x844, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x845, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x846, // Size: 1, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x847, // Size: 256, Flags: PRIVATE + PLAYER_FIELD_REST_INFO = UNIT_END + 0x947, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x94B, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x952, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x959, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x960, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x961, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x962, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x963, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x964, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x967, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x96A, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x96B, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x96C, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x96D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x96E, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x96F, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x970, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x971, // Size: 1, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x972, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x973, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x974, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x980, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x98C, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x98D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x98E, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x98F, // Size: 32, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x9AF, // Size: 36, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x9D3, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA = UNIT_END + 0x9D4, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MAX_CREATURE_SCALING_LEVEL = UNIT_END + 0x9D5, // Size: 1, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x9D6, // Size: 4, Flags: PRIVATE + PLAYER_PET_SPELL_POWER = UNIT_END + 0x9DA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9DB, // Size: 10, Flags: PRIVATE + PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9E5, // Size: 2, Flags: PRIVATE + PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9E7, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9E8, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9E9, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9EA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x9EB, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9EC, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9ED, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9EE, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9EF, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9F3, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9FA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9FB, // Size: 875, Flags: PRIVATE + PLAYER_FIELD_HONOR = UNIT_END + 0xD66, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_HONOR_NEXT_LEVEL = UNIT_END + 0xD67, // Size: 1, Flags: PRIVATE + PLAYER_END = UNIT_END + 0xD68, }; enum PlayerDynamicFields @@ -315,7 +317,8 @@ enum PlayerDynamicFields PLAYER_DYNAMIC_FIELD_TOYS = UNIT_DYNAMIC_END + 0x006, // Flags: PRIVATE PLAYER_DYNAMIC_FIELD_TRANSMOG = UNIT_DYNAMIC_END + 0x007, // Flags: PRIVATE PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG = UNIT_DYNAMIC_END + 0x008, // Flags: PRIVATE - PLAYER_DYNAMIC_END = UNIT_DYNAMIC_END + 0x009, + PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS = UNIT_DYNAMIC_END + 0x009, // Flags: PRIVATE + PLAYER_DYNAMIC_END = UNIT_DYNAMIC_END + 0x00A, }; enum GameObjectFields @@ -389,7 +392,8 @@ enum AreaTriggerFields AREATRIGGER_SPELLVISUALID = OBJECT_END + 0x017, // Size: 1, Flags: DYNAMIC AREATRIGGER_BOUNDS_RADIUS_2D = OBJECT_END + 0x018, // Size: 1, Flags: DYNAMIC, URGENT AREATRIGGER_DECAL_PROPERTIES_ID = OBJECT_END + 0x019, // Size: 1, Flags: PUBLIC - AREATRIGGER_END = OBJECT_END + 0x01A, + AREATRIGGER_VISUAL_ANIMATION = OBJECT_END + 0x01A, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_END = OBJECT_END + 0x01B, }; enum AreaTriggerDynamicFields diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index a3ca26c99c5..332924c0ea0 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -884,7 +884,6 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetCreateStat(STAT_AGILITY, 22); SetCreateStat(STAT_STAMINA, 25); SetCreateStat(STAT_INTELLECT, 28); - SetCreateStat(STAT_SPIRIT, 27); } SetBonusDamage(0); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2809cf121d1..fefceea25e1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7205,10 +7205,10 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) HandleStatModifier(UNIT_MOD_STAT_INTELLECT, BASE_VALUE, float(val), apply); ApplyStatBuffMod(STAT_INTELLECT, CalculatePct(val, GetModifierValue(UNIT_MOD_STAT_INTELLECT, BASE_PCT_EXCLUDE_CREATE)), apply); break; - case ITEM_MOD_SPIRIT: //modify spirit - HandleStatModifier(UNIT_MOD_STAT_SPIRIT, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_SPIRIT, CalculatePct(val, GetModifierValue(UNIT_MOD_STAT_SPIRIT, BASE_PCT_EXCLUDE_CREATE)), apply); - break; + // case ITEM_MOD_SPIRIT: //modify spirit + // HandleStatModifier(UNIT_MOD_STAT_SPIRIT, BASE_VALUE, float(val), apply); + // ApplyStatBuffMod(STAT_SPIRIT, CalculatePct(val, GetModifierValue(UNIT_MOD_STAT_SPIRIT, BASE_PCT_EXCLUDE_CREATE)), apply); + // break; case ITEM_MOD_STAMINA: //modify stamina HandleStatModifier(UNIT_MOD_STAT_STAMINA, BASE_VALUE, float(val), apply); ApplyStatBuffMod(STAT_STAMINA, CalculatePct(val, GetModifierValue(UNIT_MOD_STAT_STAMINA, BASE_PCT_EXCLUDE_CREATE)), apply); @@ -12930,11 +12930,11 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply); ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply); break; - case ITEM_MOD_SPIRIT: - TC_LOG_DEBUG("entities.player.items", "+ %u SPIRIT", enchant_amount); - HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply); - ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply); - break; + // case ITEM_MOD_SPIRIT: + // TC_LOG_DEBUG("entities.player.items", "+ %u SPIRIT", enchant_amount); + // HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply); + // ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply); + // break; case ITEM_MOD_STAMINA: TC_LOG_DEBUG("entities.player.items", "+ %u STAMINA", enchant_amount); HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply); @@ -19641,7 +19641,7 @@ void Player::outDebugValues() const TC_LOG_DEBUG("entities.unit", "HP is: \t\t\t%u\t\tMP is: \t\t\t%u", GetMaxHealth(), GetMaxPower(POWER_MANA)); TC_LOG_DEBUG("entities.unit", "AGILITY is: \t\t%f\t\tSTRENGTH is: \t\t%f", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH)); - TC_LOG_DEBUG("entities.unit", "INTELLECT is: \t\t%f\t\tSPIRIT is: \t\t%f", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT)); + TC_LOG_DEBUG("entities.unit", "INTELLECT is: \t\t%f", GetStat(STAT_INTELLECT)); TC_LOG_DEBUG("entities.unit", "STAMINA is: \t\t%f", GetStat(STAT_STAMINA)); TC_LOG_DEBUG("entities.unit", "Armor is: \t\t%u\t\tBlock is: \t\t%f", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE)); TC_LOG_DEBUG("entities.unit", "HolyRes is: \t\t%u\t\tFireRes is: \t\t%u", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index e943672c4f0..2f2258118b0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -681,7 +681,7 @@ enum QuestSlotOffsets }; #define MAX_QUEST_COUNTS 24 -#define MAX_QUEST_OFFSET 15 +#define MAX_QUEST_OFFSET 16 enum QuestSlotStateMask { diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index ed6b9ec3696..447169a28d0 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -91,7 +91,7 @@ void Unit::UpdateDamagePhysical(WeaponAttackType attType) bool Player::UpdateStats(Stats stat) { - if (stat > STAT_SPIRIT) + if (stat >= MAX_STATS) return false; // value = ((base_value * base_pct) + total_value) * total_pct @@ -120,8 +120,6 @@ bool Player::UpdateStats(Stats stat) UpdateAllSpellCritChances(); UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently break; - case STAT_SPIRIT: - break; default: break; } @@ -1023,7 +1021,6 @@ bool Guardian::UpdateStats(Stats stat) case STAT_AGILITY: UpdateArmor(); break; case STAT_STAMINA: UpdateMaxHealth(); break; case STAT_INTELLECT: UpdateMaxPower(POWER_MANA); break; - case STAT_SPIRIT: default: break; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 964572e5f02..47b65b6a425 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6122,8 +6122,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233;stat = GetStat(STAT_AGILITY); } // intellect if (GetStat(STAT_INTELLECT)> stat) { trigger_spell_id = 60234;stat = GetStat(STAT_INTELLECT);} - // spirit - if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; } break; } case 64568: // Blood Reserve @@ -10740,8 +10738,7 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f case UNIT_MOD_STAT_STRENGTH: case UNIT_MOD_STAT_AGILITY: case UNIT_MOD_STAT_STAMINA: - case UNIT_MOD_STAT_INTELLECT: - case UNIT_MOD_STAT_SPIRIT: UpdateStats(GetStatByAuraGroup(unitMod)); break; + case UNIT_MOD_STAT_INTELLECT: UpdateStats(GetStatByAuraGroup(unitMod)); break; case UNIT_MOD_ARMOR: UpdateArmor(); break; case UNIT_MOD_HEALTH: UpdateMaxHealth(); break; @@ -10854,8 +10851,6 @@ Stats Unit::GetStatByAuraGroup(UnitMods unitMod) const case UNIT_MOD_STAT_AGILITY: stat = STAT_AGILITY; break; case UNIT_MOD_STAT_STAMINA: stat = STAT_STAMINA; break; case UNIT_MOD_STAT_INTELLECT: stat = STAT_INTELLECT; break; - case UNIT_MOD_STAT_SPIRIT: stat = STAT_SPIRIT; break; - default: break; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 68b27049f71..bf766267fee 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -482,11 +482,10 @@ enum TriggerCastFlags enum UnitMods { - UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_SPIRIT must be in existed order, it's accessed by index values of Stats enum. + UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_INTELLECT must be in existed order, it's accessed by index values of Stats enum. UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_INTELLECT, - UNIT_MOD_STAT_SPIRIT, UNIT_MOD_HEALTH, UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum. UNIT_MOD_RAGE, @@ -499,6 +498,14 @@ enum UnitMods UNIT_MOD_ECLIPSE, UNIT_MOD_HOLY_POWER, UNIT_MOD_ALTERNATIVE, + UNIT_MOD_MAELSTROM, + UNIT_MOD_CHI, + UNIT_MOD_INSANITY, + UNIT_MOD_BURNING_EMBERS, + UNIT_MOD_DEMONIC_FURY, + UNIT_MOD_ARCANE_CHARGES, + UNIT_MOD_FURY, + UNIT_MOD_PAIN, UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum. UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_FIRE, @@ -514,11 +521,11 @@ enum UnitMods UNIT_MOD_END, // synonyms UNIT_MOD_STAT_START = UNIT_MOD_STAT_STRENGTH, - UNIT_MOD_STAT_END = UNIT_MOD_STAT_SPIRIT + 1, + UNIT_MOD_STAT_END = UNIT_MOD_STAT_INTELLECT + 1, UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR, UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1, UNIT_MOD_POWER_START = UNIT_MOD_MANA, - UNIT_MOD_POWER_END = UNIT_MOD_ALTERNATIVE + 1 + UNIT_MOD_POWER_END = UNIT_MOD_PAIN + 1 }; enum BaseModGroup diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 0e93e93a136..5f7039b4b10 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3579,63 +3579,54 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play info->stats[STAT_STAMINA] += (lvl > 23 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 36 ? 1: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl%2) ? 1: 0); break; case CLASS_PALADIN: info->stats[STAT_STRENGTH] += (lvl > 3 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 33 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 38 ? 1: (lvl > 7 && !(lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 7 ? 1: 0); break; case CLASS_HUNTER: info->stats[STAT_STRENGTH] += (lvl > 4 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 33 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 1: (lvl > 9 && !(lvl%2) ? 1: 0)); break; case CLASS_ROGUE: info->stats[STAT_STRENGTH] += (lvl > 5 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 16 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 1: (lvl > 9 && !(lvl%2) ? 1: 0)); break; case CLASS_PRIEST: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 38 ? 1: (lvl > 8 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 22 ? 2: (lvl > 1 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 3 ? 1: 0); break; case CLASS_SHAMAN: info->stats[STAT_STRENGTH] += (lvl > 34 ? 1: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 5 ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 4 ? 1: 0); break; case CLASS_MAGE: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 24 ? 2: (lvl > 1 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); break; case CLASS_WARLOCK: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); break; case CLASS_DRUID: info->stats[STAT_STRENGTH] += (lvl > 38 ? 2: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 32 ? 2: (lvl > 4 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 38 ? 2: (lvl > 8 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 38 ? 3: (lvl > 4 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 3: (lvl > 5 ? 1: 0)); } } } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 1ef2e7b0ed9..ed516b9faa9 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -241,10 +241,9 @@ enum Stats : uint16 STAT_AGILITY = 1, STAT_STAMINA = 2, STAT_INTELLECT = 3, - STAT_SPIRIT = 4 }; -#define MAX_STATS 5 +#define MAX_STATS 4 enum Powers // (6.0) { -- cgit v1.2.3 From 31009887e35cf8db6e94bf5b6870b62538364bc4 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 20 May 2016 23:39:11 +0200 Subject: 6.x rebase --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql | 39 +++++++++++----------- .../Database/Implementation/HotfixDatabase.cpp | 2 +- src/server/game/Achievements/AchievementMgr.cpp | 11 +++--- src/server/game/Achievements/AchievementMgr.h | 2 ++ src/server/game/Achievements/CriteriaHandler.cpp | 12 +++++-- src/server/game/Achievements/CriteriaHandler.h | 1 + src/server/game/DataStores/DB2Stores.cpp | 10 +++++- src/server/game/DataStores/DB2Stores.h | 2 +- src/server/game/DataStores/DB2Structure.h | 8 ++--- src/server/game/DataStores/DB2fmt.h | 2 ++ src/server/game/DataStores/GameTables.cpp | 2 ++ src/server/game/DataStores/GameTables.h | 6 ++++ src/server/game/Entities/Unit/Unit.cpp | 8 ++--- src/server/game/Handlers/ItemHandler.cpp | 2 +- src/server/game/Miscellaneous/SharedDefines.h | 1 + src/server/game/Spells/Spell.cpp | 2 -- src/server/game/Spells/SpellInfo.cpp | 1 + 17 files changed, 69 insertions(+), 42 deletions(-) (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql index 5011a0bd29d..21c547943c7 100644 --- a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql @@ -109,13 +109,6 @@ ALTER TABLE `battle_pet_species` MODIFY `PetType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, MODIFY `Source` tinyint(4) NOT NULL DEFAULT '0' AFTER `PetType`; --- --- Table structure for table `battle_pet_species_locale` --- -ALTER TABLE `battle_pet_species_locale` - CHANGE `SourceText` `SourceText_lang` text AFTER `locale`, - CHANGE `Description` `Description_lang` text AFTER `SourceText_lang`; - -- -- Table structure for table `battle_pet_species_state` -- @@ -485,14 +478,14 @@ ALTER TABLE `gameobjects` MODIFY `RotationZ` float NOT NULL DEFAULT '0' AFTER `RotationY`, MODIFY `RotationW` float NOT NULL DEFAULT '0' AFTER `RotationZ`, MODIFY `Size` float NOT NULL DEFAULT '0' AFTER `RotationW`, - MODIFY `Data0` int(10) NOT NULL DEFAULT '0' AFTER `Size`, - MODIFY `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Data0`, + MODIFY `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Size`, MODIFY `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data1`, MODIFY `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data2`, MODIFY `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data3`, MODIFY `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data4`, MODIFY `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data5`, MODIFY `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data6`, + MODIFY `Data8` int(10) NOT NULL DEFAULT '0' AFTER `Data7`, MODIFY `Name` text AFTER `Data7`, MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, MODIFY `DisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, @@ -502,15 +495,6 @@ ALTER TABLE `gameobjects` MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `Type`; -ALTER TABLE `gameobjects` CHANGE `Data7` `Data8` int(10) NOT NULL DEFAULT '0' AFTER `Data6`; -ALTER TABLE `gameobjects` CHANGE `Data6` `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data5`; -ALTER TABLE `gameobjects` CHANGE `Data5` `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data4`; -ALTER TABLE `gameobjects` CHANGE `Data4` `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data3`; -ALTER TABLE `gameobjects` CHANGE `Data3` `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data2`; -ALTER TABLE `gameobjects` CHANGE `Data2` `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data1`; -ALTER TABLE `gameobjects` CHANGE `Data1` `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data0`; -ALTER TABLE `gameobjects` CHANGE `Data0` `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Size`; - -- -- Table structure for table `gameobject_display_info` -- @@ -1401,8 +1385,7 @@ ALTER TABLE `override_spell_data` -- -- Table structure for table `phase_x_phase_group` -- -ALTER TABLE `phase_group` - RENAME `phase_x_phase_group`, +ALTER TABLE `phase_x_phase_group` MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`; @@ -2137,6 +2120,22 @@ ALTER TABLE `spell_power_difficulty` MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; ALTER TABLE `spell_power_difficulty` ADD PRIMARY KEY (`ID`); +-- +-- Table structure for table `spell_procs_per_minute` +-- +ALTER TABLE `spell_procs_per_minute` MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BaseProcRate`; + +-- +-- Table structure for table `spell_procs_per_minute_mod` +-- +ALTER TABLE `spell_procs_per_minute_mod` + MODIFY `Param` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Coeff`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Param`, + MODIFY `SpellProcsPerMinuteID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `spell_range` +-- ALTER TABLE `spell_range` MODIFY `DisplayName` text AFTER `MaxRangeFriend`, MODIFY `DisplayNameShort` text AFTER `DisplayName`, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index e40be4e167a..31db228b20a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -753,7 +753,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinuteMod.db2 - PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" + PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Coeff, Param, Type, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRadius.db2 diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index f4b51eba6f4..9c95eca9db1 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -522,6 +522,11 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem } } +bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return AdditionalRequirementsSatisfied(sCriteriaMgr->GetModifierTree(modifierTreeId), 0, 0, nullptr, _owner); +} + void PlayerAchievementMgr::SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const { WorldPackets::Achievement::CriteriaUpdate criteriaUpdate; @@ -924,12 +929,6 @@ CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type) c return sCriteriaMgr->GetGuildCriteriaByType(type); } -bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const -{ - return AdditionalRequirementsSatisfied(sAchievementMgr->GetModifierTree(modifierTreeId), 0, 0, nullptr, _owner); -} - - std::string PlayerAchievementMgr::GetOwnerInfo() const { return Trinity::StringFormat("%s %s", _owner->GetGUID().ToString().c_str(), _owner->GetName().c_str()); diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 33ba9021b5f..ef0ee5e87e6 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -91,6 +91,8 @@ public: void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) override; + bool ModifierTreeSatisfied(uint32 modifierTreeId) const; + protected: void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override; void SendCriteriaProgressRemoved(uint32 criteriaId) override; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index e8e418001ad..e9ec1299f96 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -18,7 +18,6 @@ #include "CriteriaHandler.h" #include "ArenaTeamMgr.h" #include "Battleground.h" -#include "DBCStores.h" #include "DB2Stores.h" #include "DisableMgr.h" #include "GameEventMgr.h" @@ -780,7 +779,7 @@ void CriteriaHandler::StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, if (_timeCriteriaTrees.find(tree->ID) == _timeCriteriaTrees.end() && !IsCompletedCriteriaTree(tree)) { // Start the timer - if (criteria->Entry->StartTimer * IN_MILLISECONDS > timeLost) + if (criteria->Entry->StartTimer * uint32(IN_MILLISECONDS) > timeLost) { _timeCriteriaTrees[tree->ID] = criteria->Entry->StartTimer * IN_MILLISECONDS - timeLost; canStart = true; @@ -2216,3 +2215,12 @@ Criteria const* CriteriaMgr::GetCriteria(uint32 criteriaId) const return itr->second; } + +ModifierTreeNode const* CriteriaMgr::GetModifierTree(uint32 modifierTreeId) const +{ + auto itr = _criteriaModifiers.find(modifierTreeId); + if (itr != _criteriaModifiers.end()) + return itr->second; + + return nullptr; +} diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h index 03a4f30136e..4d269a894bd 100644 --- a/src/server/game/Achievements/CriteriaHandler.h +++ b/src/server/game/Achievements/CriteriaHandler.h @@ -370,6 +370,7 @@ public: void LoadCriteriaData(); CriteriaTree const* GetCriteriaTree(uint32 criteriaTreeId) const; Criteria const* GetCriteria(uint32 criteriaId) const; + ModifierTreeNode const* GetModifierTree(uint32 modifierTreeId) const; private: CriteriaDataMap _criteriaDataMap; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 7899b4ada83..0c2c02f2ca8 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -515,7 +515,15 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) { ASSERT(chrSpec->ClassID < MAX_CLASSES); ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); - _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec; + + uint32 storageIndex = chrSpec->ClassID; + if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC) + { + ASSERT(!chrSpec->ClassID); + storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX; + } + + _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; } ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(), diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 59bb91b4a30..6a325579aa2 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -226,7 +226,7 @@ public: typedef std::unordered_map> AreaGroupMemberContainer; typedef std::unordered_multimap CharSectionsContainer; typedef std::unordered_map CharStartOutfitContainer; - typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES][MAX_SPECIALIZATIONS]; + typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; typedef std::map, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::unordered_map> FactionTeamContainer; typedef std::set GlyphSlotContainer; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index ab29ec77c11..568729ec4cb 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -2246,16 +2246,16 @@ struct SpellProcsPerMinuteEntry { uint32 ID; float BaseProcRate; - uint32 Flags; + uint8 Flags; }; struct SpellProcsPerMinuteModEntry { uint32 ID; - uint32 Type; - uint32 Param; float Coeff; - uint32 SpellProcsPerMinuteID; + uint16 Param; + uint8 Type; + uint8 SpellProcsPerMinuteID; }; struct SpellRadiusEntry diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 5e2bf12a12a..57963f3aec6 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -175,6 +175,8 @@ char const SpellLevelsFormat[] = "dihhhbb"; char const SpellMiscFormat[] = "diiiiiiiiiiiiiiffhhhhhb"; char const SpellPowerFormat[] = "niiffifhhhhbbb"; char const SpellPowerDifficultyFormat[] = "nbb"; +char const SpellProcsPerMinuteFormat[] = "dfb"; +char const SpellProcsPerMinuteModFormat[] = "dfhbb"; char const SpellRadiusFormat[] = "dffff"; char const SpellRangeFormat[] = "dffffssb"; char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh"; diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp index 23319e27734..4cde4bb7b2e 100644 --- a/src/server/game/DataStores/GameTables.cpp +++ b/src/server/game/DataStores/GameTables.cpp @@ -22,6 +22,7 @@ #include #include +GameTable sArmorMitigationByLvlGameTable; GameTable sBarberShopCostBaseGameTable; GameTable sBaseMPGameTable; GameTable sCombatRatingsGameTable; @@ -94,6 +95,7 @@ void LoadGameTables(std::string const& dataPath) #define LOAD_GT(store, file) gameTableCount += LoadGameTable(bad_gt_files, store, gtPath / file) + LOAD_GT(sArmorMitigationByLvlGameTable, "ArmorMitigationByLvl.txt"); LOAD_GT(sBarberShopCostBaseGameTable, "BarberShopCostBase.txt"); LOAD_GT(sBaseMPGameTable, "BaseMp.txt"); LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt"); diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h index ad79a7e699a..1d4e9126955 100644 --- a/src/server/game/DataStores/GameTables.h +++ b/src/server/game/DataStores/GameTables.h @@ -21,6 +21,11 @@ #include "SharedDefines.h" #include "Common.h" +struct GtArmorMitigationByLvlEntry +{ + float Mitigation = 0.0f; +}; + struct GtBarberShopCostBaseEntry { float Cost = 0.0f; @@ -176,6 +181,7 @@ private: std::vector _data; }; +TC_GAME_API extern GameTable sArmorMitigationByLvlGameTable; TC_GAME_API extern GameTable sBarberShopCostBaseGameTable; TC_GAME_API extern GameTable sBaseMPGameTable; TC_GAME_API extern GameTable sCombatRatingsGameTable; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 47b65b6a425..f42be192a3f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1503,14 +1503,14 @@ uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 d return damage; uint8 attackerLevel = attacker->getLevel(); - if (attackerLevel > sGtArmorMitigationByLvlStore.GetTableRowCount()) - attackerLevel = sGtArmorMitigationByLvlStore.GetTableRowCount(); + if (attackerLevel > sArmorMitigationByLvlGameTable.GetTableRowCount()) + attackerLevel = sArmorMitigationByLvlGameTable.GetTableRowCount(); - GtArmorMitigationByLvlEntry const* ambl = sGtArmorMitigationByLvlStore.EvaluateTable(attackerLevel - 1, 0); + GtArmorMitigationByLvlEntry const* ambl = sArmorMitigationByLvlGameTable.GetRow(attackerLevel); if (!ambl) return damage; - float mitigation = std::min(armor / (armor + ambl->KFactor), 0.85f); + float mitigation = std::min(armor / (armor + ambl->Mitigation), 0.85f); return std::max(damage * (1.0f - mitigation), 1); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 54bbfddb5fa..b5c8e6bdc67 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1287,7 +1287,7 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC if (entry->SummonSpellID == spellToLearn) { GetBattlePetMgr()->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID)); - _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT); + _player->UpdateCriteria(CRITERIA_TYPE_OWN_BATTLE_PET_COUNT); break; } } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index ed516b9faa9..d796b789f8d 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -858,6 +858,7 @@ enum SpellAttr13 #define MAX_GLYPH_SLOT_INDEX 6 #define MIN_SPECIALIZATION_LEVEL 10 #define MAX_SPECIALIZATIONS 4 +#define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES // Custom values enum SpellClickUserTypes diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a6734f6c205..4a166351fe5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4585,8 +4585,6 @@ void Spell::TakeRunePower(bool didHit) { player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown() : uint32(RUNE_MISS_COOLDOWN), true); --runeCost; - if (convertUsedRunes) - player->ConvertRune(i, RUNE_DEATH); } } } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index ec1c63076aa..448d4eaa2f7 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1028,6 +1028,7 @@ SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& // SpellScalingEntry SpellScalingEntry const* _scaling = data.Scaling; Scaling.Class = _scaling ? _scaling->ScalingClass : 0; + Scaling.MinScalingLevel = _scaling ? _scaling->MinScalingLevel : 0; Scaling.MaxScalingLevel = _scaling ? _scaling->MaxScalingLevel : 0; Scaling.ScalesFromItemLevel = _scaling ? _scaling->ScalesFromItemLevel : 0; -- cgit v1.2.3 From b82332487afd7233850e7eed996615b3fdd7248c Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 27 May 2016 23:13:47 +0200 Subject: Core/DataStores: Updated db2 to 7.0.3.21737 --- .../2016_xx_xx_xx_characters_legion_04.sql | 1 + .../hotfixes/2016_xx_xx_xx_hotfixes_legion_05.sql | 854 +++ .../world/2016_xx_xx_xx_world_legion_01.sql | 1 - src/common/Define.h | 5 +- .../Database/Implementation/CharacterDatabase.cpp | 3 - .../Database/Implementation/CharacterDatabase.h | 3 - .../Database/Implementation/HotfixDatabase.cpp | 283 +- .../Database/Implementation/HotfixDatabase.h | 6 +- src/server/game/DataStores/DB2Metadata.h | 6283 ++++++++++++++++++++ src/server/game/DataStores/DB2Stores.cpp | 401 +- src/server/game/DataStores/DB2Stores.h | 7 +- src/server/game/DataStores/DB2Structure.h | 315 +- src/server/game/DataStores/DB2fmt.h | 207 - src/server/game/DataStores/DBCEnums.h | 5 + src/server/game/DataStores/DBCfmt.h | 26 - src/server/game/Entities/Item/Item.cpp | 3 + src/server/game/Entities/Player/Player.cpp | 124 - src/server/game/Entities/Player/Player.h | 17 - src/server/game/Handlers/CharacterHandler.cpp | 26 - src/server/game/Handlers/InspectHandler.cpp | 3 - src/server/game/Miscellaneous/SharedDefines.h | 1 - src/server/game/Server/Packets/TalentPackets.cpp | 4 +- src/server/game/Server/Packets/TalentPackets.h | 2 +- src/server/game/Server/WorldSession.h | 1 - src/server/game/Spells/Auras/SpellAuraEffects.cpp | 17 - src/server/game/Spells/SpellEffects.cpp | 63 - src/server/scripts/Commands/cs_reset.cpp | 2 - src/server/scripts/Spells/spell_shaman.cpp | 2 +- src/server/shared/DataStores/DB2Meta.cpp | 101 + src/server/shared/DataStores/DB2Meta.h | 46 + .../shared/DataStores/DB2SparseStorageLoader.cpp | 529 +- .../shared/DataStores/DB2SparseStorageLoader.h | 39 +- src/server/shared/DataStores/DB2StorageLoader.cpp | 658 +- src/server/shared/DataStores/DB2StorageLoader.h | 142 +- src/server/shared/DataStores/DB2Store.h | 150 +- src/tools/connection_patcher/Patterns/Windows.hpp | 4 +- 36 files changed, 8555 insertions(+), 1779 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_04.sql create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_05.sql delete mode 100644 sql/updates/world/2016_xx_xx_xx_world_legion_01.sql create mode 100644 src/server/game/DataStores/DB2Metadata.h delete mode 100644 src/server/game/DataStores/DB2fmt.h delete mode 100644 src/server/game/DataStores/DBCfmt.h create mode 100644 src/server/shared/DataStores/DB2Meta.cpp create mode 100644 src/server/shared/DataStores/DB2Meta.h (limited to 'src/server/database') diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_04.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_04.sql new file mode 100644 index 00000000000..c231fcff007 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_04.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `character_glyphs`; diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_05.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_05.sql new file mode 100644 index 00000000000..f165d7f8ae2 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_05.sql @@ -0,0 +1,854 @@ +ALTER TABLE `achievement` + MODIFY `Title` text NULL FIRST, + MODIFY `Description` text NULL AFTER `Title`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Reward` text NULL AFTER `Flags`, + MODIFY `MapID` smallint(6) NOT NULL DEFAULT '0' AFTER `Reward`, + MODIFY `Supercedes` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `Category` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Supercedes`, + MODIFY `UIOrder` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Category`, + MODIFY `IconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UIOrder`, + MODIFY `SharesCriteria` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconID`, + MODIFY `CriteriaTree` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SharesCriteria`, + MODIFY `Faction` tinyint(4) NOT NULL DEFAULT '0' AFTER `CriteriaTree`, + MODIFY `Points` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Faction`, + MODIFY `MinimumCriteria` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Points`; + +ALTER TABLE `area_table` + CHANGE `PvPCombastWorldStateID` `PvPCombatWorldStateID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UWAmbience`, + CHANGE `UWIntroMusic` `UWIntroSound` int(10) unsigned NOT NULL DEFAULT '0' AFTER `WindSettingsID`; + +ALTER TABLE `area_trigger` + MODIFY `PosX` float NOT NULL DEFAULT '0' FIRST, + MODIFY `PosY` float NOT NULL DEFAULT '0' AFTER `PosX`, + MODIFY `PosZ` float NOT NULL DEFAULT '0' AFTER `PosY`, + MODIFY `Radius` float NOT NULL DEFAULT '0' AFTER `PosZ`, + MODIFY `BoxLength` float NOT NULL DEFAULT '0' AFTER `Radius`, + MODIFY `BoxWidth` float NOT NULL DEFAULT '0' AFTER `BoxLength`, + MODIFY `BoxHeight` float NOT NULL DEFAULT '0' AFTER `BoxWidth`, + MODIFY `BoxYaw` float NOT NULL DEFAULT '0' AFTER `BoxHeight`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BoxYaw`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `ShapeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `AreaTriggerActionSetID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ShapeID`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AreaTriggerActionSetID`, + MODIFY `ShapeType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `Flag` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ShapeType`; + +ALTER TABLE `barber_shop_style` + MODIFY `DisplayName` text NULL FIRST, + MODIFY `Description` text NULL AFTER `DisplayName`, + MODIFY `CostModifier` float NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostModifier`, + MODIFY `Race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Sex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Race`, + MODIFY `Data` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sex`; + +ALTER TABLE `battle_pet_species` + MODIFY `CreatureID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `IconFileID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CreatureID`, + MODIFY `SummonSpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `IconFileID`, + MODIFY `SourceText` text NULL AFTER `SummonSpellID`, + MODIFY `Description` text NULL AFTER `SourceText`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `PetType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(4) NOT NULL DEFAULT '0' AFTER `PetType`; + +ALTER TABLE `broadcast_text` + CHANGE `SoundID` `SoundID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + ADD `SoundID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SoundID1`, + ADD `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SoundID2`; + +ALTER TABLE `chr_classes` + MODIFY `PetNameToken` text NULL FIRST, + MODIFY `Name` text NULL AFTER `PetNameToken`, + MODIFY `NameFemale` text NULL AFTER `Name`, + MODIFY `NameMale` text NULL AFTER `NameFemale`, + MODIFY `Filename` text NULL AFTER `NameMale`, + MODIFY `CreateScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Filename`, + MODIFY `SelectScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CreateScreenFileDataID`, + MODIFY `LowResScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SelectScreenFileDataID`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LowResScreenFileDataID`, + MODIFY `CinematicSequenceID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `DefaultSpec` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CinematicSequenceID`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DefaultSpec`, + MODIFY `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerType`, + MODIFY `AttackPowerPerStrength` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellClassSet`, + MODIFY `AttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AttackPowerPerStrength`, + MODIFY `RangedAttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AttackPowerPerAgility`, + MODIFY `IconFileDataID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RangedAttackPowerPerAgility`, + MODIFY `Unk1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +ALTER TABLE `chr_races` + MODIFY `Unk` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UAFemaleCreatureSoundDataID`, + MODIFY `BaseLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unk`, + MODIFY `CreatureType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BaseLanguage`, + MODIFY `TeamID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CreatureType`, + MODIFY `RaceRelated` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TeamID`, + MODIFY `UnalteredVisualRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RaceRelated`, + MODIFY `CharComponentTextureLayoutID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UnalteredVisualRaceID`, + MODIFY `DefaultClassID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CharComponentTextureLayoutID`, + MODIFY `NeutralRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DefaultClassID`, + MODIFY `ItemAppearanceFrameRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NeutralRaceID`, + MODIFY `CharComponentTexLayoutHiResID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemAppearanceFrameRaceID`, + MODIFY `HighResMaleDisplayID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CharComponentTexLayoutHiResID`, + MODIFY `HighResFemaleDisplayID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HighResMaleDisplayID`; + +ALTER TABLE `chr_specialization` + MODIFY `MasterySpellID1` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `MasterySpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MasterySpellID1`, + MODIFY `Name` text NULL AFTER `MasterySpellID2`, + MODIFY `Name2` text NULL AFTER `Name`, + MODIFY `Description` text NULL AFTER `Name2`, + MODIFY `BackgroundFile` text NULL AFTER `Description`, + MODIFY `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BackgroundFile`, + MODIFY `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellIconID`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassID`, + MODIFY `PetTalentType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`, + MODIFY `Role` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PetTalentType`, + MODIFY `PrimaryStatOrder` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Role`; + +ALTER TABLE `creature_model_data` + MODIFY `ModelScale` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `FootprintTextureLength` float NOT NULL DEFAULT '0' AFTER `ModelScale`, + MODIFY `FootprintTextureWidth` float NOT NULL DEFAULT '0' AFTER `FootprintTextureLength`, + MODIFY `FootprintParticleScale` float NOT NULL DEFAULT '0' AFTER `FootprintTextureWidth`, + MODIFY `CollisionWidth` float NOT NULL DEFAULT '0' AFTER `FootprintParticleScale`, + MODIFY `CollisionHeight` float NOT NULL DEFAULT '0' AFTER `CollisionWidth`, + MODIFY `MountHeight` float NOT NULL DEFAULT '0' AFTER `CollisionHeight`, + MODIFY `GeoBoxMin1` float NOT NULL DEFAULT '0' AFTER `MountHeight`, + MODIFY `GeoBoxMin2` float NOT NULL DEFAULT '0' AFTER `GeoBoxMin1`, + MODIFY `GeoBoxMin3` float NOT NULL DEFAULT '0' AFTER `GeoBoxMin2`, + MODIFY `GeoBoxMax1` float NOT NULL DEFAULT '0' AFTER `GeoBoxMin3`, + MODIFY `GeoBoxMax2` float NOT NULL DEFAULT '0' AFTER `GeoBoxMax1`, + MODIFY `GeoBoxMax3` float NOT NULL DEFAULT '0' AFTER `GeoBoxMax2`, + MODIFY `WorldEffectScale` float NOT NULL DEFAULT '0' AFTER `GeoBoxMax3`, + MODIFY `AttachedEffectScale` float NOT NULL DEFAULT '0' AFTER `WorldEffectScale`, + MODIFY `MissileCollisionRadius` float NOT NULL DEFAULT '0' AFTER `AttachedEffectScale`, + MODIFY `MissileCollisionPush` float NOT NULL DEFAULT '0' AFTER `MissileCollisionRadius`, + MODIFY `MissileCollisionRaise` float NOT NULL DEFAULT '0' AFTER `MissileCollisionPush`, + MODIFY `OverrideLootEffectScale` float NOT NULL DEFAULT '0' AFTER `MissileCollisionRaise`, + MODIFY `OverrideNameScale` float NOT NULL DEFAULT '0' AFTER `OverrideLootEffectScale`, + MODIFY `OverrideSelectionRadius` float NOT NULL DEFAULT '0' AFTER `OverrideNameScale`, + MODIFY `TamedPetBaseScale` float NOT NULL DEFAULT '0' AFTER `OverrideSelectionRadius`, + MODIFY `HoverHeight` float NOT NULL DEFAULT '0' AFTER `TamedPetBaseScale`, + MODIFY `SizeClass` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID`, + MODIFY `BloodID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SizeClass`, + MODIFY `FootprintTextureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `BloodID`, + MODIFY `FoleyMaterialID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FootprintTextureID`, + CHANGE `Unk700_1` `FootstepEffectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FoleyMaterialID`, + CHANGE `Unk700_2` `DeathThudEffectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FootstepEffectID`, + MODIFY `FootstepShakeSize` int(10) unsigned NOT NULL DEFAULT '0' AFTER `DeathThudEffectID`, + MODIFY `DeathThudShakeSize` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FootstepShakeSize`, + MODIFY `SoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `DeathThudShakeSize`, + MODIFY `CreatureGeosetDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`; + +ALTER TABLE `criteria_tree` + MODIFY `CriteriaID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Operator` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `OrderIndex` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Operator`; + +ALTER TABLE `currency_types` + MODIFY `SpellCategory` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CategoryID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellCategory`, + MODIFY `SpellWeight` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Quality`; + +ALTER TABLE `dungeon_encounter` + MODIFY `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellIconID`, + MODIFY `Bit` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Bit`, + MODIFY `OrderIndex` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +ALTER TABLE `emotes` + MODIFY `EmoteSpecProc` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AnimID`, + MODIFY `EmoteSpecProcParam` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EmoteSpecProc`, + MODIFY `EmoteSoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EmoteSpecProcParam`, + CHANGE `Unk703_1` `ClassMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EmoteSoundID`, + CHANGE `Unk703_2` `RaceMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ClassMask`; + +ALTER TABLE `emotes_text_sound` + MODIFY `RaceId` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EmotesTextId`, + MODIFY `SexId` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RaceId`, + MODIFY `ClassId` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SexId`, + MODIFY `SoundId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ClassId`; + +ALTER TABLE `faction` + ADD `ReputationMax1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + ADD `ReputationMax2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ReputationMax1`, + ADD `ReputationMax3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ReputationMax2`, + ADD `ReputationMax4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ReputationMax3`; + +ALTER TABLE `gameobjects` + MODIFY `PositionX` float NOT NULL DEFAULT '0' FIRST, + MODIFY `PositionY` float NOT NULL DEFAULT '0' AFTER `PositionX`, + MODIFY `PositionZ` float NOT NULL DEFAULT '0' AFTER `PositionY`, + MODIFY `RotationX` float NOT NULL DEFAULT '0' AFTER `PositionZ`, + MODIFY `RotationY` float NOT NULL DEFAULT '0' AFTER `RotationX`, + MODIFY `RotationZ` float NOT NULL DEFAULT '0' AFTER `RotationY`, + MODIFY `RotationW` float NOT NULL DEFAULT '0' AFTER `RotationZ`, + MODIFY `Size` float NOT NULL DEFAULT '0' AFTER `RotationW`, + MODIFY `Data1` int(11) NOT NULL DEFAULT '0' AFTER `Size`, + MODIFY `Data2` int(11) NOT NULL DEFAULT '0' AFTER `Data1`, + MODIFY `Data3` int(11) NOT NULL DEFAULT '0' AFTER `Data2`, + MODIFY `Data4` int(11) NOT NULL DEFAULT '0' AFTER `Data3`, + MODIFY `Data5` int(11) NOT NULL DEFAULT '0' AFTER `Data4`, + MODIFY `Data6` int(11) NOT NULL DEFAULT '0' AFTER `Data5`, + MODIFY `Data7` int(11) NOT NULL DEFAULT '0' AFTER `Data6`, + MODIFY `Data8` int(11) NOT NULL DEFAULT '0' AFTER `Data7`, + MODIFY `Name` text NULL AFTER `Data8`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `DisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DisplayID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`; + +ALTER TABLE `garr_ability` + MODIFY `Name` text NULL FIRST, + MODIFY `Description` text NULL AFTER `Name`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `OtherFactionGarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `GarrAbilityCategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OtherFactionGarrAbilityID`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrAbilityCategoryID`; + +ALTER TABLE `garr_building` + MODIFY `CostCurrencyID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `HordeTexPrefixKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CostCurrencyID`, + MODIFY `AllianceTexPrefixKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeTexPrefixKitID`, + MODIFY `AllianceActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceTexPrefixKitID`, + MODIFY `HordeActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceActivationScenePackageID`, + MODIFY `FollowerRequiredGarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeActivationScenePackageID`, + MODIFY `FollowerGarrAbilityEffectID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FollowerRequiredGarrAbilityID`, + MODIFY `CostMoney` smallint(6) NOT NULL DEFAULT '0' AFTER `FollowerGarrAbilityEffectID`, + MODIFY `Unknown` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostMoney`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `MaxShipments` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxShipments`, + MODIFY `BuildDuration` int(10) unsigned NOT NULL DEFAULT '0' AFTER `GarrTypeID`, + MODIFY `CostCurrencyAmount` int(11) NOT NULL DEFAULT '0' AFTER `BuildDuration`, + MODIFY `BonusAmount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CostCurrencyAmount`; + +ALTER TABLE `garr_building_plot_inst` + MODIFY `LandmarkOffsetX` float NOT NULL DEFAULT '0' FIRST, + MODIFY `LandmarkOffsetY` float NOT NULL DEFAULT '0' AFTER `LandmarkOffsetX`, + MODIFY `UiTextureAtlasMemberID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LandmarkOffsetY`, + MODIFY `GarrSiteLevelPlotInstID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UiTextureAtlasMemberID`, + MODIFY `GarrBuildingID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrSiteLevelPlotInstID`; + +ALTER TABLE `garr_class_spec` + MODIFY `NameMale` text NULL FIRST, + MODIFY `NameFemale` text NULL AFTER `NameMale`, + MODIFY `NameGenderless` text NULL AFTER `NameFemale`, + MODIFY `ClassAtlasID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `NameGenderless`, + MODIFY `GarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassAtlasID`, + MODIFY `Limit` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollItemSetID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Limit`; + +ALTER TABLE `garr_follower` + MODIFY `HordeCreatureID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `AllianceCreatureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeCreatureID`, + MODIFY `HordeSourceText` text NULL AFTER `AllianceCreatureID`, + MODIFY `AllianceSourceText` text NULL AFTER `HordeSourceText`, + MODIFY `HordePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllianceSourceText`, + MODIFY `AlliancePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordePortraitIconID`, + ADD `HordeAddedBroadcastTextID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AlliancePortraitIconID`, + ADD `AllianceAddedBroadcastTextID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeAddedBroadcastTextID`, + MODIFY `HordeGarrFollItemSetID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceAddedBroadcastTextID`, + MODIFY `AllianceGarrFollItemSetID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrFollItemSetID`, + MODIFY `ItemLevelWeapon` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrFollItemSetID`, + MODIFY `ItemLevelArmor` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelWeapon`, + MODIFY `HordeListPortraitTextureKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelArmor`, + MODIFY `AllianceListPortraitTextureKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeListPortraitTextureKitID`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceListPortraitTextureKitID`, + MODIFY `HordeUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerTypeID`, + MODIFY `AllianceUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeUiAnimRaceInfoID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceUiAnimRaceInfoID`, + MODIFY `HordeGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quality`, + MODIFY `AllianceGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrClassSpecID`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrClassSpecID`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `Unknown2` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Unknown3` tinyint(4) NOT NULL DEFAULT '0' AFTER `Unknown2`, + MODIFY `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown3`, + MODIFY `MaxDurability` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrTypeID`, + MODIFY `Class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxDurability`, + ADD `HordeFlavorTextGarrStringID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Class`, + ADD `AllianceFlavorTextGarrStringID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeFlavorTextGarrStringID`; + +ALTER TABLE `garr_plot` + MODIFY `GarrPlotUICategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeConstructionGameObjectID`, + MODIFY `PlotType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotUICategoryID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlotType`, + MODIFY `MinCount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `MaxCount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MinCount`; + +ALTER TABLE `garr_site_level` MODIFY `SiteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`; + +ALTER TABLE `heirloom` + MODIFY `ItemID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `SourceText` text NULL AFTER `ItemID`, + MODIFY `OldItem1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SourceText`, + MODIFY `OldItem2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem1`, + MODIFY `NextDifficultyItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem2`, + MODIFY `UpgradeItemID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `NextDifficultyItemID`, + MODIFY `UpgradeItemID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID1`, + MODIFY `ItemBonusListID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID2`, + MODIFY `ItemBonusListID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID1`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID2`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +ALTER TABLE `item_extended_cost` DROP `RequiredMoney`; + +ALTER TABLE `item_modified_appearance` + MODIFY `ItemID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `AppearanceID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `AppearanceModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceID`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID`, + MODIFY `SourceType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Index`; + +ALTER TABLE `item_set` + MODIFY `RequiredSkill` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkillRank`, + CHANGE `Unknown703` `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkill`; + +ALTER TABLE `lfg_dungeons` + MODIFY `Name` text NULL FIRST, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `TextureFilename` text NULL AFTER `Flags`, + MODIFY `Description` text NULL AFTER `TextureFilename`, + MODIFY `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `TargetLevelMax` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `MapID` smallint(6) NOT NULL DEFAULT '0' AFTER `TargetLevelMax`, + MODIFY `RandomID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `ScenarioID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RandomID`, + MODIFY `LastBossJournalEncounterID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ScenarioID`, + MODIFY `BonusReputationAmount` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LastBossJournalEncounterID`, + MODIFY `MentorItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BonusReputationAmount`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MentorItemLevel`, + MODIFY `TargetLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `TargetLevelMin` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TargetLevel`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TargetLevelMin`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`, + MODIFY `Faction` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Expansion` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Faction`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Expansion`, + MODIFY `GroupID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`, + MODIFY `CountTank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GroupID`, + MODIFY `CountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CountTank`, + MODIFY `CountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CountHealer`, + MODIFY `MinCountTank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CountDamage`, + MODIFY `MinCountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinCountTank`, + MODIFY `MinCountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinCountHealer`, + MODIFY `SubType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinCountDamage`, + MODIFY `MentorCharLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SubType`; + +ALTER TABLE `liquid_type` + MODIFY `LightID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LightID`, + MODIFY `ParticleMovement` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `ParticleTexSlots` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ParticleMovement`, + MODIFY `MaterialID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ParticleTexSlots`, + MODIFY `DepthTexCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaterialID`, + MODIFY `DepthTexCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount1`, + MODIFY `DepthTexCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount2`, + MODIFY `DepthTexCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount3`, + MODIFY `DepthTexCount5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount4`, + MODIFY `DepthTexCount6` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount5`, + MODIFY `SoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `DepthTexCount6`; + +ALTER TABLE `map_difficulty` + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Message`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `RaidDurationType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`, + MODIFY `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RaidDurationType`, + MODIFY `LockID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxPlayers`, + MODIFY `ItemBonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LockID`; + +ALTER TABLE `mount` + MODIFY `SpellId` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `DisplayId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellId`, + MODIFY `Name` text NULL AFTER `DisplayId`, + MODIFY `Description` text NULL AFTER `Name`, + MODIFY `SourceDescription` text NULL AFTER `Description`, + ADD `CameraPivotMultiplier` float NOT NULL DEFAULT '0' AFTER `SourceDescription`, + MODIFY `MountTypeId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CameraPivotMultiplier`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MountTypeId`, + MODIFY `PlayerConditionId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionId`; + +ALTER TABLE `mount_capability` + MODIFY `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `SpeedModSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSpell`, + MODIFY `RequiredRidingSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpeedModSpell`, + MODIFY `RequiredArea` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredRidingSkill`, + MODIFY `RequiredMap` smallint(6) NOT NULL DEFAULT '0' AFTER `RequiredArea`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredMap`; + +ALTER TABLE `player_condition` + MODIFY `ItemLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellLogic`, + MODIFY `Time1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemLogic`, + MODIFY `Time2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time1`, + MODIFY `AuraSpellLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time2`, + MODIFY `AuraSpellID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellLogic`, + MODIFY `AuraSpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID1`, + MODIFY `AuraSpellID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID2`, + MODIFY `AuraSpellID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID3`, + MODIFY `AchievementLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID4`, + MODIFY `AreaLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AchievementLogic`, + MODIFY `QuestKillLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaLogic`, + MODIFY `FailureDescription` text NULL AFTER `QuestKillLogic`, + MODIFY `MinLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FailureDescription`, + MODIFY `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `SkillID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `SkillID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID1`, + MODIFY `SkillID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID2`, + MODIFY `SkillID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID3`, + MODIFY `MinSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `SkillID4`, + MODIFY `MinSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill1`, + MODIFY `MinSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill2`, + MODIFY `MinSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill3`, + MODIFY `MaxSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill4`, + MODIFY `MaxSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill1`, + MODIFY `MaxSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill2`, + MODIFY `MaxSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill3`, + MODIFY `MaxFactionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxSkill4`, + MODIFY `PrevQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxFactionID`, + MODIFY `PrevQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID1`, + MODIFY `PrevQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID2`, + MODIFY `PrevQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID3`, + MODIFY `CurrQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID4`, + MODIFY `CurrQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID1`, + MODIFY `CurrQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID2`, + MODIFY `CurrQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID3`, + MODIFY `CurrentCompletedQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID4`, + MODIFY `CurrentCompletedQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID1`, + MODIFY `CurrentCompletedQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID2`, + MODIFY `CurrentCompletedQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID3`, + MODIFY `Explored1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID4`, + MODIFY `Explored2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored1`, + MODIFY `WorldStateExpressionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored2`, + MODIFY `Achievement1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WorldStateExpressionID`, + MODIFY `Achievement2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement1`, + MODIFY `Achievement3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement2`, + MODIFY `Achievement4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement3`, + MODIFY `AreaID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement4`, + MODIFY `AreaID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `QuestKillID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillID`, + MODIFY `MinAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `MaxAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgEquippedItemLevel`, + MODIFY `ModifierTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgEquippedItemLevel`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ModifierTreeID`, + MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `NativeGender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Gender`, + MODIFY `MinLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NativeGender`, + MODIFY `MaxLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLanguage`, + MODIFY `MinReputation1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLanguage`, + MODIFY `MinReputation2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation1`, + MODIFY `MinReputation3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation2`, + MODIFY `MaxReputation` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation3`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxReputation`, + MODIFY `MinPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `MaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinPVPRank`, + MODIFY `PvpMedal` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxPVPRank`, + MODIFY `ItemFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PvpMedal`, + MODIFY `AuraCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemFlags`, + MODIFY `AuraCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount1`, + MODIFY `AuraCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount2`, + MODIFY `AuraCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount3`, + MODIFY `WeatherID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount4`, + MODIFY `PartyStatus` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `WeatherID`, + MODIFY `LifetimeMaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PartyStatus`, + MODIFY `LfgStatus1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LifetimeMaxPVPRank`, + MODIFY `LfgStatus2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus1`, + MODIFY `LfgStatus3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus2`, + MODIFY `LfgStatus4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus3`, + MODIFY `LfgCompare1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus4`, + MODIFY `LfgCompare2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare1`, + MODIFY `LfgCompare3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare2`, + MODIFY `LfgCompare4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare3`, + MODIFY `CurrencyCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare4`, + MODIFY `CurrencyCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount1`, + MODIFY `CurrencyCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount2`, + MODIFY `CurrencyCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount3`, + MODIFY `MinExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `CurrencyCount4`, + MODIFY `MaxExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionLevel`, + MODIFY `MinExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MaxExpansionLevel`, + MODIFY `MaxExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionTier`, + MODIFY `MinGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxExpansionTier`, + MODIFY `MaxGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinGuildLevel`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxGuildLevel`, + MODIFY `ChrSpecializationIndex` tinyint(4) NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `ChrSpecializationRole` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationIndex`, + MODIFY `PowerType` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationRole`, + MODIFY `PowerTypeComp` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerType`, + MODIFY `PowerTypeValue` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerTypeComp`, + MODIFY `ClassMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PowerTypeValue`, + MODIFY `LanguageID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ClassMask`, + MODIFY `MinFactionID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LanguageID`, + MODIFY `MinFactionID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID1`, + MODIFY `MinFactionID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID2`, + MODIFY `ItemCount1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID4`, + MODIFY `ItemCount2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount1`, + MODIFY `ItemCount3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount2`, + MODIFY `ItemCount4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount3`, + MODIFY `LfgLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount4`, + MODIFY `LfgValue1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LfgLogic`, + MODIFY `LfgValue2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue1`, + MODIFY `LfgValue3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue2`, + MODIFY `LfgValue4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue3`, + MODIFY `CurrencyLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue4`, + MODIFY `CurrencyID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyLogic`, + MODIFY `CurrencyID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID1`, + MODIFY `CurrencyID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID2`, + MODIFY `CurrencyID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID3`, + MODIFY `PhaseGroupID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster6`, + MODIFY `MinAvgItemLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `MaxAvgItemLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgItemLevel`, + MODIFY `Unknown700_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgItemLevel`, + MODIFY `Unknown700_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown700_1`; + +ALTER TABLE `scaling_stat_distribution` + MODIFY `MinLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelCurveID`, + MODIFY `MaxLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`; + +ALTER TABLE `skill_line` MODIFY `ParentSkillLineID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CanLink`; + +ALTER TABLE `skill_line_ability` + MODIFY `SupercedesSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RaceMask`, + ADD `Unknown703` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SupercedesSpell`, + MODIFY `SkillLine` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unknown703`, + MODIFY `MinSkillLineRank` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillLine`, + MODIFY `TrivialSkillLineRankHigh` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinSkillLineRank`, + MODIFY `TrivialSkillLineRankLow` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TrivialSkillLineRankHigh`, + MODIFY `UniqueBit` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TrivialSkillLineRankLow`, + MODIFY `TradeSkillCategoryID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UniqueBit`, + MODIFY `AquireMethod` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TradeSkillCategoryID`, + MODIFY `NumSkillUps` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AquireMethod`; + +ALTER TABLE `skill_race_class_info` + MODIFY `SkillID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RaceMask`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID`, + MODIFY `SkillTierID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Availability` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SkillTierID`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Availability`; + +ALTER TABLE `sound_kit` + MODIFY `Name` text NULL FIRST, + MODIFY `VolumeFloat` float NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `MinDistance` float NOT NULL DEFAULT '0' AFTER `VolumeFloat`, + MODIFY `DistanceCutoff` float NOT NULL DEFAULT '0' AFTER `MinDistance`, + MODIFY `VolumeVariationPlus` float NOT NULL DEFAULT '0' AFTER `DistanceCutoff`, + MODIFY `VolumeVariationMinus` float NOT NULL DEFAULT '0' AFTER `VolumeVariationPlus`, + MODIFY `PitchVariationPlus` float NOT NULL DEFAULT '0' AFTER `VolumeVariationMinus`, + MODIFY `PitchVariationMinus` float NOT NULL DEFAULT '0' AFTER `PitchVariationPlus`, + MODIFY `PitchAdjust` float NOT NULL DEFAULT '0' AFTER `PitchVariationMinus`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PitchAdjust`, + MODIFY `SoundEntriesAdvancedID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `BusOverwriteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundEntriesAdvancedID`, + MODIFY `SoundType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BusOverwriteID`, + MODIFY `EAXDef` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SoundType`, + MODIFY `DialogType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EAXDef`, + MODIFY `Unk700` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DialogType`; + +ALTER TABLE `specialization_spells` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `OverridesSpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `Description` text NULL AFTER `OverridesSpellID`, + MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpecID`; + +ALTER TABLE `spell` + MODIFY `Name` text NULL FIRST, + MODIFY `NameSubtext` text NULL AFTER `Name`, + MODIFY `Description` text NULL AFTER `NameSubtext`, + MODIFY `AuraDescription` text NULL AFTER `Description`, + MODIFY `MiscID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraDescription`, + MODIFY `DescriptionVariablesID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `spell_category` + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChargeRecoveryTime`, + MODIFY `UsesPerWeek` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `MaxCharges` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UsesPerWeek`; + +ALTER TABLE `spell_class_options` + MODIFY `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellClassMask4`, + MODIFY `ModalNextSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellClassSet`; + +ALTER TABLE `spell_effect` + MODIFY `EffectAmplitude` float NOT NULL DEFAULT '0' FIRST, + MODIFY `EffectBonusCoefficient` float NOT NULL DEFAULT '0' AFTER `EffectAmplitude`, + MODIFY `EffectChainAmplitude` float NOT NULL DEFAULT '0' AFTER `EffectBonusCoefficient`, + MODIFY `EffectPointsPerResource` float NOT NULL DEFAULT '0' AFTER `EffectChainAmplitude`, + MODIFY `EffectRealPointsPerLevel` float NOT NULL DEFAULT '0' AFTER `EffectPointsPerResource`, + MODIFY `EffectSpellClassMask1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectRealPointsPerLevel`, + MODIFY `EffectSpellClassMask2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask1`, + MODIFY `EffectSpellClassMask3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask2`, + MODIFY `EffectSpellClassMask4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask3`, + MODIFY `EffectPosFacing` float NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask4`, + MODIFY `BonusCoefficientFromAP` float NOT NULL DEFAULT '0' AFTER `EffectPosFacing`, + MODIFY `DifficultyID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Effect` int(10) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`, + MODIFY `EffectAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Effect`, + MODIFY `EffectChainTargets` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectBasePoints`, + MODIFY `EffectMechanic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectItemType`, + MODIFY `EffectRadiusIndex` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectMiscValueB`, + MODIFY `EffectRadiusMaxIndex` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectRadiusIndex`, + MODIFY `ImplicitTarget1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectTriggerSpell`, + MODIFY `ImplicitTarget2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ImplicitTarget1`, + MODIFY `EffectIndex` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`; + +ALTER TABLE `spell_item_enchantment` + MODIFY `TransmogCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectScalingPoints3`, + MODIFY `TextureFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TransmogCost`, + MODIFY `EffectPointsMin1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureFileDataID`, + MODIFY `EffectPointsMin2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EffectPointsMin1`, + MODIFY `EffectPointsMin3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EffectPointsMin2`, + MODIFY `ItemVisual` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EffectPointsMin3`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemVisual`, + MODIFY `RequiredSkillID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkillID`, + MODIFY `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkillRank`, + MODIFY `Charges` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevel`, + MODIFY `Effect1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Charges`, + MODIFY `Effect2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Effect1`, + MODIFY `Effect3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Effect2`, + MODIFY `ConditionID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Effect3`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ConditionID`, + MODIFY `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `ScalingClass` tinyint(4) NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `ScalingClassRestricted` tinyint(4) NOT NULL DEFAULT '0' AFTER `ScalingClass`; + +ALTER TABLE `spell_item_enchantment_condition` + MODIFY `Operator1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperandType5`, + MODIFY `Operator2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator1`, + MODIFY `Operator3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator2`, + MODIFY `Operator4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator3`, + MODIFY `Operator5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator4`, + MODIFY `RTOperandType1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator5`, + MODIFY `RTOperandType2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType1`, + MODIFY `RTOperandType3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType2`, + MODIFY `RTOperandType4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType3`, + MODIFY `RTOperandType5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType4`, + MODIFY `RTOperand1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType5`, + MODIFY `RTOperand2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand1`, + MODIFY `RTOperand3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand2`, + MODIFY `RTOperand4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand3`, + MODIFY `RTOperand5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand4`, + MODIFY `Logic1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand5`, + MODIFY `Logic2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Logic1`, + MODIFY `Logic3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Logic2`, + MODIFY `Logic4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Logic3`, + MODIFY `Logic5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Logic4`, + MODIFY `LTOperand1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Logic5`, + MODIFY `LTOperand2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand1`, + MODIFY `LTOperand3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand2`, + MODIFY `LTOperand4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand3`, + MODIFY `LTOperand5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand4`; + +ALTER TABLE `spell_power` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `ManaCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `ManaCostPercentage` float NOT NULL DEFAULT '0' AFTER `ManaCost`, + MODIFY `ManaCostPercentagePerSecond` float NOT NULL DEFAULT '0' AFTER `ManaCostPercentage`, + MODIFY `RequiredAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPercentagePerSecond`, + MODIFY `HealthCostPercentage` float NOT NULL DEFAULT '0' AFTER `RequiredAura`, + MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HealthCostPercentage`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerIndex`, + MODIFY `ManaCostPerLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `ManaCostPerSecond` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPerLevel`, + MODIFY `ManaCostAdditional` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPerSecond`, + MODIFY `PowerDisplayID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostAdditional`, + MODIFY `UnitPowerBarID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PowerDisplayID`; + +ALTER TABLE `spell_power_difficulty` CHANGE `SpellPowerID` `ID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PowerIndex`; + +ALTER TABLE `spell_scaling` + MODIFY `MinScalingLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ScalesFromItemLevel`, + MODIFY `MaxScalingLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinScalingLevel`, + MODIFY `ScalingClass` int(11) NOT NULL DEFAULT '0' AFTER `MaxScalingLevel`; + +ALTER TABLE `spell_shapeshift_form` MODIFY `MountTypeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PresetSpellID8`; + +ALTER TABLE `spell_target_restrictions` + MODIFY `TargetCreatureType` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Targets`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TargetCreatureType`, + MODIFY `MaxAffectedTargets` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`, + MODIFY `MaxTargetLevel` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxAffectedTargets`; + +ALTER TABLE `spell_totems` + MODIFY `RequiredTotemCategoryID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Totem2`, + MODIFY `RequiredTotemCategoryID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredTotemCategoryID1`; + +ALTER TABLE `spell_x_spell_visual` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `Unk620` float NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `SpellVisualID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unk620`, + MODIFY `SpellVisualID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID1`, + MODIFY `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID2`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; + +ALTER TABLE `taxi_nodes` + MODIFY `PosX` float NOT NULL DEFAULT '0' FIRST, + MODIFY `PosY` float NOT NULL DEFAULT '0' AFTER `PosX`, + MODIFY `PosZ` float NOT NULL DEFAULT '0' AFTER `PosY`, + MODIFY `Name` text NULL AFTER `PosZ`, + MODIFY `MountCreatureID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `MountCreatureID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MountCreatureID1`, + MODIFY `MapOffsetX` float NOT NULL DEFAULT '0' AFTER `MountCreatureID2`, + MODIFY `MapOffsetY` float NOT NULL DEFAULT '0' AFTER `MapOffsetX`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapOffsetY`, + MODIFY `ConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `LearnableIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LearnableIndex`; + +ALTER TABLE `taxi_path` + MODIFY `From` smallint(5) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `To` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `From`, + MODIFY `Cost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `taxi_path_node` + MODIFY `LocX` float NOT NULL DEFAULT '0' FIRST, + MODIFY `LocY` float NOT NULL DEFAULT '0' AFTER `LocX`, + MODIFY `LocZ` float NOT NULL DEFAULT '0' AFTER `LocY`, + MODIFY `Delay` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LocZ`, + MODIFY `PathID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Delay`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PathID`, + MODIFY `ArrivalEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `DepartureEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ArrivalEventID`, + MODIFY `NodeIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepartureEventID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NodeIndex`; + +ALTER TABLE `toy` + MODIFY `ItemID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `Description` text NULL AFTER `ItemID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `CategoryFilter` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +ALTER TABLE `unit_power_bar` + MODIFY `RegenerationPeace` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `RegenerationCombat` float NOT NULL DEFAULT '0' AFTER `RegenerationPeace`, + MODIFY `FileDataID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RegenerationCombat`, + MODIFY `FileDataID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID1`, + MODIFY `FileDataID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID2`, + MODIFY `FileDataID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID3`, + MODIFY `FileDataID5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID4`, + MODIFY `FileDataID6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID5`, + MODIFY `Color1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID6`, + MODIFY `Color2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color1`, + MODIFY `Color3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color2`, + MODIFY `Color4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color3`, + MODIFY `Color5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color4`, + MODIFY `Color6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color5`, + MODIFY `Name` text NULL AFTER `Color6`, + MODIFY `Cost` text NULL AFTER `Name`, + MODIFY `OutOfError` text NULL AFTER `Cost`, + MODIFY `ToolTip` text NULL AFTER `OutOfError`, + MODIFY `StartInset` float NOT NULL DEFAULT '0' AFTER `ToolTip`, + MODIFY `EndInset` float NOT NULL DEFAULT '0' AFTER `StartInset`, + MODIFY `StartPower` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EndInset`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartPower`, + MODIFY `CenterPower` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `BarType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CenterPower`, + MODIFY `MinPower` int(10) unsigned NOT NULL DEFAULT '0' AFTER `BarType`; + +ALTER TABLE `vehicle_seat` + MODIFY `CameraEnteringDelay` float NOT NULL DEFAULT '0' AFTER `VehicleExitAnimDelay`, + MODIFY `CameraEnteringDuration` float NOT NULL DEFAULT '0' AFTER `CameraEnteringDelay`, + MODIFY `CameraExitingDelay` float NOT NULL DEFAULT '0' AFTER `CameraEnteringDuration`, + MODIFY `CameraExitingDuration` float NOT NULL DEFAULT '0' AFTER `CameraExitingDelay`, + MODIFY `CameraOffsetX` float NOT NULL DEFAULT '0' AFTER `CameraExitingDuration`, + MODIFY `CameraOffsetY` float NOT NULL DEFAULT '0' AFTER `CameraOffsetX`, + MODIFY `CameraOffsetZ` float NOT NULL DEFAULT '0' AFTER `CameraOffsetY`, + MODIFY `CameraPosChaseRate` float NOT NULL DEFAULT '0' AFTER `CameraOffsetZ`, + MODIFY `CameraFacingChaseRate` float NOT NULL DEFAULT '0' AFTER `CameraPosChaseRate`, + MODIFY `CameraEnteringZoom` float NOT NULL DEFAULT '0' AFTER `CameraFacingChaseRate`, + MODIFY `CameraSeatZoomMin` float NOT NULL DEFAULT '0' AFTER `CameraEnteringZoom`, + MODIFY `CameraSeatZoomMax` float NOT NULL DEFAULT '0' AFTER `CameraSeatZoomMin`, + MODIFY `UISkinFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CameraSeatZoomMax`, + MODIFY `EnterAnimStart` smallint(6) NOT NULL DEFAULT '0' AFTER `UISkinFileDataID`, + MODIFY `EnterAnimLoop` smallint(6) NOT NULL DEFAULT '0' AFTER `EnterAnimStart`, + MODIFY `RideAnimStart` smallint(6) NOT NULL DEFAULT '0' AFTER `EnterAnimLoop`, + MODIFY `RideAnimLoop` smallint(6) NOT NULL DEFAULT '0' AFTER `RideAnimStart`, + MODIFY `RideUpperAnimStart` smallint(6) NOT NULL DEFAULT '0' AFTER `RideAnimLoop`, + MODIFY `RideUpperAnimLoop` smallint(6) NOT NULL DEFAULT '0' AFTER `RideUpperAnimStart`, + MODIFY `ExitAnimStart` smallint(6) NOT NULL DEFAULT '0' AFTER `RideUpperAnimLoop`, + MODIFY `ExitAnimLoop` smallint(6) NOT NULL DEFAULT '0' AFTER `ExitAnimStart`, + MODIFY `ExitAnimEnd` smallint(6) NOT NULL DEFAULT '0' AFTER `ExitAnimLoop`, + MODIFY `VehicleEnterAnim` smallint(6) NOT NULL DEFAULT '0' AFTER `ExitAnimEnd`, + MODIFY `VehicleExitAnim` smallint(6) NOT NULL DEFAULT '0' AFTER `VehicleEnterAnim`, + MODIFY `VehicleRideAnimLoop` smallint(6) NOT NULL DEFAULT '0' AFTER `VehicleExitAnim`, + MODIFY `EnterAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `VehicleRideAnimLoop`, + MODIFY `RideAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EnterAnimKitID`, + MODIFY `ExitAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RideAnimKitID`, + MODIFY `VehicleEnterAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ExitAnimKitID`, + MODIFY `VehicleRideAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `VehicleEnterAnimKitID`, + MODIFY `VehicleExitAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `VehicleRideAnimKitID`, + MODIFY `CameraModeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `VehicleExitAnimKitID`, + MODIFY `AttachmentID` tinyint(4) NOT NULL DEFAULT '0' AFTER `CameraModeID`, + MODIFY `PassengerAttachmentID` tinyint(4) NOT NULL DEFAULT '0' AFTER `AttachmentID`, + MODIFY `VehicleEnterAnimBone` tinyint(4) NOT NULL DEFAULT '0' AFTER `PassengerAttachmentID`, + MODIFY `VehicleExitAnimBone` tinyint(4) NOT NULL DEFAULT '0' AFTER `VehicleEnterAnimBone`, + MODIFY `VehicleRideAnimLoopBone` tinyint(4) NOT NULL DEFAULT '0' AFTER `VehicleExitAnimBone`, + MODIFY `VehicleAbilityDisplay` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `VehicleRideAnimLoopBone`; + +ALTER TABLE `wmo_area_table` + MODIFY `WMOGroupID` int(11) NOT NULL DEFAULT '0' FIRST, + MODIFY `AreaName` text NULL AFTER `WMOGroupID`, + MODIFY `WMOID` smallint(6) NOT NULL DEFAULT '0' AFTER `AreaName`, + MODIFY `AmbienceID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WMOID`, + MODIFY `ZoneMusic` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AmbienceID`, + MODIFY `IntroSound` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ZoneMusic`, + MODIFY `AreaTableID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IntroSound`, + MODIFY `UWIntroSound` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaTableID`, + MODIFY `UWAmbience` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UWIntroSound`, + MODIFY `NameSet` tinyint(4) NOT NULL DEFAULT '0' AFTER `UWAmbience`, + MODIFY `SoundProviderPref` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NameSet`, + MODIFY `SoundProviderPrefUnderwater` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SoundProviderPref`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SoundProviderPrefUnderwater`, + MODIFY `UWZoneMusic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `world_map_area` + MODIFY `AreaName` text NULL FIRST, + MODIFY `LocLeft` float NOT NULL DEFAULT '0' AFTER `AreaName`, + MODIFY `LocRight` float NOT NULL DEFAULT '0' AFTER `LocLeft`, + MODIFY `LocTop` float NOT NULL DEFAULT '0' AFTER `LocRight`, + MODIFY `LocBottom` float NOT NULL DEFAULT '0' AFTER `LocTop`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LocBottom`, + MODIFY `AreaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `DisplayMapID` smallint(6) NOT NULL DEFAULT '0' AFTER `AreaID`, + MODIFY `DefaultDungeonFloor` smallint(6) NOT NULL DEFAULT '0' AFTER `DisplayMapID`, + MODIFY `ParentWorldMapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DefaultDungeonFloor`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ParentWorldMapID`, + MODIFY `LevelRangeMin` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `LevelRangeMax` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LevelRangeMin`, + MODIFY `BountySetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LevelRangeMax`, + MODIFY `BountyBoardLocation` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BountySetID`, + MODIFY `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +ALTER TABLE `world_map_overlay` + MODIFY `TextureWidth` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureName`, + MODIFY `TextureHeight` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureWidth`, + MODIFY `MapAreaID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TextureHeight`, + MODIFY `AreaID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MapAreaID`, + MODIFY `AreaID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `OffsetX` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `OffsetY` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OffsetX`, + MODIFY `HitRectTop` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OffsetY`, + MODIFY `HitRectLeft` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HitRectTop`, + MODIFY `HitRectBottom` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HitRectLeft`, + MODIFY `HitRectRight` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HitRectBottom`, + MODIFY `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HitRectRight`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`; + +DROP TABLE `glyph_slot`; diff --git a/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql b/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql deleted file mode 100644 index 44e87058b38..00000000000 --- a/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sha_mana_tide_totem'; diff --git a/src/common/Define.h b/src/common/Define.h index 5bbb77916f5..784bb4dd8ca 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -164,10 +164,7 @@ enum DBCFormer FT_FLOAT = 'f', // float FT_INT = 'i', // uint32 FT_BYTE = 'b', // uint8 - FT_LONG = 'l', // uint64 - FT_SHORT = 'h', // uint16 - FT_SORT = 'd', // sorted by this field but not present in DB2 data block (calculated) - FT_IND = 'n' // sorted by this field + FT_SHORT = 'h' // uint16 }; #endif //TRINITY_DEFINE_H diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6055abdd08d..8dbfbb150a7 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -127,7 +127,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); @@ -554,7 +553,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC); @@ -583,7 +581,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and talentGroup = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index e35bedfd587..81847f12c58 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -110,7 +110,6 @@ enum CharacterDatabaseStatements CHAR_SEL_CHARACTER_CRITERIAPROGRESS, CHAR_SEL_CHARACTER_EQUIPMENTSETS, CHAR_SEL_CHARACTER_BGDATA, - CHAR_SEL_CHARACTER_GLYPHS, CHAR_SEL_CHARACTER_TALENTS, CHAR_SEL_CHARACTER_SKILLS, CHAR_SEL_CHARACTER_RANDOMBG, @@ -470,7 +469,6 @@ enum CharacterDatabaseStatements CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, - CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHAR_SKILLS, CHAR_UPD_CHAR_MONEY, @@ -497,7 +495,6 @@ enum CharacterDatabaseStatements CHAR_INS_CHAR_STATS, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, - CHAR_INS_CHAR_GLYPHS, CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, CHAR_INS_CHAR_TALENT, CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 31db228b20a..6a7badda678 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -15,8 +15,8 @@ * with this program. If not, see . */ - // DO NOT EDIT! - // Autogenerated from DB2Structure.h +// DO NOT EDIT! +// Autogenerated from DB2Structure.h #include "HotfixDatabase.h" @@ -31,8 +31,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS); // Achievement.db2 - PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, IconID, " - "SharesCriteria, CriteriaTree, Faction, Points, MinimumCriteria FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, IconID, SharesCriteria, " + "CriteriaTree, Faction, Points, MinimumCriteria, ID FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); // AnimKit.db2 @@ -43,14 +43,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() // AreaTable.db2 PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, Flags1, Flags2, ZoneName, AmbientMultiplier, AreaName, MapID, ParentAreaID, AreaBit, " - "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWIntroMusic, UWZoneMusic, UWAmbience, " - "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, " - "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); + "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWZoneMusic, UWAmbience, " + "PvPCombatWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, " + "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, UWIntroSound FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?", CONNECTION_SYNCH); // AreaTrigger.db2 - PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT ID, PosX, PosY, PosZ, Radius, BoxLength, BoxWidth, BoxHeight, BoxYaw, MapID, PhaseID, " - "PhaseGroupID, ShapeID, AreaTriggerActionSetID, PhaseUseFlags, ShapeType, Flag FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT PosX, PosY, PosZ, Radius, BoxLength, BoxWidth, BoxHeight, BoxYaw, MapID, PhaseID, PhaseGroupID, " + "ShapeID, AreaTriggerActionSetID, PhaseUseFlags, ShapeType, Flag, ID FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH); // ArmorLocation.db2 PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Modifier1, Modifier2, Modifier3, Modifier4, Modifier5 FROM armor_location ORDER BY ID DESC", CONNECTION_SYNCH); @@ -66,7 +66,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons ORDER BY ID DESC", CONNECTION_SYNCH); // BarberShopStyle.db2 - PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, CostModifier, Type, Race, Sex, Data FROM barber_shop_style" + PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, CostModifier, Type, Race, Sex, Data, ID FROM barber_shop_style" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -77,8 +77,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, Value, BreedID, State FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetSpecies.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, SourceText, Description, Flags, PetType, " - "Source FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT CreatureID, IconFileID, SummonSpellID, SourceText, Description, Flags, PetType, Source, " + "ID FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText_lang, Description_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetSpeciesState.db2 @@ -92,12 +92,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() // BroadcastText.db2 PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " - "EmoteDelay3, SoundID, UnkEmoteID, Language, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); + "EmoteDelay3, UnkEmoteID, Language, Type, SoundID1, SoundID2, PlayerConditionID FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); // CharSections.db2 PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT Id, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3, Flags, Race, Gender, GenType, " - "Type, Color FROM char_sections ORDER BY Id DESC", CONNECTION_SYNCH); + "Type, Color FROM char_sections ORDER BY ID DESC", CONNECTION_SYNCH); // CharStartOutfit.db2 PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " @@ -113,9 +113,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrClasses.db2 - PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, PowerType, PetNameToken, Name, NameFemale, NameMale, Filename, CreateScreenFileDataID, " - "SelectScreenFileDataID, LowResScreenFileDataID, Flags, CinematicSequenceID, DefaultSpec, SpellClassSet, AttackPowerPerStrength, " - "AttackPowerPerAgility, RangedAttackPowerPerAgility, IconFileDataID, Unk1 FROM chr_classes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT PetNameToken, Name, NameFemale, NameMale, Filename, CreateScreenFileDataID, " + "SelectScreenFileDataID, LowResScreenFileDataID, Flags, CinematicSequenceID, DefaultSpec, PowerType, SpellClassSet, AttackPowerPerStrength, " + "AttackPowerPerAgility, RangedAttackPowerPerAgility, IconFileDataID, Unk1, ID FROM chr_classes ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_classes_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrClassesXPowerTypes.db2 @@ -126,14 +126,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() "FacialHairCustomization2, HairCustomization, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, " "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, " "ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, " - "UAFemaleCreatureSoundDataID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, " - "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, " - "CharComponentTexLayoutHiResID FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); + "UAFemaleCreatureSoundDataID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " + "DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, CharComponentTexLayoutHiResID, HighResMaleDisplayID, HighResFemaleDisplayID" + " FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrSpecialization.db2 - PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, MasterySpellID1, MasterySpellID2, Flags, AnimReplacementSetID, Name, Name2, " - "Description, BackgroundFile, SpellIconID, ClassID, OrderIndex, PetTalentType, Role, PrimaryStatOrder FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT MasterySpellID1, MasterySpellID2, Name, Name2, Description, BackgroundFile, SpellIconID, " + "ClassID, OrderIndex, PetTalentType, Role, PrimaryStatOrder, ID, Flags, AnimReplacementSetID FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, Name_lang, Name2_lang, Description_lang FROM chr_specialization_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -158,11 +158,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); // CreatureModelData.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, Flags, FileDataID, ModelScale, FootprintTextureLength, FootprintTextureWidth, " - "FootprintParticleScale, CollisionWidth, CollisionHeight, MountHeight, GeoBoxMin1, GeoBoxMin2, GeoBoxMin3, GeoBoxMax1, GeoBoxMax2, " - "GeoBoxMax3, WorldEffectScale, AttachedEffectScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, " - "OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, HoverHeight, SoundID, CreatureGeosetDataID, " - "SizeClass, BloodID, FootprintTextureID, FoleyMaterialID, Unk700_1, Unk700_2, FootstepShakeSize, DeathThudShakeSize FROM creature_model_data" + PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, ModelScale, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, " + "CollisionWidth, CollisionHeight, MountHeight, GeoBoxMin1, GeoBoxMin2, GeoBoxMin3, GeoBoxMax1, GeoBoxMax2, GeoBoxMax3, WorldEffectScale, " + "AttachedEffectScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, OverrideLootEffectScale, OverrideNameScale, " + "OverrideSelectionRadius, TamedPetBaseScale, HoverHeight, Flags, FileDataID, SizeClass, BloodID, FootprintTextureID, FoleyMaterialID, " + "FootstepEffectID, DeathThudEffectID, FootstepShakeSize, DeathThudShakeSize, SoundID, CreatureGeosetDataID FROM creature_model_data" " ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureType.db2 @@ -170,17 +170,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Criteria.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Asset, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, " - "StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, StartEvent, " + "FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); // CriteriaTree.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Amount, Description, CriteriaID, Parent, Flags, OrderIndex, Operator FROM criteria_tree" + PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Amount, Description, Parent, Flags, Operator, OrderIndex FROM criteria_tree" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH); // CurrencyTypes.db2 PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, InventoryIcon1, InventoryIcon2, MaxQty, MaxEarnablePerWeek, Flags, Description, " - "CategoryID, SpellWeight, SpellCategory, Quality FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); + "CategoryID, SpellCategory, Quality, SpellWeight FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); // CurvePoint.db2 @@ -201,7 +201,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); // DungeonEncounter.db2 - PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name, CreatureDisplayID, MapID, OrderIndex, SpellIconID, DifficultyID, Bit, Flags" + PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name, CreatureDisplayID, MapID, SpellIconID, DifficultyID, Bit, Flags, OrderIndex" " FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -217,22 +217,22 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); // Emotes.db2 - PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, Unk703_1, Unk703_2, AnimID, EmoteSpecProcParam, " - "EmoteSoundID, EmoteSpecProc FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSpecProc, EmoteSpecProcParam, " + "EmoteSoundID, ClassMask, RaceMask FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); // EmotesText.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name_lang FROM emotes_text_locale WHERE locale = ?", CONNECTION_SYNCH); // EmotesTextSound.db2 - PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, RaceId, SexId, ClassId, SoundId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); // Faction.db2 PrepareStatement(HOTFIX_SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, " "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ParentFactionModIn, ParentFactionModOut, Name, Description, " - "ReputationIndex, ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, " - "ReputationFlags3, ReputationFlags4, ParentFactionID, ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction" - " ORDER BY ID DESC", CONNECTION_SYNCH); + "ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, ReputationIndex, ReputationClassMask1, ReputationClassMask2, " + "ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, ParentFactionID, " + "ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?", CONNECTION_SYNCH); // FactionTemplate.db2 @@ -240,8 +240,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Friends4, Mask, FriendMask, EnemyMask FROM faction_template ORDER BY ID DESC", CONNECTION_SYNCH); // Gameobjects.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, " - "Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type FROM gameobjects" + PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, Data2, " + "Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type, ID FROM gameobjects" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -250,34 +250,34 @@ void HotfixDatabaseConnection::DoPrepareStatements() "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, Flags, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " - "FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT Name, Description, IconFileDataID, Flags, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " + "FollowerTypeID, ID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuilding.db2 PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, NameAlliance, NameHorde, Description, Tooltip, " - "IconFileDataID, BuildDuration, CostCurrencyID, CostCurrencyAmount, AllianceActivationScenePackageID, HordeActivationScenePackageID, " - "CostMoney, Unknown, Type, Level, HordeTexPrefixKitID, AllianceTexPrefixKitID, BonusAmount, Flags, MaxShipments, " - "FollowerRequiredGarrAbilityID, FollowerGarrAbilityEffectID, GarrTypeID FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); + "IconFileDataID, CostCurrencyID, HordeTexPrefixKitID, AllianceTexPrefixKitID, AllianceActivationScenePackageID, " + "HordeActivationScenePackageID, FollowerRequiredGarrAbilityID, FollowerGarrAbilityEffectID, CostMoney, Unknown, Type, Level, Flags, " + "MaxShipments, GarrTypeID, BuildDuration, CostCurrencyAmount, BonusAmount FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, NameAlliance_lang, NameHorde_lang, Description_lang, Tooltip_lang" " FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuildingPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, LandmarkOffsetX, LandmarkOffsetY, UiTextureAtlasMemberID, " - "GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT LandmarkOffsetX, LandmarkOffsetY, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " + "GarrBuildingID, ID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 - PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, `Limit`, Flags" + PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, `Limit`, Flags, ID" " FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale" " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollower.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, " - "HordePortraitIconID, AlliancePortraitIconID, ItemLevelWeapon, ItemLevelArmor, FollowerTypeID, HordeUiAnimRaceInfoID, " - "AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, " - "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID, MaxDurability, Class" - " FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, HordePortraitIconID, " + "AlliancePortraitIconID, HordeAddedBroadcastTextID, AllianceAddedBroadcastTextID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, " + "ItemLevelWeapon, ItemLevelArmor, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, FollowerTypeID, HordeUiAnimRaceInfoID, " + "AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, Level, Unknown1, Flags, Unknown2, Unknown3, GarrTypeID, " + "MaxDurability, Class, HordeFlavorTextGarrStringID, AllianceFlavorTextGarrStringID, ID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 @@ -285,8 +285,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, MinCount, MaxCount, " - "GarrPlotUICategoryID, PlotType, Flags FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, GarrPlotUICategoryID, " + "PlotType, Flags, MinCount, MaxCount FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrPlotBuilding.db2 @@ -297,7 +297,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name_lang FROM garr_plot_instance_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrSiteLevel.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, UpgradeResourceCost, UpgradeMoneyCost, Level, SiteID, " + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, SiteID, UpgradeResourceCost, UpgradeMoneyCost, Level, " "UITextureKitID, MovieID, Level2 FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevelPlotInst.db2 @@ -311,9 +311,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, Type, GlyphExclusiveCategoryID FROM glyph_properties" " ORDER BY ID DESC", CONNECTION_SYNCH); - // GlyphSlot.db2 - PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Tooltip, Type FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); - // GuildColorBackground.db2 PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); @@ -327,8 +324,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Heirloom.db2 - PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, " - "ItemBonusListID1, ItemBonusListID2, Flags, Source FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, " + "ItemBonusListID1, ItemBonusListID2, Flags, Source, ID FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_HEIRLOOM, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?", CONNECTION_SYNCH); // Holidays.db2 @@ -418,17 +415,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ItemExtendedCost.db2 PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, RequiredItem5, " - "RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, RequiredMoney, " - "RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredPersonalArenaRating, " - "RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, " - "RequiredFactionStanding, RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); + "RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, RequiredItemCount1, " + "RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredPersonalArenaRating, RequiredCurrency1, " + "RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, RequiredFactionStanding, " + "RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); // ItemLimitCategory.db2 PrepareStatement(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index`, SourceType" + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ItemID, AppearanceID, AppearanceModID, `Index`, SourceType, ID" " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); // ItemPriceBase.db2 @@ -446,7 +443,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ItemSet.db2 PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " - "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, Unknown703, RequiredSkillRank, RequiredSkill FROM item_set" + "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill, Flags FROM item_set" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -487,10 +484,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // LfgDungeons.db2 - PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Flags, TextureFilename, Description, MaxLevel, TargetLevelMax, MapID, RandomID, " + PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT Name, Flags, TextureFilename, Description, MaxLevel, TargetLevelMax, MapID, RandomID, " "ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, TargetLevelMin, DifficultyID, Type, " "Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, SubType, " - "MentorCharLevel FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); + "MentorCharLevel, ID FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH); // Light.db2 @@ -500,9 +497,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() // LiquidType.db2 PrepareStatement(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name, SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, " "ParticleScale, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, " - "Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Flags, " - "SoundID, Type, LightID, ParticleMovement, ParticleTexSlots, MaterialID, DepthTexCount1, DepthTexCount2, DepthTexCount3, DepthTexCount4, " - "DepthTexCount5, DepthTexCount6 FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH); + "Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, " + "Flags, LightID, Type, ParticleMovement, ParticleTexSlots, MaterialID, DepthTexCount1, DepthTexCount2, DepthTexCount3, DepthTexCount4, " + "DepthTexCount5, DepthTexCount6, SoundID FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name_lang FROM liquid_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Lock.db2 @@ -521,21 +518,21 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH); // MapDifficulty.db2 - PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, Context, MapID, DifficultyID, RaidDurationType, MaxPlayers, LockID, " - "ItemBonusTreeModID FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, MapID, DifficultyID, RaidDurationType, MaxPlayers, LockID, ItemBonusTreeModID, " + "Context FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); // ModifierTree.db2 PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT ID, SpellId, DisplayId, Name, Description, SourceDescription, MountTypeId, Flags, PlayerConditionId, " - "Source FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT SpellId, DisplayId, Name, Description, SourceDescription, CameraPivotMultiplier, MountTypeId, Flags, " + "PlayerConditionId, Source, ID FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); // MountCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredAura, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, " - "RequiredMap, Flags FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, RequiredMap, Flags, ID, " + "RequiredAura FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); // MountTypeXCapability.db2 PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" @@ -569,21 +566,21 @@ void HotfixDatabaseConnection::DoPrepareStatements() // PlayerCondition.db2 PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, RaceMask, SkillLogic, ReputationLogic, PrevQuestLogic, CurrQuestLogic, " - "CurrentCompletedQuestLogic, SpellLogic, SpellID1, SpellID2, SpellID3, SpellID4, ItemLogic, ItemID1, ItemID2, ItemID3, ItemID4, Time1, Time2, " - "AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AchievementLogic, AreaLogic, QuestKillLogic, QuestKillMonster1, " - "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, FailureDescription, Unknown700_1, " - "Unknown700_2, MinLevel, MaxLevel, ClassMask, SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, " - "MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, MinFactionID3, MaxFactionID, PrevQuestID1, PrevQuestID2, PrevQuestID3, " + "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, Time1, Time2, AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, " + "AchievementLogic, AreaLogic, QuestKillLogic, FailureDescription, MinLevel, MaxLevel, SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, " + "MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MaxFactionID, PrevQuestID1, PrevQuestID2, PrevQuestID3, " "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " "CurrentCompletedQuestID3, CurrentCompletedQuestID4, Explored1, Explored2, WorldStateExpressionID, Achievement1, Achievement2, Achievement3, " - "Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, QuestKillID, PhaseID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, " - "MaxAvgEquippedItemLevel, ModifierTreeID, Flags, Gender, NativeGender, LanguageID, MinLanguage, MaxLanguage, MinReputation1, MinReputation2, " - "MinReputation3, MaxReputation, Unknown1, MinPVPRank, MaxPVPRank, PvpMedal, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemFlags, " - "AuraCount1, AuraCount2, AuraCount3, AuraCount4, WeatherID, PartyStatus, LifetimeMaxPVPRank, LfgLogic, LfgStatus1, LfgStatus2, LfgStatus3, " - "LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, " - "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, MinExpansionLevel, MaxExpansionLevel, " - "MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, PhaseGroupID, ChrSpecializationIndex, " - "ChrSpecializationRole, PowerType, PowerTypeComp, PowerTypeValue FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); + "Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, QuestKillID, PhaseID, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, ModifierTreeID, " + "Flags, Gender, NativeGender, MinLanguage, MaxLanguage, MinReputation1, MinReputation2, MinReputation3, MaxReputation, Unknown1, MinPVPRank, " + "MaxPVPRank, PvpMedal, ItemFlags, AuraCount1, AuraCount2, AuraCount3, AuraCount4, WeatherID, PartyStatus, LifetimeMaxPVPRank, LfgStatus1, " + "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, CurrencyCount1, CurrencyCount2, CurrencyCount3, " + "CurrencyCount4, MinExpansionLevel, MaxExpansionLevel, MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, " + "ChrSpecializationIndex, ChrSpecializationRole, PowerType, PowerTypeComp, PowerTypeValue, ClassMask, LanguageID, MinFactionID1, " + "MinFactionID2, MinFactionID3, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, " + "ItemCount3, ItemCount4, LfgLogic, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, CurrencyID2, CurrencyID3, " + "CurrencyID4, QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, PhaseGroupID, " + "MinAvgItemLevel, MaxAvgItemLevel, Unknown700_1, Unknown700_2 FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH); // PowerDisplay.db2 @@ -631,27 +628,27 @@ void HotfixDatabaseConnection::DoPrepareStatements() " WHERE locale = ?", CONNECTION_SYNCH); // SkillLineAbility.db2 - PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, ClassMask, SupercedesSpell, SkillLine, MinSkillLineRank, " - "TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AquireMethod, NumSkillUps FROM skill_line_ability" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, SupercedesSpell, Unknown703, SkillLine, MinSkillLineRank, " + "TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AquireMethod, NumSkillUps, ClassMask" + " FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH); // SkillRaceClassInfo.db2 - PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, ClassMask, SkillID, Flags, SkillTierID, Availability, MinLevel" + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, Flags, SkillTierID, Availability, MinLevel, ClassMask" " FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH); // SoundKit.db2 - PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, VolumeVariationMinus, " - "PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, BusOverwriteID, SoundType, EAXDef, DialogType, Unk700" - " FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, VolumeVariationMinus, " + "PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, BusOverwriteID, SoundType, EAXDef, DialogType, Unk700, " + "ID FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name_lang FROM sound_kit_locale WHERE locale = ?", CONNECTION_SYNCH); // SpecializationSpells.db2 - PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpellID, OverridesSpellID, Description, SpecID, OrderIndex" + PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT SpellID, OverridesSpellID, Description, SpecID, OrderIndex, ID" " FROM specialization_spells ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?", CONNECTION_SYNCH); // Spell.db2 - PrepareStatement(HOTFIX_SEL_SPELL, "SELECT ID, Name, NameSubtext, Description, AuraDescription, MiscID, DescriptionVariablesID FROM spell" + PrepareStatement(HOTFIX_SEL_SPELL, "SELECT Name, NameSubtext, Description, AuraDescription, MiscID, ID, DescriptionVariablesID FROM spell" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL, "SELECT ID, Name_lang, NameSubtext_lang, Description_lang, AuraDescription_lang FROM spell_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -677,13 +674,13 @@ void HotfixDatabaseConnection::DoPrepareStatements() "DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCategory.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Unk703, Flags, UsesPerWeek, MaxCharges FROM spell_category" + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges, Unk703 FROM spell_category" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellClassOptions.db2 PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " - "ModalNextSpell, SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + "SpellClassSet, ModalNextSpell FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCooldowns.db2 PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, SpellID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, DifficultyID" @@ -693,11 +690,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerLevel FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); // SpellEffect.db2 - PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, EffectAmplitude, EffectAuraPeriod, EffectBasePoints, EffectBonusCoefficient, " - "EffectChainAmplitude, EffectDieSides, EffectItemType, EffectMiscValue, EffectMiscValueB, EffectPointsPerResource, EffectRealPointsPerLevel, " - "EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, EffectTriggerSpell, EffectPosFacing, SpellID, " - "EffectAttributes, BonusCoefficientFromAP, EffectAura, EffectChainTargets, DifficultyID, Effect, EffectMechanic, EffectRadiusIndex, " - "EffectRadiusMaxIndex, ImplicitTarget1, ImplicitTarget2, EffectIndex FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT EffectAmplitude, EffectBonusCoefficient, EffectChainAmplitude, EffectPointsPerResource, " + "EffectRealPointsPerLevel, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, EffectPosFacing, " + "BonusCoefficientFromAP, ID, DifficultyID, Effect, EffectAura, EffectAuraPeriod, EffectBasePoints, EffectChainTargets, EffectDieSides, " + "EffectItemType, EffectMechanic, EffectMiscValue, EffectMiscValueB, EffectRadiusIndex, EffectRadiusMaxIndex, EffectTriggerSpell, " + "ImplicitTarget1, ImplicitTarget2, SpellID, EffectIndex, EffectAttributes FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH); // SpellEffectScaling.db2 PrepareStatement(HOTFIX_SEL_SPELL_EFFECT_SCALING, "SELECT ID, Coefficient, Variance, ResourceCoefficient, SpellEffectID FROM spell_effect_scaling" @@ -717,16 +714,16 @@ void HotfixDatabaseConnection::DoPrepareStatements() // SpellItemEnchantment.db2 PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, EffectSpellID1, EffectSpellID2, EffectSpellID3, Name, EffectScalingPoints1, " - "EffectScalingPoints2, EffectScalingPoints3, PlayerConditionID, TransmogCost, TextureFileDataID, EffectPointsMin1, EffectPointsMin2, " - "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ConditionID, " - "MinLevel, MaxLevel, ScalingClass, ScalingClassRestricted FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH); + "EffectScalingPoints2, EffectScalingPoints3, TransmogCost, TextureFileDataID, EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, " + "ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ConditionID, MinLevel, MaxLevel, " + "ScalingClass, ScalingClassRestricted, PlayerConditionID FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang FROM spell_item_enchantment_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellItemEnchantmentCondition.db2 PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, " - "LTOperandType5, LTOperand1, LTOperand2, LTOperand3, LTOperand4, LTOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " - "RTOperandType1, RTOperandType2, RTOperandType3, RTOperandType4, RTOperandType5, RTOperand1, RTOperand2, RTOperand3, RTOperand4, RTOperand5, " - "Logic1, Logic2, Logic3, Logic4, Logic5 FROM spell_item_enchantment_condition ORDER BY ID DESC", CONNECTION_SYNCH); + "LTOperandType5, Operator1, Operator2, Operator3, Operator4, Operator5, RTOperandType1, RTOperandType2, RTOperandType3, RTOperandType4, " + "RTOperandType5, RTOperand1, RTOperand2, RTOperand3, RTOperand4, RTOperand5, Logic1, Logic2, Logic3, Logic4, Logic5, LTOperand1, LTOperand2, " + "LTOperand3, LTOperand4, LTOperand5 FROM spell_item_enchantment_condition ORDER BY ID DESC", CONNECTION_SYNCH); // SpellLearnSpell.db2 PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, LearnSpellID, SpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); @@ -741,13 +738,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() "MultistrikeSpeedMod, CastingTimeIndex, DurationIndex, RangeIndex, SpellIconID, ActiveIconID, SchoolMask FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPower.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, ManaCost, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, " - "HealthCostPercentage, ManaCostPerSecond, ManaCostAdditional, PowerDisplayID, UnitPowerBarID, PowerIndex, PowerType, ManaCostPerLevel" + PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT SpellID, ManaCost, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, " + "HealthCostPercentage, PowerIndex, PowerType, ID, ManaCostPerLevel, ManaCostPerSecond, ManaCostAdditional, PowerDisplayID, UnitPowerBarID" " FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" - " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT DifficultyID, PowerIndex, ID FROM spell_power_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinute.db2 PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); @@ -770,7 +766,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellScaling.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MinScalingLevel, MaxScalingLevel" + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, MinScalingLevel, MaxScalingLevel, ScalingClass" " FROM spell_scaling ORDER BY ID DESC", CONNECTION_SYNCH); // SpellShapeshift.db2 @@ -780,21 +776,21 @@ void HotfixDatabaseConnection::DoPrepareStatements() // SpellShapeshiftForm.db2 PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, WeaponDamageVariance, Flags, AttackIconID, CombatRoundTime, " "CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, PresetSpellID3, " - "PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8, CreatureType, MountTypeID, BonusActionBar" + "PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8, MountTypeID, CreatureType, BonusActionBar" " FROM spell_shapeshift_form ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellTargetRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, SpellID, ConeAngle, Width, Targets, MaxTargetLevel, TargetCreatureType, " - "DifficultyID, MaxAffectedTargets FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, SpellID, ConeAngle, Width, Targets, TargetCreatureType, DifficultyID, " + "MaxAffectedTargets, MaxTargetLevel FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); // SpellTotems.db2 PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, SpellID, Totem1, Totem2, RequiredTotemCategoryID1, RequiredTotemCategoryID2" " FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH); // SpellXSpellVisual.db2 - PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, Unk620, SpellVisualID1, SpellVisualID2, PlayerConditionID, DifficultyID, " - "Flags FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT SpellID, Unk620, SpellVisualID1, SpellVisualID2, PlayerConditionID, DifficultyID, " + "Flags, ID FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); // SummonProperties.db2 PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Category, Faction, Type, Slot, Flags FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH); @@ -805,23 +801,23 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_TALENT, "SELECT ID, Description_lang FROM talent_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiNodes.db2 - PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " - "ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " + "ConditionID, LearnableIndex, Flags, ID FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TAXI_NODES, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiPath.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT ID, `From`, `To`, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT `From`, `To`, ID, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiPathNode.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, LocX, LocY, LocZ, Delay, PathID, MapID, ArrivalEventID, DepartureEventID, NodeIndex, " - "Flags FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT LocX, LocY, LocZ, Delay, PathID, MapID, ArrivalEventID, DepartureEventID, NodeIndex, Flags, " + "ID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); // TotemCategory.db2 PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryMask, CategoryType FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); // Toy.db2 - PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Description, Flags, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOY, "SELECT ItemID, Description, Flags, CategoryFilter, ID FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, Description_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH); // TransportAnimation.db2 @@ -832,9 +828,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, TransportID, TimeIndex, X, Y, Z, W FROM transport_rotation ORDER BY ID DESC", CONNECTION_SYNCH); // UnitPowerBar.db2 - PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MaxPower, RegenerationPeace, RegenerationCombat, FileDataID1, FileDataID2, FileDataID3, " + PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, RegenerationPeace, RegenerationCombat, FileDataID1, FileDataID2, FileDataID3, " "FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, Name, Cost, OutOfError, ToolTip, StartInset, " - "EndInset, StartPower, Flags, MinPower, CenterPower, BarType FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); + "EndInset, StartPower, Flags, CenterPower, BarType, MinPower, MaxPower FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -850,26 +846,27 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, Flags1, Flags2, Flags3, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, " "EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, EnterMinArcHeight, EnterMaxArcHeight, ExitPreDelay, ExitSpeed, " "ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, PassengerYaw, PassengerPitch, PassengerRoll, " - "VehicleEnterAnimDelay, VehicleExitAnimDelay, EnterUISoundID, ExitUISoundID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, " - "CameraExitingDuration, CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, " - "CameraSeatZoomMin, CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, " - "RideUpperAnimLoop, ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterAnimKitID, " - "RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, " - "PassengerAttachmentID, VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay FROM vehicle_seat" + "VehicleEnterAnimDelay, VehicleExitAnimDelay, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " + "CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, " + "CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " + "ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterAnimKitID, RideAnimKitID, " + "ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, PassengerAttachmentID, " + "VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay, EnterUISoundID, ExitUISoundID FROM vehicle_seat" " ORDER BY ID DESC", CONNECTION_SYNCH); // WmoAreaTable.db2 - PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, WMOGroupID, AreaName, WMOID, AmbienceID, ZoneMusic, IntroSound, AreaTableID, " - "UWIntroSound, UWAmbience, NameSet, SoundProviderPref, SoundProviderPrefUnderwater, Flags, UWZoneMusic FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT WMOGroupID, AreaName, WMOID, AmbienceID, ZoneMusic, IntroSound, AreaTableID, UWIntroSound, " + "UWAmbience, NameSet, SoundProviderPref, SoundProviderPrefUnderwater, Flags, ID, UWZoneMusic FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, AreaName_lang FROM wmo_area_table_locale WHERE locale = ?", CONNECTION_SYNCH); // WorldMapArea.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_AREA, "SELECT ID, AreaName, LocLeft, LocRight, LocTop, LocBottom, MapID, AreaID, DisplayMapID, " - "DefaultDungeonFloor, ParentWorldMapID, Flags, PlayerConditionID, LevelRangeMin, LevelRangeMax FROM world_map_area ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WORLD_MAP_AREA, "SELECT AreaName, LocLeft, LocRight, LocTop, LocBottom, MapID, AreaID, DisplayMapID, " + "DefaultDungeonFloor, ParentWorldMapID, Flags, LevelRangeMin, LevelRangeMax, BountySetID, BountyBoardLocation, ID, PlayerConditionID" + " FROM world_map_area ORDER BY ID DESC", CONNECTION_SYNCH); // WorldMapOverlay.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, " - "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID, Flags FROM world_map_overlay" + PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, TextureWidth, TextureHeight, MapAreaID, AreaID1, AreaID2, AreaID3, " + "AreaID4, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID, Flags FROM world_map_overlay" " ORDER BY ID DESC", CONNECTION_SYNCH); // WorldMapTransforms.db2 diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index f9ef5610ca3..5c3b0ddb196 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ - // DO NOT EDIT! - // Autogenerated from DB2Structure.h +// DO NOT EDIT! +// Autogenerated from DB2Structure.h #ifndef _HOTFIXDATABASE_H #define _HOTFIXDATABASE_H @@ -177,8 +177,6 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GLYPH_PROPERTIES, - HOTFIX_SEL_GLYPH_SLOT, - HOTFIX_SEL_GUILD_COLOR_BACKGROUND, HOTFIX_SEL_GUILD_COLOR_BORDER, diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h new file mode 100644 index 00000000000..51dc273e2bc --- /dev/null +++ b/src/server/game/DataStores/DB2Metadata.h @@ -0,0 +1,6283 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef DB2Metadata_h__ +#define DB2Metadata_h__ + +#include "DB2Meta.h" + +struct AchievementMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssishhhhhhhbbbi"; + static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(14, 15, types, arraySizes); + return &instance; + } +}; + +struct Achievement_CategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct AdventureJournalMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sssiisshhhhhhbbbbbbbbb"; + static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1 }; + static DB2Meta instance(-1, 22, types, arraySizes); + return &instance; + } +}; + +struct AdventureMapPOIMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fissbiiiiiiii"; + static uint8 const arraySizes[13] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct AnimKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct AnimKitBoneSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct AnimKitBoneSetAliasMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct AnimKitConfigMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct AnimKitConfigBoneSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct AnimKitPriorityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct AnimKitSegmentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiifihhhbbbbbbbi"; + static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 16, types, arraySizes); + return &instance; + } +}; + +struct AnimReplacementMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhh"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct AnimReplacementSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct AnimationDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sihhb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct AreaGroupMemberMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct AreaPOIMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fsshhhhhhbbbi"; + static uint8 const arraySizes[13] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct AreaPOIStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct AreaTableMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iSfshhhhhhhhhhbbbbbbbbi"; + static uint8 const arraySizes[23] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 23, types, arraySizes); + return &instance; + } +}; + +struct AreaTriggerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffhhhhhbbbi"; + static uint8 const arraySizes[15] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(14, 15, types, arraySizes); + return &instance; + } +}; + +struct AreaTriggerActionSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct AreaTriggerBoxMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 3 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct AreaTriggerCylinderMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fff"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct AreaTriggerSphereMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ArmorLocationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffff"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ArtifactMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siiihhbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct ArtifactAppearanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siffihhhbbbbiii"; + static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(12, 15, types, arraySizes); + return &instance; + } +}; + +struct ArtifactAppearanceSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct ArtifactCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ArtifactPowerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbbbii"; + static uint8 const arraySizes[6] = { 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(4, 6, types, arraySizes); + return &instance; + } +}; + +struct ArtifactPowerLinkMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ArtifactPowerRankMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifhhb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ArtifactQuestXPMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 10 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ArtifactUnlockMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct AuctionHouseMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct BankBagSlotPricesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct BannedAddOnsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "SSb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BarberShopStyleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssfbbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct BattlePetAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isshbbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct BattlePetAbilityEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 6, 1, 1 }; + static DB2Meta instance(6, 7, types, arraySizes); + return &instance; + } +}; + +struct BattlePetAbilityStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BattlePetAbilityTurnMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbbbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(5, 6, types, arraySizes); + return &instance; + } +}; + +struct BattlePetBreedQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct BattlePetBreedStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BattlePetEffectPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shb"; + static uint8 const arraySizes[3] = { 6, 1, 6 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BattlePetNPCTeamMemberMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct BattlePetSpeciesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiisshbbi"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(8, 9, types, arraySizes); + return &instance; + } +}; + +struct BattlePetSpeciesStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BattlePetSpeciesXAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct BattlePetStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct BattlePetVisualMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhhhbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct BattlemasterListMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sishhhbbbbbbbbb"; + static uint8 const arraySizes[15] = { 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 15, types, arraySizes); + return &instance; + } +}; + +struct BoneWindModifierModelMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct BoneWindModifiersMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ff"; + static uint8 const arraySizes[2] = { 3, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct BountyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct BountySetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct BroadcastTextMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhhbbii"; + static uint8 const arraySizes[9] = { 1, 1, 3, 3, 1, 1, 1, 2, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct CameraEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct CameraEffectEntryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffffhhbbbbbb"; + static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 16, types, arraySizes); + return &instance; + } +}; + +struct CameraModeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffhbbbbb"; + static uint8 const arraySizes[11] = { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct CameraShakesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffbbbbi"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct CastableRaidBuffsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct Cfg_CategoriesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct Cfg_ConfigsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct Cfg_RegionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sib"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct CharBaseInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CharBaseSectionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct CharComponentTextureLayoutsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CharComponentTextureSectionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct CharHairGeosetsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbbbbbbbi"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct CharSectionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbbbb"; + static uint8 const arraySizes[7] = { 3, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct CharShipmentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiihbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct CharShipmentContainerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhhhhhbbbbbbbi"; + static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 16, types, arraySizes); + return &instance; + } +}; + +struct CharStartOutfitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibbbbb"; + static uint8 const arraySizes[7] = { 24, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct CharTitlesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct CharacterFaceBoneSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct CharacterFacialHairStylesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbb"; + static uint8 const arraySizes[4] = { 5, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct CharacterLoadoutMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct CharacterLoadoutItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ChatChannelsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "issb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ChatProfanityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ChrClassRaceSexMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbiii"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct ChrClassTitleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ChrClassUIDisplayMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ChrClassVillainMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ChrClassesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "SsssSiiihhhbbbbbbbi"; + static uint8 const arraySizes[19] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(18, 19, types, arraySizes); + return &instance; + } +}; + +struct ChrClassesXPowerTypesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ChrRacesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iSSsssSSiiffihhhhhhhhhhbbbbbbbbbbii"; + static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 35, types, arraySizes); + return &instance; + } +}; + +struct ChrSpecializationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isssshbbbbbiii"; + static uint8 const arraySizes[14] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(11, 14, types, arraySizes); + return &instance; + } +}; + +struct ChrUpgradeBucketMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct ChrUpgradeBucketSpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ChrUpgradeTierMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct CinematicCameraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sffh"; + static uint8 const arraySizes[4] = { 1, 3, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct CinematicSequencesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 8 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CloakDampeningMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffff"; + static uint8 const arraySizes[5] = { 5, 5, 2, 2, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct CombatConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhbbbbbb"; + static uint8 const arraySizes[11] = { 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct ComponentModelFileDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ComponentTextureFileDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ConversationLineMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiihhbbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct CreatureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiifssssbbbb"; + static uint8 const arraySizes[12] = { 3, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 12, types, arraySizes); + return &instance; + } +}; + +struct CreatureDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihbbb"; + static uint8 const arraySizes[6] = { 1, 7, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct CreatureDispXUiCameraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CreatureDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffiSiiifhhhhhhbbbbbb"; + static uint8 const arraySizes[21] = { 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 21, types, arraySizes); + return &instance; + } +}; + +struct CreatureDisplayInfoCondMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiibbiiiiiiiii"; + static uint8 const arraySizes[15] = { 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; + static DB2Meta instance(-1, 15, types, arraySizes); + return &instance; + } +}; + +struct CreatureDisplayInfoExtraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibbbbbbbbbb"; + static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1 }; + static DB2Meta instance(-1, 12, types, arraySizes); + return &instance; + } +}; + +struct CreatureDisplayInfoTrnMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iifh"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct CreatureFamilyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffsShhbbbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct CreatureImmunitiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbbbbiii"; + static uint8 const arraySizes[9] = { 2, 1, 1, 1, 1, 1, 1, 8, 16 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct CreatureModelDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffffffffffffffiiiiiiiiiiii"; + static uint8 const arraySizes[30] = { 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 30, types, arraySizes); + return &instance; + } +}; + +struct CreatureMovementInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct CreatureSoundDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffbbiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; + static uint8 const arraySizes[37] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 37, types, arraySizes); + return &instance; + } +}; + +struct CreatureTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CriteriaMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiihhhbbbbb"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct CriteriaTreeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iishhbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct CriteriaTreeXEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CurrencyCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct CurrencyTypesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sSiiisbbbi"; + static uint8 const arraySizes[10] = { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct CurveMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct CurvePointMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhb"; + static uint8 const arraySizes[3] = { 2, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct DeathThudLookupsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct DecalPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffffffffbbiii"; + static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 14, types, arraySizes); + return &instance; + } +}; + +struct DeclinedWordMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "si"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(1, 2, types, arraySizes); + return &instance; + } +}; + +struct DeclinedWordCasesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct DestructibleModelDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhbbbbbbbbbbbbbbbbb"; + static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 22, types, arraySizes); + return &instance; + } +}; + +struct DeviceBlacklistMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct DeviceDefaultSettingsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct DifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbbbbbbbbbbbb"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct DissolveEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffffbbii"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct DriverBlacklistMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihbbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct DungeonEncounterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sihhbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct DungeonMapMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhhbbi"; + static uint8 const arraySizes[7] = { 2, 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(6, 7, types, arraySizes); + return &instance; + } +}; + +struct DungeonMapChunkMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fihhh"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct DurabilityCostsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 21, 8 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct DurabilityQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct EdgeGlowEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffffffb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct EmotesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Siihbiiii"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct EmotesTextMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct EmotesTextDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct EmotesTextSoundMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct EnvironmentalDamageMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ExhaustionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffsfsi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct FactionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iifssihhhhbbbb"; + static uint8 const arraySizes[14] = { 4, 4, 2, 1, 1, 4, 1, 4, 4, 1, 2, 1, 1, 1 }; + static DB2Meta instance(-1, 14, types, arraySizes); + return &instance; + } +}; + +struct FactionGroupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct FactionTemplateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhbbb"; + static uint8 const arraySizes[7] = { 1, 1, 4, 4, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct FootprintTexturesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "si"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(1, 2, types, arraySizes); + return &instance; + } +}; + +struct FootstepTerrainLookupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct FriendshipRepReactionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct FriendshipReputationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ishi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct FullScreenEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffffffffffffffffiiffffffffffffffbiii"; + static uint8 const arraySizes[39] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 39, types, arraySizes); + return &instance; + } +}; + +struct GMSurveyAnswersMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GMSurveyCurrentSurveyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GMSurveyQuestionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GMSurveySurveysMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 15 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GameObjectArtKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ss"; + static uint8 const arraySizes[2] = { 3, 4 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GameObjectDiffAnimMapMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GameObjectDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffh"; + static uint8 const arraySizes[5] = { 1, 6, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct GameObjectDisplayInfoXSoundKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GameObjectsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffishhhhbbi"; + static uint8 const arraySizes[12] = { 3, 4, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(11, 12, types, arraySizes); + return &instance; + } +}; + +struct GameTipsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssihhbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct GarrAbilityCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GarrAbilityEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffihbbbbbbi"; + static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(11, 12, types, arraySizes); + return &instance; + } +}; + +struct GarrBuildingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iissssihhhhhhhhbbbbbbiii"; + static uint8 const arraySizes[24] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 24, types, arraySizes); + return &instance; + } +}; + +struct GarrBuildingDoodadSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrBuildingPlotInstMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhhbi"; + static uint8 const arraySizes[5] = { 2, 1, 1, 1, 1 }; + static DB2Meta instance(4, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrClassSpecMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssshbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct GarrClassSpecPlayerCondMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isbiii"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct GarrEncounterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isffihi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(6, 7, types, arraySizes); + return &instance; + } +}; + +struct GarrEncounterSetXEncounterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrEncounterXMechanicMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrFollItemSetMemberMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrFollSupportSpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iissiiiihhhhhhbbbbbbbbbbbbbbbbi"; + static uint8 const arraySizes[31] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(30, 31, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerLevelXPMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbbbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerSetXFollowerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbbbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerUICreatureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifhbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerXAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrMechanicMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrMechanicSetXMechanicMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrMechanicTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssibi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(4, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrMissionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iisssiiffhhhhhhbbbbbbbbbiiiii"; + static uint8 const arraySizes[29] = { 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(24, 29, types, arraySizes); + return &instance; + } +}; + +struct GarrMissionTextureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 2, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrMissionTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrMissionXEncounterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "biiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(1, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrMissionXFollowerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GarrMssnBonusAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fihbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrPlotMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siibbbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 2 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct GarrPlotBuildingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrPlotInstanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrPlotUICategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GarrSiteLevelMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhhhhbbbb"; + static uint8 const arraySizes[9] = { 2, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct GarrSiteLevelPlotInstMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhbb"; + static uint8 const arraySizes[4] = { 2, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrSpecializationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifssbbb"; + static uint8 const arraySizes[7] = { 1, 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct GarrStringMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GarrTalentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "issibbbiiiiiiiiiiiii"; + static uint8 const arraySizes[20] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 20, types, arraySizes); + return &instance; + } +}; + +struct GarrTalentTreeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct GarrUiAnimClassInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GarrUiAnimRaceInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffffffffb"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct GemPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GlobalStringsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GlyphBindableSpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GlyphExclusiveCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct GlyphPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GlyphRequiredSpecMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GroundEffectDoodadMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sffb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GroundEffectTextureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbi"; + static uint8 const arraySizes[4] = { 4, 4, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct GroupFinderActivityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhhbbbbbbbbb"; + static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 14, types, arraySizes); + return &instance; + } +}; + +struct GroupFinderActivityGrpMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct GroupFinderCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GuildColorBackgroundMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GuildColorBorderMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GuildColorEmblemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct GuildPerkSpellsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct HeirloomMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isiiiihbbi"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 2, 2, 1, 1, 1 }; + static DB2Meta instance(9, 10, types, arraySizes); + return &instance; + } +}; + +struct HelmetAnimScalingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct HelmetGeosetVisDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 9 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct HighlightColorMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiibb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct HolidayDescriptionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct HolidayNamesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct HolidaysMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iShhbbbbbbb"; + static uint8 const arraySizes[11] = { 16, 1, 10, 1, 1, 10, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct ImportPriceArmorMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffff"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ImportPriceQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ImportPriceShieldMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ImportPriceWeaponMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "f"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct InvasionClientDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sfiiiiiii"; + static uint8 const arraySizes[9] = { 1, 2, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(2, 9, types, arraySizes); + return &instance; + } +}; + +struct ItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbbbbbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct ItemAppearanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiib"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemAppearanceXUiCameraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemArmorQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemArmorShieldMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemArmorTotalMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffh"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ItemBagFamilyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemBonusMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbb"; + static uint8 const arraySizes[4] = { 2, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemBonusListLevelDeltaMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hi"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemBonusTreeNodeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemChildEquipmentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iib"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemClassMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fsb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemContextPickerEntryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ItemCurrencyCostMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemDamageAmmoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemDamageOneHandMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemDamageOneHandCasterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemDamageTwoHandMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemDamageTwoHandCasterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 7, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemDisenchantLootMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhbbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct ItemDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiiiiiiiiii"; + static uint8 const arraySizes[15] = { 2, 2, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 15, types, arraySizes); + return &instance; + } +}; + +struct ItemDisplayInfoMaterialResMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iib"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemDisplayXUiCameraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiihhhbb"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct ItemExtendedCostMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihhhbbbbb"; + static uint8 const arraySizes[10] = { 5, 5, 5, 1, 5, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct ItemGroupSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 4 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemLimitCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemLimitCategoryConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemModifiedAppearanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(5, 6, types, arraySizes); + return &instance; + } +}; + +struct ItemModifiedAppearanceExtraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ItemNameDescriptionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "si"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemPetFoodMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemPriceBaseMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemRandomPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sh"; + static uint8 const arraySizes[2] = { 1, 5 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemRandomSuffixMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshh"; + static uint8 const arraySizes[4] = { 1, 1, 5, 5 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemRangedDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemSearchNameMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siiihhhhbbbbi"; + static uint8 const arraySizes[13] = { 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct ItemSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sihii"; + static uint8 const arraySizes[5] = { 1, 17, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ItemSetSpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ItemSparseMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffiiiiiiiiffsssssififhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbb"; + static uint8 const arraySizes[63] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 63, types, arraySizes); + return &instance; + } +}; + +struct ItemSpecMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbbbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct ItemSpecOverrideMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ItemSubClassMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshbbbbbbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct ItemSubClassMaskMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ItemUpgradeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ItemVisualEffectsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemVisualsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 5 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ItemXBonusTreeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct JournalEncounterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fsshhhhbbi"; + static uint8 const arraySizes[10] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct JournalEncounterCreatureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iisshbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(6, 7, types, arraySizes); + return &instance; + } +}; + +struct JournalEncounterItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(5, 6, types, arraySizes); + return &instance; + } +}; + +struct JournalEncounterSectionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssiiihhhhhhbbb"; + static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 14, types, arraySizes); + return &instance; + } +}; + +struct JournalEncounterXDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct JournalInstanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiisshhbbi"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(10, 11, types, arraySizes); + return &instance; + } +}; + +struct JournalItemXDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct JournalSectionXDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct JournalTierMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct JournalTierXInstanceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct KeyChainMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 32 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct KeystoneAffixMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct LanguageWordsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct LanguagesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "si"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(1, 2, types, arraySizes); + return &instance; + } +}; + +struct LfgDungeonExpansionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbbbii"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct LfgDungeonGroupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct LfgDungeonsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siSshhhhhhhhbbbbbbbbbbbbbbbbbi"; + static uint8 const arraySizes[30] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(29, 30, types, arraySizes); + return &instance; + } +}; + +struct LfgDungeonsGroupingMapMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct LfgRoleRequirementMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct LightMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffhh"; + static uint8 const arraySizes[5] = { 3, 1, 1, 1, 8 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct LightDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiiiiiiiiiiiiifffffffffiiiiiihh"; + static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 35, types, arraySizes); + return &instance; + } +}; + +struct LightParamsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffhbbbi"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 }; + static DB2Meta instance(10, 11, types, arraySizes); + return &instance; + } +}; + +struct LightSkyboxMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct LiquidMaterialMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct LiquidObjectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct LiquidTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sifffffSifihhbbbbbi"; + static uint8 const arraySizes[19] = { 1, 1, 1, 1, 1, 1, 1, 6, 2, 18, 4, 1, 1, 1, 1, 1, 1, 6, 1 }; + static DB2Meta instance(-1, 19, types, arraySizes); + return &instance; + } +}; + +struct LoadingScreenTaxiSplinesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhhb"; + static uint8 const arraySizes[5] = { 10, 10, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct LoadingScreensMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct LocaleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct LocationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ff"; + static uint8 const arraySizes[2] = { 3, 3 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct LockMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbb"; + static uint8 const arraySizes[4] = { 8, 8, 8, 8 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct LockTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssssi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(4, 5, types, arraySizes); + return &instance; + } +}; + +struct LookAtControllerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffhhhhbbbbbiiiii"; + static uint8 const arraySizes[18] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 18, types, arraySizes); + return &instance; + } +}; + +struct MailTemplateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ManifestInterfaceActionIconMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(0, 1, types, arraySizes); + return &instance; + } +}; + +struct ManifestInterfaceDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ss"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ManifestInterfaceItemIconMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(0, 1, types, arraySizes); + return &instance; + } +}; + +struct ManifestInterfaceTOCDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ManifestMP3Meta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(0, 1, types, arraySizes); + return &instance; + } +}; + +struct MapMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siffssshhhhhhbbbbb"; + static uint8 const arraySizes[18] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 18, types, arraySizes); + return &instance; + } +}; + +struct MapChallengeModeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 3, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct MapDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbbbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct MapDifficultyXConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct MarketingPromotionsXLocaleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiisbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct MaterialMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "biii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct MinorTalentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ModelAnimCloakDampeningMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ModelFileDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(1, 3, types, arraySizes); + return &instance; + } +}; + +struct ModelRibbonQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ib"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ModifierTreeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihbbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct MountMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iisssfhhhbi"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(10, 11, types, arraySizes); + return &instance; + } +}; + +struct MountCapabilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihhhbii"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(6, 8, types, arraySizes); + return &instance; + } +}; + +struct MountTypeXCapabilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct MovieMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct MovieFileDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct MovieVariationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct NPCSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 4 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct NameGenMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct NamesProfanityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct NamesReservedMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "S"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct NamesReservedLocaleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct NpcModelItemSlotDisplayInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iib"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ObjectEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sfhbbbbbi"; + static uint8 const arraySizes[9] = { 1, 3, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct ObjectEffectGroupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ObjectEffectModifierMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbbb"; + static uint8 const arraySizes[4] = { 4, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ObjectEffectPackageMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ObjectEffectPackageElemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct OutlineEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fiiiii"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct OverrideSpellDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iib"; + static uint8 const arraySizes[3] = { 10, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct PageTextMaterialMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct PaperDollItemFrameMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ParticleColorMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 3, 3, 3 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct PathMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbbbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct PathNodeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iihh"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(0, 4, types, arraySizes); + return &instance; + } +}; + +struct PathNodePropertyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhbii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(3, 5, types, arraySizes); + return &instance; + } +}; + +struct PathPropertyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct PhaseMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct PhaseShiftZoneSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhbbbbiiii"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct PhaseXPhaseGroupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct PlayerConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiiiiiiiiishhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbiiiiiiiiiiiiiii"; + // 1111111121411111144414442144111111111131111114111444111111111111113444141461112 + static uint8 const arraySizes[79] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 4, 4, 4, 2, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 4, 4, 1, 4, 1, 4, 6, 1, 1, 1, 2 }; + static DB2Meta instance(-1, 79, types, arraySizes); + return &instance; + } +}; + +struct PositionerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct PositionerStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbiiiiii"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct PositionerStateEntryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffbbbbbbbbi"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct PowerDisplayMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Sbbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct PowerTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssffhhhbbbbb"; + static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 12, types, arraySizes); + return &instance; + } +}; + +struct PrestigeLevelInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct PvpBracketTypesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bi"; + static uint8 const arraySizes[2] = { 1, 4 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct PvpDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct PvpItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ib"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct PvpRewardMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct PvpTalentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iisiiiiii"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct PvpTalentUnlockMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct QuestFactionRewardMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 10 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct QuestFeedbackEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct QuestInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct QuestLineMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct QuestLineXQuestMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct QuestMoneyRewardMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 10 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct QuestObjectiveMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iishbbbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct QuestPOIBlobMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct QuestPOIPointMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct QuestPOIPointCliTaskMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct QuestPackageItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct QuestSortMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct QuestV2Meta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct QuestV2CliTaskMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "issihhhhhhhbbbbbbbbbiii"; + static uint8 const arraySizes[23] = { 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(20, 23, types, arraySizes); + return &instance; + } +}; + +struct QuestXPMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "h"; + static uint8 const arraySizes[1] = { 10 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct RacialMountsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ib"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct RandPropPointsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 5, 5, 5 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ResearchBranchMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssihb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ResearchFieldMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct ResearchProjectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssishbbii"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 9, types, arraySizes); + return &instance; + } +}; + +struct ResearchSiteMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ishi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ResistancesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct RewardPackMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifbbii"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct RewardPackXCurrencyTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct RewardPackXItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct RibbonQualityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct RulesetItemUpgradeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ScalingStatDistributionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ScenarioMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ScenarioEventEntryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct ScenarioStepMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhhhbbi"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct SceneScriptMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshh"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SceneScriptPackageMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SceneScriptPackageMemberMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ScheduledIntervalMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ScheduledWorldStateMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiii"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct ScheduledWorldStateGroupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct ScheduledWorldStateXUniqCatMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(0, 3, types, arraySizes); + return &instance; + } +}; + +struct ScreenEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sihhhhbbbiii"; + static uint8 const arraySizes[12] = { 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 12, types, arraySizes); + return &instance; + } +}; + +struct ScreenLocationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SeamlessSiteMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "i"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ServerMessagesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct ShadowyEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiffffffbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct SkillLineMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssshhbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct SkillLineAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiihhhhhhbbi"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct SkillRaceClassInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhbbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct SoundAmbienceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "biii"; + static uint8 const arraySizes[4] = { 1, 2, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SoundAmbienceFlavorMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SoundBusMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhbbbbbbbbi"; + static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(11, 12, types, arraySizes); + return &instance; + } +}; + +struct SoundEmitterPillPointsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fh"; + static uint8 const arraySizes[2] = { 3, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SoundEmittersMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffshhhbbbbii"; + static uint8 const arraySizes[12] = { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(10, 12, types, arraySizes); + return &instance; + } +}; + +struct SoundFilterMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SoundFilterElemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbb"; + static uint8 const arraySizes[3] = { 9, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SoundKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sffffffffhhhbbbbi"; + static uint8 const arraySizes[17] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(16, 17, types, arraySizes); + return &instance; + } +}; + +struct SoundKitAdvancedMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fiiiiiifffffiiffffffihbbbbiiiiii"; + static uint8 const arraySizes[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 32, types, arraySizes); + return &instance; + } +}; + +struct SoundKitChildMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SoundKitEntryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SoundKitFallbackMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SoundOverrideMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SoundProviderPreferencesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sfffffffffffffffhhhhhbb"; + static uint8 const arraySizes[23] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 23, types, arraySizes); + return &instance; + } +}; + +struct SourceInfoMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpamMessagesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SpecializationSpellsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iishbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(5, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssssiii"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(5, 7, types, arraySizes); + return &instance; + } +}; + +struct SpellActionBarPrefMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ih"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellActivationOverlayMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiifibbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 4, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct SpellAuraOptionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiihbbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct SpellAuraRestrictionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiibbbbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct SpellAuraVisXChrSpecMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellAuraVisibilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(3, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellCastTimesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iih"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellCastingRequirementsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhbbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct SpellCategoriesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhbbbbb"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct SpellCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sibbbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellChainEffectsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffiifffffffffffffffffffffffffffffffffffiffsshhhhbbbbbbbbbbbi"; + static uint8 const arraySizes[62] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 3, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 62, types, arraySizes); + return &instance; + } +}; + +struct SpellClassOptionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iibi"; + static uint8 const arraySizes[4] = { 1, 4, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellCooldownsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiib"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct SpellDescriptionVariablesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SpellDispelTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellDurationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iih"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffiffiiiiiiiiiiiiiiiii"; + static uint8 const arraySizes[25] = { 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1 }; + static DB2Meta instance(8, 25, types, arraySizes); + return &instance; + } +}; + +struct SpellEffectCameraShakesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 3, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellEffectEmissionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellEffectGroupSizeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "if"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellEffectScalingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellEquippedItemsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiib"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellFlyoutMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isshbi"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellFlyoutItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellFocusObjectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SpellIconMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SpellInterruptsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiihb"; + static uint8 const arraySizes[5] = { 1, 2, 2, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct SpellItemEnchantmentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isfiihhhhhhbbbbbbbi"; + static uint8 const arraySizes[19] = { 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 19, types, arraySizes); + return &instance; + } +}; + +struct SpellItemEnchantmentConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbbbi"; + static uint8 const arraySizes[6] = { 5, 5, 5, 5, 5, 5 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellKeyboundOverrideMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellLabelMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ii"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellLearnSpellMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellLevelsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellMechanicMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SpellMiscMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffhhhhhb"; + static uint8 const arraySizes[9] = { 14, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct SpellMiscDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellMissileMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffffffffffffb"; + static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 15, types, arraySizes); + return &instance; + } +}; + +struct SpellMissileMotionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellPowerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiffifbbiiiiii"; + static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(8, 14, types, arraySizes); + return &instance; + } +}; + +struct SpellPowerDifficultyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellProceduralEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fbi"; + static uint8 const arraySizes[3] = { 4, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellProcsPerMinuteMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellProcsPerMinuteModMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellRadiusMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffff"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellRangeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffssb"; + static uint8 const arraySizes[5] = { 2, 2, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct SpellReagentsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iih"; + static uint8 const arraySizes[3] = { 1, 8, 8 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellReagentsCurrencyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellScalingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct SpellShapeshiftMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiib"; + static uint8 const arraySizes[4] = { 1, 2, 2, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct SpellShapeshiftFormMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sfihhhhhbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 4, 8, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct SpellSpecialUnitEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hi"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct SpellTargetRestrictionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffihbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct SpellTotemsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iih"; + static uint8 const arraySizes[3] = { 1, 2, 2 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiiiiiiiiiiffiihhhbbiiii"; + static uint8 const arraySizes[28] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(24, 28, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualAnimMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualColorEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fifhhhhhbbi"; + static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualEffectNameMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sffffffiiibii"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifhhii"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(4, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualKitAreaModelMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffhb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualKitEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualKitModelAttachMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffffffffffifhhhhhhbbi"; + static uint8 const arraySizes[22] = { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(21, 22, types, arraySizes); + return &instance; + } +}; + +struct SpellVisualMissileMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiffhhhhhhbbiii"; + static uint8 const arraySizes[16] = { 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(13, 16, types, arraySizes); + return &instance; + } +}; + +struct SpellXSpellVisualMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifhhhbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, types, arraySizes); + return &instance; + } +}; + +struct Startup_StringsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ss"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct StationeryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct StringLookupsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct SummonPropertiesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct TactKeyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 16 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct TactKeyLookupMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 8 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct TalentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iishbbbbb"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 2, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct TaxiNodesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fsifhhhbi"; + static uint8 const arraySizes[9] = { 3, 1, 2, 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(8, 9, types, arraySizes); + return &instance; + } +}; + +struct TaxiPathMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(2, 4, types, arraySizes); + return &instance; + } +}; + +struct TaxiPathNodeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fihhhhbbi"; + static uint8 const arraySizes[9] = { 3, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(8, 9, types, arraySizes); + return &instance; + } +}; + +struct TerrainMaterialMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ssb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct TerrainTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct TerrainTypeSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct TextureBlendSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffffbbbb"; + static uint8 const arraySizes[10] = { 3, 3, 3, 3, 3, 4, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct TextureFileDataMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(2, 3, types, arraySizes); + return &instance; + } +}; + +struct TotemCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sib"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ToyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "isbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(4, 5, types, arraySizes); + return &instance; + } +}; + +struct TradeSkillCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhhb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct TradeSkillItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct TransformMatrixMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffff"; + static uint8 const arraySizes[5] = { 3, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct TransmogSetMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(0, 4, types, arraySizes); + return &instance; + } +}; + +struct TransmogSetItemMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiii"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(0, 4, types, arraySizes); + return &instance; + } +}; + +struct TransportAnimationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iifb"; + static uint8 const arraySizes[4] = { 1, 1, 3, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct TransportPhysicsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffffffff"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct TransportRotationMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iif"; + static uint8 const arraySizes[3] = { 1, 1, 4 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct TrophyMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct UiCamFbackTransmogChrRaceMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct UiCamFbackTransmogWeaponMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct UiCameraMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sfffhbbbi"; + static uint8 const arraySizes[9] = { 1, 3, 3, 3, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct UiCameraTypeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sii"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct UiMapPOIMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifiiiii"; + static uint8 const arraySizes[7] = { 1, 3, 1, 1, 1, 1, 1 }; + static DB2Meta instance(6, 7, types, arraySizes); + return &instance; + } +}; + +struct UiTextureAtlasMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct UiTextureAtlasMemberMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhhhhbb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct UiTextureKitMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct UnitBloodMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shhhiii"; + static uint8 const arraySizes[7] = { 5, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct UnitBloodLevelsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "b"; + static uint8 const arraySizes[1] = { 3 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct UnitConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ibbb"; + static uint8 const arraySizes[4] = { 8, 1, 8, 8 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct UnitPowerBarMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffiissssffhhbbii"; + static uint8 const arraySizes[16] = { 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 16, types, arraySizes); + return &instance; + } +}; + +struct VehicleMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iffffffffffffffffffSSSffhhhbb"; + static uint8 const arraySizes[29] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 8, 1, 3, 1, 1 }; + static DB2Meta instance(-1, 29, types, arraySizes); + return &instance; + } +}; + +struct VehicleSeatMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiffffffffffffffffffffffffffffffihhhhhhhhhhhhhhhhhhhbbbbbbii"; + static uint8 const arraySizes[61] = { 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 61, types, arraySizes); + return &instance; + } +}; + +struct VehicleUIIndSeatMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffhb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct VehicleUIIndicatorMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct VideoHardwareMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshhbbbbbbbbbbiiiiiiii"; + static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(14, 22, types, arraySizes); + return &instance; + } +}; + +struct VignetteMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sffhbii"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct VocalUISoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 2 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct WMOAreaTableMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ishhhhhhhbbbbii"; + static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(13, 15, types, arraySizes); + return &instance; + } +}; + +struct WbAccessControlListMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct WbCertBlacklistMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 20 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct WbCertWhitelistMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct WbPermissionsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sb"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct WeaponImpactSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbbiiii"; + static uint8 const arraySizes[7] = { 1, 1, 1, 11, 11, 11, 11 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct WeaponSwingSounds2Meta +{ + static DB2Meta const* Instance() + { + static char const* types = "bbi"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct WeaponTrailMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ifffiffff"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 3, 3, 3, 3, 3 }; + static DB2Meta instance(-1, 9, types, arraySizes); + return &instance; + } +}; + +struct WeaponTrailModelDefMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct WeaponTrailParamMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffhbbbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct WeatherMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffsfffffhbbbi"; + static uint8 const arraySizes[14] = { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 14, types, arraySizes); + return &instance; + } +}; + +struct WindSettingsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffffffffb"; + static uint8 const arraySizes[10] = { 1, 3, 1, 1, 3, 1, 3, 1, 1, 1 }; + static DB2Meta instance(-1, 10, types, arraySizes); + return &instance; + } +}; + +struct WmoMinimapTextureMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhbb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, types, arraySizes); + return &instance; + } +}; + +struct WorldBossLockoutMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, types, arraySizes); + return &instance; + } +}; + +struct WorldChunkSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hbbbbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct WorldEffectMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, types, arraySizes); + return &instance; + } +}; + +struct WorldElapsedTimerMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sbb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct WorldMapAreaMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Sffffhhhhhhbbbbii"; + static uint8 const arraySizes[17] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(15, 17, types, arraySizes); + return &instance; + } +}; + +struct WorldMapContinentMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffffhhbbbbb"; + static uint8 const arraySizes[11] = { 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 11, types, arraySizes); + return &instance; + } +}; + +struct WorldMapOverlayMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "Shhiiiiiiiiii"; + static uint8 const arraySizes[13] = { 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 13, types, arraySizes); + return &instance; + } +}; + +struct WorldMapTransformsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fffhhhhb"; + static uint8 const arraySizes[8] = { 6, 2, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct WorldSafeLocsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ffsh"; + static uint8 const arraySizes[4] = { 3, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct WorldStateExpressionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "s"; + static uint8 const arraySizes[1] = { 1 }; + static DB2Meta instance(-1, 1, types, arraySizes); + return &instance; + } +}; + +struct WorldStateUIMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sssssshhhhhbbbbi"; + static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 }; + static DB2Meta instance(15, 16, types, arraySizes); + return &instance; + } +}; + +struct WorldStateZoneSoundsMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihhhhhhb"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 8, types, arraySizes); + return &instance; + } +}; + +struct World_PVP_AreaMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhhhhbb"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, types, arraySizes); + return &instance; + } +}; + +struct ZoneIntroMusicTableMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shbi"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +struct ZoneLightMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shh"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ZoneLightPointMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "fhb"; + static uint8 const arraySizes[3] = { 2, 1, 1 }; + static DB2Meta instance(-1, 3, types, arraySizes); + return &instance; + } +}; + +struct ZoneMusicMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "siii"; + static uint8 const arraySizes[4] = { 1, 2, 2, 2 }; + static DB2Meta instance(-1, 4, types, arraySizes); + return &instance; + } +}; + +#endif // DB2Metadata_h__ diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 0c2c02f2ca8..dfae9795b4e 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -18,197 +18,196 @@ #include "DB2Stores.h" #include "Common.h" #include "Containers.h" -#include "DB2fmt.h" -#include "HotfixDatabase.h" +#include "DatabaseEnv.h" +#include "DB2Metadata.h" #include "Log.h" #include "TransportMgr.h" #include "World.h" -DB2Storage sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); -DB2Storage sAnimKitStore("AnimKit.db2", AnimKitFormat, HOTFIX_SEL_ANIM_KIT); -DB2Storage sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); -DB2Storage sAreaTableStore("AreaTable.db2", AreaTableFormat, HOTFIX_SEL_AREA_TABLE); -DB2Storage sAreaTriggerStore("AreaTrigger.db2", AreaTriggerFormat, HOTFIX_SEL_AREA_TRIGGER); -DB2Storage sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION); -DB2Storage sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); -DB2Storage sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES); -DB2Storage sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsFormat, HOTFIX_SEL_BANNED_ADDONS); -DB2Storage sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE); -DB2Storage sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityFormat, HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); -DB2Storage sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateFormat, HOTFIX_SEL_BATTLE_PET_BREED_STATE); -DB2Storage sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesFormat, HOTFIX_SEL_BATTLE_PET_SPECIES); -DB2Storage sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateFormat, HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); -DB2Storage sBattlemasterListStore("BattlemasterList.db2", BattlemasterListFormat, HOTFIX_SEL_BATTLEMASTER_LIST); -DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); -DB2Storage sCharSectionsStore("CharSections.db2", CharSectionsFormat, HOTFIX_SEL_CHAR_SECTIONS); -DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); -DB2Storage sCharTitlesStore("CharTitles.db2", CharTitlesFormat, HOTFIX_SEL_CHAR_TITLES); -DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS); -DB2Storage sChrClassesStore("ChrClasses.db2", ChrClassesFormat, HOTFIX_SEL_CHR_CLASSES); -DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); -DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); -DB2Storage sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationFormat, HOTFIX_SEL_CHR_SPECIALIZATION); -DB2Storage sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); -DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); -DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); -DB2Storage sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyFormat, HOTFIX_SEL_CREATURE_FAMILY); -DB2Storage sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataFormat, HOTFIX_SEL_CREATURE_MODEL_DATA); -DB2Storage sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); -DB2Storage sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); -DB2Storage sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); -DB2Storage sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); -DB2Storage sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); -DB2Storage sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); -DB2Storage sDifficultyStore("Difficulty.db2", DifficultyFormat, HOTFIX_SEL_DIFFICULTY); -DB2Storage sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterFormat, HOTFIX_SEL_DUNGEON_ENCOUNTER); -DB2Storage sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS); -DB2Storage sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); -DB2Storage sEmotesStore("Emotes.db2", EmotesFormat, HOTFIX_SEL_EMOTES); -DB2Storage sEmotesTextStore("EmotesText.db2", EmotesTextFormat, HOTFIX_SEL_EMOTES_TEXT); -DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); -DB2Storage sFactionStore("Faction.db2", FactionFormat, HOTFIX_SEL_FACTION); -DB2Storage sFactionTemplateStore("FactionTemplate.db2", FactionTemplateFormat, HOTFIX_SEL_FACTION_TEMPLATE); -DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); -DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); -DB2Storage sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); -DB2Storage sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); -DB2Storage sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST); -DB2Storage sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecFormat, HOTFIX_SEL_GARR_CLASS_SPEC); -DB2Storage sGarrFollowerStore("GarrFollower.db2", GarrFollowerFormat, HOTFIX_SEL_GARR_FOLLOWER); -DB2Storage sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityFormat, HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); -DB2Storage sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingFormat, HOTFIX_SEL_GARR_PLOT_BUILDING); -DB2Storage sGarrPlotStore("GarrPlot.db2", GarrPlotFormat, HOTFIX_SEL_GARR_PLOT); -DB2Storage sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceFormat, HOTFIX_SEL_GARR_PLOT_INSTANCE); -DB2Storage sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); -DB2Storage sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); -DB2Storage sGemPropertiesStore("GemProperties.db2", GemPropertiesFormat, HOTFIX_SEL_GEM_PROPERTIES); -DB2Storage sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesFormat, HOTFIX_SEL_GLYPH_PROPERTIES); -DB2Storage sGlyphSlotStore("GlyphSlot.db2", GlyphSlotFormat, HOTFIX_SEL_GLYPH_SLOT); -DB2Storage sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundFormat, HOTFIX_SEL_GUILD_COLOR_BACKGROUND); -DB2Storage sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderFormat, HOTFIX_SEL_GUILD_COLOR_BORDER); -DB2Storage sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemFormat, HOTFIX_SEL_GUILD_COLOR_EMBLEM); -DB2Storage sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsFormat, HOTFIX_SEL_GUILD_PERK_SPELLS); -DB2Storage sHeirloomStore("Heirloom.db2", HeirloomFormat, HOTFIX_SEL_HEIRLOOM); -DB2Storage sHolidaysStore("Holidays.db2", HolidaysEntryFormat, HOTFIX_SEL_HOLIDAYS); -DB2Storage sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorFormat, HOTFIX_SEL_IMPORT_PRICE_ARMOR); -DB2Storage sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityFormat, HOTFIX_SEL_IMPORT_PRICE_QUALITY); -DB2Storage sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldFormat, HOTFIX_SEL_IMPORT_PRICE_SHIELD); -DB2Storage sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponFormat, HOTFIX_SEL_IMPORT_PRICE_WEAPON); -DB2Storage sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceFormat, HOTFIX_SEL_ITEM_APPEARANCE); -DB2Storage sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityFormat, HOTFIX_SEL_ITEM_ARMOR_QUALITY); -DB2Storage sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldFormat, HOTFIX_SEL_ITEM_ARMOR_SHIELD); -DB2Storage sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalFormat, HOTFIX_SEL_ITEM_ARMOR_TOTAL); -DB2Storage sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyFormat, HOTFIX_SEL_ITEM_BAG_FAMILY); -DB2Storage sItemBonusStore("ItemBonus.db2", ItemBonusFormat, HOTFIX_SEL_ITEM_BONUS); -DB2Storage sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeFormat, HOTFIX_SEL_ITEM_BONUS_TREE_NODE); -DB2Storage sItemClassStore("ItemClass.db2", ItemClassFormat, HOTFIX_SEL_ITEM_CLASS); -DB2Storage sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostFormat, HOTFIX_SEL_ITEM_CURRENCY_COST); -DB2Storage sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoFormat, HOTFIX_SEL_ITEM_DAMAGE_AMMO); -DB2Storage sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); -DB2Storage sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); -DB2Storage sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); -DB2Storage sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); -DB2Storage sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootFormat, HOTFIX_SEL_ITEM_DISENCHANT_LOOT); -DB2Storage sItemEffectStore("ItemEffect.db2", ItemEffectFormat, HOTFIX_SEL_ITEM_EFFECT); -DB2Storage sItemStore("Item.db2", ItemFormat, HOTFIX_SEL_ITEM); -DB2Storage sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostFormat, HOTFIX_SEL_ITEM_EXTENDED_COST); -DB2Storage sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryFormat, HOTFIX_SEL_ITEM_LIMIT_CATEGORY); -DB2Storage sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceFormat, HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); -DB2Storage sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseFormat, HOTFIX_SEL_ITEM_PRICE_BASE); -DB2Storage sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesFormat, HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); -DB2Storage sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixFormat, HOTFIX_SEL_ITEM_RANDOM_SUFFIX); -DB2Storage sItemSetStore("ItemSet.db2", ItemSetFormat, HOTFIX_SEL_ITEM_SET); -DB2Storage sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellFormat, HOTFIX_SEL_ITEM_SET_SPELL); -DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); -DB2Storage sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); -DB2Storage sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE); -DB2Storage sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); -DB2Storage sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); -DB2Storage sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsFormat, HOTFIX_SEL_LFG_DUNGEONS); -DB2Storage sLightStore("Light.db2", LightFormat, HOTFIX_SEL_LIGHT); -DB2Storage sLiquidTypeStore("LiquidType.db2", LiquidTypeFormat, HOTFIX_SEL_LIQUID_TYPE); -DB2Storage sLockStore("Lock.db2", LockFormat, HOTFIX_SEL_LOCK); -DB2Storage sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); -DB2Storage sMapStore("Map.db2", MapFormat, HOTFIX_SEL_MAP); -DB2Storage sMapDifficultyStore("MapDifficulty.db2", MapDifficultyFormat, HOTFIX_SEL_MAP_DIFFICULTY); -DB2Storage sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE); -DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); -DB2Storage sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); -DB2Storage sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityFormat, HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); -DB2Storage sMovieStore("Movie.db2", MovieFormat, HOTFIX_SEL_MOVIE); -DB2Storage sNameGenStore("NameGen.db2", NameGenFormat, HOTFIX_SEL_NAME_GEN); -DB2Storage sNamesProfanityStore("NamesProfanity.db2", NamesProfanityFormat, HOTFIX_SEL_NAMES_PROFANITY); -DB2Storage sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED); -DB2Storage sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleFormat, HOTFIX_SEL_NAMES_RESERVED_LOCALE); -DB2Storage sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); -DB2Storage sPhaseStore("Phase.db2", PhaseFormat, HOTFIX_SEL_PHASE); -DB2Storage sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); -DB2Storage sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION); -DB2Storage sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY); -DB2Storage sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyFormat, HOTFIX_SEL_PVP_DIFFICULTY); -DB2Storage sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardFormat, HOTFIX_SEL_QUEST_FACTION_REWARD); -DB2Storage sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); -DB2Storage sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemFormat, HOTFIX_SEL_QUEST_PACKAGE_ITEM); -DB2Storage sQuestSortStore("QuestSort.db2", QuestSortFormat, HOTFIX_SEL_QUEST_SORT); -DB2Storage sQuestV2Store("QuestV2.db2", QuestV2Format, HOTFIX_SEL_QUEST_V2); -DB2Storage sQuestXPStore("QuestXP.db2", QuestXPFormat, HOTFIX_SEL_QUEST_XP); -DB2Storage sRandPropPointsStore("RandPropPoints.db2", RandPropPointsFormat, HOTFIX_SEL_RAND_PROP_POINTS); -DB2Storage sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionFormat, HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); -DB2Storage sSkillLineStore("SkillLine.db2", SkillLineFormat, HOTFIX_SEL_SKILL_LINE); -DB2Storage sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityFormat, HOTFIX_SEL_SKILL_LINE_ABILITY); -DB2Storage sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoFormat, HOTFIX_SEL_SKILL_RACE_CLASS_INFO); -DB2Storage sSoundKitStore("SoundKit.db2", SoundKitFormat, HOTFIX_SEL_SOUND_KIT); -DB2Storage sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsFormat, HOTFIX_SEL_SPECIALIZATION_SPELLS); -DB2Storage sSpellStore("Spell.db2", SpellFormat, HOTFIX_SEL_SPELL); -DB2Storage sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsFormat, HOTFIX_SEL_SPELL_AURA_OPTIONS); -DB2Storage sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsFormat, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); -DB2Storage sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesFormat, HOTFIX_SEL_SPELL_CAST_TIMES); -DB2Storage sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsFormat, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); -DB2Storage sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesFormat, HOTFIX_SEL_SPELL_CATEGORIES); -DB2Storage sSpellCategoryStore("SpellCategory.db2", SpellCategoryFormat, HOTFIX_SEL_SPELL_CATEGORY); -DB2Storage sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); -DB2Storage sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsFormat, HOTFIX_SEL_SPELL_COOLDOWNS); -DB2Storage sSpellDurationStore("SpellDuration.db2", SpellDurationFormat, HOTFIX_SEL_SPELL_DURATION); -DB2Storage sSpellEffectStore("SpellEffect.db2", SpellEffectFormat, HOTFIX_SEL_SPELL_EFFECT); -DB2Storage sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingFormat, HOTFIX_SEL_SPELL_EFFECT_SCALING); -DB2Storage sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsFormat, HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); -DB2Storage sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectFormat, HOTFIX_SEL_SPELL_FOCUS_OBJECT); -DB2Storage sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsFormat, HOTFIX_SEL_SPELL_INTERRUPTS); -DB2Storage sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); -DB2Storage sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); -DB2Storage sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); -DB2Storage sSpellLevelsStore("SpellLevels.db2", SpellLevelsFormat, HOTFIX_SEL_SPELL_LEVELS); -DB2Storage sSpellMiscStore("SpellMisc.db2", SpellMiscFormat, HOTFIX_SEL_SPELL_MISC); -DB2Storage sSpellPowerStore("SpellPower.db2", SpellPowerFormat, HOTFIX_SEL_SPELL_POWER); -DB2Storage sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyFormat, HOTFIX_SEL_SPELL_POWER_DIFFICULTY); -DB2Storage sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteFormat, HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); -DB2Storage sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModFormat, HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); -DB2Storage sSpellRadiusStore("SpellRadius.db2", SpellRadiusFormat, HOTFIX_SEL_SPELL_RADIUS); -DB2Storage sSpellRangeStore("SpellRange.db2", SpellRangeFormat, HOTFIX_SEL_SPELL_RANGE); -DB2Storage sSpellReagentsStore("SpellReagents.db2", SpellReagentsFormat, HOTFIX_SEL_SPELL_REAGENTS); -DB2Storage sSpellScalingStore("SpellScaling.db2", SpellScalingFormat, HOTFIX_SEL_SPELL_SCALING); -DB2Storage sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftFormat, HOTFIX_SEL_SPELL_SHAPESHIFT); -DB2Storage sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormFormat, HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); -DB2Storage sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsFormat, HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); -DB2Storage sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); -DB2Storage sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); -DB2Storage sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesFormat, HOTFIX_SEL_SUMMON_PROPERTIES); -DB2Storage sTalentStore("Talent.db2", TalentFormat, HOTFIX_SEL_TALENT); -DB2Storage sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); -DB2Storage sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); -DB2Storage sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); -DB2Storage sTotemCategoryStore("TotemCategory.db2", TotemCategoryFormat, HOTFIX_SEL_TOTEM_CATEGORY); -DB2Storage sToyStore("Toy.db2", ToyFormat, HOTFIX_SEL_TOY); -DB2Storage sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION); -DB2Storage sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); -DB2Storage sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); -DB2Storage sVehicleStore("Vehicle.db2", VehicleFormat, HOTFIX_SEL_VEHICLE); -DB2Storage sVehicleSeatStore("VehicleSeat.db2", VehicleSeatFormat, HOTFIX_SEL_VEHICLE_SEAT); -DB2Storage sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableFormat, HOTFIX_SEL_WMO_AREA_TABLE); -DB2Storage sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaFormat, HOTFIX_SEL_WORLD_MAP_AREA); -DB2Storage sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); -DB2Storage sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS); -DB2Storage sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsFormat, HOTFIX_SEL_WORLD_SAFE_LOCS); +DB2Storage sAchievementStore("Achievement.db2", AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT); +DB2Storage sAnimKitStore("AnimKit.db2", AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT); +DB2Storage sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage sAreaTableStore("AreaTable.db2", AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE); +DB2Storage sAreaTriggerStore("AreaTrigger.db2", AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER); +DB2Storage sArmorLocationStore("ArmorLocation.db2", ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION); +DB2Storage sAuctionHouseStore("AuctionHouse.db2", AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE); +DB2Storage sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES); +DB2Storage sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS); +DB2Storage sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE); +DB2Storage sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); +DB2Storage sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE); +DB2Storage sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES); +DB2Storage sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); +DB2Storage sBattlemasterListStore("BattlemasterList.db2", BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST); +DB2Storage sBroadcastTextStore("BroadcastText.db2", BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT); +DB2Storage sCharSectionsStore("CharSections.db2", CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS); +DB2Storage sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT); +DB2Storage sCharTitlesStore("CharTitles.db2", CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); +DB2Storage sChatChannelsStore("ChatChannels.db2", ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS); +DB2Storage sChrClassesStore("ChrClasses.db2", ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES); +DB2Storage sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); +DB2Storage sChrRacesStore("ChrRaces.db2", ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES); +DB2Storage sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION); +DB2Storage sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES); +DB2Storage sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO); +DB2Storage sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); +DB2Storage sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY); +DB2Storage sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA); +DB2Storage sCreatureTypeStore("CreatureType.db2", CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE); +DB2Storage sCriteriaStore("Criteria.db2", CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA); +DB2Storage sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE); +DB2Storage sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES); +DB2Storage sCurvePointStore("CurvePoint.db2", CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT); +DB2Storage sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); +DB2Storage sDifficultyStore("Difficulty.db2", DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY); +DB2Storage sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER); +DB2Storage sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS); +DB2Storage sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage sEmotesStore("Emotes.db2", EmotesMeta::Instance(), HOTFIX_SEL_EMOTES); +DB2Storage sEmotesTextStore("EmotesText.db2", EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT); +DB2Storage sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND); +DB2Storage sFactionStore("Faction.db2", FactionMeta::Instance(), HOTFIX_SEL_FACTION); +DB2Storage sFactionTemplateStore("FactionTemplate.db2", FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE); +DB2Storage sGameObjectsStore("GameObjects.db2", GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS); +DB2Storage sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); +DB2Storage sGarrAbilityStore("GarrAbility.db2", GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY); +DB2Storage sGarrBuildingStore("GarrBuilding.db2", GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING); +DB2Storage sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST); +DB2Storage sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC); +DB2Storage sGarrFollowerStore("GarrFollower.db2", GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER); +DB2Storage sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); +DB2Storage sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING); +DB2Storage sGarrPlotStore("GarrPlot.db2", GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT); +DB2Storage sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE); +DB2Storage sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL); +DB2Storage sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); +DB2Storage sGemPropertiesStore("GemProperties.db2", GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES); +DB2Storage sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES); +DB2Storage sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND); +DB2Storage sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER); +DB2Storage sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM); +DB2Storage sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS); +DB2Storage sHeirloomStore("Heirloom.db2", HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM); +DB2Storage sHolidaysStore("Holidays.db2", HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS); +DB2Storage sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR); +DB2Storage sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY); +DB2Storage sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD); +DB2Storage sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON); +DB2Storage sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE); +DB2Storage sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY); +DB2Storage sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD); +DB2Storage sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL); +DB2Storage sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY); +DB2Storage sItemBonusStore("ItemBonus.db2", ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS); +DB2Storage sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE); +DB2Storage sItemClassStore("ItemClass.db2", ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS); +DB2Storage sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST); +DB2Storage sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO); +DB2Storage sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); +DB2Storage sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); +DB2Storage sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); +DB2Storage sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); +DB2Storage sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT); +DB2Storage sItemEffectStore("ItemEffect.db2", ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT); +DB2Storage sItemStore("Item.db2", ItemMeta::Instance(), HOTFIX_SEL_ITEM); +DB2Storage sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST); +DB2Storage sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY); +DB2Storage sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); +DB2Storage sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE); +DB2Storage sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); +DB2Storage sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX); +DB2Storage sItemSetStore("ItemSet.db2", ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET); +DB2Storage sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL); +DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE); +DB2Storage sItemSpecStore("ItemSpec.db2", ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC); +DB2Storage sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE); +DB2Storage sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE); +DB2Storage sKeyChainStore("KeyChain.db2", KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN); +DB2Storage sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS); +DB2Storage sLightStore("Light.db2", LightMeta::Instance(), HOTFIX_SEL_LIGHT); +DB2Storage sLiquidTypeStore("LiquidType.db2", LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE); +DB2Storage sLockStore("Lock.db2", LockMeta::Instance(), HOTFIX_SEL_LOCK); +DB2Storage sMailTemplateStore("MailTemplate.db2", MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE); +DB2Storage sMapStore("Map.db2", MapMeta::Instance(), HOTFIX_SEL_MAP); +DB2Storage sMapDifficultyStore("MapDifficulty.db2", MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY); +DB2Storage sModifierTreeStore("ModifierTree.db2", ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE); +DB2Storage sMountCapabilityStore("MountCapability.db2", MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY); +DB2Storage sMountStore("Mount.db2", MountMeta::Instance(), HOTFIX_SEL_MOUNT); +DB2Storage sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); +DB2Storage sMovieStore("Movie.db2", MovieMeta::Instance(), HOTFIX_SEL_MOVIE); +DB2Storage sNameGenStore("NameGen.db2", NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN); +DB2Storage sNamesProfanityStore("NamesProfanity.db2", NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY); +DB2Storage sNamesReservedStore("NamesReserved.db2", NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED); +DB2Storage sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED_LOCALE); +DB2Storage sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA); +DB2Storage sPhaseStore("Phase.db2", PhaseMeta::Instance(), HOTFIX_SEL_PHASE); +DB2Storage sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP); +DB2Storage sPlayerConditionStore("PlayerCondition.db2", PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION); +DB2Storage sPowerDisplayStore("PowerDisplay.db2", PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY); +DB2Storage sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY); +DB2Storage sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD); +DB2Storage sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD); +DB2Storage sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM); +DB2Storage sQuestSortStore("QuestSort.db2", QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT); +DB2Storage sQuestV2Store("QuestV2.db2", QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2); +DB2Storage sQuestXPStore("QuestXP.db2", QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP); +DB2Storage sRandPropPointsStore("RandPropPoints.db2", RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS); +DB2Storage sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); +DB2Storage sSkillLineStore("SkillLine.db2", SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE); +DB2Storage sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY); +DB2Storage sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO); +DB2Storage sSoundKitStore("SoundKit.db2", SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT); +DB2Storage sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS); +DB2Storage sSpellStore("Spell.db2", SpellMeta::Instance(), HOTFIX_SEL_SPELL); +DB2Storage sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS); +DB2Storage sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); +DB2Storage sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES); +DB2Storage sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); +DB2Storage sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES); +DB2Storage sSpellCategoryStore("SpellCategory.db2", SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY); +DB2Storage sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS); +DB2Storage sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS); +DB2Storage sSpellDurationStore("SpellDuration.db2", SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION); +DB2Storage sSpellEffectStore("SpellEffect.db2", SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT); +DB2Storage sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING); +DB2Storage sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); +DB2Storage sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT); +DB2Storage sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS); +DB2Storage sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); +DB2Storage sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); +DB2Storage sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL); +DB2Storage sSpellLevelsStore("SpellLevels.db2", SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS); +DB2Storage sSpellMiscStore("SpellMisc.db2", SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); +DB2Storage sSpellPowerStore("SpellPower.db2", SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER); +DB2Storage sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY); +DB2Storage sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); +DB2Storage sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); +DB2Storage sSpellRadiusStore("SpellRadius.db2", SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS); +DB2Storage sSpellRangeStore("SpellRange.db2", SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE); +DB2Storage sSpellReagentsStore("SpellReagents.db2", SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS); +DB2Storage sSpellScalingStore("SpellScaling.db2", SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING); +DB2Storage sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT); +DB2Storage sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); +DB2Storage sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); +DB2Storage sSpellTotemsStore("SpellTotems.db2", SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS); +DB2Storage sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL); +DB2Storage sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES); +DB2Storage sTalentStore("Talent.db2", TalentMeta::Instance(), HOTFIX_SEL_TALENT); +DB2Storage sTaxiNodesStore("TaxiNodes.db2", TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES); +DB2Storage sTaxiPathStore("TaxiPath.db2", TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH); +DB2Storage sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE); +DB2Storage sTotemCategoryStore("TotemCategory.db2", TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY); +DB2Storage sToyStore("Toy.db2", ToyMeta::Instance(), HOTFIX_SEL_TOY); +DB2Storage sTransportAnimationStore("TransportAnimation.db2", TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION); +DB2Storage sTransportRotationStore("TransportRotation.db2", TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION); +DB2Storage sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR); +DB2Storage sVehicleStore("Vehicle.db2", VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE); +DB2Storage sVehicleSeatStore("VehicleSeat.db2", VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT); +DB2Storage sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE); +DB2Storage sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA); +DB2Storage sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY); +DB2Storage sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS); +DB2Storage sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -225,22 +224,14 @@ template class DB2> inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, uint32 defaultLocale, DB2 const& /*hint*/) { // compatibility format and C++ structure sizes - ASSERT(DB2FileLoader::GetFormatRecordSize(storage->GetFormat()) == sizeof(T), + ASSERT(storage->GetMeta()->GetRecordSize() == sizeof(T), "Size of '%s' set by format string (%u) not equal size of C++ structure (" SZFMTD ").", - storage->GetFileName().c_str(), DB2FileLoader::GetFormatRecordSize(storage->GetFormat()), sizeof(T)); + storage->GetFileName().c_str(), storage->GetMeta()->GetRecordSize(), sizeof(T)); ++DB2FilesCount; -#define EXPECTED_DB2_BUILD 21414 - if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale)) { - if (storage->GetBuild() != EXPECTED_DB2_BUILD) - { - errlist.push_back(Trinity::StringFormat("DB2 file %s is from wrong client version!", storage->GetFileName())); - return; - } - storage->LoadFromDB(); for (uint32 i = 0; i < TOTAL_LOCALES; ++i) @@ -261,7 +252,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D if (FILE* f = fopen((db2Path + localeNames[defaultLocale] + '/' + storage->GetFileName()).c_str(), "rb")) { std::ostringstream stream; - stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << strlen(storage->GetFormat()) + stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << storage->GetMeta()->FieldCount << "). Extracted file might be from wrong client version."; std::string buf = stream.str(); errlist.push_back(buf); @@ -271,7 +262,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D errlist.push_back(storage->GetFileName()); } - stores[storage->GetHash()] = storage; + stores[storage->GetTableHash()] = storage; } DB2Manager& DB2Manager::Instance() @@ -350,7 +341,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGemPropertiesStore); LOAD_DB2(sGlyphPropertiesStore); - LOAD_DB2(sGlyphSlotStore); LOAD_DB2(sGuildColorBackgroundStore); LOAD_DB2(sGuildColorBorderStore); LOAD_DB2(sGuildColorEmblemStore); @@ -547,10 +537,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.Z), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.Z)); } - for (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) - if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) - _glyphSlots.insert(glyphSlot); - for (HeirloomEntry const* heirloom : sHeirloomStore) _heirlooms[heirloom->ItemID] = heirloom; @@ -1476,13 +1462,6 @@ bool DB2Manager::ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerT return left->PowerType < right->PowerType; } -bool DB2Manager::GlyphSlotEntryComparator::Compare(GlyphSlotEntry const* left, GlyphSlotEntry const* right) -{ - if (left->Tooltip != right->Tooltip) - return left->Tooltip < right->Tooltip; - return left->Type > right->Type; -} - bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) { if (left->MountTypeID == right->MountTypeID) diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 6a325579aa2..a0c54d28ef4 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -78,7 +78,6 @@ TC_GAME_API extern DB2Storage sGarrSiteLev TC_GAME_API extern DB2Storage sGarrSiteLevelPlotInstStore; TC_GAME_API extern DB2Storage sGemPropertiesStore; TC_GAME_API extern DB2Storage sGlyphPropertiesStore; -TC_GAME_API extern DB2Storage sGlyphSlotStore; TC_GAME_API extern DB2Storage sGuildColorBackgroundStore; TC_GAME_API extern DB2Storage sGuildColorBorderStore; TC_GAME_API extern DB2Storage sGuildColorEmblemStore; @@ -189,7 +188,7 @@ typedef std::map TaxiPathSetBySource; typedef std::vector TaxiPathNodeList; typedef std::vector TaxiPathNodesByPath; -#define TaxiMaskSize 232 +#define TaxiMaskSize 234 typedef std::array TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; @@ -219,7 +218,6 @@ class TC_GAME_API DB2Manager { public: DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry); - DEFINE_DB2_SET_COMPARATOR(GlyphSlotEntry); DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry); typedef std::map StorageMap; @@ -229,7 +227,6 @@ public: typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; typedef std::map, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::unordered_map> FactionTeamContainer; - typedef std::set GlyphSlotContainer; typedef std::map>> HeirloomCurvesContainer; typedef std::unordered_map HeirloomItemsContainer; typedef std::vector ItemBonusList; @@ -278,7 +275,6 @@ public: static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; std::vector const* GetFactionTeamList(uint32 faction) const; - GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; @@ -328,7 +324,6 @@ private: ChrSpecializationByIndexContainer _chrSpecializationsByIndex; EmotesTextSoundContainer _emoteTextSounds; FactionTeamContainer _factionTeams; - GlyphSlotContainer _glyphSlots; HeirloomItemsContainer _heirlooms; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 568729ec4cb..ae1ef3bf598 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -26,7 +26,6 @@ struct AchievementEntry { - uint32 ID; LocalizedString* Title; LocalizedString* Description; uint32 Flags; @@ -41,6 +40,7 @@ struct AchievementEntry int8 Faction; // -1 = all, 0 = horde, 1 = alliance uint8 Points; uint8 MinimumCriteria; // need this count of completed criterias (own or referenced achievement criterias) + uint32 ID; }; struct AnimKitEntry @@ -72,10 +72,9 @@ struct AreaTableEntry uint16 ZoneMusic; uint16 IntroSound; uint16 LiquidTypeID[4]; - uint16 UWIntroMusic; uint16 UWZoneMusic; uint16 UWAmbience; - uint16 PvPCombastWorldStateID; + uint16 PvPCombatWorldStateID; uint8 SoundProviderPref; uint8 SoundProviderPrefUnderwater; uint8 ExplorationLevel; @@ -84,6 +83,7 @@ struct AreaTableEntry uint8 WildBattlePetLevelMin; uint8 WildBattlePetLevelMax; uint8 WindSettingsID; + uint32 UWIntroSound; // helpers bool IsSanctuary() const @@ -96,7 +96,6 @@ struct AreaTableEntry struct AreaTriggerEntry { - uint32 ID; DBCPosition3D Pos; float Radius; float BoxLength; @@ -111,6 +110,7 @@ struct AreaTriggerEntry uint8 PhaseUseFlags; uint8 ShapeType; uint8 Flag; + uint32 ID; }; struct ArmorLocationEntry @@ -144,7 +144,6 @@ struct BannedAddOnsEntry struct BarberShopStyleEntry { - uint32 ID; LocalizedString* DisplayName; LocalizedString* Description; float CostModifier; @@ -152,6 +151,7 @@ struct BarberShopStyleEntry uint8 Race; uint8 Sex; uint8 Data; // real ID to hair/facial hair + uint32 ID; }; struct BattlePetBreedQualityEntry @@ -171,7 +171,6 @@ struct BattlePetBreedStateEntry struct BattlePetSpeciesEntry { - uint32 ID; uint32 CreatureID; uint32 IconFileID; uint32 SummonSpellID; @@ -179,7 +178,8 @@ struct BattlePetSpeciesEntry LocalizedString* Description; uint16 Flags; uint8 PetType; - int8 Source; + int8 Source; + uint32 ID; }; struct BattlePetSpeciesStateEntry @@ -219,10 +219,11 @@ struct BroadcastTextEntry LocalizedString* FemaleText; uint16 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; uint16 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES]; - uint16 SoundID; uint16 UnkEmoteID; uint8 Language; uint8 Type; + uint32 SoundID[2]; + uint32 PlayerConditionID; }; struct CharSectionsEntry @@ -272,8 +273,6 @@ struct ChatChannelsEntry struct ChrClassesEntry { - uint32 ID; - uint8 PowerType; char const* PetNameToken; LocalizedString* Name; LocalizedString* NameFemale; @@ -285,12 +284,14 @@ struct ChrClassesEntry uint16 Flags; uint16 CinematicSequenceID; uint16 DefaultSpec; + uint8 PowerType; uint8 SpellClassSet; uint8 AttackPowerPerStrength; uint8 AttackPowerPerAgility; uint8 RangedAttackPowerPerAgility; uint8 IconFileDataID; uint8 Unk1; + uint32 ID; }; struct ChrClassesXPowerTypesEntry @@ -325,8 +326,6 @@ struct ChrRacesEntry uint16 CinematicSequenceID; uint16 UAMaleCreatureSoundDataID; uint16 UAFemaleCreatureSoundDataID; - uint16 HighResMaleDisplayID; - uint16 HighResFemaleDisplayID; uint16 Unk; uint8 BaseLanguage; uint8 CreatureType; @@ -338,16 +337,15 @@ struct ChrRacesEntry uint8 NeutralRaceID; uint8 ItemAppearanceFrameRaceID; uint8 CharComponentTexLayoutHiResID; + uint32 HighResMaleDisplayID; + uint32 HighResFemaleDisplayID; }; #define MAX_MASTERY_SPELLS 2 struct ChrSpecializationEntry { - uint32 ID; uint32 MasterySpellID[MAX_MASTERY_SPELLS]; - uint32 Flags; - uint32 AnimReplacementSetID; LocalizedString* Name; LocalizedString* Name2; LocalizedString* Description; @@ -358,6 +356,9 @@ struct ChrSpecializationEntry uint8 PetTalentType; uint8 Role; uint8 PrimaryStatOrder; + uint32 ID; + uint32 Flags; + uint32 AnimReplacementSetID; }; struct CinematicSequencesEntry @@ -428,8 +429,6 @@ struct CreatureFamilyEntry struct CreatureModelDataEntry { uint32 ID; - uint32 Flags; - uint32 FileDataID; float ModelScale; float FootprintTextureLength; float FootprintTextureWidth; @@ -449,16 +448,18 @@ struct CreatureModelDataEntry float OverrideSelectionRadius; float TamedPetBaseScale; float HoverHeight; - uint16 SoundID; - uint16 CreatureGeosetDataID; - uint8 SizeClass; - uint8 BloodID; - uint8 FootprintTextureID; - uint8 FoleyMaterialID; - uint8 Unk700_1; - uint8 Unk700_2; - uint8 FootstepShakeSize; - uint8 DeathThudShakeSize; + uint32 Flags; + uint32 FileDataID; + uint32 SizeClass; + uint32 BloodID; + uint32 FootprintTextureID; + uint32 FoleyMaterialID; + uint32 FootstepEffectID; + uint32 DeathThudEffectID; + uint32 FootstepShakeSize; + uint32 DeathThudShakeSize; + uint32 SoundID; + uint32 CreatureGeosetDataID; }; struct CreatureTypeEntry @@ -605,13 +606,13 @@ struct CriteriaEntry struct CriteriaTreeEntry { uint32 ID; + uint32 CriteriaID; uint32 Amount; LocalizedString* Description; - uint16 CriteriaID; uint16 Parent; uint16 Flags; - uint16 OrderIndex; uint8 Operator; + uint32 OrderIndex; }; struct CurrencyTypesEntry @@ -624,9 +625,9 @@ struct CurrencyTypesEntry uint32 Flags; LocalizedString* Description; uint8 CategoryID; - uint8 SpellWeight; uint8 SpellCategory; uint8 Quality; + uint32 SpellWeight; }; struct CurvePointEntry @@ -689,11 +690,11 @@ struct DungeonEncounterEntry LocalizedString* Name; uint32 CreatureDisplayID; uint16 MapID; - uint16 OrderIndex; uint16 SpellIconID; uint8 DifficultyID; uint8 Bit; uint8 Flags; + uint32 OrderIndex; }; struct DurabilityCostsEntry @@ -715,12 +716,12 @@ struct EmotesEntry char const* EmoteSlashCommand; uint32 SpellVisualKitID; uint32 EmoteFlags; - int32 Unk703_1; - int32 Unk703_2; uint16 AnimID; - uint16 EmoteSpecProcParam; - uint16 EmoteSoundID; uint8 EmoteSpecProc; + uint32 EmoteSpecProcParam; + uint32 EmoteSoundID; + uint32 ClassMask; + uint32 RaceMask; }; struct EmotesTextEntry @@ -734,10 +735,10 @@ struct EmotesTextSoundEntry { uint32 ID; uint16 EmotesTextId; - uint16 SoundId; uint8 RaceId; uint8 SexId; uint8 ClassId; + uint32 SoundId; }; struct FactionEntry @@ -749,6 +750,7 @@ struct FactionEntry float ParentFactionModOut; // Faction outputs rep * ParentFactionModOut as spillover reputation LocalizedString* Name; LocalizedString* Description; + uint32 ReputationMax[4]; int16 ReputationIndex; uint16 ReputationClassMask[4]; uint16 ReputationFlags[4]; @@ -825,7 +827,6 @@ struct FactionTemplateEntry struct GameObjectsEntry { - uint32 ID; DBCPosition3D Position; float RotationX; float RotationY; @@ -840,6 +841,7 @@ struct GameObjectsEntry uint16 PhaseGroupID; uint8 PhaseUseFlags; uint8 Type; + uint32 ID; }; struct GameObjectDisplayInfoEntry @@ -855,7 +857,6 @@ struct GameObjectDisplayInfoEntry struct GarrAbilityEntry { - uint32 ID; LocalizedString* Name; LocalizedString* Description; uint32 IconFileDataID; @@ -863,6 +864,7 @@ struct GarrAbilityEntry uint16 OtherFactionGarrAbilityID; uint8 GarrAbilityCategoryID; uint8 FollowerTypeID; + uint32 ID; }; struct GarrBuildingEntry @@ -875,37 +877,36 @@ struct GarrBuildingEntry LocalizedString* Description; LocalizedString* Tooltip; uint32 IconFileDataID; - uint16 BuildDuration; uint16 CostCurrencyID; - int16 CostCurrencyAmount; + uint16 HordeTexPrefixKitID; + uint16 AllianceTexPrefixKitID; uint16 AllianceActivationScenePackageID; uint16 HordeActivationScenePackageID; + uint16 FollowerRequiredGarrAbilityID; + uint16 FollowerGarrAbilityEffectID; int16 CostMoney; uint8 Unknown; uint8 Type; uint8 Level; - uint8 HordeTexPrefixKitID; - uint8 AllianceTexPrefixKitID; - uint8 BonusAmount; uint8 Flags; uint8 MaxShipments; - uint8 FollowerRequiredGarrAbilityID; - uint8 FollowerGarrAbilityEffectID; uint8 GarrTypeID; + uint32 BuildDuration; + int32 CostCurrencyAmount; + uint32 BonusAmount; }; struct GarrBuildingPlotInstEntry { - uint32 ID; DBCPosition2D LandmarkOffset; uint16 UiTextureAtlasMemberID; uint16 GarrSiteLevelPlotInstID; uint8 GarrBuildingID; + uint32 ID; }; struct GarrClassSpecEntry { - uint32 ID; LocalizedString* NameMale; LocalizedString* NameFemale; LocalizedString* NameGenderless; @@ -913,37 +914,42 @@ struct GarrClassSpecEntry uint8 GarrFollItemSetID; uint8 Limit; uint8 Flags; + uint32 ID; }; struct GarrFollowerEntry { - uint32 ID; uint32 HordeCreatureID; uint32 AllianceCreatureID; LocalizedString* HordeSourceText; LocalizedString* AllianceSourceText; uint32 HordePortraitIconID; uint32 AlliancePortraitIconID; + uint32 HordeAddedBroadcastTextID; + uint32 AllianceAddedBroadcastTextID; + uint16 HordeGarrFollItemSetID; + uint16 AllianceGarrFollItemSetID; uint16 ItemLevelWeapon; uint16 ItemLevelArmor; + uint16 HordeListPortraitTextureKitID; + uint16 AllianceListPortraitTextureKitID; uint8 FollowerTypeID; uint8 HordeUiAnimRaceInfoID; uint8 AllianceUiAnimRaceInfoID; uint8 Quality; uint8 HordeGarrClassSpecID; uint8 AllianceGarrClassSpecID; - uint8 HordeGarrFollItemSetID; - uint8 AllianceGarrFollItemSetID; uint8 Level; uint8 Unknown1; uint8 Flags; int8 Unknown2; int8 Unknown3; - uint8 HordeListPortraitTextureKitID; - uint8 AllianceListPortraitTextureKitID; uint8 GarrTypeID; uint8 MaxDurability; uint8 Class; + uint8 HordeFlavorTextGarrStringID; + uint8 AllianceFlavorTextGarrStringID; + uint32 ID; }; struct GarrFollowerXAbilityEntry @@ -960,11 +966,11 @@ struct GarrPlotEntry LocalizedString* Name; uint32 AllianceConstructionGameObjectID; uint32 HordeConstructionGameObjectID; - uint16 MinCount; - uint16 MaxCount; uint8 GarrPlotUICategoryID; uint8 PlotType; uint8 Flags; + uint32 MinCount; + uint32 MaxCount; }; struct GarrPlotBuildingEntry @@ -986,10 +992,10 @@ struct GarrSiteLevelEntry uint32 ID; DBCPosition2D TownHall; uint16 MapID; + uint16 SiteID; uint16 UpgradeResourceCost; uint16 UpgradeMoneyCost; uint8 Level; - uint8 SiteID; uint8 UITextureKitID; uint8 MovieID; uint8 Level2; @@ -1021,13 +1027,6 @@ struct GlyphPropertiesEntry uint8 GlyphExclusiveCategoryID; }; -struct GlyphSlotEntry -{ - uint32 ID; - uint16 Tooltip; - uint8 Type; -}; - struct GuildColorBackgroundEntry { uint32 ID; @@ -1060,7 +1059,6 @@ struct GuildPerkSpellsEntry struct HeirloomEntry { - uint32 ID; uint32 ItemID; LocalizedString* SourceText; uint32 OldItem[2]; @@ -1069,6 +1067,7 @@ struct HeirloomEntry uint16 ItemBonusListID[2]; uint8 Flags; uint8 Source; + uint32 ID; }; #define MAX_HOLIDAY_DURATIONS 10 @@ -1267,7 +1266,6 @@ struct ItemExtendedCostEntry uint32 ID; uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count - uint32 RequiredMoney; uint16 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // required count of 1st item uint16 RequiredPersonalArenaRating; // required personal arena rating uint16 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency id @@ -1288,12 +1286,12 @@ struct ItemLimitCategoryEntry struct ItemModifiedAppearanceEntry { - uint32 ID; uint32 ItemID; uint16 AppearanceID; uint8 AppearanceModID; uint8 Index; uint8 SourceType; + uint32 ID; }; struct ItemPriceBaseEntry @@ -1329,9 +1327,9 @@ struct ItemSetEntry uint32 ID; LocalizedString* Name; uint32 ItemID[MAX_ITEM_SET_ITEMS]; - uint32 Unknown703; uint16 RequiredSkillRank; - uint8 RequiredSkill; + uint32 RequiredSkill; + uint32 Flags; }; struct ItemSetSpellEntry @@ -1450,7 +1448,6 @@ struct KeyChainEntry struct LfgDungeonsEntry { - uint32 ID; LocalizedString* Name; uint32 Flags; char const* TextureFilename; @@ -1480,6 +1477,7 @@ struct LfgDungeonsEntry uint8 MinCountDamage; uint8 SubType; uint8 MentorCharLevel; + uint32 ID; // Helpers uint32 Entry() const { return ID + (Type << 24); } @@ -1510,13 +1508,13 @@ struct LiquidTypeEntry float Float[18]; uint32 Int[4]; uint16 Flags; - uint16 SoundID; + uint16 LightID; uint8 Type; - uint8 LightID; uint8 ParticleMovement; uint8 ParticleTexSlots; uint8 MaterialID; uint8 DepthTexCount[6]; + uint32 SoundID; }; #define MAX_LOCK_CASE 8 @@ -1595,13 +1593,13 @@ struct MapDifficultyEntry { uint32 ID; LocalizedString* Message_lang; // m_message_lang (text showed when transfer to map failed) - uint32 Context; uint16 MapID; uint8 DifficultyID; uint8 RaidDurationType; // 1 means daily reset, 2 means weekly uint8 MaxPlayers; // m_maxPlayers some heroic versions have 0 when expected same amount as in normal version uint8 LockID; uint8 ItemBonusTreeModID; + uint32 Context; uint32 GetRaidDuration() const { @@ -1626,28 +1624,29 @@ struct ModifierTreeEntry struct MountEntry { - uint32 ID; uint32 SpellId; uint32 DisplayId; LocalizedString* Name; LocalizedString* Description; LocalizedString* SourceDescription; + float CameraPivotMultiplier; uint16 MountTypeId; uint16 Flags; uint16 PlayerConditionId; uint8 Source; + uint32 ID; }; struct MountCapabilityEntry { - uint32 ID; - uint32 RequiredAura; uint32 RequiredSpell; uint32 SpeedModSpell; uint16 RequiredRidingSkill; uint16 RequiredArea; int16 RequiredMap; uint8 Flags; + uint32 ID; + uint32 RequiredAura; }; struct MountTypeXCapabilityEntry @@ -1720,7 +1719,7 @@ struct PhaseXPhaseGroupEntry struct PlayerConditionEntry { - uint32 ID; + uint32 ID; // 1, 1, 1 uint32 RaceMask; uint32 SkillLogic; uint32 ReputationLogic; @@ -1728,26 +1727,19 @@ struct PlayerConditionEntry uint32 CurrQuestLogic; uint32 CurrentCompletedQuestLogic; uint32 SpellLogic; - uint32 SpellID[4]; uint32 ItemLogic; - uint32 ItemID[4]; uint32 Time[2]; uint32 AuraSpellLogic; uint32 AuraSpellID[4]; uint32 AchievementLogic; uint32 AreaLogic; uint32 QuestKillLogic; - uint32 QuestKillMonster[6]; LocalizedString* FailureDescription; - uint32 Unknown700_1; - uint32 Unknown700_2; uint16 MinLevel; uint16 MaxLevel; - uint16 ClassMask; uint16 SkillID[4]; int16 MinSkill[4]; int16 MaxSkill[4]; - uint16 MinFactionID[3]; uint16 MaxFactionID; uint16 PrevQuestID[4]; uint16 CurrQuestID[4]; @@ -1758,15 +1750,12 @@ struct PlayerConditionEntry uint16 AreaID[4]; uint16 QuestKillID; uint16 PhaseID; - uint16 MinAvgItemLevel; - uint16 MaxAvgItemLevel; uint16 MinAvgEquippedItemLevel; uint16 MaxAvgEquippedItemLevel; uint16 ModifierTreeID; uint8 Flags; int8 Gender; int8 NativeGender; - uint8 LanguageID; uint8 MinLanguage; uint8 MaxLanguage; uint8 MinReputation[3]; @@ -1775,18 +1764,13 @@ struct PlayerConditionEntry uint8 MinPVPRank; uint8 MaxPVPRank; uint8 PvpMedal; - uint8 ItemCount[4]; uint8 ItemFlags; uint8 AuraCount[4]; uint8 WeatherID; uint8 PartyStatus; uint8 LifetimeMaxPVPRank; - uint8 LfgLogic; uint8 LfgStatus[4]; uint8 LfgCompare[4]; - uint8 LfgValue[4]; - uint8 CurrencyLogic; - uint8 CurrencyID[4]; uint8 CurrencyCount[4]; int8 MinExpansionLevel; int8 MaxExpansionLevel; @@ -1795,12 +1779,26 @@ struct PlayerConditionEntry uint8 MinGuildLevel; uint8 MaxGuildLevel; uint8 PhaseUseFlags; - uint8 PhaseGroupID; int8 ChrSpecializationIndex; int8 ChrSpecializationRole; int8 PowerType; int8 PowerTypeComp; int8 PowerTypeValue; + uint32 ClassMask; + uint32 LanguageID; + uint32 MinFactionID[3]; + uint32 SpellID[4]; + uint32 ItemID[4]; + uint32 ItemCount[4]; + uint32 LfgLogic; + uint32 LfgValue[4]; + uint32 CurrencyLogic; + uint32 CurrencyID[4]; + uint32 QuestKillMonster[6]; + uint32 PhaseGroupID; + uint32 MinAvgItemLevel; + uint32 MaxAvgItemLevel; + uint32 Unknown700[2]; }; struct PowerDisplayEntry @@ -1877,8 +1875,8 @@ struct ScalingStatDistributionEntry { uint32 ID; uint16 ItemLevelCurveID; - uint8 MinLevel; - uint8 MaxLevel; + uint32 MinLevel; + uint32 MaxLevel; }; struct SkillLineEntry @@ -1891,7 +1889,7 @@ struct SkillLineEntry uint16 Flags; uint8 CategoryID; uint8 CanLink; - uint8 ParentSkillLineID; + uint32 ParentSkillLineID; }; struct SkillLineAbilityEntry @@ -1899,8 +1897,8 @@ struct SkillLineAbilityEntry uint32 ID; uint32 SpellID; uint32 RaceMask; - uint32 ClassMask; uint32 SupercedesSpell; + uint32 Unknown703; uint16 SkillLine; uint16 MinSkillLineRank; uint16 TrivialSkillLineRankHigh; @@ -1909,23 +1907,23 @@ struct SkillLineAbilityEntry uint16 TradeSkillCategoryID; uint8 AquireMethod; uint8 NumSkillUps; + uint32 ClassMask; }; struct SkillRaceClassInfoEntry { uint32 ID; int32 RaceMask; - int32 ClassMask; uint16 SkillID; uint16 Flags; uint16 SkillTierID; uint8 Availability; uint8 MinLevel; + int32 ClassMask; }; struct SoundKitEntry { - uint32 ID; LocalizedString* Name; float VolumeFloat; float MinDistance; @@ -1942,27 +1940,28 @@ struct SoundKitEntry uint8 EAXDef; uint8 DialogType; uint8 Unk700; + uint32 ID; }; struct SpecializationSpellsEntry { - uint32 ID; uint32 SpellID; uint32 OverridesSpellID; LocalizedString* Description; uint16 SpecID; uint8 OrderIndex; + uint32 ID; }; struct SpellEntry { - uint32 ID; LocalizedString* Name; LocalizedString* NameSubtext; LocalizedString* Description; LocalizedString* AuraDescription; uint32 MiscID; - uint16 DescriptionVariablesID; + uint32 ID; + uint32 DescriptionVariablesID; }; struct SpellAuraOptionsEntry @@ -2032,10 +2031,10 @@ struct SpellCategoryEntry uint32 ID; LocalizedString* Name; int32 ChargeRecoveryTime; - uint32 Unk703; uint8 Flags; uint8 UsesPerWeek; uint8 MaxCharges; + uint32 Unk703; }; struct SpellClassOptionsEntry @@ -2043,8 +2042,8 @@ struct SpellClassOptionsEntry uint32 ID; uint32 SpellID; flag128 SpellClassMask; - uint16 ModalNextSpell; - uint8 SpellClassSet; + uint8 SpellClassSet; + uint32 ModalNextSpell; }; struct SpellCooldownsEntry @@ -2067,33 +2066,33 @@ struct SpellDurationEntry struct SpellEffectEntry { - uint32 ID; float EffectAmplitude; - uint32 EffectAuraPeriod; - uint32 EffectBasePoints; float EffectBonusCoefficient; float EffectChainAmplitude; + float EffectPointsPerResource; + float EffectRealPointsPerLevel; + flag128 EffectSpellClassMask; + float EffectPosFacing; + float BonusCoefficientFromAP; + uint32 ID; + uint32 DifficultyID; + uint32 Effect; + uint32 EffectAura; + uint32 EffectAuraPeriod; + uint32 EffectBasePoints; + uint32 EffectChainTargets; uint32 EffectDieSides; uint32 EffectItemType; + uint32 EffectMechanic; int32 EffectMiscValue; int32 EffectMiscValueB; - float EffectPointsPerResource; - float EffectRealPointsPerLevel; - flag128 EffectSpellClassMask; + uint32 EffectRadiusIndex; + uint32 EffectRadiusMaxIndex; uint32 EffectTriggerSpell; - float EffectPosFacing; + uint32 ImplicitTarget[2]; uint32 SpellID; + uint32 EffectIndex; uint32 EffectAttributes; - float BonusCoefficientFromAP; - uint16 EffectAura; - uint16 EffectChainTargets; - uint8 DifficultyID; - uint8 Effect; - uint8 EffectMechanic; - uint8 EffectRadiusIndex; - uint8 EffectRadiusMaxIndex; - uint8 ImplicitTarget[2]; - uint8 EffectIndex; }; #define MAX_SPELL_EFFECTS 32 @@ -2141,7 +2140,6 @@ struct SpellItemEnchantmentEntry uint32 EffectSpellID[MAX_ITEM_ENCHANTMENT_EFFECTS]; LocalizedString* Name; float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS]; - uint32 PlayerConditionID; uint32 TransmogCost; uint32 TextureFileDataID; uint16 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS]; @@ -2157,17 +2155,18 @@ struct SpellItemEnchantmentEntry uint8 MaxLevel; int8 ScalingClass; int8 ScalingClassRestricted; + uint32 PlayerConditionID; }; struct SpellItemEnchantmentConditionEntry { uint32 ID; uint8 LTOperandType[5]; - uint8 LTOperand[5]; uint8 Operator[5]; uint8 RTOperandType[5]; uint8 RTOperand[5]; uint8 Logic[5]; + uint32 LTOperand[5]; }; struct SpellLearnSpellEntry @@ -2218,28 +2217,28 @@ struct SpellMiscEntry struct SpellPowerEntry { - uint32 ID; uint32 SpellID; uint32 ManaCost; float ManaCostPercentage; float ManaCostPercentagePerSecond; uint32 RequiredAura; float HealthCostPercentage; - uint16 ManaCostPerSecond; - uint16 ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource - // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG - uint16 PowerDisplayID; - uint16 UnitPowerBarID; uint8 PowerIndex; uint8 PowerType; - uint8 ManaCostPerLevel; + uint32 ID; + uint32 ManaCostPerLevel; + uint32 ManaCostPerSecond; + uint32 ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource + // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG + uint32 PowerDisplayID; + uint32 UnitPowerBarID; }; struct SpellPowerDifficultyEntry { - uint32 SpellPowerID; uint8 DifficultyID; uint8 PowerIndex; + uint32 ID; }; struct SpellProcsPerMinuteEntry @@ -2294,9 +2293,9 @@ struct SpellScalingEntry uint32 ID; uint32 SpellID; uint16 ScalesFromItemLevel; - int8 ScalingClass; uint8 MinScalingLevel; uint8 MaxScalingLevel; + int32 ScalingClass; }; struct SpellShapeshiftEntry @@ -2320,8 +2319,8 @@ struct SpellShapeshiftFormEntry uint16 CombatRoundTime; uint16 CreatureDisplayID[4]; uint16 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; + uint16 MountTypeID; int8 CreatureType; - uint8 MountTypeID; uint8 BonusActionBar; }; @@ -2332,10 +2331,10 @@ struct SpellTargetRestrictionsEntry float ConeAngle; float Width; uint32 Targets; - uint16 MaxTargetLevel; uint16 TargetCreatureType; uint8 DifficultyID; uint8 MaxAffectedTargets; + uint32 MaxTargetLevel; }; #define MAX_SPELL_TOTEMS 2 @@ -2345,18 +2344,18 @@ struct SpellTotemsEntry uint32 ID; uint32 SpellID; uint32 Totem[MAX_SPELL_TOTEMS]; - uint8 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; + uint16 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; }; struct SpellXSpellVisualEntry { - uint32 ID; uint32 SpellID; float Unk620; uint16 SpellVisualID[2]; uint16 PlayerConditionID; uint8 DifficultyID; uint8 Flags; + uint32 ID; }; struct SummonPropertiesEntry @@ -2388,7 +2387,6 @@ struct TalentEntry struct TaxiNodesEntry { - uint32 ID; DBCPosition3D Pos; LocalizedString* Name; uint32 MountCreatureID[2]; @@ -2397,19 +2395,19 @@ struct TaxiNodesEntry uint16 ConditionID; uint16 LearnableIndex; uint8 Flags; + uint32 ID; }; struct TaxiPathEntry { - uint32 ID; uint16 From; uint16 To; - uint16 Cost; + uint32 ID; + uint32 Cost; }; struct TaxiPathNodeEntry { - uint32 ID; DBCPosition3D Loc; uint32 Delay; uint16 PathID; @@ -2418,6 +2416,7 @@ struct TaxiPathNodeEntry uint16 DepartureEventID; uint8 NodeIndex; uint8 Flags; + uint32 ID; }; struct TotemCategoryEntry @@ -2430,11 +2429,11 @@ struct TotemCategoryEntry struct ToyEntry { - uint32 ID; uint32 ItemID; LocalizedString* Description; uint8 Flags; uint8 CategoryFilter; + uint32 ID; }; struct TransportAnimationEntry @@ -2460,7 +2459,6 @@ struct TransportRotationEntry struct UnitPowerBarEntry { uint32 ID; - uint32 MaxPower; float RegenerationPeace; float RegenerationCombat; uint32 FileDataID[6]; @@ -2473,9 +2471,10 @@ struct UnitPowerBarEntry float EndInset; uint16 StartPower; uint16 Flags; - uint8 MinPower; uint8 CenterPower; uint8 BarType; + uint32 MinPower; + uint32 MaxPower; }; #define MAX_VEHICLE_SEATS 8 @@ -2538,8 +2537,6 @@ struct VehicleSeatEntry float PassengerRoll; float VehicleEnterAnimDelay; float VehicleExitAnimDelay; - uint32 EnterUISoundID; - uint32 ExitUISoundID; float CameraEnteringDelay; float CameraEnteringDuration; float CameraExitingDelay; @@ -2576,6 +2573,8 @@ struct VehicleSeatEntry int8 VehicleExitAnimBone; int8 VehicleRideAnimLoopBone; uint8 VehicleAbilityDisplay; + uint32 EnterUISoundID; + uint32 ExitUISoundID; bool CanEnterOrExit() const { @@ -2595,7 +2594,6 @@ struct VehicleSeatEntry struct WMOAreaTableEntry { - uint32 ID; int32 WMOGroupID; // used in group WMO LocalizedString* AreaName; int16 WMOID; // used in root WMO @@ -2609,12 +2607,12 @@ struct WMOAreaTableEntry uint8 SoundProviderPref; uint8 SoundProviderPrefUnderwater; uint8 Flags; - uint8 UWZoneMusic; + uint32 ID; + uint32 UWZoneMusic; }; struct WorldMapAreaEntry { - uint32 ID; char const* AreaName; float LocLeft; float LocRight; @@ -2626,11 +2624,12 @@ struct WorldMapAreaEntry int16 DefaultDungeonFloor; uint16 ParentWorldMapID; uint16 Flags; - uint16 PlayerConditionID; uint8 LevelRangeMin; uint8 LevelRangeMax; uint8 BountySetID; uint8 BountyBoardLocation; + uint32 ID; + uint32 PlayerConditionID; }; #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 @@ -2639,18 +2638,18 @@ struct WorldMapOverlayEntry { uint32 ID; char const* TextureName; - uint16 MapAreaID; // idx in WorldMapArea.dbc - uint16 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; uint16 TextureWidth; uint16 TextureHeight; - uint16 OffsetX; - uint16 OffsetY; - uint16 HitRectTop; - uint16 HitRectLeft; - uint16 HitRectBottom; - uint16 HitRectRight; - uint16 PlayerConditionID; - uint8 Flags; + uint32 MapAreaID; // idx in WorldMapArea.dbc + uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; + uint32 OffsetX; + uint32 OffsetY; + uint32 HitRectTop; + uint32 HitRectLeft; + uint32 HitRectBottom; + uint32 HitRectRight; + uint32 PlayerConditionID; + uint32 Flags; }; struct WorldMapTransformsEntry diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h deleted file mode 100644 index 57963f3aec6..00000000000 --- a/src/server/game/DataStores/DB2fmt.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_DB2SFRM_H -#define TRINITY_DB2SFRM_H - -char const AchievementFormat[] = "nssishhhhhhhbbb"; -char const AnimKitFormat[] = "dihh"; -char const AreaGroupMemberFormat[] = "dhh"; -char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhhbbbbbbbb"; -char const AreaTriggerFormat[] = "nffffffffhhhhhbbb"; -char const ArmorLocationFormat[] = "dfffff"; -char const AuctionHouseFormat[] = "dshbb"; -char const BankBagSlotPricesFormat[] = "di"; -char const BannedAddOnsFormat[] = "dSSb"; -char const BarberShopStyleFormat[] = "nssfbbbb"; -char const BattlePetBreedQualityFormat[] = "dfb"; -char const BattlePetBreedStateFormat[] = "nhbb"; -char const BattlePetSpeciesFormat[] = "niiisshbb"; -char const BattlePetSpeciesStateFormat[] = "nihb"; -char const BattlemasterListFormat[] = "nsishhhhhhhhhhhhhhhhhhbbbbbbbbb"; -char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; -char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; -char const CharSectionsFormat[] = "niiihbbbbb"; -char const CharTitlesFormat[] = "dsshhb"; -char const ChatChannelsFormat[] = "dissb"; -char const ChrClassesFormat[] = "nSsssSiiihhhbbbbbbb"; -char const ChrClassesXPowerTypesFormat[] = "dbb"; -char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbbb"; -char const ChrSpecializationFormat[] = "niiiisssShbbbbb"; -char const CinematicSequencesFormat[] = "dhhhhhhhhh"; -char const CreatureDisplayInfoFormat[] = "diffiiiSiiifhhhhhhbbbbbb"; -char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb"; -char const CreatureFamilyFormat[] = "dffsshhhbbbb"; -char const CreatureModelDataFormat[] = "diifffffffffffffffffffffffhhbbbbbbbb"; -char const CreatureTypeFormat[] = "dsb"; -char const CriteriaFormat[] = "diiihhhbbbbb"; -char const CriteriaTreeFormat[] = "dishhhhb"; -char const CurrencyTypesFormat[] = "nSSsiiisbbbb"; -char const CurvePointFormat[] = "dffhb"; -char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb"; -char const DifficultyFormat[] = "nsbbbbbbbbbbbb"; -char const DungeonEncounterFormat[] = "dsihhhbbb"; -char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; -char const DurabilityQualityFormat[] = "df"; -char const EmotesFormat[] = "dSiiiihhhb"; -char const EmotesTextFormat[] = "dsh"; -char const EmotesTextSoundFormat[] = "dhhbbb"; -char const FactionFormat[] = "diiiiiiiiffsshhhhhhhhhhbbbbb"; -char const FactionTemplateFormat[] = "dhhhhhhhhhhbbb"; -char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; -char const GameObjectDisplayInfoFormat[] = "diffffffffh"; -char const GarrAbilityFormat[] = "nssihhbb"; -char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb"; -char const GarrBuildingPlotInstFormat[] = "nffhhb"; -char const GarrClassSpecFormat[] = "nssshbbb"; -char const GarrFollowerFormat[] = "niissiihhbbbbbbbbbbbbbbbbbb"; -char const GarrFollowerXAbilityFormat[] = "dhhb"; -char const GarrPlotFormat[] = "dsiihhbbb"; -char const GarrPlotBuildingFormat[] = "dbb"; -char const GarrPlotInstanceFormat[] = "dsb"; -char const GarrSiteLevelFormat[] = "dffhhhbbbbb"; -char const GarrSiteLevelPlotInstFormat[] = "dffhbb"; -char const GemPropertiesFormat[] = "dihh"; -char const GlyphPropertiesFormat[] = "dihbb"; -char const GlyphSlotFormat[] = "dhb"; -char const GuildColorBackgroundFormat[] = "dbbb"; -char const GuildColorBorderFormat[] = "dbbb"; -char const GuildColorEmblemFormat[] = "dbbb"; -char const GuildPerkSpellsFormat[] = "di"; -char const HeirloomFormat[] = "nisiiiiihhbb"; -char const HolidaysEntryFormat[] = "diiiiiiiiiiiiiiiiShhhhhhhhhhhbbbbbbbbbbbbbbbb"; -char const ImportPriceArmorFormat[] = "dffff"; -char const ImportPriceQualityFormat[] = "df"; -char const ImportPriceShieldFormat[] = "df"; -char const ImportPriceWeaponFormat[] = "df"; -char const ItemFormat[] = "dibbbbbbb"; -char const ItemAppearanceFormat[] = "diiib"; -char const ItemArmorQualityFormat[] = "dfffffffh"; -char const ItemArmorShieldFormat[] = "dfffffffh"; -char const ItemArmorTotalFormat[] = "dffffh"; -char const ItemBagFamilyFormat[] = "ds"; -char const ItemBonusFormat[] = "niihbb"; -char const ItemBonusTreeNodeFormat[] = "dhhhb"; -char const ItemClassFormat[] = "dfsb"; -char const ItemCurrencyCostFormat[] = "di"; -char const ItemDamageAmmoFormat[] = "dfffffffh"; -char const ItemDamageOneHandFormat[] = "dfffffffh"; -char const ItemDamageOneHandCasterFormat[] = "dfffffffh"; -char const ItemDamageTwoHandFormat[] = "dfffffffh"; -char const ItemDamageTwoHandCasterFormat[] = "dfffffffh"; -char const ItemDisenchantLootFormat[] = "dhhhbbb"; -char const ItemEffectFormat[] = "diiiihhhbb"; -char const ItemExtendedCostFormat[] = "diiiiiiiiiiihhhhhhhhhhhbbbbb"; -char const ItemLimitCategoryFormat[] = "dsbb"; -char const ItemModifiedAppearanceFormat[] = "nihbbb"; -char const ItemPriceBaseFormat[] = "dffh"; -char const ItemRandomPropertiesFormat[] = "dshhhhh"; -char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh"; -char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiiihb"; -char const ItemSetSpellFormat[] = "dihhb"; -char const ItemSparseFormat[] = "diiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const ItemSpecFormat[] = "dhbbbbb"; -char const ItemSpecOverrideFormat[] = "dih"; -char const ItemXBonusTreeFormat[] = "dih"; -char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const LfgDungeonsFormat[] = "nsiSshhhhhhhhbbbbbbbbbbbbbbbbb"; -char const LightFormat[] = "dfffffhhhhhhhhh"; -char const LiquidTypeFormat[] = "dsifffffssssssiiffffffffffffffffffiiiihhbbbbbbbbbbb"; -char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb"; -char const MailTemplateFormat[] = "ds"; -char const MapFormat[] = "dsiifffssshhhhhhbbbbb"; -char const MapDifficultyFormat[] = "dsihbbbbb"; -char const ModifierTreeFormat[] = "diihbbbb"; -char const MountFormat[] = "niissshhhb"; -char const MountCapabilityFormat[] = "niiihhhb"; -char const MountTypeXCapabilityFormat[] = "dhhb"; -char const MovieFormat[] = "diibb"; -char const NameGenFormat[] = "dsbb"; -char const NamesProfanityFormat[] = "dSb"; -char const NamesReservedFormat[] = "dS"; -char const NamesReservedLocaleFormat[] = "dSb"; -char const OverrideSpellDataFormat[] = "diiiiiiiiiiib"; -char const PhaseFormat[] = "dh"; -char const PhaseXPhaseGroupFormat[] = "dhh"; -char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const PowerDisplayFormat[] = "dSbbbb"; -char const PvpDifficultyFormat[] = "dhbbb"; -char const QuestFactionRewardFormat[] = "dhhhhhhhhhh"; -char const QuestMoneyRewardFormat[] = "diiiiiiiiii"; -char const QuestPackageItemFormat[] = "dihbb"; -char const QuestSortFormat[] = "dsb"; -char const QuestV2Format[] = "dh"; -char const QuestXPFormat[] = "dhhhhhhhhhh"; -char const RandPropPointsFormat[] = "diiiiiiiiiiiiiii"; -char const ScalingStatDistributionFormat[] = "dhbb"; -char const SkillLineFormat[] = "dssshhbbb"; -char const SkillLineAbilityFormat[] = "diiiihhhhhhbb"; -char const SkillRaceClassInfoFormat[] = "diihhhbb"; -char const SoundKitFormat[] = "nsffffffffhhhbbbb"; -char const SpecializationSpellsFormat[] = "niishb"; -char const SpellFormat[] = "nssssih"; -char const SpellAuraOptionsFormat[] = "diiiihbbb"; -char const SpellAuraRestrictionsFormat[] = "diiiiibbbbb"; -char const SpellCastTimesFormat[] = "diih"; -char const SpellCastingRequirementsFormat[] = "dihhhbbb"; -char const SpellCategoriesFormat[] = "dihhhbbbbb"; -char const SpellCategoryFormat[] = "dsiibbb"; -char const SpellClassOptionsFormat[] = "diiiiihb"; -char const SpellCooldownsFormat[] = "diiiib"; -char const SpellDurationFormat[] = "diih"; -char const SpellEffectFormat[] = "nfiiffiiiiffiiiiifiifhhbbbbbbbb"; -char const SpellEffectScalingFormat[] = "dfffi"; -char const SpellEquippedItemsFormat[] = "diiib"; -char const SpellFocusObjectFormat[] = "ds"; -char const SpellInterruptsFormat[] = "diiiiihb"; -char const SpellItemEnchantmentFormat[] = "diiisfffiiihhhhhhhhbbbbbbbbb"; -char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const SpellLearnSpellFormat[] = "diii"; -char const SpellLevelsFormat[] = "dihhhbb"; -char const SpellMiscFormat[] = "diiiiiiiiiiiiiiffhhhhhb"; -char const SpellPowerFormat[] = "niiffifhhhhbbb"; -char const SpellPowerDifficultyFormat[] = "nbb"; -char const SpellProcsPerMinuteFormat[] = "dfb"; -char const SpellProcsPerMinuteModFormat[] = "dfhbb"; -char const SpellRadiusFormat[] = "dffff"; -char const SpellRangeFormat[] = "dffffssb"; -char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh"; -char const SpellScalingFormat[] = "dihbbb"; -char const SpellShapeshiftFormat[] = "diiiiib"; -char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb"; -char const SpellTargetRestrictionsFormat[] = "diffihhbb"; -char const SpellTotemsFormat[] = "diiibb"; -char const SpellXSpellVisualFormat[] = "nifhhhbb"; -char const SummonPropertiesFormat[] = "diiiii"; -char const TalentFormat[] = "diishbbbbbb"; -char const TaxiNodesFormat[] = "nfffsiiffhhhb"; -char const TaxiPathFormat[] = "nhhh"; -char const TaxiPathNodeFormat[] = "nfffihhhhbb"; -char const TotemCategoryFormat[] = "dsib"; -char const ToyFormat[] = "nisbb"; -char const TransportAnimationFormat[] = "diifffb"; -char const TransportRotationFormat[] = "diiffff"; -char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb"; -char const VehicleFormat[] = "difffffffffffffffffffSSSSffhhhhhhhhhhhhbb"; -char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffiiffffffffffffihhhhhhhhhhhhhhhhhhhbbbbbb"; -char const WMOAreaTableFormat[] = "nishhhhhhhbbbbb"; -char const WorldMapAreaFormat[] = "nSffffhhhhhhhbbbb"; -char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhhb"; -char const WorldMapTransformsFormat[] = "dfffffffffhhhhb"; -char const WorldSafeLocsFormat[] = "dffffsh"; - -#endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index f71e105a62b..b00cbf7e9fb 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -585,6 +585,11 @@ enum ItemLimitCategoryMode ITEM_LIMIT_CATEGORY_MODE_EQUIP = 1 // limit applied to amount equipped items (including used gems) }; +enum ItemSetFlags +{ + ITEM_SET_FLAG_LEGACY_INACTIVE = 0x01, +}; + enum ItemSpecStat { ITEM_SPEC_STAT_INTELLECT = 0, diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h deleted file mode 100644 index 3027402f596..00000000000 --- a/src/server/game/DataStores/DBCfmt.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef TRINITY_DBCSFRM_H -#define TRINITY_DBCSFRM_H - -// x - skip, X - skip, s - char*, f - float, i - uint32, b - uint8, d - index (not included) -// n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc - - -#endif diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 84138cf0b45..a049256f0a7 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -49,6 +49,9 @@ void AddItemsSetItem(Player* player, Item* item) if (set->RequiredSkill && player->GetSkillValue(set->RequiredSkill) < set->RequiredSkillRank) return; + if (set->Flags & ITEM_SET_FLAG_LEGACY_INACTIVE) + return; + ItemSetEffect* eff = NULL; for (size_t x = 0; x < player->ItemSetEff.size(); ++x) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fefceea25e1..9626b828cf9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -561,7 +561,6 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac // base stats and related field values InitStatsForLevel(); InitTaxiNodesForLevel(); - InitGlyphsForLevel(); InitTalentForLevel(); InitPrimaryProfessions(); // to max set before any spell added @@ -2448,7 +2447,6 @@ void Player::GiveLevel(uint8 level) InitTalentForLevel(); InitTaxiNodesForLevel(); - InitGlyphsForLevel(); UpdateAllStats(); @@ -4021,10 +4019,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_QUESTSTATUS_DAILY); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -16800,7 +16794,6 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // reset stats before loading any modifiers InitStatsForLevel(); - InitGlyphsForLevel(); InitTaxiNodesForLevel(); InitRunes(); @@ -16869,9 +16862,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) LearnSpecializationSpells(); - _LoadGlyphs(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS)); _LoadAuras(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURA_EFFECTS), time_diff); - _LoadGlyphAuras(); // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura) if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) m_deathState = DEAD; @@ -17241,36 +17232,6 @@ void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effe } } -void Player::_LoadGlyphAuras() -{ - for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - { - if (uint32 glyph = GetGlyph(GetActiveTalentGroup(), i)) - { - if (GlyphPropertiesEntry const* gp = sGlyphPropertiesStore.LookupEntry(glyph)) - { - if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i))) - { - if (gp->Type == gs->Type) - { - CastSpell(this, gp->SpellID, true); - continue; - } - else - TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has glyph with typeflags %u in slot with typeflags %u, removing.", GetName().c_str(), GetGUID().ToString().c_str(), gp->Type, gs->Type); - } - else - TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has not existing glyph slot entry %u on index %u", GetName().c_str(), GetGUID().ToString().c_str(), GetGlyphSlot(i), i); - } - else - TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has not existing glyph entry %u on index %u", GetName().c_str(), GetGUID().ToString().c_str(), glyph, i); - - // On any error remove glyph - SetGlyph(i, 0); - } - } -} - void Player::LoadCorpse(PreparedQueryResult result) { if (IsAlive() || HasAtLoginFlag(AT_LOGIN_RESURRECT)) @@ -18874,7 +18835,6 @@ void Player::SaveToDB(bool create /*=false*/) m_reputationMgr->SaveToDB(trans); _SaveEquipmentSets(trans); GetSession()->SaveTutorialsData(trans); // changed only while character in game - _SaveGlyphs(trans); _SaveInstanceTimeRestrictions(trans); _SaveCurrency(trans); _SaveCUFProfiles(trans); @@ -24014,25 +23974,6 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 return cost; } -void Player::InitGlyphsForLevel() -{ - //uint32 slotMask = 0; - //uint8 slot = 0; - //uint8 level = getLevel(); - //for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) - //{ - // if (level >= ((gs->Tooltip + 1) * 25)) - // slotMask |= 1 << slot; - - // SetGlyphSlot(slot++, gs->ID); - //} -} - -void Player::SetGlyph(uint8 slot, uint32 glyph) -{ - _talentMgr->GroupInfo[GetActiveTalentGroup()].Glyphs[slot] = glyph; -} - bool Player::isTotalImmune() const { AuraEffectList const& immune = GetAuraEffectsByType(SPELL_AURA_SCHOOL_IMMUNITY); @@ -24840,9 +24781,6 @@ void Player::SendTalentsInfoData() groupInfoPkt.TalentIDs.push_back(uint16(itr->first)); } - for (uint32 x = 0; x < MAX_GLYPH_SLOT_INDEX; ++x) - groupInfoPkt.GlyphIDs[x] = uint16(GetGlyph(i, x)); - packet.Info.TalentGroups.push_back(groupInfoPkt); } @@ -25021,48 +24959,6 @@ void Player::SetMap(Map* map) m_mapRef.link(map, this); } -void Player::_LoadGlyphs(PreparedQueryResult result) -{ - // SELECT group, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6, glyph7, glyph8, glyph9 FROM character_glyphs WHERE guid = '%u' - if (!result) - return; - - do - { - Field* fields = result->Fetch(); - - uint8 group = fields[0].GetUInt8(); - if (group >= GetTalentGroupsCount()) - continue; - - for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - _talentMgr->GroupInfo[group].Glyphs[i] = fields[i + 1].GetUInt16(); - } - while (result->NextRow()); -} - -void Player::_SaveGlyphs(SQLTransaction& trans) const -{ - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); - - for (uint8 group = 0; group < GetTalentGroupsCount(); ++group) - { - uint8 index = 0; - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS); - stmt->setUInt64(index++, GetGUID().GetCounter()); - - stmt->setUInt8(index++, group); - - for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - stmt->setUInt16(index++, uint16(GetGlyph(group, i))); - - trans->Append(stmt); - } -} - void Player::_LoadTalents(PreparedQueryResult result) { // SetPQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, spec FROM character_talent WHERE guid = '%u'", GUID_LOPART(m_guid)); @@ -25215,13 +25111,6 @@ void Player::ActivateTalentGroup(uint8 spec) // Remove spec specific spells RemoveSpecializationSpells(); - // set glyphs - for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) - // remove secondary glyph - if (uint32 oldglyph = GetGlyph(GetActiveTalentGroup(), slot)) - if (GlyphPropertiesEntry const* old_gp = sGlyphPropertiesStore.LookupEntry(oldglyph)) - RemoveAurasDueToSpell(old_gp->SpellID); - SetActiveTalentGroup(spec); SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, GetSpecId(spec)); @@ -25255,19 +25144,6 @@ void Player::ActivateTalentGroup(uint8 spec) if (uint32 mastery = specialization->MasterySpellID[i]) LearnSpell(mastery, false); - // set glyphs - for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) - { - uint32 glyph = GetGlyph(GetActiveTalentGroup(), slot); - - // apply primary glyph - if (glyph) - if (GlyphPropertiesEntry const* gp = sGlyphPropertiesStore.LookupEntry(glyph)) - CastSpell(this, gp->SpellID, true); - - SetGlyph(slot, glyph); - } - InitTalentForLevel(); { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2f2258118b0..7edc88bdecc 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -956,7 +956,6 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_BG_DATA, - PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA, PLAYER_LOGIN_QUERY_LOAD_SKILLS, @@ -1150,11 +1149,8 @@ struct TC_GAME_API PlayerTalentInfo for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) { GroupInfo[i].Talents = new PlayerTalentMap(); - memset(GroupInfo[i].Glyphs, 0, MAX_GLYPH_SLOT_INDEX * sizeof(uint32)); GroupInfo[i].SpecId = 0; } - - GlyphSlots.fill(0); } ~PlayerTalentInfo() @@ -1166,7 +1162,6 @@ struct TC_GAME_API PlayerTalentInfo struct TalentGroupInfo { PlayerTalentMap* Talents; - uint32 Glyphs[MAX_GLYPH_SLOT_INDEX]; uint32 SpecId; } GroupInfo[MAX_TALENT_GROUPS]; @@ -1175,8 +1170,6 @@ struct TC_GAME_API PlayerTalentInfo uint8 ActiveGroup; uint8 GroupsCount; - std::array GlyphSlots; - private: PlayerTalentInfo(PlayerTalentInfo const&); }; @@ -1784,13 +1777,6 @@ class TC_GAME_API Player : public Unit, public GridObject void UpdateTalentGroupCount(uint8 count); void ActivateTalentGroup(uint8 group); - void InitGlyphsForLevel(); - void SetGlyphSlot(uint8 slot, uint32 slottype) { _talentMgr->GlyphSlots[slot] = slottype; } - - uint32 GetGlyphSlot(uint8 slot) const { return _talentMgr->GlyphSlots[slot]; } - void SetGlyph(uint8 slot, uint32 glyph); - uint32 GetGlyph(uint8 group, uint8 slot) const { return _talentMgr->GroupInfo[group].Glyphs[slot]; } - PlayerTalentMap const* GetTalentMap(uint8 spec) const { return _talentMgr->GroupInfo[spec].Talents; } PlayerTalentMap* GetTalentMap(uint8 spec) { return _talentMgr->GroupInfo[spec].Talents; } ActionButtonList const& GetActionButtons() const { return m_actionButtons; } @@ -2524,7 +2510,6 @@ class TC_GAME_API Player : public Unit, public GridObject void _LoadActions(PreparedQueryResult result); void _LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectResult, uint32 timediff); - void _LoadGlyphAuras(); void _LoadBoundInstances(PreparedQueryResult result); void _LoadInventory(PreparedQueryResult result, uint32 timeDiff); void _LoadVoidStorage(PreparedQueryResult result); @@ -2547,7 +2532,6 @@ class TC_GAME_API Player : public Unit, public GridObject void _LoadArenaTeamInfo(PreparedQueryResult result); void _LoadEquipmentSets(PreparedQueryResult result); void _LoadBGData(PreparedQueryResult result); - void _LoadGlyphs(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); void _LoadCurrency(PreparedQueryResult result); @@ -2571,7 +2555,6 @@ class TC_GAME_API Player : public Unit, public GridObject void _SaveSpells(SQLTransaction& trans); void _SaveEquipmentSets(SQLTransaction& trans); void _SaveBGData(SQLTransaction& trans); - void _SaveGlyphs(SQLTransaction& trans) const; void _SaveTalents(SQLTransaction& trans); void _SaveStats(SQLTransaction& trans) const; void _SaveInstanceTimeRestrictions(SQLTransaction& trans); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index d4ea3927f6c..1e80aa8018b 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -199,10 +199,6 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_BG_DATA, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_GLYPHS); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_GLYPHS, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_TALENTS); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_TALENTS, stmt); @@ -1462,28 +1458,6 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance _player->SetStandState(UNIT_STAND_STATE_STAND); } -void WorldSession::HandleRemoveGlyph(WorldPacket& recvData) -{ - uint32 slot; - recvData >> slot; - - if (slot >= MAX_GLYPH_SLOT_INDEX) - { - TC_LOG_DEBUG("network", "Client sent wrong glyph slot number in opcode CMSG_REMOVE_GLYPH %u", slot); - return; - } - - if (uint32 glyph = _player->GetGlyph(_player->GetActiveTalentGroup(), slot)) - { - if (GlyphPropertiesEntry const* gp = sGlyphPropertiesStore.LookupEntry(glyph)) - { - _player->RemoveAurasDueToSpell(gp->SpellID); - _player->SetGlyph(slot, 0); - _player->SendTalentsInfoData(); - } - } -} - void WorldSession::HandleCharCustomizeOpcode(WorldPackets::Character::CharCustomize& packet) { if (!IsLegitCharacterForAccount(packet.CustomizeInfo->CharGUID)) diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index 3ffde3dc3e3..3ac39c2d500 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -58,9 +58,6 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) if (v.second != PLAYERSPELL_REMOVED) inspectResult.Talents.push_back(v.first); } - - for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - inspectResult.Glyphs.push_back(player->GetGlyph(player->GetActiveTalentGroup(), i)); } if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index d796b789f8d..6bbec483634 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -855,7 +855,6 @@ enum SpellAttr13 #define MAX_TALENT_GROUP 1 #define MIN_TALENT_GROUPS 1 #define MAX_TALENT_GROUPS 2 -#define MAX_GLYPH_SLOT_INDEX 6 #define MIN_SPECIALIZATION_LEVEL 10 #define MAX_SPECIALIZATIONS 4 #define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index 7dc2daaa706..bc7b6aec20c 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -27,8 +27,8 @@ WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write() _worldPacket << talentGroupInfo.SpecID; _worldPacket << uint32(talentGroupInfo.TalentIDs.size()); - for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - _worldPacket << talentGroupInfo.GlyphIDs[i]; + //for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) + // _worldPacket << talentGroupInfo.GlyphIDs[i]; for (uint16 talentID : talentGroupInfo.TalentIDs) _worldPacket << talentID; diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index ca6b0217a28..9e09605b362 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -29,7 +29,7 @@ namespace WorldPackets { uint32 SpecID; std::vector TalentIDs; - uint16 GlyphIDs[MAX_GLYPH_SLOT_INDEX]; + //uint16 GlyphIDs[MAX_GLYPH_SLOT_INDEX]; }; struct TalentInfoUpdate diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5becf594568..d58b03ebb2c 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1650,7 +1650,6 @@ class TC_GAME_API WorldSession // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); void HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& getMirrorImageData); - void HandleRemoveGlyph(WorldPacket& recvData); void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& saveEquipmentSet); void HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& deleteEquipmentSet); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e529990cccd..9962a214f97 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1359,23 +1359,6 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const target->CastSpell(target, itr->first, true, NULL, this); } - // Also do it for Glyphs - for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - { - if (uint32 glyphId = plrTarget->GetGlyph(plrTarget->GetActiveTalentGroup(), i)) - { - if (GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId)) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyph->SpellID); - if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) - continue; - - if (spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() - 1))) - target->CastSpell(target, glyph->SpellID, true, NULL, this); - } - } - } - // Leader of the Pack if (plrTarget->HasSpell(17007)) { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d22b6df71e4..3b452024c80 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3922,72 +3922,9 @@ void Spell::EffectApplyGlyph(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (m_misc.GlyphSlot >= MAX_GLYPH_SLOT_INDEX) - return; - Player* player = m_caster->ToPlayer(); if (!player) return; - - // glyph sockets level requirement - uint8 minLevel = 0; - switch (m_misc.GlyphSlot) - { - case 0: - case 1: - case 6: minLevel = 25; break; - case 2: - case 3: - case 7: minLevel = 50; break; - case 4: - case 5: - case 8: minLevel = 75; break; - } - - if (minLevel && m_caster->getLevel() < minLevel) - { - SendCastResult(SPELL_FAILED_GLYPH_SOCKET_LOCKED); - return; - } - - // apply new one - if (uint32 newGlyph = effectInfo->MiscValue) - { - if (GlyphPropertiesEntry const* newGlyphProperties = sGlyphPropertiesStore.LookupEntry(newGlyph)) - { - if (GlyphSlotEntry const* newGlyphSlot = sGlyphSlotStore.LookupEntry(player->GetGlyphSlot(m_misc.GlyphSlot))) - { - if (newGlyphProperties->Type != newGlyphSlot->Type) - { - SendCastResult(SPELL_FAILED_INVALID_GLYPH); - return; // glyph slot mismatch - } - } - - // remove old glyph - if (uint32 oldGlyph = player->GetGlyph(player->GetActiveTalentGroup(), m_misc.GlyphSlot)) - { - if (GlyphPropertiesEntry const* oldGlyphProperties = sGlyphPropertiesStore.LookupEntry(oldGlyph)) - { - player->RemoveAurasDueToSpell(oldGlyphProperties->SpellID); - player->SetGlyph(m_misc.GlyphSlot, 0); - } - } - - player->CastSpell(m_caster, newGlyphProperties->SpellID, true); - player->SetGlyph(m_misc.GlyphSlot, newGlyph); - player->SendTalentsInfoData(); - } - } - else if (uint32 oldGlyph = player->GetGlyph(player->GetActiveTalentGroup(), m_misc.GlyphSlot)) // Removing the glyph, get the old one - { - if (GlyphPropertiesEntry const* oldGlyphProperties = sGlyphPropertiesStore.LookupEntry(oldGlyph)) - { - player->RemoveAurasDueToSpell(oldGlyphProperties->SpellID); - player->SetGlyph(m_misc.GlyphSlot, 0); - player->SendTalentsInfoData(); - } - } } void Spell::EffectEnchantHeldItem(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index e77893e9de6..f72d7c614cc 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -134,7 +134,6 @@ public: target->InitRunes(); target->InitStatsForLevel(true); target->InitTaxiNodesForLevel(); - target->InitGlyphsForLevel(); target->InitTalentForLevel(); target->SetUInt32Value(PLAYER_XP, 0); @@ -190,7 +189,6 @@ public: target->InitRunes(); target->InitStatsForLevel(true); target->InitTaxiNodesForLevel(); - target->InitGlyphsForLevel(); target->InitTalentForLevel(); return true; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index d41dcb42411..0829441e17a 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1008,7 +1008,7 @@ class spell_sha_lava_surge_proc : public SpellScriptLoader void ResetCooldown() { - GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_LAVA_BURST)->ChargeCategoryEntry); + GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_LAVA_BURST)->ChargeCategoryId); } void Register() override diff --git a/src/server/shared/DataStores/DB2Meta.cpp b/src/server/shared/DataStores/DB2Meta.cpp new file mode 100644 index 00000000000..66c18961551 --- /dev/null +++ b/src/server/shared/DataStores/DB2Meta.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "DB2Meta.h" + +DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, char const* types, uint8 const* arraySizes) + : IndexField(indexField), FieldCount(fieldCount), Types(types), ArraySizes(arraySizes) +{ +} + +bool DB2Meta::HasIndexFieldInData() const +{ + return IndexField != -1; +} + +uint32 DB2Meta::GetIndexField() const +{ + return IndexField == -1 ? 0 : uint32(IndexField); +} + +uint32 DB2Meta::GetRecordSize() const +{ + uint32 size = 0; + for (uint32 i = 0; i < FieldCount; ++i) + { + for (uint8 j = 0; j < ArraySizes[i]; ++j) + { + switch (Types[i]) + { + case FT_BYTE: + size += 1; + break; + case FT_SHORT: + size += 2; + break; + case FT_FLOAT: + case FT_INT: + size += 4; + break; + case FT_STRING: + case FT_STRING_NOT_LOCALIZED: + size += sizeof(char*); + break; + } + } + } + + if (!HasIndexFieldInData()) + size += 4; + + return size; +} + +uint32 DB2Meta::GetDbIndexField() const +{ + if (IndexField == -1) + return 0; + + uint32 index = 0; + for (uint32 i = 0; i < FieldCount && i < uint32(IndexField); ++i) + index += ArraySizes[i]; + + return index; +} + +uint32 DB2Meta::GetDbFieldCount() const +{ + uint32 fields = 0; + for (uint32 i = 0; i < FieldCount; ++i) + fields += ArraySizes[i]; + + if (!HasIndexFieldInData()) + ++fields; + + return fields; +} + +uint32 DB2Meta::GetStringFieldCount(bool localizedOnly) const +{ + uint32 stringFields = 0; + for (uint32 i = 0; i < FieldCount; ++i) + if (Types[i] == FT_STRING || (Types[i] == FT_STRING_NOT_LOCALIZED && !localizedOnly)) + for (uint8 j = 0; j < ArraySizes[i]; ++j) + ++stringFields; + + return stringFields; +} diff --git a/src/server/shared/DataStores/DB2Meta.h b/src/server/shared/DataStores/DB2Meta.h new file mode 100644 index 00000000000..adfdfea37fb --- /dev/null +++ b/src/server/shared/DataStores/DB2Meta.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef DB2Meta_h__ +#define DB2Meta_h__ + +#include "Define.h" + +struct DB2Meta +{ + DB2Meta(int32 indexField, uint32 fieldCount, char const* types, uint8 const* arraySizes); + + bool HasIndexFieldInData() const; + + // Returns field index for data loaded in our structures (ID field is appended in the front if not present in db2 file data section) + uint32 GetIndexField() const; + + // Returns size of final loaded structure + uint32 GetRecordSize() const; + + uint32 GetDbIndexField() const; + uint32 GetDbFieldCount() const; + + uint32 GetStringFieldCount(bool localizedOnly) const; + + int32 IndexField; + uint32 FieldCount; + char const* Types; + uint8 const* ArraySizes; +}; + +#endif // DB2Meta_h__ diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp index 2d5c11b9d5d..721ce6d8813 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -23,14 +23,14 @@ DB2SparseFileLoader::DB2SparseFileLoader() { fileName = nullptr; + meta = nullptr; recordCount = 0; fieldCount = 0; recordSize = 0; offsetsPos = 0; tableHash = 0; - build = 0; - unk1 = 0; + layoutHash = 0; minIndex = 0; maxIndex = 0; localeMask = 0; @@ -39,9 +39,10 @@ DB2SparseFileLoader::DB2SparseFileLoader() dataStart = 0; data = nullptr; offsets = nullptr; + fields = nullptr; } -bool DB2SparseFileLoader::Load(const char *filename) +bool DB2SparseFileLoader::Load(const char *filename, DB2Meta const* meta) { if (data) { @@ -54,6 +55,7 @@ bool DB2SparseFileLoader::Load(const char *filename) return false; fileName = filename; + this->meta = meta; uint32 header; if (fread(&header, 4, 1, f) != 1) // Signature { @@ -63,10 +65,10 @@ bool DB2SparseFileLoader::Load(const char *filename) EndianConvert(header); - if (header != 0x34424457) + if (header != 0x35424457) { fclose(f); - return false; //'WDB4' + return false; //'WDB5' } if (fread(&recordCount, 4, 1, f) != 1) // Number of records @@ -109,21 +111,13 @@ bool DB2SparseFileLoader::Load(const char *filename) EndianConvert(tableHash); - if (fread(&build, 4, 1, f) != 1) // Build + if (fread(&layoutHash, 4, 1, f) != 1) // Layout hash { fclose(f); return false; } - EndianConvert(build); - - if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 - { - fclose(f); - return false; - } - - EndianConvert(unk1); + EndianConvert(layoutHash); if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { @@ -165,6 +159,13 @@ bool DB2SparseFileLoader::Load(const char *filename) EndianConvert(metaFlags); + fields = new FieldEntry[fieldCount]; + if (fread(fields, fieldCount * sizeof(FieldEntry), 1, f) != 1) + { + fclose(f); + return false; + } + dataStart = ftell(f); data = new unsigned char[offsetsPos - dataStart]; @@ -190,69 +191,19 @@ DB2SparseFileLoader::~DB2SparseFileLoader() { delete[] data; delete[] offsets; -} - -uint32 DB2SparseFileLoader::GetFormatRecordSize(const char * format) -{ - uint32 recordsize = 0; - for (uint32 x = 0; format[x]; ++x) - { - switch (format[x]) - { - case FT_FLOAT: - case FT_INT: - case FT_SORT: - recordsize += 4; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: - recordsize += sizeof(char*); - break; - case FT_BYTE: - recordsize += 1; - break; - case FT_LONG: - recordsize += 8; - break; - case FT_SHORT: - recordsize += 2; - break; - } - } - - return recordsize; -} - -uint32 DB2SparseFileLoader::GetFormatStringFieldCount(const char* format) -{ - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) - ++stringfields; - - return stringfields; -} - -uint32 DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(char const* format) -{ - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING) - ++stringfields; - - return stringfields; + delete[] fields; } static char const* const nullStr = ""; -char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable, uint32 locale, std::vector& stringPool) +char* DB2SparseFileLoader::AutoProduceData(IndexTable const& indexTable, uint32 locale, std::vector& stringPool) { typedef char* ptr; - if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) + if (meta->FieldCount != fieldCount) return NULL; //get struct size and index pos - uint32 recordsize = GetFormatRecordSize(format); + uint32 recordsize = meta->GetRecordSize(); uint32 offsetCount = maxIndex - minIndex + 1; uint32 records = 0; @@ -269,12 +220,11 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& char* dataTable = new char[records * recordsize]; // we store flat holders pool as single memory block - std::size_t stringFields = GetFormatStringFieldCount(format); - std::size_t localizedStringFields = GetFormatLocalizedStringFieldCount(format); + std::size_t stringFields = meta->GetStringFieldCount(false); + std::size_t localizedStringFields = meta->GetStringFieldCount(true); // each string field at load have array of string for each locale - std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; - std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * records; char* stringHoldersPool = new char[stringHoldersPoolSize]; @@ -284,8 +234,8 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) ((char const**)stringHoldersPool)[i] = nullStr; - char* stringTable = new char[expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*))]; - memset(stringTable, 0, expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*))); + char* stringTable = new char[expandedDataSize - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; + memset(stringTable, 0, expandedDataSize - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); stringPool.push_back(stringTable); char* stringPtr = stringTable; @@ -299,64 +249,113 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable.Insert(y + minIndex, &dataTable[offset]); uint32 fieldOffset = 0; uint32 stringFieldOffset = 0; - for (uint32 x = 0; x < (fieldCount + (format[0] == FT_SORT ? 1 : 0)); x++) + + if (!meta->HasIndexFieldInData()) + { + *((uint32*)(&dataTable[offset])) = y + minIndex; + offset += 4; + } + + for (uint32 x = 0; x < fieldCount; ++x) { - switch (format[x]) + uint16 fieldBytes = 4 - fields[x].UnusedBits / 8; + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - *((float*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 4; - fieldOffset += 4; - break; - case FT_IND: - case FT_INT: - *((uint32*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 4; - fieldOffset += 4; - break; - case FT_BYTE: - *((uint8*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 1; - fieldOffset += 1; - break; - case FT_LONG: - *((uint64*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 8; - fieldOffset += 8; - break; - case FT_SHORT: - *((uint16*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 2; - fieldOffset += 2; - break; - case FT_STRING: - { - LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); - *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); - (*slot)->Str[locale] = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - stringFieldOffset += stringHolderSize; - offset += sizeof(LocalizedString*); - break; - } - case FT_STRING_NOT_LOCALIZED: + switch (meta->Types[x]) { - char const*** slot = (char const***)(&dataTable[offset]); - *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); - **slot = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - ++stringFieldOffset; - offset += sizeof(char*); - break; + case FT_FLOAT: + { + float val = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + EndianConvert(val); + *((float*)(&dataTable[offset])) = val; + offset += 4; + fieldOffset += 4; + break; + } + case FT_INT: + { + ASSERT(fieldBytes && fieldBytes <= 4); + uint32 val; + switch (fieldBytes) + { + case 1: + val = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + break; + case 2: + { + uint16 val16 = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + EndianConvert(val16); + val = val16; + break; + } + case 3: + { +#pragma pack(push, 1) + struct dbcint24 { uint8 v[3]; }; +#pragma pack(pop) + dbcint24 i24v = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + EndianConvert(i24v); + val = uint32(i24v.v[0]) | (uint32(i24v.v[1]) << 8) | (uint32(i24v.v[2]) << 16); + break; + } + case 4: + val = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + EndianConvert(val); + break; + default: + break; + } + *((uint32*)(&dataTable[offset])) = val; + offset += 4; + fieldOffset += fieldBytes; + break; + } + case FT_BYTE: + { + ASSERT(fieldBytes == 1); + *((uint8*)(&dataTable[offset])) = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 1; + fieldOffset += 1; + break; + } + case FT_SHORT: + { + ASSERT(fieldBytes == 2); + uint16 val = *reinterpret_cast(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + EndianConvert(val); + *((uint16*)(&dataTable[offset])) = val; + offset += 2; + fieldOffset += 2; + break; + } + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); + *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + (*slot)->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + stringFieldOffset += sizeof(LocalizedString); + offset += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const*** slot = (char const***)(&dataTable[offset]); + *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + **slot = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + stringFieldOffset += sizeof(char*); + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + break; } - case FT_SORT: - *((uint32*)(&dataTable[offset])) = y + minIndex; - offset += 4; - break; } } @@ -366,9 +365,9 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& return dataTable; } -char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) +char* DB2SparseFileLoader::AutoProduceStrings(char* dataTable, uint32 locale) { - if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) + if (meta->FieldCount != fieldCount) return nullptr; if (!(localeMask & (1 << locale))) @@ -394,10 +393,10 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl if (offsets[i].FileOffset && offsets[i].RecordSize) ++records; - uint32 recordsize = GetFormatRecordSize(format); - std::size_t stringFields = GetFormatLocalizedStringFieldCount(format); - char* stringTable = new char[offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))]; - memset(stringTable, 0, offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))); + uint32 recordsize = meta->GetRecordSize(); + std::size_t stringFields = meta->GetStringFieldCount(true); + char* stringTable = new char[offsetsPos - dataStart - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; + memset(stringTable, 0, offsetsPos - dataStart - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); char* stringPtr = stringTable; uint32 offset = 0; @@ -407,44 +406,51 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl if (!offsets[y].FileOffset || !offsets[y].RecordSize) continue; + if (!meta->HasIndexFieldInData()) + offset += 4; + uint32 fieldOffset = 0; - for (uint32 x = 0; x < fieldCount; x++) + for (uint32 x = 0; x < fieldCount; ++x) { - switch (format[x]) + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - case FT_IND: - case FT_INT: - offset += 4; - fieldOffset += 4; - break; - case FT_BYTE: - offset += 1; - fieldOffset += 1; - break; - case FT_LONG: - offset += 8; - fieldOffset += 8; - break; - case FT_SHORT: - offset += 2; - fieldOffset += 2; - break; - case FT_STRING: - { - LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); - db2str->Str[locale] = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: + switch (meta->Types[x]) { - fieldOffset += strlen((char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]) + 1; - offset += sizeof(char*); - break; + case FT_FLOAT: + offset += 4; + fieldOffset += 4; + break; + case FT_INT: + offset += 4; + fieldOffset += 4 - fields[x].UnusedBits / 8; + break; + case FT_BYTE: + offset += 1; + fieldOffset += 1; + break; + case FT_SHORT: + offset += 2; + fieldOffset += 2; + break; + case FT_STRING: + { + LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); + db2str->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + fieldOffset += strlen((char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]) + 1; + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + break; } } } @@ -453,27 +459,26 @@ char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTabl return stringTable; } -char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool) +char* DB2SparseDatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool) { // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); if (!result) return nullptr; - uint32 const fieldCount = strlen(format); - if (fieldCount != result->GetFieldCount()) + if (_meta->GetDbFieldCount() != result->GetFieldCount()) return nullptr; // get struct size and index pos - uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); + uint32 indexField = _meta->GetDbIndexField(); + uint32 recordSize = _meta->GetRecordSize(); // we store flat holders pool as single memory block - std::size_t stringFields = DB2SparseFileLoader::GetFormatStringFieldCount(format); - std::size_t localizedStringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + std::size_t stringFields = _meta->GetStringFieldCount(false); + std::size_t localizedStringFields = _meta->GetStringFieldCount(true); // each string field at load have array of string for each locale - std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; - std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); char* stringHolders = nullptr; if (stringFields) @@ -498,7 +503,7 @@ char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements uint32 offset = 0; uint32 stringFieldOffset = 0; - uint32 indexValue = fields[0].GetUInt32(); + uint32 indexValue = fields[indexField].GetUInt32(); // Attempt to overwrite existing data char* dataValue = indexTable.Get(indexValue); @@ -508,60 +513,69 @@ char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements dataValue = &tempDataTable[newRecords++ * recordSize]; } - for (uint32 f = 0; f < fieldCount; f++) + uint32 f = 0; + if (!_meta->HasIndexFieldInData()) + { + *((uint32*)(&dataValue[offset])) = indexValue; + offset += 4; + ++f; + } + + for (uint32 x = 0; x < _meta->FieldCount; ++x) { - switch (format[f]) + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - *((float*)(&dataValue[offset])) = fields[f].GetFloat(); - offset += 4; - break; - case FT_IND: - case FT_INT: - case FT_SORT: - *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); - offset += 4; - break; - case FT_BYTE: - *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); - offset += 1; - break; - case FT_LONG: - *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); - offset += 8; - break; - case FT_SHORT: - *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); - offset += 2; - break; - case FT_STRING: + switch (_meta->Types[x]) { - LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); - *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); - ASSERT(*slot); + case FT_FLOAT: + *((float*)(&dataValue[offset])) = fields[f].GetFloat(); + offset += 4; + break; + case FT_INT: + *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); + offset += 4; + break; + case FT_BYTE: + *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); + offset += 1; + break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); + *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); - // Value in database in main table field must be for enUS locale - if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) - stringPool.push_back(str); + // Value in database in main table field must be for enUS locale + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); - stringFieldOffset += stringHolderSize; - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const** slot = (char const**)(&dataValue[offset]); - *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); - ASSERT(*slot); + stringFieldOffset += sizeof(LocalizedString); + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); - // Value in database in main table field must be for enUS locale - if (char* str = AddString(slot, fields[f].GetString())) - stringPool.push_back(str); + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) + stringPool.push_back(str); - ++stringFieldOffset; - offset += sizeof(char*); - break; + stringFieldOffset += sizeof(char*); + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + break; } + ++f; } } @@ -590,7 +604,7 @@ char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements return dataTable; } -void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool) +void DB2SparseDatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -598,13 +612,12 @@ void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStat if (!result) return; - size_t stringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + size_t stringFields = _meta->GetStringFieldCount(true); if (result->GetFieldCount() != stringFields + 1 /*ID*/) return; - uint32 const fieldCount = strlen(format); - uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); - ASSERT(0 >= 0, "DB2Storage must be indexed to load localized strings"); + uint32 fieldCount = _meta->FieldCount; + uint32 recordSize = _meta->GetRecordSize(); do { @@ -616,36 +629,40 @@ void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStat // Attempt to overwrite existing data if (char* dataValue = indexTable.Get(indexValue)) { - for (uint32 x = 0; x < fieldCount; x++) + if (!_meta->HasIndexFieldInData()) + offset += 4; + + for (uint32 x = 0; x < fieldCount; ++x) { - switch (format[x]) + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - case FT_IND: - case FT_INT: - case FT_SORT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: + switch (_meta->Types[x]) { - // fill only not filled entries - LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); - if (db2str->Str[locale] == nullStr) - if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) - stringPool.push_back(str); - - ++stringFieldNumInRecord; - offset += sizeof(char*); - break; + case FT_FLOAT: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); + if (db2str->Str[locale] == nullStr) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + break; } } } diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.h b/src/server/shared/DataStores/DB2SparseStorageLoader.h index ac75e6b82d5..0936947ea6a 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.h +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h @@ -18,13 +18,13 @@ #ifndef DB2_SPARSE_FILE_LOADER_H #define DB2_SPARSE_FILE_LOADER_H -#include "Define.h" +#include "DB2Meta.h" #include "Utilities/ByteConverter.h" #include "Implementation/HotfixDatabase.h" #include #include -class IndexTable +class TC_SHARED_API IndexTable { public: virtual void Insert(uint32 index, char* data) const = 0; @@ -54,24 +54,22 @@ private: std::unordered_map& _indexTable; }; -class DB2SparseFileLoader +class TC_SHARED_API DB2SparseFileLoader { public: DB2SparseFileLoader(); ~DB2SparseFileLoader(); - bool Load(const char *filename); + bool Load(char const* filename, DB2Meta const* meta); uint32 GetNumRows() const { return recordCount; } uint32 GetCols() const { return fieldCount; } - uint32 GetHash() const { return tableHash; } - uint32 GetBuild() const { return build; } + uint32 GetTableHash() const { return tableHash; } + uint32 GetLayoutHash() const { return layoutHash; } bool IsLoaded() const { return (data != NULL); } - char* AutoProduceData(const char* fmt, IndexTable const& indexTable, uint32 locale, std::vector& stringPool); - char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); - static uint32 GetFormatRecordSize(const char * format); - static uint32 GetFormatStringFieldCount(const char * format); - static uint32 GetFormatLocalizedStringFieldCount(const char * format); + char* AutoProduceData(IndexTable const& indexTable, uint32 locale, std::vector& stringPool); + char* AutoProduceStrings(char* dataTable, uint32 locale); + private: #pragma pack(push, 1) struct OffsetTableEntry @@ -79,9 +77,15 @@ private: uint32 FileOffset; uint16 RecordSize; }; + struct FieldEntry + { + uint16 UnusedBits; + uint16 Offset; + }; #pragma pack(pop) char const* fileName; + DB2Meta const* meta; // WDB2 / WCH2 fields uint32 recordSize; @@ -89,30 +93,31 @@ private: uint32 fieldCount; uint32 offsetsPos; uint32 tableHash; - uint32 build; - uint32 unk1; + uint32 layoutHash; uint32 minIndex; uint32 maxIndex; uint32 localeMask; uint32 copyIdSize; uint32 metaFlags; + FieldEntry* fields; uint32 dataStart; unsigned char* data; OffsetTableEntry* offsets; }; -class DB2SparseDatabaseLoader +class TC_SHARED_API DB2SparseDatabaseLoader { public: - explicit DB2SparseDatabaseLoader(std::string const& storageName) : _storageName(storageName) { } + DB2SparseDatabaseLoader(std::string const& storageName, DB2Meta const* meta) : _storageName(storageName), _meta(meta) { } - char* Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool); - void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool); + char* Load(HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector& stringPool); + void LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector& stringPool); static char* AddString(char const** holder, std::string const& value); private: std::string _storageName; + DB2Meta const* _meta; }; #endif diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index 56a8dbbed65..0f45b75c8d6 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -23,28 +23,28 @@ DB2FileLoader::DB2FileLoader() { fileName = nullptr; + meta = nullptr; recordSize = 0; recordCount = 0; fieldCount = 0; stringSize = 0; tableHash = 0; - build = 0; - unk1 = 0; + layoutHash = 0; minIndex = 0; maxIndex = 0; localeMask = 0; copyIdSize = 0; - fieldsOffset = nullptr; data = nullptr; stringTable = nullptr; idTable = nullptr; idTableSize = 0; copyTable = nullptr; + fields = nullptr; } -bool DB2FileLoader::Load(const char *filename, const char *fmt) +bool DB2FileLoader::Load(char const* filename, DB2Meta const* meta) { if (data) { @@ -57,6 +57,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) return false; fileName = filename; + this->meta = meta; uint32 header; if (fread(&header, 4, 1, f) != 1) // Signature { @@ -66,10 +67,10 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(header); - if (header != 0x34424457) + if (header != 0x35424457) { fclose(f); - return false; //'WDB4' + return false; //'WDB5' } if (fread(&recordCount, 4, 1, f) != 1) // Number of records @@ -112,21 +113,13 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(tableHash); - if (fread(&build, 4, 1, f) != 1) // Build + if (fread(&layoutHash, 4, 1, f) != 1) // Build { fclose(f); return false; } - EndianConvert(build); - - if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 - { - fclose(f); - return false; - } - - EndianConvert(unk1); + EndianConvert(layoutHash); if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { @@ -168,26 +161,17 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(metaFlags); - if (fmt[0] == FT_SORT) + ASSERT((meta->IndexField == -1) || (meta->IndexField == (metaFlags >> 16))); + + fields = new FieldEntry[fieldCount]; + if (fread(fields, fieldCount * sizeof(FieldEntry), 1, f) != 1) { - idTableSize = recordCount * sizeof(uint32); - ++fmt; + fclose(f); + return false; } - fieldsOffset = new uint32[fieldCount]; - fieldsOffset[0] = 0; - for (uint32 i = 1; i < fieldCount; i++) - { - fieldsOffset[i] = fieldsOffset[i - 1]; - if (fmt[i - 1] == FT_BYTE) // byte fields - fieldsOffset[i] += 1; - else if (fmt[i - 1] == FT_LONG) - fieldsOffset[i] += 8; - else if (fmt[i - 1] == FT_SHORT) - fieldsOffset[i] += 2; - else // 4 byte fields (int32/float/strings) - fieldsOffset[i] += 4; - } + if (!meta->HasIndexFieldInData()) + idTableSize = recordCount * sizeof(uint32); data = new unsigned char[recordSize * recordCount + stringSize]; stringTable = data + recordSize * recordCount; @@ -227,7 +211,7 @@ DB2FileLoader::~DB2FileLoader() delete[] data; delete[] idTable; delete[] copyTable; - delete[] fieldsOffset; + delete[] fields; } DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) @@ -236,181 +220,98 @@ DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) return Record(*this, data + id * recordSize); } -uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) -{ - uint32 recordsize = 0; - int32 i = -1; - for (uint32 x = 0; format[x]; ++x) - { - switch (format[x]) - { - case FT_FLOAT: - case FT_INT: - recordsize += 4; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: - recordsize += sizeof(char*); - break; - case FT_SORT: - case FT_IND: - i = x; - recordsize += 4; - break; - case FT_BYTE: - recordsize += 1; - break; - case FT_LONG: - recordsize += 8; - break; - case FT_SHORT: - recordsize += 2; - break; - } - } - - if (index_pos) - *index_pos = i; - - return recordsize; -} - -uint32 DB2FileLoader::GetFormatStringFieldCount(const char* format) -{ - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) - ++stringfields; - - return stringfields; -} - -uint32 DB2FileLoader::GetFormatLocalizedStringFieldCount(char const* format) -{ - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING) - ++stringfields; - - return stringfields; -} - -char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable) +char* DB2FileLoader::AutoProduceData(uint32& records, char**& indexTable) { typedef char* ptr; - if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) + if (meta->FieldCount != fieldCount) return NULL; //get struct size and index pos - int32 indexField; - uint32 recordsize = GetFormatRecordSize(format, &indexField); + uint32 indexField = meta->GetIndexField(); + uint32 recordsize = meta->GetRecordSize(); - if (indexField >= 0) + uint32 maxi = 0; + //find max index + if (!idTableSize) { - uint32 maxi = 0; - //find max index - if (!idTableSize) - { - for (uint32 y = 0; y < recordCount; ++y) - { - uint32 ind = getRecord(y).getUInt(indexField); - if (ind > maxi) - maxi = ind; - } - } - else + for (uint32 y = 0; y < recordCount; ++y) { - for (uint32 y = 0; y < recordCount; ++y) - { - uint32 ind = ((uint32*)idTable)[y]; - if (ind > maxi) - maxi = ind; - } + uint32 ind = getRecord(y).getUInt(indexField, 0); + if (ind > maxi) + maxi = ind; } - for (uint32 y = 0; y < copyIdSize; y += 8) + } + else + { + for (uint32 y = 0; y < recordCount; ++y) { - uint32 ind = *((uint32*)(copyTable + y)); + uint32 ind = ((uint32*)idTable)[y]; if (ind > maxi) maxi = ind; } - - ++maxi; - records = maxi; - indexTable = new ptr[maxi]; - memset(indexTable, 0, maxi * sizeof(ptr)); } - else + + for (uint32 y = 0; y < copyIdSize; y += 8) { - ASSERT(!copyIdSize, "Storage %s uses id copy table - must be indexed!", fileName); - records = recordCount; - indexTable = new ptr[recordCount]; + uint32 ind = *((uint32*)(copyTable + y)); + if (ind > maxi) + maxi = ind; } + ++maxi; + records = maxi; + indexTable = new ptr[maxi]; + memset(indexTable, 0, maxi * sizeof(ptr)); + char* dataTable = new char[(recordCount + (copyIdSize / 8)) * recordsize]; uint32 offset = 0; for (uint32 y = 0; y < recordCount; y++) { - uint32 indexVal; - if (indexField >= 0) - indexVal = !idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]; - else - indexVal = y; + uint32 indexVal = meta->HasIndexFieldInData() ? getRecord(y).getUInt(indexField, 0) : ((uint32*)idTable)[y]; indexTable[indexVal] = &dataTable[offset]; - uint32 x = 0; - for (char const* fmt = format; *fmt != '\0'; ++fmt) + if (!meta->HasIndexFieldInData()) { - switch (*fmt) - { - case FT_FLOAT: - *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x++); - offset += 4; - break; - case FT_IND: - case FT_INT: - *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x++); - offset += 4; - break; - case FT_BYTE: - *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x++); - offset += 1; - break; - case FT_LONG: - *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x++); - offset += 8; - break; - case FT_SHORT: - *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x++); - offset += 2; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: - *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings - offset += sizeof(char*); - ++x; - break; - case FT_SORT: - *((uint32*)(&dataTable[offset])) = indexVal; - offset += 4; - break; - } + *((uint32*)(&dataTable[offset])) = indexVal; + offset += 4; } - } - uint32* copyIds = (uint32*)copyTable; - for (uint32 c = 0; c < copyIdSize / 4; c += 2) - { - uint32 to = copyIds[c]; - uint32 from = copyIds[c + 1]; - - if (from && from < records && indexTable[from]) + Record rec = getRecord(y); + for (uint32 x = 0; x < fieldCount; ++x) { - indexTable[to] = &dataTable[offset]; - memcpy(indexTable[to], indexTable[from], recordsize); - offset += recordsize; + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + { + switch (meta->Types[x]) + { + case FT_FLOAT: + *((float*)(&dataTable[offset])) = rec.getFloat(x, z); + offset += 4; + break; + case FT_INT: + *((uint32*)(&dataTable[offset])) = rec.getUInt(x, z); + offset += 4; + break; + case FT_BYTE: + *((uint8*)(&dataTable[offset])) = rec.getUInt8(x, z); + offset += 1; + break; + case FT_SHORT: + *((uint16*)(&dataTable[offset])) = rec.getUInt16(x, z); + offset += 2; + break; + case FT_STRING: + case FT_STRING_NOT_LOCALIZED: + *((char**)(&dataTable[offset])) = nullptr; // will be replaced by non-empty or "" strings in AutoProduceStrings + offset += sizeof(char*); + break; + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + break; + } + } } } @@ -419,21 +320,20 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** static char const* const nullStr = ""; -char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* dataTable) +char* DB2FileLoader::AutoProduceStringsArrayHolders(char* dataTable) { - if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) + if (meta->FieldCount != fieldCount) return nullptr; // we store flat holders pool as single memory block - std::size_t stringFields = GetFormatStringFieldCount(format); + std::size_t stringFields = meta->GetStringFieldCount(false); if (!stringFields) return nullptr; - std::size_t localizedStringFields = GetFormatLocalizedStringFieldCount(format); + std::size_t localizedStringFields = meta->GetStringFieldCount(true); // each string field at load have array of string for each locale - std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; - std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * recordCount; char* stringHoldersPool = new char[stringHoldersPoolSize]; @@ -449,41 +349,43 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da { uint32 stringFieldOffset = 0; - for (char const* fmt = format; *fmt != '\0'; ++fmt) + if (!meta->HasIndexFieldInData()) + offset += 4; + + for (uint32 x = 0; x < fieldCount; ++x) { - switch (*fmt) + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - case FT_IND: - case FT_INT: - case FT_SORT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: + switch (meta->Types[x]) { - // init db2 string field slots by pointers to string holders - char const*** slot = (char const***)(&dataTable[offset]); - *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); - if (*fmt == FT_STRING) - stringFieldOffset += stringHolderSize; - else - ++stringFieldOffset; - - offset += sizeof(char*); - break; + case FT_FLOAT: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + case FT_STRING_NOT_LOCALIZED: + { + // init db2 string field slots by pointers to string holders + char const*** slot = (char const***)(&dataTable[offset]); + *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); + if (meta->Types[x] == FT_STRING) + stringFieldOffset += sizeof(LocalizedString); + else + stringFieldOffset += sizeof(char*); + + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + break; } - default: - ASSERT(false, "unknown format character %c", *fmt); } } } @@ -492,9 +394,9 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da return stringHoldersPool; } -char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) +char* DB2FileLoader::AutoProduceStrings(char* dataTable, uint32 locale) { - if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) + if (meta->FieldCount != fieldCount) return nullptr; if (!(localeMask & (1 << locale))) @@ -521,86 +423,110 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin for (uint32 y = 0; y < recordCount; y++) { - uint32 x = 0; - for (char const* fmt = format; *fmt != '\0'; ++fmt) + if (!meta->HasIndexFieldInData()) + offset += 4; + + for (uint32 x = 0; x < fieldCount; ++x) { - switch (*fmt) + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - case FT_IND: - case FT_INT: - case FT_SORT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: + switch (meta->Types[x]) { - // fill only not filled entries - LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); - if (db2str->Str[locale] == nullStr) + case FT_FLOAT: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: { - char const* st = getRecord(y).getString(x); - db2str->Str[locale] = stringPool + (st - (char const*)stringTable); - } + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); + if (db2str->Str[locale] == nullStr) + { + char const* st = getRecord(y).getString(x, z); + db2str->Str[locale] = stringPool + (st - (char const*)stringTable); + } - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char** db2str = (char**)(&dataTable[offset]); - char const* st = getRecord(y).getString(x); - *db2str = stringPool + (st - (char const*)stringTable); - offset += sizeof(char*); - break; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char** db2str = (char**)(&dataTable[offset]); + char const* st = getRecord(y).getString(x, z); + *db2str = stringPool + (st - (char const*)stringTable); + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + break; } } - - if (*fmt != FT_SORT) - ++x; } } return stringPool; } -char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool) +void DB2FileLoader::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) +{ + uint32 recordsize = meta->GetRecordSize(); + uint32 offset = recordCount * recordsize; + uint32* copyIds = (uint32*)copyTable; + for (uint32 c = 0; c < copyIdSize / 4; c += 2) + { + uint32 to = copyIds[c]; + uint32 from = copyIds[c + 1]; + + if (from && from < records && indexTable[from]) + { + indexTable[to] = &dataTable[offset]; + memcpy(indexTable[to], indexTable[from], recordsize); + + if (meta->HasIndexFieldInData()) + *((uint32*)(&dataTable[offset + fields[meta->GetIndexField()].Offset])) = to; + else + *((uint32*)(&dataTable[offset])) = to; + + offset += recordsize; + } + } +} + +char* DB2DatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool) { // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); if (!result) return nullptr; - uint32 const fieldCount = strlen(format); - if (fieldCount != result->GetFieldCount()) + if (_meta->GetDbFieldCount() != result->GetFieldCount()) return nullptr; // get struct size and index pos - int32 indexField; - uint32 recordSize = DB2FileLoader::GetFormatRecordSize(format, &indexField); + uint32 indexField = _meta->GetDbIndexField(); + uint32 recordSize = _meta->GetRecordSize(); // we store flat holders pool as single memory block - size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format); + std::size_t stringFields = _meta->GetStringFieldCount(false); + std::size_t localizedStringFields = _meta->GetStringFieldCount(true); // each string field at load have array of string for each locale - size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; - size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); if (stringFields) { - size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); stringHolders = new char[stringHoldersPoolSize]; // DB2 strings expected to have at least empty string - for (size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) ((char const**)stringHolders)[i] = nullStr; } else @@ -608,15 +534,9 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa // Resize index table // database query *MUST* contain ORDER BY `index_field` DESC clause - uint32 indexTableSize; - if (indexField >= 0) - { - indexTableSize = (*result)[indexField].GetUInt32() + 1; - if (indexTableSize < records) - indexTableSize = records; - } - else - indexTableSize = records + result->GetRowCount(); + uint32 indexTableSize = (*result)[indexField].GetUInt32() + 1; + if (indexTableSize < records) + indexTableSize = records; if (indexTableSize > records) { @@ -636,13 +556,9 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa { Field* fields = result->Fetch(); uint32 offset = 0; - uint32 stringFieldNumInRecord = 0; + uint32 stringFieldOffset = 0; - uint32 indexValue; - if (indexField >= 0) - indexValue = fields[indexField].GetUInt32(); - else - indexValue = records + rec; + uint32 indexValue = fields[indexField].GetUInt32(); // Attempt to overwrite existing data char* dataValue = indexTable[indexValue]; @@ -652,63 +568,69 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa dataValue = &tempDataTable[newRecords++ * recordSize]; } - for (uint32 f = 0; f < fieldCount; f++) + uint32 f = 0; + if (!_meta->HasIndexFieldInData()) + { + *((uint32*)(&dataValue[offset])) = indexValue; + offset += 4; + ++f; + } + + for (uint32 x = 0; x < _meta->FieldCount; ++x) { - switch (format[f]) + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - *((float*)(&dataValue[offset])) = fields[f].GetFloat(); - offset += 4; - break; - case FT_IND: - case FT_INT: - *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); - offset += 4; - break; - case FT_BYTE: - *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); - offset += 1; - break; - case FT_LONG: - *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); - offset += 8; - break; - case FT_SHORT: - *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); - offset += 2; - break; - case FT_STRING: + switch (_meta->Types[x]) { - LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); - *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringHolderSize * stringFieldNumInRecord]); - ASSERT(*slot); + case FT_FLOAT: + *((float*)(&dataValue[offset])) = fields[f].GetFloat(); + offset += 4; + break; + case FT_INT: + *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); + offset += 4; + break; + case FT_BYTE: + *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); + offset += 1; + break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); + *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); - // Value in database in main table field must be for enUS locale - if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) - stringPool.push_back(str); + // Value in database in main table field must be for enUS locale + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); - ++stringFieldNumInRecord; - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const** slot = (char const**)(&dataValue[offset]); - *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringHolderSize * stringFieldNumInRecord]); - ASSERT(*slot); + stringFieldOffset += sizeof(LocalizedString); + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); - // Value in database in main table field must be for enUS locale - if (char* str = AddString(slot, fields[f].GetString())) - stringPool.push_back(str); + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) + stringPool.push_back(str); - ++stringFieldNumInRecord; - offset += sizeof(char*); - break; + stringFieldOffset += sizeof(char*); + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + break; } - case FT_SORT: - *((int32*)(&dataValue[offset])) = indexValue; - offset += 4; - break; + ++f; } } @@ -739,7 +661,7 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa return dataTable; } -void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector& stringPool) +void DB2DatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -747,14 +669,12 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements if (!result) return; - size_t stringFields = DB2FileLoader::GetFormatLocalizedStringFieldCount(format); + std::size_t stringFields = _meta->GetStringFieldCount(true); if (result->GetFieldCount() != stringFields + 1 /*ID*/) return; - uint32 const fieldCount = strlen(format); - int32 indexField; - uint32 recordSize = DB2FileLoader::GetFormatRecordSize(format, &indexField); - ASSERT(indexField >= 0, "DB2Storage must be indexed to load localized strings"); + uint32 fieldCount = _meta->FieldCount; + uint32 recordSize = _meta->GetRecordSize(); do { @@ -763,39 +683,49 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements uint32 stringFieldNumInRecord = 0; uint32 indexValue = fields[0].GetUInt32(); + if (indexValue >= records) + continue; + // Attempt to overwrite existing data if (char* dataValue = indexTable[indexValue]) { - for (uint32 x = 0; x < fieldCount; x++) + if (!_meta->HasIndexFieldInData()) + offset += 4; + + for (uint32 x = 0; x < fieldCount; ++x) { - switch (format[x]) + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) { - case FT_FLOAT: - case FT_IND: - case FT_INT: - case FT_SORT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: + switch (_meta->Types[x]) { - // fill only not filled entries - LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); - if (db2str->Str[locale] == nullStr) - if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) - stringPool.push_back(str); - - ++stringFieldNumInRecord; - offset += sizeof(char*); - break; + case FT_FLOAT: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); + if (db2str->Str[locale] == nullStr) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + offset += sizeof(char*); + break; + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + break; } } } @@ -803,7 +733,7 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements ASSERT(offset == recordSize); } else - TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u!", _storageName.c_str(), indexValue); + TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u locale %s!", _storageName.c_str(), indexValue, localeNames[locale]); } while (result->NextRow()); diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index c84f38b74b9..b302a1afe7d 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -18,10 +18,10 @@ #ifndef DB2_FILE_LOADER_H #define DB2_FILE_LOADER_H -#include "Define.h" +#include "DB2Meta.h" #include "Utilities/ByteConverter.h" #include "Implementation/HotfixDatabase.h" -#include +#include "Errors.h" #include class TC_SHARED_API DB2FileLoader @@ -30,53 +30,101 @@ class TC_SHARED_API DB2FileLoader DB2FileLoader(); ~DB2FileLoader(); - bool Load(const char *filename, const char *fmt); + bool Load(char const* filename, DB2Meta const* meta); class Record { public: - float getFloat(size_t field) const + float getFloat(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - float val = *reinterpret_cast(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + float val = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(float)); EndianConvert(val); return val; } - uint32 getUInt(size_t field) const - { - assert(field < file.fieldCount); - uint32 val = *reinterpret_cast(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - uint8 getUInt8(size_t field) const + + uint32 getUInt(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - return *reinterpret_cast(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + return GetVarInt(field, GetByteSize(field), arrayIndex); } - uint64 getUInt64(size_t field) const + + uint8 getUInt8(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - uint64 val = *reinterpret_cast(offset + file.GetOffset(field)); - EndianConvert(val); - return val; + ASSERT(field < file.fieldCount); + ASSERT(GetByteSize(field) == 1); + return *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); } - uint16 getUInt16(size_t field) const + + uint16 getUInt16(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - uint16 val = *reinterpret_cast(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + ASSERT(GetByteSize(field) == 2); + uint16 val = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint16)); EndianConvert(val); return val; } - const char *getString(size_t field) const + + char const* getString(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - size_t stringOffset = getUInt(field); - assert(stringOffset < file.stringSize); + ASSERT(field < file.fieldCount); + uint32 stringOffset = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); + EndianConvert(stringOffset); + ASSERT(stringOffset < file.stringSize); return reinterpret_cast(file.stringTable + stringOffset); } private: + uint16 GetOffset(uint32 field) const + { + ASSERT(field < file.fieldCount); + return file.fields[field].Offset; + } + + uint16 GetByteSize(uint32 field) const + { + ASSERT(field < file.fieldCount); + return 4 - file.fields[field].UnusedBits / 8; + } + + uint32 GetVarInt(uint32 field, uint16 size, uint32 arrayIndex) const + { + ASSERT(field < file.fieldCount); + switch (size) + { + case 1: + { + return *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); + } + case 2: + { + uint16 val = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint16)); + EndianConvert(val); + return val; + } + case 3: + { +#pragma pack(push, 1) + struct dbcint24 { uint8 v[3]; }; +#pragma pack(pop) + dbcint24 val = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(dbcint24)); + EndianConvert(val); + return uint32(val.v[0]) | (uint32(val.v[1]) << 8) | (uint32(val.v[2]) << 16); + } + case 4: + { + uint32 val = *reinterpret_cast(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); + EndianConvert(val); + return val; + } + default: + break; + } + + ASSERT(false, "GetByteSize(field) < 4"); + return 0; + } + Record(DB2FileLoader &file_, unsigned char *offset_): offset(offset_), file(file_) {} unsigned char *offset; DB2FileLoader &file; @@ -86,22 +134,28 @@ class TC_SHARED_API DB2FileLoader // Get record by id Record getRecord(size_t id); - /// Get begin iterator over records uint32 GetNumRows() const { return recordCount;} uint32 GetCols() const { return fieldCount; } - uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; } - uint32 GetHash() const { return tableHash; } - uint32 GetBuild() const { return build; } + uint32 GetTableHash() const { return tableHash; } + uint32 GetLayoutHash() const { return layoutHash; } bool IsLoaded() const { return (data != NULL); } - char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable); - char* AutoProduceStringsArrayHolders(const char* fmt, char* dataTable); - char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); - static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL); - static uint32 GetFormatStringFieldCount(const char * format); - static uint32 GetFormatLocalizedStringFieldCount(const char * format); + char* AutoProduceData(uint32& count, char**& indexTable); + char* AutoProduceStringsArrayHolders(char* dataTable); + char* AutoProduceStrings(char* dataTable, uint32 locale); + void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable); + private: +#pragma pack(push, 1) + struct FieldEntry + { + uint16 UnusedBits; + uint16 Offset; + }; +#pragma pack(pop) + char const* fileName; + DB2Meta const* meta; // WDB2 / WCH2 fields uint32 recordSize; @@ -109,33 +163,33 @@ private: uint32 fieldCount; uint32 stringSize; uint32 tableHash; - uint32 build; - uint32 unk1; + uint32 layoutHash; uint32 minIndex; uint32 maxIndex; uint32 localeMask; uint32 copyIdSize; uint32 metaFlags; - uint32 *fieldsOffset; unsigned char* data; unsigned char* stringTable; unsigned char* idTable; uint32 idTableSize; unsigned char* copyTable; + FieldEntry* fields; }; class TC_SHARED_API DB2DatabaseLoader { public: - explicit DB2DatabaseLoader(std::string const& storageName) : _storageName(storageName) { } + DB2DatabaseLoader(std::string const& storageName, DB2Meta const* meta) : _storageName(storageName), _meta(meta) { } - char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool); - void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector& stringPool); + char* Load(HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector& stringPool); + void LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector& stringPool); static char* AddString(char const** holder, std::string const& value); private: std::string _storageName; + DB2Meta const* _meta; }; #endif diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index e1c05cfbbe7..e673b8a6a97 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -28,8 +28,8 @@ class DB2StorageBase { public: - DB2StorageBase(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : _tableHash(0), _build(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } + DB2StorageBase(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) + : _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _meta(meta), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } virtual ~DB2StorageBase() { @@ -39,9 +39,9 @@ public: delete[] strings; } - uint32 GetHash() const { return _tableHash; } + uint32 GetTableHash() const { return _tableHash; } - uint32 GetBuild() const { return _build; } + uint32 GetLayoutHash() const { return _layoutHash; } virtual bool HasRecord(uint32 id) const = 0; @@ -53,7 +53,7 @@ public: uint32 GetFieldCount() const { return _fieldCount; } - char const* GetFormat() const { return _format; } + DB2Meta const* GetMeta() const { return _meta; } virtual bool Load(std::string const& path, uint32 locale) = 0; virtual bool LoadStringsFrom(std::string const& path, uint32 locale) = 0; @@ -63,63 +63,67 @@ public: protected: void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const { - std::size_t fields = strlen(_format); - for (uint32 i = 0; i < fields; ++i) + if (!_meta->HasIndexFieldInData()) + entry += 4; + + for (uint32 i = 0; i < _meta->FieldCount; ++i) { - switch (_format[i]) + for (uint32 a = 0; a < _meta->ArraySizes[i]; ++a) { - case FT_IND: - case FT_INT: - buffer << *(uint32*)entry; - entry += 4; - break; - case FT_FLOAT: - buffer << *(float*)entry; - entry += 4; - break; - case FT_BYTE: - buffer << *(uint8*)entry; - entry += 1; - break; - case FT_STRING: + switch (_meta->Types[i]) { - LocalizedString* locStr = *(LocalizedString**)entry; - if (locStr->Str[locale][0] == '\0') - locale = 0; - - char const* str = locStr->Str[locale]; - std::size_t len = strlen(str); - buffer << uint16(len ? len + 1 : 0); - if (len) + case FT_INT: + buffer << *(uint32*)entry; + entry += 4; + break; + case FT_FLOAT: + buffer << *(float*)entry; + entry += 4; + break; + case FT_BYTE: + buffer << *(uint8*)entry; + entry += 1; + break; + case FT_STRING: { - buffer.append(str, len); - buffer << uint8(0); + LocalizedString* locStr = *(LocalizedString**)entry; + if (locStr->Str[locale][0] == '\0') + locale = 0; + + char const* str = locStr->Str[locale]; + std::size_t len = strlen(str); + buffer << uint16(len ? len + 1 : 0); + if (len) + { + buffer.append(str, len); + buffer << uint8(0); + } + entry += sizeof(LocalizedString*); + break; } - entry += sizeof(LocalizedString*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const* str = *(char const**)entry; - std::size_t len = strlen(str); - buffer << uint16(len ? len + 1 : 0); - if (len) + case FT_STRING_NOT_LOCALIZED: { - buffer.append(str, len); - buffer << uint8(0); + char const* str = *(char const**)entry; + std::size_t len = strlen(str); + buffer << uint16(len ? len + 1 : 0); + if (len) + { + buffer.append(str, len); + buffer << uint8(0); + } + entry += sizeof(char const*); + break; } - entry += sizeof(char const*); - break; } } } } uint32 _tableHash; - uint32 _build; + uint32 _layoutHash; std::string _fileName; uint32 _fieldCount; - char const* _format; + DB2Meta const* _meta; char* _dataTable; char* _dataTableEx; std::vector _stringPool; @@ -134,7 +138,7 @@ class DB2Storage : public DB2StorageBase public: typedef DBStorageIterator iterator; - DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, format, preparedStmtIndex), + DB2Storage(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, meta, preparedStmtIndex), _indexTableSize(0) { _indexTable.AsT = NULL; @@ -161,26 +165,28 @@ public: { DB2FileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), _format)) + if (!db2.Load((path + _fileName).c_str(), _meta)) return false; _fieldCount = db2.GetCols(); - _tableHash = db2.GetHash(); - _build = db2.GetBuild(); + _tableHash = db2.GetTableHash(); + _layoutHash = db2.GetLayoutHash(); // load raw non-string data - _dataTable = db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar); + _dataTable = db2.AutoProduceData(_indexTableSize, _indexTable.AsChar); // create string holders for loaded string fields - if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_format, _dataTable)) + if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_dataTable)) { _stringPool.push_back(stringHolders); // load strings from db2 data - if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) _stringPool.push_back(stringBlock); } + db2.AutoProduceRecordCopies(_indexTableSize, _indexTable.AsChar, _dataTable); + // error in db2 file at loading if NULL return _indexTable.AsT != NULL; } @@ -193,12 +199,12 @@ public: DB2FileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), _format)) + if (!db2.Load((path + _fileName).c_str(), _meta)) return false; // load strings from another locale db2 data - if (DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) - if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + if (_meta->GetStringFieldCount(true)) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) _stringPool.push_back(stringBlock); return true; } @@ -206,17 +212,17 @@ public: void LoadFromDB() override { char* extraStringHolders = nullptr; - _dataTableEx = DB2DatabaseLoader(_fileName).Load(_format, _hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); + _dataTableEx = DB2DatabaseLoader(_fileName, _meta).Load(_hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); if (extraStringHolders) _stringPool.push_back(extraStringHolders); } void LoadStringsFromDB(uint32 locale) override { - if (!DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) + if (!_meta->GetStringFieldCount(true)) return; - DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPool); + DB2DatabaseLoader(_fileName, _meta).LoadStrings(HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTableSize, _indexTable.AsChar, _stringPool); } iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } @@ -249,8 +255,8 @@ public: T const* operator*() const { return Base::operator*().second; } } iterator; - DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : DB2StorageBase(fileName, format, preparedStmtIndex) + DB2SparseStorage(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) + : DB2StorageBase(fileName, meta, preparedStmtIndex) { } @@ -282,15 +288,15 @@ public: { DB2SparseFileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str())) + if (!db2.Load((path + _fileName).c_str(), _meta)) return false; _fieldCount = db2.GetCols(); - _tableHash = db2.GetHash(); - _build = db2.GetBuild(); + _tableHash = db2.GetTableHash(); + _layoutHash = db2.GetLayoutHash(); // load raw non-string data - _dataTable = db2.AutoProduceData(_format, IndexTableAdapter(_indexTable), locale, _stringPool); + _dataTable = db2.AutoProduceData(IndexTableAdapter(_indexTable), locale, _stringPool); // error in db2 file at loading if NULL return !_indexTable.empty(); @@ -304,27 +310,27 @@ public: DB2SparseFileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str())) + if (!db2.Load((path + _fileName).c_str(), _meta)) return false; // load strings from another locale db2 data - if (DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) - if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + if (_meta->GetStringFieldCount(true)) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) _stringPool.push_back(stringBlock); return true; } void LoadFromDB() override { - _dataTableEx = DB2SparseDatabaseLoader(_fileName).Load(_format, _hotfixStatement, IndexTableAdapter(_indexTable), _stringPool); + _dataTableEx = DB2SparseDatabaseLoader(_fileName, _meta).Load(_hotfixStatement, IndexTableAdapter(_indexTable), _stringPool); } void LoadStringsFromDB(uint32 locale) override { - if (!DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) + if (!_meta->GetStringFieldCount(true)) return; - DB2SparseDatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter(_indexTable), _stringPool); + DB2SparseDatabaseLoader(_fileName, _meta).LoadStrings(HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter(_indexTable), _stringPool); } iterator begin() const { return iterator(_indexTable.begin()); } diff --git a/src/tools/connection_patcher/Patterns/Windows.hpp b/src/tools/connection_patcher/Patterns/Windows.hpp index 5b2de204a7b..239d2a19b36 100644 --- a/src/tools/connection_patcher/Patterns/Windows.hpp +++ b/src/tools/connection_patcher/Patterns/Windows.hpp @@ -29,8 +29,8 @@ namespace Connection_Patcher { struct x86 { - static const std::vector CertBundleCASCLocalFile() { return{ 0x6A, 0x00, 0x8D, 0x45, 0xFC, 0x50, 0x8D, 0x45, 0xF8, 0x50, 0x68 }; } - static const std::vector CertBundleSignatureCheck() { return{ 0x59, 0x59, 0x84, 0xC0, 0x75, 0x08, 0x47, 0x83, 0xFF, 0x02 }; } + static const std::vector CertBundleCASCLocalFile() { return{ 0x6A, 0x00, 0x50, 0x8D, 0x45, 0xF8, 0x50, 0x68 }; } + static const std::vector CertBundleSignatureCheck() { return{ 0x59, 0x59, 0x84, 0xC0, 0x75, 0x08, 0x46, 0x83, 0xFE, 0x02 }; } }; struct x64 -- cgit v1.2.3 From 634ec0061f9358f03aba91dc5411c2d38de94f5c Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 30 May 2016 23:41:08 +0200 Subject: Core/DataStores: Updated db2 to 7.0.3.21796 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_06.sql | 12 + .../Database/Implementation/HotfixDatabase.cpp | 19 +- src/server/game/DataStores/DB2Metadata.h | 1155 ++++++++++---------- src/server/game/DataStores/DB2Stores.h | 2 +- src/server/game/DataStores/DB2Structure.h | 12 +- src/server/shared/DataStores/DB2Meta.cpp | 4 +- src/server/shared/DataStores/DB2Meta.h | 3 +- .../shared/DataStores/DB2SparseStorageLoader.cpp | 6 + src/server/shared/DataStores/DB2StorageLoader.cpp | 6 + 9 files changed, 623 insertions(+), 596 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_06.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_06.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_06.sql new file mode 100644 index 00000000000..bbb0075ac6b --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_06.sql @@ -0,0 +1,12 @@ +ALTER TABLE `lfg_dungeons` ADD `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Description`; + +ALTER TABLE `map` + CHANGE `Flags` `Flags1` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Directory`, + CHANGE `MapType` `Flags2` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Flags1`, + ADD `WindSettingsID` smallint(5) unsigned NOT NULL DEFAULT 0 AFTER `CosmeticParentMapID`; + +ALTER TABLE `player_condition` + CHANGE `Unknown700_1` `Unknown7001` int(10) unsigned NOT NULL DEFAULT 0 AFTER `MaxAvgItemLevel`, + CHANGE `Unknown700_2` `Unknown7002` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Unknown7001`; + +ALTER TABLE `world_map_transforms` ADD `AreaID` smallint(5) unsigned NOT NULL DEFAULT 0 AFTER `MapID`; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 6a7badda678..344b3bd5004 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -484,10 +484,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // LfgDungeons.db2 - PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT Name, Flags, TextureFilename, Description, MaxLevel, TargetLevelMax, MapID, RandomID, " - "ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, TargetLevelMin, DifficultyID, Type, " - "Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, SubType, " - "MentorCharLevel, ID FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT Name, Flags, TextureFilename, Description, PlayerConditionID, MaxLevel, TargetLevelMax, MapID, " + "RandomID, ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, TargetLevelMin, " + "DifficultyID, Type, Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, " + "MinCountDamage, SubType, MentorCharLevel, ID FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH); // Light.db2 @@ -512,9 +512,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); // Map.db2 - PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, MapName, MapDescription0, " - "MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, InstanceType, unk5, " - "ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags1, Flags2, MinimapIconScale, CorpsePosX, CorpsePosY, MapName, MapDescription0, " + "MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, WindSettingsID, " + "InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH); // MapDifficulty.db2 @@ -580,7 +580,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "MinFactionID2, MinFactionID3, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, " "ItemCount3, ItemCount4, LfgLogic, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, CurrencyID2, CurrencyID3, " "CurrencyID4, QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, PhaseGroupID, " - "MinAvgItemLevel, MaxAvgItemLevel, Unknown700_1, Unknown700_2 FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); + "MinAvgItemLevel, MaxAvgItemLevel, Unknown7001, Unknown7002 FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH); // PowerDisplay.db2 @@ -871,7 +871,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() // WorldMapTransforms.db2 PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, " - "RegionOffsetX, RegionOffsetY, RegionScale, MapID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms ORDER BY ID DESC", CONNECTION_SYNCH); + "RegionOffsetX, RegionOffsetY, RegionScale, MapID, AreaID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms" + " ORDER BY ID DESC", CONNECTION_SYNCH); // WorldSafeLocs.db2 PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, LocX, LocY, LocZ, Facing, AreaName, MapID FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH); diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 51dc273e2bc..7bc32ba286e 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -26,7 +26,7 @@ struct AchievementMeta { static char const* types = "ssishhhhhhhbbbi"; static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(14, 15, types, arraySizes); + static DB2Meta instance(14, 15, 0x057D1672, types, arraySizes); return &instance; } }; @@ -37,7 +37,7 @@ struct Achievement_CategoryMeta { static char const* types = "shbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0x5F7AFA62, types, arraySizes); return &instance; } }; @@ -48,7 +48,7 @@ struct AdventureJournalMeta { static char const* types = "sssiisshhhhhhbbbbbbbbb"; static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1 }; - static DB2Meta instance(-1, 22, types, arraySizes); + static DB2Meta instance(-1, 22, 0xA6E97BED, types, arraySizes); return &instance; } }; @@ -59,7 +59,7 @@ struct AdventureMapPOIMeta { static char const* types = "fissbiiiiiiii"; static uint8 const arraySizes[13] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x1BFEDEA5, types, arraySizes); return &instance; } }; @@ -70,7 +70,7 @@ struct AnimKitMeta { static char const* types = "ihh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x2BD42EF8, types, arraySizes); return &instance; } }; @@ -81,7 +81,7 @@ struct AnimKitBoneSetMeta { static char const* types = "sbbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x9A2DD037, types, arraySizes); return &instance; } }; @@ -92,7 +92,7 @@ struct AnimKitBoneSetAliasMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xD2683E5C, types, arraySizes); return &instance; } }; @@ -103,7 +103,7 @@ struct AnimKitConfigMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xAB996914, types, arraySizes); return &instance; } }; @@ -114,7 +114,7 @@ struct AnimKitConfigBoneSetMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC8D4518B, types, arraySizes); return &instance; } }; @@ -125,7 +125,7 @@ struct AnimKitPriorityMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xF32FA71F, types, arraySizes); return &instance; } }; @@ -136,7 +136,7 @@ struct AnimKitSegmentMeta { static char const* types = "iiifihhhbbbbbbbi"; static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 16, types, arraySizes); + static DB2Meta instance(-1, 16, 0x8E562093, types, arraySizes); return &instance; } }; @@ -147,7 +147,7 @@ struct AnimReplacementMeta { static char const* types = "hhhh"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x2E145FA3, types, arraySizes); return &instance; } }; @@ -158,7 +158,7 @@ struct AnimReplacementSetMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xAAFA7852, types, arraySizes); return &instance; } }; @@ -169,7 +169,7 @@ struct AnimationDataMeta { static char const* types = "sihhb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x541FCB2C, types, arraySizes); return &instance; } }; @@ -180,7 +180,7 @@ struct AreaGroupMemberMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x61DEFC72, types, arraySizes); return &instance; } }; @@ -191,7 +191,7 @@ struct AreaPOIMeta { static char const* types = "fsshhhhhhbbbi"; static uint8 const arraySizes[13] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0xF56B4ECA, types, arraySizes); return &instance; } }; @@ -202,7 +202,7 @@ struct AreaPOIStateMeta { static char const* types = "shbbi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x9ACE5A2C, types, arraySizes); return &instance; } }; @@ -213,7 +213,7 @@ struct AreaTableMeta { static char const* types = "iSfshhhhhhhhhhbbbbbbbbi"; static uint8 const arraySizes[23] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 23, types, arraySizes); + static DB2Meta instance(-1, 23, 0xFCC856E3, types, arraySizes); return &instance; } }; @@ -224,7 +224,7 @@ struct AreaTriggerMeta { static char const* types = "ffffffhhhhhbbbi"; static uint8 const arraySizes[15] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(14, 15, types, arraySizes); + static DB2Meta instance(14, 15, 0x33CB66C0, types, arraySizes); return &instance; } }; @@ -235,7 +235,7 @@ struct AreaTriggerActionSetMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x62C25555, types, arraySizes); return &instance; } }; @@ -246,7 +246,7 @@ struct AreaTriggerBoxMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 3 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x5727C7CE, types, arraySizes); return &instance; } }; @@ -257,7 +257,7 @@ struct AreaTriggerCylinderMeta { static char const* types = "fff"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x32D70665, types, arraySizes); return &instance; } }; @@ -268,7 +268,7 @@ struct AreaTriggerSphereMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xF3855A07, types, arraySizes); return &instance; } }; @@ -279,7 +279,7 @@ struct ArmorLocationMeta { static char const* types = "fffff"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x7D19CBE6, types, arraySizes); return &instance; } }; @@ -290,7 +290,7 @@ struct ArtifactMeta { static char const* types = "siiihhbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x0B635E27, types, arraySizes); return &instance; } }; @@ -301,7 +301,7 @@ struct ArtifactAppearanceMeta { static char const* types = "siffihhhbbbbiii"; static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(12, 15, types, arraySizes); + static DB2Meta instance(12, 15, 0x269F6469, types, arraySizes); return &instance; } }; @@ -312,7 +312,7 @@ struct ArtifactAppearanceSetMeta { static char const* types = "sshhbbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0x144B4DF1, types, arraySizes); return &instance; } }; @@ -323,7 +323,7 @@ struct ArtifactCategoryMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x015DF345, types, arraySizes); return &instance; } }; @@ -334,7 +334,7 @@ struct ArtifactPowerMeta { static char const* types = "fbbbii"; static uint8 const arraySizes[6] = { 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(4, 6, types, arraySizes); + static DB2Meta instance(4, 6, 0xDF650D3E, types, arraySizes); return &instance; } }; @@ -345,7 +345,7 @@ struct ArtifactPowerLinkMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x01233BBC, types, arraySizes); return &instance; } }; @@ -356,7 +356,7 @@ struct ArtifactPowerRankMeta { static char const* types = "ifhhb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xB4D8591A, types, arraySizes); return &instance; } }; @@ -367,7 +367,7 @@ struct ArtifactQuestXPMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 10 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x24504CBE, types, arraySizes); return &instance; } }; @@ -378,7 +378,7 @@ struct ArtifactUnlockMeta { static char const* types = "hhbbi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x5F27F07F, types, arraySizes); return &instance; } }; @@ -389,7 +389,7 @@ struct AuctionHouseMeta { static char const* types = "shbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x554432EF, types, arraySizes); return &instance; } }; @@ -400,7 +400,7 @@ struct BankBagSlotPricesMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x10058492, types, arraySizes); return &instance; } }; @@ -411,7 +411,7 @@ struct BannedAddOnsMeta { static char const* types = "SSb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC0BBE91D, types, arraySizes); return &instance; } }; @@ -422,7 +422,7 @@ struct BarberShopStyleMeta { static char const* types = "ssfbbbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0x39C1F86E, types, arraySizes); return &instance; } }; @@ -433,7 +433,7 @@ struct BattlePetAbilityMeta { static char const* types = "isshbbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x5B7B567E, types, arraySizes); return &instance; } }; @@ -444,7 +444,7 @@ struct BattlePetAbilityEffectMeta { static char const* types = "hhhhhbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 6, 1, 1 }; - static DB2Meta instance(6, 7, types, arraySizes); + static DB2Meta instance(6, 7, 0x3273A2ED, types, arraySizes); return &instance; } }; @@ -455,7 +455,7 @@ struct BattlePetAbilityStateMeta { static char const* types = "ihb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xD2BE6D5C, types, arraySizes); return &instance; } }; @@ -466,7 +466,7 @@ struct BattlePetAbilityTurnMeta { static char const* types = "hhbbbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(5, 6, types, arraySizes); + static DB2Meta instance(5, 6, 0x39FDB23F, types, arraySizes); return &instance; } }; @@ -477,7 +477,7 @@ struct BattlePetBreedQualityMeta { static char const* types = "fb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xC3D0125D, types, arraySizes); return &instance; } }; @@ -488,7 +488,7 @@ struct BattlePetBreedStateMeta { static char const* types = "hbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x4AC36A1D, types, arraySizes); return &instance; } }; @@ -499,7 +499,7 @@ struct BattlePetEffectPropertiesMeta { static char const* types = "shb"; static uint8 const arraySizes[3] = { 6, 1, 6 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x891BD229, types, arraySizes); return &instance; } }; @@ -510,7 +510,7 @@ struct BattlePetNPCTeamMemberMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -521,7 +521,7 @@ struct BattlePetSpeciesMeta { static char const* types = "iiisshbbi"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(8, 9, types, arraySizes); + static DB2Meta instance(8, 9, 0xA44A31E4, types, arraySizes); return &instance; } }; @@ -532,7 +532,7 @@ struct BattlePetSpeciesStateMeta { static char const* types = "ihb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x0D345864, types, arraySizes); return &instance; } }; @@ -543,7 +543,7 @@ struct BattlePetSpeciesXAbilityMeta { static char const* types = "hhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x563A7D2A, types, arraySizes); return &instance; } }; @@ -554,7 +554,7 @@ struct BattlePetStateMeta { static char const* types = "shb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xDE5B505E, types, arraySizes); return &instance; } }; @@ -565,7 +565,7 @@ struct BattlePetVisualMeta { static char const* types = "shhhhbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x8DAD67C6, types, arraySizes); return &instance; } }; @@ -576,7 +576,7 @@ struct BattlemasterListMeta { static char const* types = "sishhhbbbbbbbbb"; static uint8 const arraySizes[15] = { 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 15, types, arraySizes); + static DB2Meta instance(-1, 15, 0xF61E6A94, types, arraySizes); return &instance; } }; @@ -587,7 +587,7 @@ struct BoneWindModifierModelMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x784E6052, types, arraySizes); return &instance; } }; @@ -598,7 +598,7 @@ struct BoneWindModifiersMeta { static char const* types = "ff"; static uint8 const arraySizes[2] = { 3, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x305E43BE, types, arraySizes); return &instance; } }; @@ -609,7 +609,7 @@ struct BountyMeta { static char const* types = "ihhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x0478B1B1, types, arraySizes); return &instance; } }; @@ -620,7 +620,7 @@ struct BountySetMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x664666E1, types, arraySizes); return &instance; } }; @@ -631,7 +631,7 @@ struct BroadcastTextMeta { static char const* types = "sshhhbbii"; static uint8 const arraySizes[9] = { 1, 1, 3, 3, 1, 1, 1, 2, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x4B97C103, types, arraySizes); return &instance; } }; @@ -642,7 +642,7 @@ struct CameraEffectMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xA898408A, types, arraySizes); return &instance; } }; @@ -653,7 +653,7 @@ struct CameraEffectEntryMeta { static char const* types = "ffffffffhhbbbbbb"; static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 16, types, arraySizes); + static DB2Meta instance(-1, 16, 0x82BF9A49, types, arraySizes); return &instance; } }; @@ -664,7 +664,7 @@ struct CameraModeMeta { static char const* types = "fffffhbbbbb"; static uint8 const arraySizes[11] = { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x1D6DC577, types, arraySizes); return &instance; } }; @@ -675,7 +675,7 @@ struct CameraShakesMeta { static char const* types = "ffffbbbbi"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x83DE01F4, types, arraySizes); return &instance; } }; @@ -686,7 +686,7 @@ struct CastableRaidBuffsMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x9CAA85E8, types, arraySizes); return &instance; } }; @@ -697,7 +697,7 @@ struct Cfg_CategoriesMeta { static char const* types = "shbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xBAB445D5, types, arraySizes); return &instance; } }; @@ -708,7 +708,7 @@ struct Cfg_ConfigsMeta { static char const* types = "fhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x4622933F, types, arraySizes); return &instance; } }; @@ -719,7 +719,7 @@ struct Cfg_RegionsMeta { static char const* types = "sib"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x63F4A5AD, types, arraySizes); return &instance; } }; @@ -730,7 +730,7 @@ struct CharBaseInfoMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x16E3FA38, types, arraySizes); return &instance; } }; @@ -741,7 +741,7 @@ struct CharBaseSectionMeta { static char const* types = "bbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x6B5EEA0B, types, arraySizes); return &instance; } }; @@ -752,7 +752,7 @@ struct CharComponentTextureLayoutsMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xF1760594, types, arraySizes); return &instance; } }; @@ -763,7 +763,7 @@ struct CharComponentTextureSectionsMeta { static char const* types = "hhhhbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xABDEFA33, types, arraySizes); return &instance; } }; @@ -774,7 +774,7 @@ struct CharHairGeosetsMeta { static char const* types = "ibbbbbbbbi"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xC269B9B2, types, arraySizes); return &instance; } }; @@ -785,7 +785,7 @@ struct CharSectionsMeta { static char const* types = "ihbbbbb"; static uint8 const arraySizes[7] = { 3, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x9B7A7C33, types, arraySizes); return &instance; } }; @@ -796,7 +796,7 @@ struct CharShipmentMeta { static char const* types = "iiiiihbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x268EC200, types, arraySizes); return &instance; } }; @@ -807,7 +807,7 @@ struct CharShipmentContainerMeta { static char const* types = "sshhhhhhbbbbbbbi"; static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 16, types, arraySizes); + static DB2Meta instance(-1, 16, 0x45AF32E1, types, arraySizes); return &instance; } }; @@ -818,7 +818,7 @@ struct CharStartOutfitMeta { static char const* types = "iibbbbb"; static uint8 const arraySizes[7] = { 24, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xB96E2E2C, types, arraySizes); return &instance; } }; @@ -829,7 +829,7 @@ struct CharTitlesMeta { static char const* types = "sshhb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x597835B2, types, arraySizes); return &instance; } }; @@ -840,7 +840,7 @@ struct CharacterFaceBoneSetMeta { static char const* types = "ibbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x87BC82E6, types, arraySizes); return &instance; } }; @@ -851,7 +851,7 @@ struct CharacterFacialHairStylesMeta { static char const* types = "ibbb"; static uint8 const arraySizes[4] = { 5, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xC8DFD1F8, types, arraySizes); return &instance; } }; @@ -862,7 +862,7 @@ struct CharacterLoadoutMeta { static char const* types = "ibb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xEA2447D5, types, arraySizes); return &instance; } }; @@ -873,7 +873,7 @@ struct CharacterLoadoutItemMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x89C0A3E9, types, arraySizes); return &instance; } }; @@ -884,7 +884,7 @@ struct ChatChannelsMeta { static char const* types = "issb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x23043EC6, types, arraySizes); return &instance; } }; @@ -895,7 +895,7 @@ struct ChatProfanityMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x589CBD66, types, arraySizes); return &instance; } }; @@ -906,7 +906,7 @@ struct ChrClassRaceSexMeta { static char const* types = "bbbiii"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x8AAD17A1, types, arraySizes); return &instance; } }; @@ -917,7 +917,7 @@ struct ChrClassTitleMeta { static char const* types = "ssb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xBFB19B72, types, arraySizes); return &instance; } }; @@ -928,7 +928,7 @@ struct ChrClassUIDisplayMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x1AFA49DF, types, arraySizes); return &instance; } }; @@ -939,7 +939,7 @@ struct ChrClassVillainMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x0EFF13C2, types, arraySizes); return &instance; } }; @@ -950,7 +950,7 @@ struct ChrClassesMeta { static char const* types = "SsssSiiihhhbbbbbbbi"; static uint8 const arraySizes[19] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(18, 19, types, arraySizes); + static DB2Meta instance(18, 19, 0xCFEFCD72, types, arraySizes); return &instance; } }; @@ -961,7 +961,7 @@ struct ChrClassesXPowerTypesMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x8BB8B9A3, types, arraySizes); return &instance; } }; @@ -972,7 +972,7 @@ struct ChrRacesMeta { static char const* types = "iSSsssSSiiffihhhhhhhhhhbbbbbbbbbbii"; static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 35, types, arraySizes); + static DB2Meta instance(-1, 35, 0x26E7581C, types, arraySizes); return &instance; } }; @@ -983,7 +983,7 @@ struct ChrSpecializationMeta { static char const* types = "isssshbbbbbiii"; static uint8 const arraySizes[14] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(11, 14, types, arraySizes); + static DB2Meta instance(11, 14, 0xFC72AC38, types, arraySizes); return &instance; } }; @@ -994,7 +994,7 @@ struct ChrUpgradeBucketMeta { static char const* types = "hbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0xB2B4798C, types, arraySizes); return &instance; } }; @@ -1005,7 +1005,7 @@ struct ChrUpgradeBucketSpellMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xD671C191, types, arraySizes); return &instance; } }; @@ -1016,7 +1016,7 @@ struct ChrUpgradeTierMeta { static char const* types = "sbbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0x2ABC2F82, types, arraySizes); return &instance; } }; @@ -1027,7 +1027,7 @@ struct CinematicCameraMeta { static char const* types = "sffh"; static uint8 const arraySizes[4] = { 1, 3, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x97F7A9AD, types, arraySizes); return &instance; } }; @@ -1038,7 +1038,7 @@ struct CinematicSequencesMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 8 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x8CF8A102, types, arraySizes); return &instance; } }; @@ -1049,7 +1049,7 @@ struct CloakDampeningMeta { static char const* types = "fffff"; static uint8 const arraySizes[5] = { 5, 5, 2, 2, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x01CB22C0, types, arraySizes); return &instance; } }; @@ -1060,7 +1060,7 @@ struct CombatConditionMeta { static char const* types = "hhhhhbbbbbb"; static uint8 const arraySizes[11] = { 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x01A085BE, types, arraySizes); return &instance; } }; @@ -1071,7 +1071,7 @@ struct ComponentModelFileDataMeta { static char const* types = "bbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x9174BFE7, types, arraySizes); return &instance; } }; @@ -1082,7 +1082,7 @@ struct ComponentTextureFileDataMeta { static char const* types = "bbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x45CD0227, types, arraySizes); return &instance; } }; @@ -1093,7 +1093,7 @@ struct ConversationLineMeta { static char const* types = "iiihhbbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x39FCD24B, types, arraySizes); return &instance; } }; @@ -1104,7 +1104,7 @@ struct CreatureMeta { static char const* types = "iiifssssbbbb"; static uint8 const arraySizes[12] = { 3, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 12, types, arraySizes); + static DB2Meta instance(-1, 12, 0xAA6999A9, types, arraySizes); return &instance; } }; @@ -1115,7 +1115,7 @@ struct CreatureDifficultyMeta { static char const* types = "iihbbb"; static uint8 const arraySizes[6] = { 1, 7, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x6EF17698, types, arraySizes); return &instance; } }; @@ -1126,7 +1126,7 @@ struct CreatureDispXUiCameraMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x5A17D4B5, types, arraySizes); return &instance; } }; @@ -1137,7 +1137,7 @@ struct CreatureDisplayInfoMeta { static char const* types = "iffiSiiifhhhhhhbbbbbb"; static uint8 const arraySizes[21] = { 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 21, types, arraySizes); + static DB2Meta instance(-1, 21, 0x4E3ED532, types, arraySizes); return &instance; } }; @@ -1148,7 +1148,7 @@ struct CreatureDisplayInfoCondMeta { static char const* types = "iiiibbiiiiiiiii"; static uint8 const arraySizes[15] = { 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; - static DB2Meta instance(-1, 15, types, arraySizes); + static DB2Meta instance(-1, 15, 0x227D7C8A, types, arraySizes); return &instance; } }; @@ -1159,7 +1159,7 @@ struct CreatureDisplayInfoExtraMeta { static char const* types = "iibbbbbbbbbb"; static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1 }; - static DB2Meta instance(-1, 12, types, arraySizes); + static DB2Meta instance(-1, 12, 0x780B4996, types, arraySizes); return &instance; } }; @@ -1170,7 +1170,7 @@ struct CreatureDisplayInfoTrnMeta { static char const* types = "iifh"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xDB9A44C4, types, arraySizes); return &instance; } }; @@ -1181,7 +1181,7 @@ struct CreatureFamilyMeta { static char const* types = "ffsShhbbbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xD3A903B4, types, arraySizes); return &instance; } }; @@ -1192,7 +1192,7 @@ struct CreatureImmunitiesMeta { static char const* types = "ibbbbbiii"; static uint8 const arraySizes[9] = { 2, 1, 1, 1, 1, 1, 1, 8, 16 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x4AFCE8AB, types, arraySizes); return &instance; } }; @@ -1203,7 +1203,7 @@ struct CreatureModelDataMeta { static char const* types = "ffffffffffffffffffiiiiiiiiiiii"; static uint8 const arraySizes[30] = { 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 30, types, arraySizes); + static DB2Meta instance(-1, 30, 0x676B5D95, types, arraySizes); return &instance; } }; @@ -1214,7 +1214,7 @@ struct CreatureMovementInfoMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xF569713B, types, arraySizes); return &instance; } }; @@ -1225,7 +1225,7 @@ struct CreatureSoundDataMeta { static char const* types = "ffbbiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; static uint8 const arraySizes[37] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 37, types, arraySizes); + static DB2Meta instance(-1, 37, 0x386F5FBB, types, arraySizes); return &instance; } }; @@ -1236,7 +1236,7 @@ struct CreatureTypeMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x62B41D78, types, arraySizes); return &instance; } }; @@ -1247,7 +1247,7 @@ struct CriteriaMeta { static char const* types = "iiihhhbbbbb"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x02F8C797, types, arraySizes); return &instance; } }; @@ -1258,7 +1258,7 @@ struct CriteriaTreeMeta { static char const* types = "iishhbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xB46EE452, types, arraySizes); return &instance; } }; @@ -1269,7 +1269,7 @@ struct CriteriaTreeXEffectMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xFA3C1BDE, types, arraySizes); return &instance; } }; @@ -1280,7 +1280,7 @@ struct CurrencyCategoryMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x3948FA3E, types, arraySizes); return &instance; } }; @@ -1291,7 +1291,7 @@ struct CurrencyTypesMeta { static char const* types = "sSiiisbbbi"; static uint8 const arraySizes[10] = { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xDEBE9278, types, arraySizes); return &instance; } }; @@ -1302,7 +1302,7 @@ struct CurveMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xE07382D4, types, arraySizes); return &instance; } }; @@ -1313,7 +1313,7 @@ struct CurvePointMeta { static char const* types = "fhb"; static uint8 const arraySizes[3] = { 2, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xFBC72093, types, arraySizes); return &instance; } }; @@ -1324,7 +1324,7 @@ struct DeathThudLookupsMeta { static char const* types = "bbii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xFD6ACECC, types, arraySizes); return &instance; } }; @@ -1335,7 +1335,7 @@ struct DecalPropertiesMeta { static char const* types = "iffffffffbbiii"; static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 14, types, arraySizes); + static DB2Meta instance(-1, 14, 0xD7E2B520, types, arraySizes); return &instance; } }; @@ -1346,7 +1346,7 @@ struct DeclinedWordMeta { static char const* types = "si"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(1, 2, types, arraySizes); + static DB2Meta instance(1, 2, 0xCA0EA44E, types, arraySizes); return &instance; } }; @@ -1357,7 +1357,7 @@ struct DeclinedWordCasesMeta { static char const* types = "sbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x3DFEB231, types, arraySizes); return &instance; } }; @@ -1368,7 +1368,7 @@ struct DestructibleModelDataMeta { static char const* types = "hhhhhbbbbbbbbbbbbbbbbb"; static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 22, types, arraySizes); + static DB2Meta instance(-1, 22, 0x08773F4F, types, arraySizes); return &instance; } }; @@ -1379,7 +1379,7 @@ struct DeviceBlacklistMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xCC3C554D, types, arraySizes); return &instance; } }; @@ -1390,7 +1390,7 @@ struct DeviceDefaultSettingsMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC0EFD6F4, types, arraySizes); return &instance; } }; @@ -1401,7 +1401,7 @@ struct DifficultyMeta { static char const* types = "sbbbbbbbbbbbb"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x7F62CC40, types, arraySizes); return &instance; } }; @@ -1412,7 +1412,7 @@ struct DissolveEffectMeta { static char const* types = "fffffffbbii"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x4CDA6220, types, arraySizes); return &instance; } }; @@ -1423,7 +1423,7 @@ struct DriverBlacklistMeta { static char const* types = "iihbbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x024A28A5, types, arraySizes); return &instance; } }; @@ -1434,7 +1434,7 @@ struct DungeonEncounterMeta { static char const* types = "sihhbbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x96AD5F03, types, arraySizes); return &instance; } }; @@ -1445,7 +1445,7 @@ struct DungeonMapMeta { static char const* types = "ffhhbbi"; static uint8 const arraySizes[7] = { 2, 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(6, 7, types, arraySizes); + static DB2Meta instance(6, 7, 0x5E653BAE, types, arraySizes); return &instance; } }; @@ -1456,7 +1456,7 @@ struct DungeonMapChunkMeta { static char const* types = "fihhh"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x681635FF, types, arraySizes); return &instance; } }; @@ -1467,7 +1467,7 @@ struct DurabilityCostsMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 21, 8 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x07F62CCA, types, arraySizes); return &instance; } }; @@ -1478,7 +1478,7 @@ struct DurabilityQualityMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x26FFB6E5, types, arraySizes); return &instance; } }; @@ -1489,7 +1489,7 @@ struct EdgeGlowEffectMeta { static char const* types = "fffffffffb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x83E5CA94, types, arraySizes); return &instance; } }; @@ -1500,7 +1500,7 @@ struct EmotesMeta { static char const* types = "Siihbiiii"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xAF8BBDFD, types, arraySizes); return &instance; } }; @@ -1511,7 +1511,7 @@ struct EmotesTextMeta { static char const* types = "sh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x290CA5E0, types, arraySizes); return &instance; } }; @@ -1522,7 +1522,7 @@ struct EmotesTextDataMeta { static char const* types = "shb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x00659303, types, arraySizes); return &instance; } }; @@ -1533,7 +1533,7 @@ struct EmotesTextSoundMeta { static char const* types = "hbbbi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x8729AA2E, types, arraySizes); return &instance; } }; @@ -1544,7 +1544,7 @@ struct EnvironmentalDamageMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xFAB902E4, types, arraySizes); return &instance; } }; @@ -1555,7 +1555,7 @@ struct ExhaustionMeta { static char const* types = "ifffsfsi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0xE3D4EEF5, types, arraySizes); return &instance; } }; @@ -1566,7 +1566,7 @@ struct FactionMeta { static char const* types = "iifssihhhhbbbb"; static uint8 const arraySizes[14] = { 4, 4, 2, 1, 1, 4, 1, 4, 4, 1, 2, 1, 1, 1 }; - static DB2Meta instance(-1, 14, types, arraySizes); + static DB2Meta instance(-1, 14, 0x5807F583, types, arraySizes); return &instance; } }; @@ -1577,7 +1577,7 @@ struct FactionGroupMeta { static char const* types = "ssb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xECF45BCB, types, arraySizes); return &instance; } }; @@ -1588,7 +1588,7 @@ struct FactionTemplateMeta { static char const* types = "hhhhbbb"; static uint8 const arraySizes[7] = { 1, 1, 4, 4, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x433A9F1D, types, arraySizes); return &instance; } }; @@ -1599,7 +1599,7 @@ struct FootprintTexturesMeta { static char const* types = "si"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(1, 2, types, arraySizes); + static DB2Meta instance(1, 2, 0x45942CAD, types, arraySizes); return &instance; } }; @@ -1610,7 +1610,7 @@ struct FootstepTerrainLookupMeta { static char const* types = "hbii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xA482F51E, types, arraySizes); return &instance; } }; @@ -1621,7 +1621,7 @@ struct FriendshipRepReactionMeta { static char const* types = "shb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x873670B3, types, arraySizes); return &instance; } }; @@ -1632,7 +1632,7 @@ struct FriendshipReputationMeta { static char const* types = "ishi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0x83EDDC57, types, arraySizes); return &instance; } }; @@ -1643,7 +1643,7 @@ struct FullScreenEffectMeta { static char const* types = "fffffffffffffffffffiiffffffffffffffbiii"; static uint8 const arraySizes[39] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 39, types, arraySizes); + static DB2Meta instance(-1, 39, 0x3C821CD4, types, arraySizes); return &instance; } }; @@ -1654,7 +1654,7 @@ struct GMSurveyAnswersMeta { static char const* types = "sbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xDA87352E, types, arraySizes); return &instance; } }; @@ -1665,7 +1665,7 @@ struct GMSurveyCurrentSurveyMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x1B969F47, types, arraySizes); return &instance; } }; @@ -1676,7 +1676,7 @@ struct GMSurveyQuestionsMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x729BB194, types, arraySizes); return &instance; } }; @@ -1687,7 +1687,7 @@ struct GMSurveySurveysMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 15 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xE62BB37A, types, arraySizes); return &instance; } }; @@ -1698,7 +1698,7 @@ struct GameObjectArtKitMeta { static char const* types = "ss"; static uint8 const arraySizes[2] = { 3, 4 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x36033AFB, types, arraySizes); return &instance; } }; @@ -1709,7 +1709,7 @@ struct GameObjectDiffAnimMapMeta { static char const* types = "hbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE26ABF27, types, arraySizes); return &instance; } }; @@ -1720,7 +1720,7 @@ struct GameObjectDisplayInfoMeta { static char const* types = "ifffh"; static uint8 const arraySizes[5] = { 1, 6, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xDD4432B9, types, arraySizes); return &instance; } }; @@ -1731,7 +1731,7 @@ struct GameObjectDisplayInfoXSoundKitMeta { static char const* types = "bii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x3D787E0A, types, arraySizes); return &instance; } }; @@ -1742,7 +1742,7 @@ struct GameObjectsMeta { static char const* types = "fffishhhhbbi"; static uint8 const arraySizes[12] = { 3, 4, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(11, 12, types, arraySizes); + static DB2Meta instance(11, 12, 0x1A493E93, types, arraySizes); return &instance; } }; @@ -1753,7 +1753,7 @@ struct GameTipsMeta { static char const* types = "sbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE0D1CAFF, types, arraySizes); return &instance; } }; @@ -1764,7 +1764,7 @@ struct GarrAbilityMeta { static char const* types = "ssihhbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0x4E5A1C8D, types, arraySizes); return &instance; } }; @@ -1775,7 +1775,7 @@ struct GarrAbilityCategoryMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -1786,7 +1786,7 @@ struct GarrAbilityEffectMeta { static char const* types = "fffihbbbbbbi"; static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(11, 12, types, arraySizes); + static DB2Meta instance(11, 12, 0xF0251DA9, types, arraySizes); return &instance; } }; @@ -1797,7 +1797,7 @@ struct GarrBuildingMeta { static char const* types = "iissssihhhhhhhhbbbbbbiii"; static uint8 const arraySizes[24] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 24, types, arraySizes); + static DB2Meta instance(-1, 24, 0xF387E4CE, types, arraySizes); return &instance; } }; @@ -1808,7 +1808,7 @@ struct GarrBuildingDoodadSetMeta { static char const* types = "bbbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xA06217A7, types, arraySizes); return &instance; } }; @@ -1819,7 +1819,7 @@ struct GarrBuildingPlotInstMeta { static char const* types = "fhhbi"; static uint8 const arraySizes[5] = { 2, 1, 1, 1, 1 }; - static DB2Meta instance(4, 5, types, arraySizes); + static DB2Meta instance(4, 5, 0xB4E9CCFF, types, arraySizes); return &instance; } }; @@ -1830,7 +1830,7 @@ struct GarrClassSpecMeta { static char const* types = "ssshbbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0xD5AAD8F5, types, arraySizes); return &instance; } }; @@ -1841,7 +1841,7 @@ struct GarrClassSpecPlayerCondMeta { static char const* types = "isbiii"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x3F748D06, types, arraySizes); return &instance; } }; @@ -1852,7 +1852,7 @@ struct GarrEncounterMeta { static char const* types = "isffihi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(6, 7, types, arraySizes); + static DB2Meta instance(6, 7, 0xE0A164CC, types, arraySizes); return &instance; } }; @@ -1863,7 +1863,7 @@ struct GarrEncounterSetXEncounterMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xC8270155, types, arraySizes); return &instance; } }; @@ -1874,7 +1874,7 @@ struct GarrEncounterXMechanicMeta { static char const* types = "hbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x61A32627, types, arraySizes); return &instance; } }; @@ -1885,7 +1885,7 @@ struct GarrFollItemSetMemberMeta { static char const* types = "ihhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x332DC097, types, arraySizes); return &instance; } }; @@ -1896,7 +1896,7 @@ struct GarrFollSupportSpellMeta { static char const* types = "iibi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x26A653E1, types, arraySizes); return &instance; } }; @@ -1907,7 +1907,7 @@ struct GarrFollowerMeta { static char const* types = "iissiiiihhhhhhbbbbbbbbbbbbbbbbi"; static uint8 const arraySizes[31] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(30, 31, types, arraySizes); + static DB2Meta instance(30, 31, 0x0708BDE8, types, arraySizes); return &instance; } }; @@ -1918,7 +1918,7 @@ struct GarrFollowerLevelXPMeta { static char const* types = "hhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x84E433B2, types, arraySizes); return &instance; } }; @@ -1929,7 +1929,7 @@ struct GarrFollowerQualityMeta { static char const* types = "ihbbbbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xA47EFC96, types, arraySizes); return &instance; } }; @@ -1940,7 +1940,7 @@ struct GarrFollowerSetXFollowerMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xAAC9B70B, types, arraySizes); return &instance; } }; @@ -1951,7 +1951,7 @@ struct GarrFollowerTypeMeta { static char const* types = "hbbbbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x83347E98, types, arraySizes); return &instance; } }; @@ -1962,7 +1962,7 @@ struct GarrFollowerUICreatureMeta { static char const* types = "ifhbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x25A4DCAF, types, arraySizes); return &instance; } }; @@ -1973,7 +1973,7 @@ struct GarrFollowerXAbilityMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x55374D4B, types, arraySizes); return &instance; } }; @@ -1984,7 +1984,7 @@ struct GarrMechanicMeta { static char const* types = "fbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x79C84299, types, arraySizes); return &instance; } }; @@ -1995,7 +1995,7 @@ struct GarrMechanicSetXMechanicMeta { static char const* types = "bii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(1, 3, types, arraySizes); + static DB2Meta instance(1, 3, 0x965A35A3, types, arraySizes); return &instance; } }; @@ -2006,7 +2006,7 @@ struct GarrMechanicTypeMeta { static char const* types = "ssibi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(4, 5, types, arraySizes); + static DB2Meta instance(4, 5, 0x201D5CC7, types, arraySizes); return &instance; } }; @@ -2017,7 +2017,7 @@ struct GarrMissionMeta { static char const* types = "iisssiiffhhhhhhbbbbbbbbbiiiii"; static uint8 const arraySizes[29] = { 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(24, 29, types, arraySizes); + static DB2Meta instance(24, 29, 0x1FFD19BB, types, arraySizes); return &instance; } }; @@ -2028,7 +2028,7 @@ struct GarrMissionTextureMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 2, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x2CFA96FC, types, arraySizes); return &instance; } }; @@ -2039,7 +2039,7 @@ struct GarrMissionTypeMeta { static char const* types = "shh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xCFFD0036, types, arraySizes); return &instance; } }; @@ -2050,7 +2050,7 @@ struct GarrMissionXEncounterMeta { static char const* types = "biiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(1, 5, types, arraySizes); + static DB2Meta instance(1, 5, 0xEDE238C4, types, arraySizes); return &instance; } }; @@ -2061,7 +2061,7 @@ struct GarrMissionXFollowerMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xE2A30EE5, types, arraySizes); return &instance; } }; @@ -2072,7 +2072,7 @@ struct GarrMssnBonusAbilityMeta { static char const* types = "fihbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x28358C8A, types, arraySizes); return &instance; } }; @@ -2083,7 +2083,7 @@ struct GarrPlotMeta { static char const* types = "siibbbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 2 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x4F7D215C, types, arraySizes); return &instance; } }; @@ -2094,7 +2094,7 @@ struct GarrPlotBuildingMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x31EE8F1A, types, arraySizes); return &instance; } }; @@ -2105,7 +2105,7 @@ struct GarrPlotInstanceMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x0CE6FE07, types, arraySizes); return &instance; } }; @@ -2116,7 +2116,7 @@ struct GarrPlotUICategoryMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x784D025A, types, arraySizes); return &instance; } }; @@ -2127,7 +2127,7 @@ struct GarrSiteLevelMeta { static char const* types = "fhhhhbbbb"; static uint8 const arraySizes[9] = { 2, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xE57CCEA0, types, arraySizes); return &instance; } }; @@ -2138,7 +2138,7 @@ struct GarrSiteLevelPlotInstMeta { static char const* types = "fhbb"; static uint8 const arraySizes[4] = { 2, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xBC111CF1, types, arraySizes); return &instance; } }; @@ -2149,7 +2149,7 @@ struct GarrSpecializationMeta { static char const* types = "ifssbbb"; static uint8 const arraySizes[7] = { 1, 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x30FB6FE9, types, arraySizes); return &instance; } }; @@ -2160,7 +2160,7 @@ struct GarrStringMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x6414DFFF, types, arraySizes); return &instance; } }; @@ -2171,7 +2171,7 @@ struct GarrTalentMeta { static char const* types = "issibbbiiiiiiiiiiiii"; static uint8 const arraySizes[20] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 20, types, arraySizes); + static DB2Meta instance(7, 20, 0x8C8B99B4, types, arraySizes); return &instance; } }; @@ -2182,7 +2182,7 @@ struct GarrTalentTreeMeta { static char const* types = "bbii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x8BB9D1A2, types, arraySizes); return &instance; } }; @@ -2193,7 +2193,7 @@ struct GarrTypeMeta { static char const* types = "iiiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x45DE3C50, types, arraySizes); return &instance; } }; @@ -2204,7 +2204,7 @@ struct GarrUiAnimClassInfoMeta { static char const* types = "fhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xCEB08F4E, types, arraySizes); return &instance; } }; @@ -2215,7 +2215,7 @@ struct GarrUiAnimRaceInfoMeta { static char const* types = "ffffffffffffb"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x55DD4EA6, types, arraySizes); return &instance; } }; @@ -2226,7 +2226,7 @@ struct GemPropertiesMeta { static char const* types = "ihh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x623B3533, types, arraySizes); return &instance; } }; @@ -2237,7 +2237,7 @@ struct GlobalStringsMeta { static char const* types = "ssb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xBFF68C36, types, arraySizes); return &instance; } }; @@ -2248,7 +2248,7 @@ struct GlyphBindableSpellMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xB164611A, types, arraySizes); return &instance; } }; @@ -2259,7 +2259,7 @@ struct GlyphExclusiveCategoryMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -2270,7 +2270,7 @@ struct GlyphPropertiesMeta { static char const* types = "ihbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xBDD76E49, types, arraySizes); return &instance; } }; @@ -2281,7 +2281,7 @@ struct GlyphRequiredSpecMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xF2A8C5FC, types, arraySizes); return &instance; } }; @@ -2292,7 +2292,7 @@ struct GroundEffectDoodadMeta { static char const* types = "sffb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xB9D8F312, types, arraySizes); return &instance; } }; @@ -2303,7 +2303,7 @@ struct GroundEffectTextureMeta { static char const* types = "hbbi"; static uint8 const arraySizes[4] = { 4, 4, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x3F1F321A, types, arraySizes); return &instance; } }; @@ -2314,7 +2314,7 @@ struct GroupFinderActivityMeta { static char const* types = "sshhhbbbbbbbbb"; static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 14, types, arraySizes); + static DB2Meta instance(-1, 14, 0x89499D40, types, arraySizes); return &instance; } }; @@ -2325,7 +2325,7 @@ struct GroupFinderActivityGrpMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x7F0F0A99, types, arraySizes); return &instance; } }; @@ -2336,7 +2336,7 @@ struct GroupFinderCategoryMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x8CD5AB4A, types, arraySizes); return &instance; } }; @@ -2347,7 +2347,7 @@ struct GuildColorBackgroundMeta { static char const* types = "bbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC6D20079, types, arraySizes); return &instance; } }; @@ -2358,7 +2358,7 @@ struct GuildColorBorderMeta { static char const* types = "bbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC6D20079, types, arraySizes); return &instance; } }; @@ -2369,7 +2369,7 @@ struct GuildColorEmblemMeta { static char const* types = "bbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC6D20079, types, arraySizes); return &instance; } }; @@ -2380,7 +2380,7 @@ struct GuildPerkSpellsMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xC7D74917, types, arraySizes); return &instance; } }; @@ -2391,7 +2391,7 @@ struct HeirloomMeta { static char const* types = "isiiiihbbi"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 2, 2, 1, 1, 1 }; - static DB2Meta instance(9, 10, types, arraySizes); + static DB2Meta instance(9, 10, 0xF07281BE, types, arraySizes); return &instance; } }; @@ -2402,7 +2402,7 @@ struct HelmetAnimScalingMeta { static char const* types = "fii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x41EDD5DA, types, arraySizes); return &instance; } }; @@ -2413,7 +2413,7 @@ struct HelmetGeosetVisDataMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 9 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xDB3E9871, types, arraySizes); return &instance; } }; @@ -2424,7 +2424,7 @@ struct HighlightColorMeta { static char const* types = "iiibb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x42A52A5B, types, arraySizes); return &instance; } }; @@ -2435,7 +2435,7 @@ struct HolidayDescriptionsMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x8E1D98D8, types, arraySizes); return &instance; } }; @@ -2446,7 +2446,7 @@ struct HolidayNamesMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -2457,7 +2457,7 @@ struct HolidaysMeta { static char const* types = "iShhbbbbbbb"; static uint8 const arraySizes[11] = { 16, 1, 10, 1, 1, 10, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x41A15068, types, arraySizes); return &instance; } }; @@ -2468,7 +2468,7 @@ struct ImportPriceArmorMeta { static char const* types = "ffff"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xD00C26AF, types, arraySizes); return &instance; } }; @@ -2479,7 +2479,7 @@ struct ImportPriceQualityMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x26FFB6E5, types, arraySizes); return &instance; } }; @@ -2490,7 +2490,7 @@ struct ImportPriceShieldMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x26FFB6E5, types, arraySizes); return &instance; } }; @@ -2501,7 +2501,7 @@ struct ImportPriceWeaponMeta { static char const* types = "f"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x26FFB6E5, types, arraySizes); return &instance; } }; @@ -2512,7 +2512,7 @@ struct InvasionClientDataMeta { static char const* types = "sfiiiiiii"; static uint8 const arraySizes[9] = { 1, 2, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(2, 9, types, arraySizes); + static DB2Meta instance(2, 9, 0x12F82601, types, arraySizes); return &instance; } }; @@ -2523,7 +2523,7 @@ struct ItemMeta { static char const* types = "ibbbbbbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xBAB9954D, types, arraySizes); return &instance; } }; @@ -2534,7 +2534,7 @@ struct ItemAppearanceMeta { static char const* types = "iiib"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xD203A3E9, types, arraySizes); return &instance; } }; @@ -2545,7 +2545,7 @@ struct ItemAppearanceXUiCameraMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x4A8796B5, types, arraySizes); return &instance; } }; @@ -2556,7 +2556,7 @@ struct ItemArmorQualityMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xC3CD05A0, types, arraySizes); return &instance; } }; @@ -2567,7 +2567,7 @@ struct ItemArmorShieldMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2578,7 +2578,7 @@ struct ItemArmorTotalMeta { static char const* types = "ffffh"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x12D739A5, types, arraySizes); return &instance; } }; @@ -2589,7 +2589,7 @@ struct ItemBagFamilyMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -2600,7 +2600,7 @@ struct ItemBonusMeta { static char const* types = "ihbb"; static uint8 const arraySizes[4] = { 2, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x7D937400, types, arraySizes); return &instance; } }; @@ -2611,7 +2611,7 @@ struct ItemBonusListLevelDeltaMeta { static char const* types = "hi"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(1, 2, types, arraySizes); + static DB2Meta instance(1, 2, 0xCB953E49, types, arraySizes); return &instance; } }; @@ -2622,7 +2622,7 @@ struct ItemBonusTreeNodeMeta { static char const* types = "hhhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE2ED6BA0, types, arraySizes); return &instance; } }; @@ -2633,7 +2633,7 @@ struct ItemChildEquipmentMeta { static char const* types = "iib"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x5E08B8E2, types, arraySizes); return &instance; } }; @@ -2644,7 +2644,7 @@ struct ItemClassMeta { static char const* types = "fsb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xFC2CE47C, types, arraySizes); return &instance; } }; @@ -2655,7 +2655,7 @@ struct ItemContextPickerEntryMeta { static char const* types = "bbiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x41FD05DE, types, arraySizes); return &instance; } }; @@ -2666,7 +2666,7 @@ struct ItemCurrencyCostMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x48C57690, types, arraySizes); return &instance; } }; @@ -2677,7 +2677,7 @@ struct ItemDamageAmmoMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2688,7 +2688,7 @@ struct ItemDamageOneHandMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2699,7 +2699,7 @@ struct ItemDamageOneHandCasterMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2710,7 +2710,7 @@ struct ItemDamageTwoHandMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2721,7 +2721,7 @@ struct ItemDamageTwoHandCasterMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 7, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xA38C0C55, types, arraySizes); return &instance; } }; @@ -2732,7 +2732,7 @@ struct ItemDisenchantLootMeta { static char const* types = "hhhbbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x9E738C93, types, arraySizes); return &instance; } }; @@ -2743,7 +2743,7 @@ struct ItemDisplayInfoMeta { static char const* types = "iiiiiiiiiiiiiii"; static uint8 const arraySizes[15] = { 2, 2, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 15, types, arraySizes); + static DB2Meta instance(-1, 15, 0x07D2E6CF, types, arraySizes); return &instance; } }; @@ -2754,7 +2754,7 @@ struct ItemDisplayInfoMaterialResMeta { static char const* types = "iib"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xAC466DE7, types, arraySizes); return &instance; } }; @@ -2765,7 +2765,7 @@ struct ItemDisplayXUiCameraMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x6EEE8622, types, arraySizes); return &instance; } }; @@ -2776,7 +2776,7 @@ struct ItemEffectMeta { static char const* types = "iiiihhhbb"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x131233D4, types, arraySizes); return &instance; } }; @@ -2787,7 +2787,7 @@ struct ItemExtendedCostMeta { static char const* types = "iihhhbbbbb"; static uint8 const arraySizes[10] = { 5, 5, 5, 1, 5, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x56C5664F, types, arraySizes); return &instance; } }; @@ -2798,7 +2798,7 @@ struct ItemGroupSoundsMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 4 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x22B7B75A, types, arraySizes); return &instance; } }; @@ -2809,7 +2809,7 @@ struct ItemLimitCategoryMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xDFE88B15, types, arraySizes); return &instance; } }; @@ -2820,7 +2820,7 @@ struct ItemLimitCategoryConditionMeta { static char const* types = "bii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x66B27D0B, types, arraySizes); return &instance; } }; @@ -2831,7 +2831,7 @@ struct ItemModifiedAppearanceMeta { static char const* types = "ihbbbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(5, 6, types, arraySizes); + static DB2Meta instance(5, 6, 0x89E44FCB, types, arraySizes); return &instance; } }; @@ -2842,7 +2842,7 @@ struct ItemModifiedAppearanceExtraMeta { static char const* types = "iibbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xA44269EE, types, arraySizes); return &instance; } }; @@ -2853,7 +2853,7 @@ struct ItemNameDescriptionMeta { static char const* types = "si"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xB914CD84, types, arraySizes); return &instance; } }; @@ -2864,7 +2864,7 @@ struct ItemPetFoodMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x47B62FA7, types, arraySizes); return &instance; } }; @@ -2875,7 +2875,7 @@ struct ItemPriceBaseMeta { static char const* types = "ffh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x79EFBA2F, types, arraySizes); return &instance; } }; @@ -2886,7 +2886,7 @@ struct ItemRandomPropertiesMeta { static char const* types = "sh"; static uint8 const arraySizes[2] = { 1, 5 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x17DC5118, types, arraySizes); return &instance; } }; @@ -2897,7 +2897,7 @@ struct ItemRandomSuffixMeta { static char const* types = "sshh"; static uint8 const arraySizes[4] = { 1, 1, 5, 5 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x451B7E5A, types, arraySizes); return &instance; } }; @@ -2908,7 +2908,7 @@ struct ItemRangedDisplayInfoMeta { static char const* types = "iiii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x99013BB1, types, arraySizes); return &instance; } }; @@ -2919,7 +2919,7 @@ struct ItemSearchNameMeta { static char const* types = "siiihhhhbbbbi"; static uint8 const arraySizes[13] = { 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0xE3F1487C, types, arraySizes); return &instance; } }; @@ -2930,7 +2930,7 @@ struct ItemSetMeta { static char const* types = "sihii"; static uint8 const arraySizes[5] = { 1, 17, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x5089F4A2, types, arraySizes); return &instance; } }; @@ -2941,7 +2941,7 @@ struct ItemSetSpellMeta { static char const* types = "ihhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x939730D0, types, arraySizes); return &instance; } }; @@ -2952,7 +2952,7 @@ struct ItemSparseMeta { static char const* types = "iffiiiiiiiiffsssssififhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbb"; static uint8 const arraySizes[63] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 63, types, arraySizes); + static DB2Meta instance(-1, 63, 0x27909DB0, types, arraySizes); return &instance; } }; @@ -2963,7 +2963,7 @@ struct ItemSpecMeta { static char const* types = "hbbbbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x9AE2EA46, types, arraySizes); return &instance; } }; @@ -2974,7 +2974,7 @@ struct ItemSpecOverrideMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x85832A2E, types, arraySizes); return &instance; } }; @@ -2985,7 +2985,7 @@ struct ItemSubClassMeta { static char const* types = "sshbbbbbbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xB94F4659, types, arraySizes); return &instance; } }; @@ -2996,7 +2996,7 @@ struct ItemSubClassMaskMeta { static char const* types = "isb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x82EEF3E8, types, arraySizes); return &instance; } }; @@ -3007,7 +3007,7 @@ struct ItemUpgradeMeta { static char const* types = "ihhbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x196B9A4F, types, arraySizes); return &instance; } }; @@ -3018,7 +3018,7 @@ struct ItemVisualEffectsMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x12126A7B, types, arraySizes); return &instance; } }; @@ -3029,7 +3029,7 @@ struct ItemVisualsMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 5 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xD4015649, types, arraySizes); return &instance; } }; @@ -3040,7 +3040,7 @@ struct ItemXBonusTreeMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xEB27B98B, types, arraySizes); return &instance; } }; @@ -3051,7 +3051,7 @@ struct JournalEncounterMeta { static char const* types = "fsshhhhbbi"; static uint8 const arraySizes[10] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x02224293, types, arraySizes); return &instance; } }; @@ -3062,7 +3062,7 @@ struct JournalEncounterCreatureMeta { static char const* types = "iisshbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(6, 7, types, arraySizes); + static DB2Meta instance(6, 7, 0xDEB5EEB8, types, arraySizes); return &instance; } }; @@ -3073,7 +3073,7 @@ struct JournalEncounterItemMeta { static char const* types = "ihbbbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(5, 6, types, arraySizes); + static DB2Meta instance(5, 6, 0x2B6945A8, types, arraySizes); return &instance; } }; @@ -3084,7 +3084,7 @@ struct JournalEncounterSectionMeta { static char const* types = "ssiiihhhhhhbbb"; static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 14, types, arraySizes); + static DB2Meta instance(-1, 14, 0xF08A57BF, types, arraySizes); return &instance; } }; @@ -3095,7 +3095,7 @@ struct JournalEncounterXDifficultyMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x911A7222, types, arraySizes); return &instance; } }; @@ -3106,7 +3106,7 @@ struct JournalInstanceMeta { static char const* types = "iiiisshhbbi"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(10, 11, types, arraySizes); + static DB2Meta instance(10, 11, 0xDFF1896D, types, arraySizes); return &instance; } }; @@ -3117,7 +3117,7 @@ struct JournalItemXDifficultyMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x3DD3BD11, types, arraySizes); return &instance; } }; @@ -3128,7 +3128,7 @@ struct JournalSectionXDifficultyMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x084FB517, types, arraySizes); return &instance; } }; @@ -3139,7 +3139,7 @@ struct JournalTierMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -3150,7 +3150,7 @@ struct JournalTierXInstanceMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xC5F39D3A, types, arraySizes); return &instance; } }; @@ -3161,7 +3161,7 @@ struct KeyChainMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 32 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xD27482EA, types, arraySizes); return &instance; } }; @@ -3172,7 +3172,7 @@ struct KeystoneAffixMeta { static char const* types = "ssi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xF165D122, types, arraySizes); return &instance; } }; @@ -3183,7 +3183,7 @@ struct LanguageWordsMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x04C0BC5D, types, arraySizes); return &instance; } }; @@ -3194,7 +3194,7 @@ struct LanguagesMeta { static char const* types = "si"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(1, 2, types, arraySizes); + static DB2Meta instance(1, 2, 0x2CF66B24, types, arraySizes); return &instance; } }; @@ -3205,7 +3205,7 @@ struct LfgDungeonExpansionMeta { static char const* types = "hhbbbii"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x0BDD9F25, types, arraySizes); return &instance; } }; @@ -3216,7 +3216,7 @@ struct LfgDungeonGroupMeta { static char const* types = "shbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xC5A0B877, types, arraySizes); return &instance; } }; @@ -3225,9 +3225,9 @@ struct LfgDungeonsMeta { static DB2Meta const* Instance() { - static char const* types = "siSshhhhhhhhbbbbbbbbbbbbbbbbbi"; - static uint8 const arraySizes[30] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(29, 30, types, arraySizes); + static char const* types = "siSsihhhhhhhhbbbbbbbbbbbbbbbbbi"; + static uint8 const arraySizes[31] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(30, 31, 0x27312D4F, types, arraySizes); return &instance; } }; @@ -3238,7 +3238,7 @@ struct LfgDungeonsGroupingMapMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x4A7FA59C, types, arraySizes); return &instance; } }; @@ -3249,7 +3249,7 @@ struct LfgRoleRequirementMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x7F56023F, types, arraySizes); return &instance; } }; @@ -3260,7 +3260,7 @@ struct LightMeta { static char const* types = "fffhh"; static uint8 const arraySizes[5] = { 3, 1, 1, 1, 8 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x35A3D54B, types, arraySizes); return &instance; } }; @@ -3271,7 +3271,7 @@ struct LightDataMeta { static char const* types = "iiiiiiiiiiiiiiiiiifffffffffiiiiiihh"; static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 35, types, arraySizes); + static DB2Meta instance(-1, 35, 0xA89E1596, types, arraySizes); return &instance; } }; @@ -3282,7 +3282,7 @@ struct LightParamsMeta { static char const* types = "ffffffhbbbi"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 }; - static DB2Meta instance(10, 11, types, arraySizes); + static DB2Meta instance(10, 11, 0xDB514597, types, arraySizes); return &instance; } }; @@ -3293,7 +3293,7 @@ struct LightSkyboxMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x62B41D78, types, arraySizes); return &instance; } }; @@ -3304,7 +3304,7 @@ struct LiquidMaterialMeta { static char const* types = "bb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x5AA70B00, types, arraySizes); return &instance; } }; @@ -3315,7 +3315,7 @@ struct LiquidObjectMeta { static char const* types = "ffhbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x551D907E, types, arraySizes); return &instance; } }; @@ -3326,7 +3326,7 @@ struct LiquidTypeMeta { static char const* types = "sifffffSifihhbbbbbi"; static uint8 const arraySizes[19] = { 1, 1, 1, 1, 1, 1, 1, 6, 2, 18, 4, 1, 1, 1, 1, 1, 1, 6, 1 }; - static DB2Meta instance(-1, 19, types, arraySizes); + static DB2Meta instance(-1, 19, 0x28B44DCB, types, arraySizes); return &instance; } }; @@ -3337,7 +3337,7 @@ struct LoadingScreenTaxiSplinesMeta { static char const* types = "ffhhb"; static uint8 const arraySizes[5] = { 10, 10, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xBE26AA7B, types, arraySizes); return &instance; } }; @@ -3348,7 +3348,7 @@ struct LoadingScreensMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x0C18B360, types, arraySizes); return &instance; } }; @@ -3359,7 +3359,7 @@ struct LocaleMeta { static char const* types = "ibbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x0BE3B70B, types, arraySizes); return &instance; } }; @@ -3370,7 +3370,7 @@ struct LocationMeta { static char const* types = "ff"; static uint8 const arraySizes[2] = { 3, 3 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x6F5C6A8A, types, arraySizes); return &instance; } }; @@ -3381,7 +3381,7 @@ struct LockMeta { static char const* types = "ihbb"; static uint8 const arraySizes[4] = { 8, 8, 8, 8 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x8501126F, types, arraySizes); return &instance; } }; @@ -3392,7 +3392,7 @@ struct LockTypeMeta { static char const* types = "ssssi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(4, 5, types, arraySizes); + static DB2Meta instance(4, 5, 0x4064FF07, types, arraySizes); return &instance; } }; @@ -3403,7 +3403,7 @@ struct LookAtControllerMeta { static char const* types = "ffffhhhhbbbbbiiiii"; static uint8 const arraySizes[18] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 18, types, arraySizes); + static DB2Meta instance(-1, 18, 0xA17E9956, types, arraySizes); return &instance; } }; @@ -3414,7 +3414,7 @@ struct MailTemplateMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xA1D9C984, types, arraySizes); return &instance; } }; @@ -3425,7 +3425,7 @@ struct ManifestInterfaceActionIconMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(0, 1, types, arraySizes); + static DB2Meta instance(0, 1, 0x38F4113F, types, arraySizes); return &instance; } }; @@ -3436,7 +3436,7 @@ struct ManifestInterfaceDataMeta { static char const* types = "ss"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xBDA49B69, types, arraySizes); return &instance; } }; @@ -3447,7 +3447,7 @@ struct ManifestInterfaceItemIconMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(0, 1, types, arraySizes); + static DB2Meta instance(0, 1, 0x38F4113F, types, arraySizes); return &instance; } }; @@ -3458,7 +3458,7 @@ struct ManifestInterfaceTOCDataMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x6B30F325, types, arraySizes); return &instance; } }; @@ -3469,7 +3469,7 @@ struct ManifestMP3Meta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(0, 1, types, arraySizes); + static DB2Meta instance(0, 1, 0x38F4113F, types, arraySizes); return &instance; } }; @@ -3478,9 +3478,9 @@ struct MapMeta { static DB2Meta const* Instance() { - static char const* types = "siffssshhhhhhbbbbb"; - static uint8 const arraySizes[18] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 18, types, arraySizes); + static char const* types = "siffssshhhhhhhbbbbb"; + static uint8 const arraySizes[19] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 19, 0xB32E648C, types, arraySizes); return &instance; } }; @@ -3491,7 +3491,7 @@ struct MapChallengeModeMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 3, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xB9D43326, types, arraySizes); return &instance; } }; @@ -3502,7 +3502,7 @@ struct MapDifficultyMeta { static char const* types = "shbbbbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x7ADE1C7B, types, arraySizes); return &instance; } }; @@ -3513,7 +3513,7 @@ struct MapDifficultyXConditionMeta { static char const* types = "siii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x726559D6, types, arraySizes); return &instance; } }; @@ -3524,7 +3524,7 @@ struct MarketingPromotionsXLocaleMeta { static char const* types = "iiiisbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xBDC16D0F, types, arraySizes); return &instance; } }; @@ -3535,7 +3535,7 @@ struct MaterialMeta { static char const* types = "biii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xB0DC1034, types, arraySizes); return &instance; } }; @@ -3546,7 +3546,7 @@ struct MinorTalentMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xD8110E92, types, arraySizes); return &instance; } }; @@ -3557,7 +3557,7 @@ struct ModelAnimCloakDampeningMeta { static char const* types = "bii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xAA3A793B, types, arraySizes); return &instance; } }; @@ -3568,7 +3568,7 @@ struct ModelFileDataMeta { static char const* types = "bii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(1, 3, types, arraySizes); + static DB2Meta instance(1, 3, 0x5EF4BA08, types, arraySizes); return &instance; } }; @@ -3579,7 +3579,7 @@ struct ModelRibbonQualityMeta { static char const* types = "ib"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x18636F99, types, arraySizes); return &instance; } }; @@ -3590,7 +3590,7 @@ struct ModifierTreeMeta { static char const* types = "iihbbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x060C2D1C, types, arraySizes); return &instance; } }; @@ -3601,7 +3601,7 @@ struct MountMeta { static char const* types = "iisssfhhhbi"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(10, 11, types, arraySizes); + static DB2Meta instance(10, 11, 0x86A9FD37, types, arraySizes); return &instance; } }; @@ -3612,7 +3612,7 @@ struct MountCapabilityMeta { static char const* types = "iihhhbii"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(6, 8, types, arraySizes); + static DB2Meta instance(6, 8, 0xB62CA122, types, arraySizes); return &instance; } }; @@ -3623,7 +3623,7 @@ struct MountTypeXCapabilityMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xADB0EE4D, types, arraySizes); return &instance; } }; @@ -3634,7 +3634,7 @@ struct MovieMeta { static char const* types = "iibb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xCAE1BC8B, types, arraySizes); return &instance; } }; @@ -3645,7 +3645,7 @@ struct MovieFileDataMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x41B84017, types, arraySizes); return &instance; } }; @@ -3656,7 +3656,7 @@ struct MovieVariationMeta { static char const* types = "ihi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x87300FEE, types, arraySizes); return &instance; } }; @@ -3667,7 +3667,7 @@ struct NPCSoundsMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 4 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x48506E87, types, arraySizes); return &instance; } }; @@ -3678,7 +3678,7 @@ struct NameGenMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xD7C1FC25, types, arraySizes); return &instance; } }; @@ -3689,7 +3689,7 @@ struct NamesProfanityMeta { static char const* types = "Sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x4C7F576E, types, arraySizes); return &instance; } }; @@ -3700,7 +3700,7 @@ struct NamesReservedMeta { static char const* types = "S"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x47B62FA7, types, arraySizes); return &instance; } }; @@ -3711,7 +3711,7 @@ struct NamesReservedLocaleMeta { static char const* types = "Sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x813B40C3, types, arraySizes); return &instance; } }; @@ -3722,7 +3722,7 @@ struct NpcModelItemSlotDisplayInfoMeta { static char const* types = "iib"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xA22F8680, types, arraySizes); return &instance; } }; @@ -3733,7 +3733,7 @@ struct ObjectEffectMeta { static char const* types = "sfhbbbbbi"; static uint8 const arraySizes[9] = { 1, 3, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xDD9C935E, types, arraySizes); return &instance; } }; @@ -3744,7 +3744,7 @@ struct ObjectEffectGroupMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -3755,7 +3755,7 @@ struct ObjectEffectModifierMeta { static char const* types = "fbbb"; static uint8 const arraySizes[4] = { 4, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x02A080A3, types, arraySizes); return &instance; } }; @@ -3766,7 +3766,7 @@ struct ObjectEffectPackageMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -3777,7 +3777,7 @@ struct ObjectEffectPackageElemMeta { static char const* types = "hhh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x041FFE7D, types, arraySizes); return &instance; } }; @@ -3788,7 +3788,7 @@ struct OutlineEffectMeta { static char const* types = "fiiiii"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xB5DB9B94, types, arraySizes); return &instance; } }; @@ -3799,7 +3799,7 @@ struct OverrideSpellDataMeta { static char const* types = "iib"; static uint8 const arraySizes[3] = { 10, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x401AC574, types, arraySizes); return &instance; } }; @@ -3810,7 +3810,7 @@ struct PageTextMaterialMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -3821,7 +3821,7 @@ struct PaperDollItemFrameMeta { static char const* types = "ssb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x15BA10F3, types, arraySizes); return &instance; } }; @@ -3832,7 +3832,7 @@ struct ParticleColorMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 3, 3, 3 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xF1BF0CA9, types, arraySizes); return &instance; } }; @@ -3843,7 +3843,7 @@ struct PathMeta { static char const* types = "bbbbbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xE6C80767, types, arraySizes); return &instance; } }; @@ -3854,7 +3854,7 @@ struct PathNodeMeta { static char const* types = "iihh"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(0, 4, types, arraySizes); + static DB2Meta instance(0, 4, 0x57D19E50, types, arraySizes); return &instance; } }; @@ -3865,7 +3865,7 @@ struct PathNodePropertyMeta { static char const* types = "hhbii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(3, 5, types, arraySizes); + static DB2Meta instance(3, 5, 0x9D908771, types, arraySizes); return &instance; } }; @@ -3876,7 +3876,7 @@ struct PathPropertyMeta { static char const* types = "ihbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0x7353B599, types, arraySizes); return &instance; } }; @@ -3887,7 +3887,7 @@ struct PhaseMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x12961644, types, arraySizes); return &instance; } }; @@ -3898,7 +3898,7 @@ struct PhaseShiftZoneSoundsMeta { static char const* types = "hhhhhbbbbiiii"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x1A5C14A8, types, arraySizes); return &instance; } }; @@ -3909,7 +3909,7 @@ struct PhaseXPhaseGroupMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xC5DECA36, types, arraySizes); return &instance; } }; @@ -3919,9 +3919,8 @@ struct PlayerConditionMeta static DB2Meta const* Instance() { static char const* types = "iiiiiiiiiiiiiishhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbiiiiiiiiiiiiiii"; - // 1111111121411111144414442144111111111131111114111444111111111111113444141461112 static uint8 const arraySizes[79] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 4, 4, 4, 2, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 4, 4, 1, 4, 1, 4, 6, 1, 1, 1, 2 }; - static DB2Meta instance(-1, 79, types, arraySizes); + static DB2Meta instance(-1, 79, 0xBAA3CA64, types, arraySizes); return &instance; } }; @@ -3932,7 +3931,7 @@ struct PositionerMeta { static char const* types = "fhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x3E7693C1, types, arraySizes); return &instance; } }; @@ -3943,7 +3942,7 @@ struct PositionerStateMeta { static char const* types = "fbiiiiii"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x0EA8C354, types, arraySizes); return &instance; } }; @@ -3954,7 +3953,7 @@ struct PositionerStateEntryMeta { static char const* types = "ffbbbbbbbbi"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x6CF8DBB6, types, arraySizes); return &instance; } }; @@ -3965,7 +3964,7 @@ struct PowerDisplayMeta { static char const* types = "Sbbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x996B7B03, types, arraySizes); return &instance; } }; @@ -3976,7 +3975,7 @@ struct PowerTypeMeta { static char const* types = "ssffhhhbbbbb"; static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 12, types, arraySizes); + static DB2Meta instance(-1, 12, 0x042B76A1, types, arraySizes); return &instance; } }; @@ -3987,7 +3986,7 @@ struct PrestigeLevelInfoMeta { static char const* types = "isbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x85DC9691, types, arraySizes); return &instance; } }; @@ -3998,7 +3997,7 @@ struct PvpBracketTypesMeta { static char const* types = "bi"; static uint8 const arraySizes[2] = { 1, 4 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x15D5D38F, types, arraySizes); return &instance; } }; @@ -4009,7 +4008,7 @@ struct PvpDifficultyMeta { static char const* types = "hbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x987332DF, types, arraySizes); return &instance; } }; @@ -4020,7 +4019,7 @@ struct PvpItemMeta { static char const* types = "ib"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xBCA228D1, types, arraySizes); return &instance; } }; @@ -4031,7 +4030,7 @@ struct PvpRewardMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x8D746A4E, types, arraySizes); return &instance; } }; @@ -4042,7 +4041,7 @@ struct PvpTalentMeta { static char const* types = "iisiiiiii"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x46E787AF, types, arraySizes); return &instance; } }; @@ -4053,7 +4052,7 @@ struct PvpTalentUnlockMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xDA321AC4, types, arraySizes); return &instance; } }; @@ -4064,7 +4063,7 @@ struct QuestFactionRewardMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 10 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x90E2CCC9, types, arraySizes); return &instance; } }; @@ -4075,7 +4074,7 @@ struct QuestFeedbackEffectMeta { static char const* types = "ihbbbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x15232667, types, arraySizes); return &instance; } }; @@ -4086,7 +4085,7 @@ struct QuestInfoMeta { static char const* types = "shbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x134A3185, types, arraySizes); return &instance; } }; @@ -4097,7 +4096,7 @@ struct QuestLineMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -4108,7 +4107,7 @@ struct QuestLineXQuestMeta { static char const* types = "hhb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xE6F65F4F, types, arraySizes); return &instance; } }; @@ -4119,7 +4118,7 @@ struct QuestMoneyRewardMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 10 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xE39F507A, types, arraySizes); return &instance; } }; @@ -4130,7 +4129,7 @@ struct QuestObjectiveMeta { static char const* types = "iishbbbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xFBAC2A6D, types, arraySizes); return &instance; } }; @@ -4139,9 +4138,9 @@ struct QuestPOIBlobMeta { static DB2Meta const* Instance() { - static char const* types = "hhb"; - static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static char const* types = "hhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, 0x2B6FCF8C, types, arraySizes); return &instance; } }; @@ -4152,7 +4151,7 @@ struct QuestPOIPointMeta { static char const* types = "ihhi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0x356F39B9, types, arraySizes); return &instance; } }; @@ -4163,7 +4162,7 @@ struct QuestPOIPointCliTaskMeta { static char const* types = "hhhhhb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xB4B42A70, types, arraySizes); return &instance; } }; @@ -4174,7 +4173,7 @@ struct QuestPackageItemMeta { static char const* types = "ihbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x9B308EDF, types, arraySizes); return &instance; } }; @@ -4185,7 +4184,7 @@ struct QuestSortMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xCD4A8256, types, arraySizes); return &instance; } }; @@ -4196,7 +4195,7 @@ struct QuestV2Meta { static char const* types = "h"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xA33E0F53, types, arraySizes); return &instance; } }; @@ -4207,7 +4206,7 @@ struct QuestV2CliTaskMeta { static char const* types = "issihhhhhhhbbbbbbbbbiii"; static uint8 const arraySizes[23] = { 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(20, 23, types, arraySizes); + static DB2Meta instance(20, 23, 0xB92018B7, types, arraySizes); return &instance; } }; @@ -4218,7 +4217,7 @@ struct QuestXPMeta { static char const* types = "h"; static uint8 const arraySizes[1] = { 10 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x4346D258, types, arraySizes); return &instance; } }; @@ -4229,7 +4228,7 @@ struct RacialMountsMeta { static char const* types = "ib"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xD4825187, types, arraySizes); return &instance; } }; @@ -4240,7 +4239,7 @@ struct RandPropPointsMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 5, 5, 5 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xBB6728B0, types, arraySizes); return &instance; } }; @@ -4251,7 +4250,7 @@ struct ResearchBranchMeta { static char const* types = "ssihb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xC54288AC, types, arraySizes); return &instance; } }; @@ -4262,7 +4261,7 @@ struct ResearchFieldMeta { static char const* types = "sbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0x3C4783A7, types, arraySizes); return &instance; } }; @@ -4273,7 +4272,7 @@ struct ResearchProjectMeta { static char const* types = "ssishbbii"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 9, types, arraySizes); + static DB2Meta instance(7, 9, 0xF188A6B0, types, arraySizes); return &instance; } }; @@ -4284,7 +4283,7 @@ struct ResearchSiteMeta { static char const* types = "ishi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x53309323, types, arraySizes); return &instance; } }; @@ -4295,7 +4294,7 @@ struct ResistancesMeta { static char const* types = "sbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x8B169B16, types, arraySizes); return &instance; } }; @@ -4306,7 +4305,7 @@ struct RewardPackMeta { static char const* types = "ifbbii"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x2804996B, types, arraySizes); return &instance; } }; @@ -4317,7 +4316,7 @@ struct RewardPackXCurrencyTypeMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x5AD7107A, types, arraySizes); return &instance; } }; @@ -4328,7 +4327,7 @@ struct RewardPackXItemMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x648BC961, types, arraySizes); return &instance; } }; @@ -4339,7 +4338,7 @@ struct RibbonQualityMeta { static char const* types = "fffb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x689AB407, types, arraySizes); return &instance; } }; @@ -4350,7 +4349,7 @@ struct RulesetItemUpgradeMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xF434A1F0, types, arraySizes); return &instance; } }; @@ -4361,7 +4360,7 @@ struct ScalingStatDistributionMeta { static char const* types = "hii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x883E80FE, types, arraySizes); return &instance; } }; @@ -4372,7 +4371,7 @@ struct ScenarioMeta { static char const* types = "shbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE71EFDEA, types, arraySizes); return &instance; } }; @@ -4383,7 +4382,7 @@ struct ScenarioEventEntryMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x4E0E3AC5, types, arraySizes); return &instance; } }; @@ -4394,7 +4393,7 @@ struct ScenarioStepMeta { static char const* types = "sshhhhbbi"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xACF5556A, types, arraySizes); return &instance; } }; @@ -4405,7 +4404,7 @@ struct SceneScriptMeta { static char const* types = "sshh"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE564690A, types, arraySizes); return &instance; } }; @@ -4416,7 +4415,7 @@ struct SceneScriptPackageMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -4427,7 +4426,7 @@ struct SceneScriptPackageMemberMeta { static char const* types = "hhhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x122FCD3F, types, arraySizes); return &instance; } }; @@ -4438,7 +4437,7 @@ struct ScheduledIntervalMeta { static char const* types = "iiiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x861AEB4E, types, arraySizes); return &instance; } }; @@ -4449,7 +4448,7 @@ struct ScheduledWorldStateMeta { static char const* types = "iiiiiiii"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x39E4B20A, types, arraySizes); return &instance; } }; @@ -4460,7 +4459,7 @@ struct ScheduledWorldStateGroupMeta { static char const* types = "iiiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xDBCC318B, types, arraySizes); return &instance; } }; @@ -4471,7 +4470,7 @@ struct ScheduledWorldStateXUniqCatMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(0, 3, types, arraySizes); + static DB2Meta instance(0, 3, 0x6E0F3FC1, types, arraySizes); return &instance; } }; @@ -4482,7 +4481,7 @@ struct ScreenEffectMeta { static char const* types = "sihhhhbbbiii"; static uint8 const arraySizes[12] = { 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 12, types, arraySizes); + static DB2Meta instance(-1, 12, 0xDD021285, types, arraySizes); return &instance; } }; @@ -4493,7 +4492,7 @@ struct ScreenLocationMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -4504,7 +4503,7 @@ struct SeamlessSiteMeta { static char const* types = "i"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x2FE47A1B, types, arraySizes); return &instance; } }; @@ -4515,7 +4514,7 @@ struct ServerMessagesMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x9599555F, types, arraySizes); return &instance; } }; @@ -4526,7 +4525,7 @@ struct ShadowyEffectMeta { static char const* types = "iiffffffbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x091E9D1A, types, arraySizes); return &instance; } }; @@ -4537,7 +4536,7 @@ struct SkillLineMeta { static char const* types = "ssshhbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xF1CDEABF, types, arraySizes); return &instance; } }; @@ -4548,7 +4547,7 @@ struct SkillLineAbilityMeta { static char const* types = "iiiihhhhhhbbi"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0xC3E8E26F, types, arraySizes); return &instance; } }; @@ -4559,7 +4558,7 @@ struct SkillRaceClassInfoMeta { static char const* types = "ihhhbbi"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xEDA3A4D4, types, arraySizes); return &instance; } }; @@ -4570,7 +4569,7 @@ struct SoundAmbienceMeta { static char const* types = "biii"; static uint8 const arraySizes[4] = { 1, 2, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x6F03BA39, types, arraySizes); return &instance; } }; @@ -4581,7 +4580,7 @@ struct SoundAmbienceFlavorMeta { static char const* types = "hii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x917AB671, types, arraySizes); return &instance; } }; @@ -4592,7 +4591,7 @@ struct SoundBusMeta { static char const* types = "ffhbbbbbbbbi"; static uint8 const arraySizes[12] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(11, 12, types, arraySizes); + static DB2Meta instance(11, 12, 0x3A647CAE, types, arraySizes); return &instance; } }; @@ -4603,7 +4602,7 @@ struct SoundEmitterPillPointsMeta { static char const* types = "fh"; static uint8 const arraySizes[2] = { 3, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x24A008CB, types, arraySizes); return &instance; } }; @@ -4614,7 +4613,7 @@ struct SoundEmittersMeta { static char const* types = "ffshhhbbbbii"; static uint8 const arraySizes[12] = { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(10, 12, types, arraySizes); + static DB2Meta instance(10, 12, 0xAED6FA80, types, arraySizes); return &instance; } }; @@ -4625,7 +4624,7 @@ struct SoundFilterMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -4636,7 +4635,7 @@ struct SoundFilterElemMeta { static char const* types = "fbb"; static uint8 const arraySizes[3] = { 9, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x700BC63F, types, arraySizes); return &instance; } }; @@ -4647,7 +4646,7 @@ struct SoundKitMeta { static char const* types = "sffffffffhhhbbbbi"; static uint8 const arraySizes[17] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(16, 17, types, arraySizes); + static DB2Meta instance(16, 17, 0x45160162, types, arraySizes); return &instance; } }; @@ -4658,7 +4657,7 @@ struct SoundKitAdvancedMeta { static char const* types = "fiiiiiifffffiiffffffihbbbbiiiiii"; static uint8 const arraySizes[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 32, types, arraySizes); + static DB2Meta instance(-1, 32, 0x27606F57, types, arraySizes); return &instance; } }; @@ -4669,7 +4668,7 @@ struct SoundKitChildMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x8C2AEA75, types, arraySizes); return &instance; } }; @@ -4680,7 +4679,7 @@ struct SoundKitEntryMeta { static char const* types = "ifbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xD29B5B47, types, arraySizes); return &instance; } }; @@ -4691,7 +4690,7 @@ struct SoundKitFallbackMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x751D6B9F, types, arraySizes); return &instance; } }; @@ -4702,7 +4701,7 @@ struct SoundOverrideMeta { static char const* types = "hhhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xAAFD0E26, types, arraySizes); return &instance; } }; @@ -4713,7 +4712,7 @@ struct SoundProviderPreferencesMeta { static char const* types = "sfffffffffffffffhhhhhbb"; static uint8 const arraySizes[23] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 23, types, arraySizes); + static DB2Meta instance(-1, 23, 0x85F511FC, types, arraySizes); return &instance; } }; @@ -4724,7 +4723,7 @@ struct SourceInfoMeta { static char const* types = "isbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x796AD8C7, types, arraySizes); return &instance; } }; @@ -4735,7 +4734,7 @@ struct SpamMessagesMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x6414DFFF, types, arraySizes); return &instance; } }; @@ -4746,7 +4745,7 @@ struct SpecializationSpellsMeta { static char const* types = "iishbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(5, 6, types, arraySizes); + static DB2Meta instance(5, 6, 0x9FC404CF, types, arraySizes); return &instance; } }; @@ -4757,7 +4756,7 @@ struct SpellMeta { static char const* types = "ssssiii"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(5, 7, types, arraySizes); + static DB2Meta instance(5, 7, 0x15C9999E, types, arraySizes); return &instance; } }; @@ -4768,7 +4767,7 @@ struct SpellActionBarPrefMeta { static char const* types = "ih"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xB1F8D61B, types, arraySizes); return &instance; } }; @@ -4779,7 +4778,7 @@ struct SpellActivationOverlayMeta { static char const* types = "iiifibbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 4, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0x2FD43517, types, arraySizes); return &instance; } }; @@ -4790,7 +4789,7 @@ struct SpellAuraOptionsMeta { static char const* types = "iiiihbbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xE99ACF7D, types, arraySizes); return &instance; } }; @@ -4801,7 +4800,7 @@ struct SpellAuraRestrictionsMeta { static char const* types = "iiiiibbbbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xCC928C2D, types, arraySizes); return &instance; } }; @@ -4812,7 +4811,7 @@ struct SpellAuraVisXChrSpecMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x19C6D5BC, types, arraySizes); return &instance; } }; @@ -4823,7 +4822,7 @@ struct SpellAuraVisibilityMeta { static char const* types = "ibbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(3, 4, types, arraySizes); + static DB2Meta instance(3, 4, 0xD4FFE0FE, types, arraySizes); return &instance; } }; @@ -4834,7 +4833,7 @@ struct SpellCastTimesMeta { static char const* types = "iih"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xB44CBB5C, types, arraySizes); return &instance; } }; @@ -4845,7 +4844,7 @@ struct SpellCastingRequirementsMeta { static char const* types = "ihhhbbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x91AFF9C5, types, arraySizes); return &instance; } }; @@ -4856,7 +4855,7 @@ struct SpellCategoriesMeta { static char const* types = "ihhhbbbbb"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xF7721E4A, types, arraySizes); return &instance; } }; @@ -4867,7 +4866,7 @@ struct SpellCategoryMeta { static char const* types = "sibbbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x5A212A44, types, arraySizes); return &instance; } }; @@ -4878,7 +4877,7 @@ struct SpellChainEffectsMeta { static char const* types = "ffffiifffffffffffffffffffffffffffffffffffiffsshhhhbbbbbbbbbbbi"; static uint8 const arraySizes[62] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 3, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 62, types, arraySizes); + static DB2Meta instance(-1, 62, 0x89DAFC72, types, arraySizes); return &instance; } }; @@ -4889,7 +4888,7 @@ struct SpellClassOptionsMeta { static char const* types = "iibi"; static uint8 const arraySizes[4] = { 1, 4, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x23C0B83A, types, arraySizes); return &instance; } }; @@ -4900,7 +4899,7 @@ struct SpellCooldownsMeta { static char const* types = "iiiib"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xC44BCFEE, types, arraySizes); return &instance; } }; @@ -4911,7 +4910,7 @@ struct SpellDescriptionVariablesMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xE37F5F23, types, arraySizes); return &instance; } }; @@ -4922,7 +4921,7 @@ struct SpellDispelTypeMeta { static char const* types = "ssbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE8FCFE59, types, arraySizes); return &instance; } }; @@ -4933,7 +4932,7 @@ struct SpellDurationMeta { static char const* types = "iih"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xC40857BC, types, arraySizes); return &instance; } }; @@ -4944,7 +4943,7 @@ struct SpellEffectMeta { static char const* types = "fffffiffiiiiiiiiiiiiiiiii"; static uint8 const arraySizes[25] = { 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1 }; - static DB2Meta instance(8, 25, types, arraySizes); + static DB2Meta instance(8, 25, 0xD5324B6A, types, arraySizes); return &instance; } }; @@ -4955,7 +4954,7 @@ struct SpellEffectCameraShakesMeta { static char const* types = "hh"; static uint8 const arraySizes[2] = { 3, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x6F5E87B0, types, arraySizes); return &instance; } }; @@ -4966,7 +4965,7 @@ struct SpellEffectEmissionMeta { static char const* types = "ffhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x744EB0EB, types, arraySizes); return &instance; } }; @@ -4977,7 +4976,7 @@ struct SpellEffectGroupSizeMeta { static char const* types = "if"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x6C6B6B5B, types, arraySizes); return &instance; } }; @@ -4988,7 +4987,7 @@ struct SpellEffectScalingMeta { static char const* types = "fffi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xBAC40B9B, types, arraySizes); return &instance; } }; @@ -4999,7 +4998,7 @@ struct SpellEquippedItemsMeta { static char const* types = "iiib"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x9C6390C6, types, arraySizes); return &instance; } }; @@ -5010,7 +5009,7 @@ struct SpellFlyoutMeta { static char const* types = "isshbi"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xB35D88A2, types, arraySizes); return &instance; } }; @@ -5021,7 +5020,7 @@ struct SpellFlyoutItemMeta { static char const* types = "ibb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x60E17715, types, arraySizes); return &instance; } }; @@ -5032,7 +5031,7 @@ struct SpellFocusObjectMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x67818447, types, arraySizes); return &instance; } }; @@ -5043,7 +5042,7 @@ struct SpellIconMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x88B46898, types, arraySizes); return &instance; } }; @@ -5054,7 +5053,7 @@ struct SpellInterruptsMeta { static char const* types = "iiihb"; static uint8 const arraySizes[5] = { 1, 2, 2, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xFCE2DF7C, types, arraySizes); return &instance; } }; @@ -5065,7 +5064,7 @@ struct SpellItemEnchantmentMeta { static char const* types = "isfiihhhhhhbbbbbbbi"; static uint8 const arraySizes[19] = { 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 19, types, arraySizes); + static DB2Meta instance(-1, 19, 0xA21E7644, types, arraySizes); return &instance; } }; @@ -5076,7 +5075,7 @@ struct SpellItemEnchantmentConditionMeta { static char const* types = "bbbbbi"; static uint8 const arraySizes[6] = { 5, 5, 5, 5, 5, 5 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xFE2C26F5, types, arraySizes); return &instance; } }; @@ -5087,7 +5086,7 @@ struct SpellKeyboundOverrideMeta { static char const* types = "isb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x4C31B87C, types, arraySizes); return &instance; } }; @@ -5098,7 +5097,7 @@ struct SpellLabelMeta { static char const* types = "ii"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x2A4CDECC, types, arraySizes); return &instance; } }; @@ -5109,7 +5108,7 @@ struct SpellLearnSpellMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x8C7EE18E, types, arraySizes); return &instance; } }; @@ -5120,7 +5119,7 @@ struct SpellLevelsMeta { static char const* types = "ihhhbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xCFBB94B1, types, arraySizes); return &instance; } }; @@ -5131,7 +5130,7 @@ struct SpellMechanicMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x8B096444, types, arraySizes); return &instance; } }; @@ -5142,7 +5141,7 @@ struct SpellMiscMeta { static char const* types = "iffhhhhhb"; static uint8 const arraySizes[9] = { 14, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x2B8ABAC3, types, arraySizes); return &instance; } }; @@ -5153,7 +5152,7 @@ struct SpellMiscDifficultyMeta { static char const* types = "ibi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0xF88FAB97, types, arraySizes); return &instance; } }; @@ -5164,7 +5163,7 @@ struct SpellMissileMeta { static char const* types = "ifffffffffffffb"; static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 15, types, arraySizes); + static DB2Meta instance(-1, 15, 0x398CF976, types, arraySizes); return &instance; } }; @@ -5175,7 +5174,7 @@ struct SpellMissileMotionMeta { static char const* types = "ssbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x719D619B, types, arraySizes); return &instance; } }; @@ -5186,7 +5185,7 @@ struct SpellPowerMeta { static char const* types = "iiffifbbiiiiii"; static uint8 const arraySizes[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(8, 14, types, arraySizes); + static DB2Meta instance(8, 14, 0x8CDC380E, types, arraySizes); return &instance; } }; @@ -5197,7 +5196,7 @@ struct SpellPowerDifficultyMeta { static char const* types = "bbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0x0117F40F, types, arraySizes); return &instance; } }; @@ -5208,7 +5207,7 @@ struct SpellProceduralEffectMeta { static char const* types = "fbi"; static uint8 const arraySizes[3] = { 4, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0xEC43FF27, types, arraySizes); return &instance; } }; @@ -5219,7 +5218,7 @@ struct SpellProcsPerMinuteMeta { static char const* types = "fb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xEFCFD31B, types, arraySizes); return &instance; } }; @@ -5230,7 +5229,7 @@ struct SpellProcsPerMinuteModMeta { static char const* types = "fhbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xA339D9A5, types, arraySizes); return &instance; } }; @@ -5241,7 +5240,7 @@ struct SpellRadiusMeta { static char const* types = "ffff"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xE948EB40, types, arraySizes); return &instance; } }; @@ -5252,7 +5251,7 @@ struct SpellRangeMeta { static char const* types = "ffssb"; static uint8 const arraySizes[5] = { 2, 2, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x78704E1A, types, arraySizes); return &instance; } }; @@ -5263,7 +5262,7 @@ struct SpellReagentsMeta { static char const* types = "iih"; static uint8 const arraySizes[3] = { 1, 8, 8 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x86B17A70, types, arraySizes); return &instance; } }; @@ -5274,7 +5273,7 @@ struct SpellReagentsCurrencyMeta { static char const* types = "ihh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x01173DCA, types, arraySizes); return &instance; } }; @@ -5285,7 +5284,7 @@ struct SpellScalingMeta { static char const* types = "ihbbi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xB0DB56A9, types, arraySizes); return &instance; } }; @@ -5296,7 +5295,7 @@ struct SpellShapeshiftMeta { static char const* types = "iiib"; static uint8 const arraySizes[4] = { 1, 2, 2, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x28AA9C0D, types, arraySizes); return &instance; } }; @@ -5307,7 +5306,7 @@ struct SpellShapeshiftFormMeta { static char const* types = "sfihhhhhbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 4, 8, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x11AFAB53, types, arraySizes); return &instance; } }; @@ -5318,7 +5317,7 @@ struct SpellSpecialUnitEffectMeta { static char const* types = "hi"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xB7AAD4C5, types, arraySizes); return &instance; } }; @@ -5329,7 +5328,7 @@ struct SpellTargetRestrictionsMeta { static char const* types = "iffihbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xD496481C, types, arraySizes); return &instance; } }; @@ -5340,7 +5339,7 @@ struct SpellTotemsMeta { static char const* types = "iih"; static uint8 const arraySizes[3] = { 1, 2, 2 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x752DCE9E, types, arraySizes); return &instance; } }; @@ -5351,7 +5350,7 @@ struct SpellVisualMeta { static char const* types = "iiiiiiiiiiiiiiiffiihhhbbiiii"; static uint8 const arraySizes[28] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(24, 28, types, arraySizes); + static DB2Meta instance(24, 28, 0xA2B85016, types, arraySizes); return &instance; } }; @@ -5362,7 +5361,7 @@ struct SpellVisualAnimMeta { static char const* types = "hhh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x0B1038D1, types, arraySizes); return &instance; } }; @@ -5373,7 +5372,7 @@ struct SpellVisualColorEffectMeta { static char const* types = "fifhhhhhbbi"; static uint8 const arraySizes[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0xD64D320E, types, arraySizes); return &instance; } }; @@ -5384,7 +5383,7 @@ struct SpellVisualEffectNameMeta { static char const* types = "sffffffiiibii"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x4552DDC5, types, arraySizes); return &instance; } }; @@ -5395,7 +5394,7 @@ struct SpellVisualKitMeta { static char const* types = "ifhhii"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(4, 6, types, arraySizes); + static DB2Meta instance(4, 6, 0xC3D97636, types, arraySizes); return &instance; } }; @@ -5406,7 +5405,7 @@ struct SpellVisualKitAreaModelMeta { static char const* types = "ifffhb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xE63E62E3, types, arraySizes); return &instance; } }; @@ -5417,7 +5416,7 @@ struct SpellVisualKitEffectMeta { static char const* types = "iii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x2323470B, types, arraySizes); return &instance; } }; @@ -5428,7 +5427,7 @@ struct SpellVisualKitModelAttachMeta { static char const* types = "iffffffffffifhhhhhhbbi"; static uint8 const arraySizes[22] = { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(21, 22, types, arraySizes); + static DB2Meta instance(21, 22, 0x2CD44B15, types, arraySizes); return &instance; } }; @@ -5439,7 +5438,7 @@ struct SpellVisualMissileMeta { static char const* types = "iiiffhhhhhhbbiii"; static uint8 const arraySizes[16] = { 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(13, 16, types, arraySizes); + static DB2Meta instance(13, 16, 0xA538BBD9, types, arraySizes); return &instance; } }; @@ -5450,7 +5449,7 @@ struct SpellXSpellVisualMeta { static char const* types = "ifhhhbbi"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, types, arraySizes); + static DB2Meta instance(7, 8, 0x462EF5F7, types, arraySizes); return &instance; } }; @@ -5461,7 +5460,7 @@ struct Startup_StringsMeta { static char const* types = "ss"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x1BE9FD87, types, arraySizes); return &instance; } }; @@ -5472,7 +5471,7 @@ struct StationeryMeta { static char const* types = "sbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xB7A33B6A, types, arraySizes); return &instance; } }; @@ -5483,7 +5482,7 @@ struct StringLookupsMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x2A21A5F9, types, arraySizes); return &instance; } }; @@ -5494,7 +5493,7 @@ struct SummonPropertiesMeta { static char const* types = "iiiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x0013EE84, types, arraySizes); return &instance; } }; @@ -5505,7 +5504,7 @@ struct TactKeyMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 16 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xE980B1CA, types, arraySizes); return &instance; } }; @@ -5516,7 +5515,7 @@ struct TactKeyLookupMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 8 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x72063202, types, arraySizes); return &instance; } }; @@ -5527,7 +5526,7 @@ struct TalentMeta { static char const* types = "iishbbbbb"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 2, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xE408A87C, types, arraySizes); return &instance; } }; @@ -5538,7 +5537,7 @@ struct TaxiNodesMeta { static char const* types = "fsifhhhbi"; static uint8 const arraySizes[9] = { 3, 1, 2, 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(8, 9, types, arraySizes); + static DB2Meta instance(8, 9, 0x970E4A17, types, arraySizes); return &instance; } }; @@ -5549,7 +5548,7 @@ struct TaxiPathMeta { static char const* types = "hhii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(2, 4, types, arraySizes); + static DB2Meta instance(2, 4, 0xE194AB65, types, arraySizes); return &instance; } }; @@ -5560,7 +5559,7 @@ struct TaxiPathNodeMeta { static char const* types = "fihhhhbbi"; static uint8 const arraySizes[9] = { 3, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(8, 9, types, arraySizes); + static DB2Meta instance(8, 9, 0xF8DBC1E7, types, arraySizes); return &instance; } }; @@ -5571,7 +5570,7 @@ struct TerrainMaterialMeta { static char const* types = "ssb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x8DB3D50D, types, arraySizes); return &instance; } }; @@ -5582,7 +5581,7 @@ struct TerrainTypeMeta { static char const* types = "shhbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x6F34AF2D, types, arraySizes); return &instance; } }; @@ -5593,7 +5592,7 @@ struct TerrainTypeSoundsMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x47B62FA7, types, arraySizes); return &instance; } }; @@ -5604,7 +5603,7 @@ struct TextureBlendSetMeta { static char const* types = "ifffffbbbb"; static uint8 const arraySizes[10] = { 3, 3, 3, 3, 3, 4, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x6FF19F2C, types, arraySizes); return &instance; } }; @@ -5615,7 +5614,7 @@ struct TextureFileDataMeta { static char const* types = "ibi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(2, 3, types, arraySizes); + static DB2Meta instance(2, 3, 0xD01C9708, types, arraySizes); return &instance; } }; @@ -5626,7 +5625,7 @@ struct TotemCategoryMeta { static char const* types = "sib"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x52AA4462, types, arraySizes); return &instance; } }; @@ -5637,7 +5636,7 @@ struct ToyMeta { static char const* types = "isbbi"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(4, 5, types, arraySizes); + static DB2Meta instance(4, 5, 0xF0409D8D, types, arraySizes); return &instance; } }; @@ -5648,7 +5647,7 @@ struct TradeSkillCategoryMeta { static char const* types = "shhhb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x8795B715, types, arraySizes); return &instance; } }; @@ -5659,7 +5658,7 @@ struct TradeSkillItemMeta { static char const* types = "hb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xD99B4F6A, types, arraySizes); return &instance; } }; @@ -5670,7 +5669,7 @@ struct TransformMatrixMeta { static char const* types = "fffff"; static uint8 const arraySizes[5] = { 3, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xCD652C09, types, arraySizes); return &instance; } }; @@ -5681,7 +5680,7 @@ struct TransmogSetMeta { static char const* types = "iiii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(0, 4, types, arraySizes); + static DB2Meta instance(0, 4, 0x64CA0A37, types, arraySizes); return &instance; } }; @@ -5692,7 +5691,7 @@ struct TransmogSetItemMeta { static char const* types = "iiii"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(0, 4, types, arraySizes); + static DB2Meta instance(0, 4, 0x36FF3392, types, arraySizes); return &instance; } }; @@ -5703,7 +5702,7 @@ struct TransportAnimationMeta { static char const* types = "iifb"; static uint8 const arraySizes[4] = { 1, 1, 3, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x8F3D2D53, types, arraySizes); return &instance; } }; @@ -5714,7 +5713,7 @@ struct TransportPhysicsMeta { static char const* types = "ffffffffff"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x8A98A638, types, arraySizes); return &instance; } }; @@ -5725,7 +5724,7 @@ struct TransportRotationMeta { static char const* types = "iif"; static uint8 const arraySizes[3] = { 1, 1, 4 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x27FC8611, types, arraySizes); return &instance; } }; @@ -5736,7 +5735,7 @@ struct TrophyMeta { static char const* types = "shhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xB217955D, types, arraySizes); return &instance; } }; @@ -5747,7 +5746,7 @@ struct UiCamFbackTransmogChrRaceMeta { static char const* types = "hbbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xCC9066D0, types, arraySizes); return &instance; } }; @@ -5758,7 +5757,7 @@ struct UiCamFbackTransmogWeaponMeta { static char const* types = "hbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x23AEBF37, types, arraySizes); return &instance; } }; @@ -5769,7 +5768,7 @@ struct UiCameraMeta { static char const* types = "sfffhbbbi"; static uint8 const arraySizes[9] = { 1, 3, 3, 3, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0xB26544DC, types, arraySizes); return &instance; } }; @@ -5780,7 +5779,7 @@ struct UiCameraTypeMeta { static char const* types = "sii"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x69F34A26, types, arraySizes); return &instance; } }; @@ -5791,7 +5790,7 @@ struct UiMapPOIMeta { static char const* types = "ifiiiii"; static uint8 const arraySizes[7] = { 1, 3, 1, 1, 1, 1, 1 }; - static DB2Meta instance(6, 7, types, arraySizes); + static DB2Meta instance(6, 7, 0xCEED00B2, types, arraySizes); return &instance; } }; @@ -5802,7 +5801,7 @@ struct UiTextureAtlasMeta { static char const* types = "ihh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x6D5738D2, types, arraySizes); return &instance; } }; @@ -5813,7 +5812,7 @@ struct UiTextureAtlasMemberMeta { static char const* types = "shhhhhbb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xFDF0C65B, types, arraySizes); return &instance; } }; @@ -5824,7 +5823,7 @@ struct UiTextureKitMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xC336C8DA, types, arraySizes); return &instance; } }; @@ -5835,7 +5834,7 @@ struct UnitBloodMeta { static char const* types = "shhhiii"; static uint8 const arraySizes[7] = { 5, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0x0C19FB60, types, arraySizes); return &instance; } }; @@ -5846,7 +5845,7 @@ struct UnitBloodLevelsMeta { static char const* types = "b"; static uint8 const arraySizes[1] = { 3 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x24D51F50, types, arraySizes); return &instance; } }; @@ -5857,7 +5856,7 @@ struct UnitConditionMeta { static char const* types = "ibbb"; static uint8 const arraySizes[4] = { 8, 1, 8, 8 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x3F2E499C, types, arraySizes); return &instance; } }; @@ -5868,7 +5867,7 @@ struct UnitPowerBarMeta { static char const* types = "ffiissssffhhbbii"; static uint8 const arraySizes[16] = { 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 16, types, arraySizes); + static DB2Meta instance(-1, 16, 0x4413ED21, types, arraySizes); return &instance; } }; @@ -5879,7 +5878,7 @@ struct VehicleMeta { static char const* types = "iffffffffffffffffffSSSffhhhbb"; static uint8 const arraySizes[29] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 8, 1, 3, 1, 1 }; - static DB2Meta instance(-1, 29, types, arraySizes); + static DB2Meta instance(-1, 29, 0x2AC865D9, types, arraySizes); return &instance; } }; @@ -5890,7 +5889,7 @@ struct VehicleSeatMeta { static char const* types = "iiiffffffffffffffffffffffffffffffihhhhhhhhhhhhhhhhhhhbbbbbbii"; static uint8 const arraySizes[61] = { 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 61, types, arraySizes); + static DB2Meta instance(-1, 61, 0x78C29525, types, arraySizes); return &instance; } }; @@ -5901,7 +5900,7 @@ struct VehicleUIIndSeatMeta { static char const* types = "ffhb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xAD2E69CE, types, arraySizes); return &instance; } }; @@ -5912,7 +5911,7 @@ struct VehicleUIIndicatorMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0xC76F0AED, types, arraySizes); return &instance; } }; @@ -5923,7 +5922,7 @@ struct VideoHardwareMeta { static char const* types = "sshhbbbbbbbbbbiiiiiiii"; static uint8 const arraySizes[22] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(14, 22, types, arraySizes); + static DB2Meta instance(14, 22, 0x28102E83, types, arraySizes); return &instance; } }; @@ -5934,7 +5933,7 @@ struct VignetteMeta { static char const* types = "sffhbii"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xB2E8B652, types, arraySizes); return &instance; } }; @@ -5945,7 +5944,7 @@ struct VocalUISoundsMeta { static char const* types = "bbbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 2 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x7552ABFD, types, arraySizes); return &instance; } }; @@ -5956,7 +5955,7 @@ struct WMOAreaTableMeta { static char const* types = "ishhhhhhhbbbbii"; static uint8 const arraySizes[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(13, 15, types, arraySizes); + static DB2Meta instance(13, 15, 0xBCABACED, types, arraySizes); return &instance; } }; @@ -5967,7 +5966,7 @@ struct WbAccessControlListMeta { static char const* types = "shbbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0xE9DAEF18, types, arraySizes); return &instance; } }; @@ -5978,7 +5977,7 @@ struct WbCertBlacklistMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 20 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0xFF4C7C92, types, arraySizes); return &instance; } }; @@ -5989,7 +5988,7 @@ struct WbCertWhitelistMeta { static char const* types = "sbbb"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x38D49A50, types, arraySizes); return &instance; } }; @@ -6000,7 +5999,7 @@ struct WbPermissionsMeta { static char const* types = "sb"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x3DE53946, types, arraySizes); return &instance; } }; @@ -6011,7 +6010,7 @@ struct WeaponImpactSoundsMeta { static char const* types = "bbbiiii"; static uint8 const arraySizes[7] = { 1, 1, 1, 11, 11, 11, 11 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xA75127FA, types, arraySizes); return &instance; } }; @@ -6022,7 +6021,7 @@ struct WeaponSwingSounds2Meta { static char const* types = "bbi"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x0F38699B, types, arraySizes); return &instance; } }; @@ -6033,7 +6032,7 @@ struct WeaponTrailMeta { static char const* types = "ifffiffff"; static uint8 const arraySizes[9] = { 1, 1, 1, 1, 3, 3, 3, 3, 3 }; - static DB2Meta instance(-1, 9, types, arraySizes); + static DB2Meta instance(-1, 9, 0x0D505BC8, types, arraySizes); return &instance; } }; @@ -6044,7 +6043,7 @@ struct WeaponTrailModelDefMeta { static char const* types = "ihh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0x1C6502AA, types, arraySizes); return &instance; } }; @@ -6055,7 +6054,7 @@ struct WeaponTrailParamMeta { static char const* types = "fffffhbbbb"; static uint8 const arraySizes[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0x30130FBE, types, arraySizes); return &instance; } }; @@ -6066,7 +6065,7 @@ struct WeatherMeta { static char const* types = "fffsfffffhbbbi"; static uint8 const arraySizes[14] = { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 14, types, arraySizes); + static DB2Meta instance(-1, 14, 0x651F8E28, types, arraySizes); return &instance; } }; @@ -6077,7 +6076,7 @@ struct WindSettingsMeta { static char const* types = "fffffffffb"; static uint8 const arraySizes[10] = { 1, 3, 1, 1, 3, 1, 3, 1, 1, 1 }; - static DB2Meta instance(-1, 10, types, arraySizes); + static DB2Meta instance(-1, 10, 0xABCC7A7C, types, arraySizes); return &instance; } }; @@ -6088,7 +6087,7 @@ struct WmoMinimapTextureMeta { static char const* types = "ihhbb"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, types, arraySizes); + static DB2Meta instance(-1, 5, 0x10897820, types, arraySizes); return &instance; } }; @@ -6099,7 +6098,7 @@ struct WorldBossLockoutMeta { static char const* types = "sh"; static uint8 const arraySizes[2] = { 1, 1 }; - static DB2Meta instance(-1, 2, types, arraySizes); + static DB2Meta instance(-1, 2, 0x3E48DAA1, types, arraySizes); return &instance; } }; @@ -6110,7 +6109,7 @@ struct WorldChunkSoundsMeta { static char const* types = "hbbbbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0xFEFA6C76, types, arraySizes); return &instance; } }; @@ -6121,7 +6120,7 @@ struct WorldEffectMeta { static char const* types = "ihhhbb"; static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, types, arraySizes); + static DB2Meta instance(-1, 6, 0x9594D9DD, types, arraySizes); return &instance; } }; @@ -6132,7 +6131,7 @@ struct WorldElapsedTimerMeta { static char const* types = "sbb"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xB57F2FF6, types, arraySizes); return &instance; } }; @@ -6143,7 +6142,7 @@ struct WorldMapAreaMeta { static char const* types = "Sffffhhhhhhbbbbii"; static uint8 const arraySizes[17] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(15, 17, types, arraySizes); + static DB2Meta instance(15, 17, 0x40BE2B6B, types, arraySizes); return &instance; } }; @@ -6154,7 +6153,7 @@ struct WorldMapContinentMeta { static char const* types = "ffffhhbbbbb"; static uint8 const arraySizes[11] = { 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 11, types, arraySizes); + static DB2Meta instance(-1, 11, 0x35915CEF, types, arraySizes); return &instance; } }; @@ -6165,7 +6164,7 @@ struct WorldMapOverlayMeta { static char const* types = "Shhiiiiiiiiii"; static uint8 const arraySizes[13] = { 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 13, types, arraySizes); + static DB2Meta instance(-1, 13, 0x638A31A5, types, arraySizes); return &instance; } }; @@ -6174,9 +6173,9 @@ struct WorldMapTransformsMeta { static DB2Meta const* Instance() { - static char const* types = "fffhhhhb"; - static uint8 const arraySizes[8] = { 6, 2, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static char const* types = "fffhhhhhb"; + static uint8 const arraySizes[9] = { 6, 2, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, 0xBB1EA93A, types, arraySizes); return &instance; } }; @@ -6187,7 +6186,7 @@ struct WorldSafeLocsMeta { static char const* types = "ffsh"; static uint8 const arraySizes[4] = { 3, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0xD3E152D4, types, arraySizes); return &instance; } }; @@ -6198,7 +6197,7 @@ struct WorldStateExpressionMeta { static char const* types = "s"; static uint8 const arraySizes[1] = { 1 }; - static DB2Meta instance(-1, 1, types, arraySizes); + static DB2Meta instance(-1, 1, 0x702F537A, types, arraySizes); return &instance; } }; @@ -6209,7 +6208,7 @@ struct WorldStateUIMeta { static char const* types = "sssssshhhhhbbbbi"; static uint8 const arraySizes[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 }; - static DB2Meta instance(15, 16, types, arraySizes); + static DB2Meta instance(15, 16, 0x41F0EDEA, types, arraySizes); return &instance; } }; @@ -6220,7 +6219,7 @@ struct WorldStateZoneSoundsMeta { static char const* types = "ihhhhhhb"; static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 8, types, arraySizes); + static DB2Meta instance(-1, 8, 0xB746727D, types, arraySizes); return &instance; } }; @@ -6231,7 +6230,7 @@ struct World_PVP_AreaMeta { static char const* types = "hhhhhbb"; static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 7, types, arraySizes); + static DB2Meta instance(-1, 7, 0xD070A163, types, arraySizes); return &instance; } }; @@ -6242,7 +6241,7 @@ struct ZoneIntroMusicTableMeta { static char const* types = "shbi"; static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x6BF0DF5D, types, arraySizes); return &instance; } }; @@ -6253,7 +6252,7 @@ struct ZoneLightMeta { static char const* types = "shh"; static uint8 const arraySizes[3] = { 1, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xFD2DACC3, types, arraySizes); return &instance; } }; @@ -6264,7 +6263,7 @@ struct ZoneLightPointMeta { static char const* types = "fhb"; static uint8 const arraySizes[3] = { 2, 1, 1 }; - static DB2Meta instance(-1, 3, types, arraySizes); + static DB2Meta instance(-1, 3, 0xA2F676B8, types, arraySizes); return &instance; } }; @@ -6275,7 +6274,7 @@ struct ZoneMusicMeta { static char const* types = "siii"; static uint8 const arraySizes[4] = { 1, 2, 2, 2 }; - static DB2Meta instance(-1, 4, types, arraySizes); + static DB2Meta instance(-1, 4, 0x56448249, types, arraySizes); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index a0c54d28ef4..78bebed07d0 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -188,7 +188,7 @@ typedef std::map TaxiPathSetBySource; typedef std::vector TaxiPathNodeList; typedef std::vector TaxiPathNodesByPath; -#define TaxiMaskSize 234 +#define TaxiMaskSize 235 typedef std::array TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index ae1ef3bf598..9f2fbb55d64 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -228,7 +228,7 @@ struct BroadcastTextEntry struct CharSectionsEntry { - uint32 Id; + uint32 ID; uint32 TextureFileDataID[3]; uint16 Flags; uint8 Race; @@ -1452,6 +1452,7 @@ struct LfgDungeonsEntry uint32 Flags; char const* TextureFilename; LocalizedString* Description; + uint32 PlayerConditionID; uint16 MaxLevel; uint16 TargetLevelMax; int16 MapID; @@ -1538,8 +1539,7 @@ struct MapEntry { uint32 ID; char* Directory; - uint32 Flags; - uint32 MapType; + uint32 Flags[2]; float MinimapIconScale; DBCPosition2D CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance) LocalizedString* MapName; @@ -1551,6 +1551,7 @@ struct MapEntry uint16 TimeOfDayOverride; int16 ParentMapID; int16 CosmeticParentMapID; + uint16 WindSettingsID; uint8 InstanceType; uint8 unk5; uint8 ExpansionID; @@ -1585,8 +1586,8 @@ struct MapEntry return ID == 0 || ID == 1 || ID == 530 || ID == 571 || ID == 870 || ID == 1116; } - bool IsDynamicDifficultyMap() const { return (Flags & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; } - bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; } + bool IsDynamicDifficultyMap() const { return (Flags[0] & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; } + bool IsGarrison() const { return (Flags[0] & MAP_FLAG_GARRISON) != 0; } }; struct MapDifficultyEntry @@ -2660,6 +2661,7 @@ struct WorldMapTransformsEntry DBCPosition2D RegionOffset; float RegionScale; uint16 MapID; + uint16 AreaID; uint16 NewMapID; uint16 NewDungeonMapID; uint16 NewAreaID; diff --git a/src/server/shared/DataStores/DB2Meta.cpp b/src/server/shared/DataStores/DB2Meta.cpp index 66c18961551..bf119b52150 100644 --- a/src/server/shared/DataStores/DB2Meta.cpp +++ b/src/server/shared/DataStores/DB2Meta.cpp @@ -17,8 +17,8 @@ #include "DB2Meta.h" -DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, char const* types, uint8 const* arraySizes) - : IndexField(indexField), FieldCount(fieldCount), Types(types), ArraySizes(arraySizes) +DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes) + : IndexField(indexField), FieldCount(fieldCount), LayoutHash(layoutHash), Types(types), ArraySizes(arraySizes) { } diff --git a/src/server/shared/DataStores/DB2Meta.h b/src/server/shared/DataStores/DB2Meta.h index adfdfea37fb..2c165b52d86 100644 --- a/src/server/shared/DataStores/DB2Meta.h +++ b/src/server/shared/DataStores/DB2Meta.h @@ -22,7 +22,7 @@ struct DB2Meta { - DB2Meta(int32 indexField, uint32 fieldCount, char const* types, uint8 const* arraySizes); + DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes); bool HasIndexFieldInData() const; @@ -39,6 +39,7 @@ struct DB2Meta int32 IndexField; uint32 FieldCount; + uint32 LayoutHash; char const* Types; uint8 const* ArraySizes; }; diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp index 721ce6d8813..c6e1c495b00 100644 --- a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -119,6 +119,12 @@ bool DB2SparseFileLoader::Load(const char *filename, DB2Meta const* meta) EndianConvert(layoutHash); + if (layoutHash != meta->LayoutHash) + { + fclose(f); + return false; + } + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { fclose(f); diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index 0f45b75c8d6..fd3e0a257cd 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -119,6 +119,12 @@ bool DB2FileLoader::Load(char const* filename, DB2Meta const* meta) return false; } + if (layoutHash != meta->LayoutHash) + { + fclose(f); + return false; + } + EndianConvert(layoutHash); if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 -- cgit v1.2.3 From d62b52befb1e16e6b854062d974756038c2b6e4e Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 30 May 2016 23:42:09 +0200 Subject: Core/Addons: Removed AddonMgr --- .../2016_xx_xx_xx_characters_legion_05.sql | 2 + .../Database/Implementation/CharacterDatabase.cpp | 1 - .../Database/Implementation/CharacterDatabase.h | 1 - src/server/game/Addons/AddonMgr.cpp | 129 --------------------- src/server/game/Addons/AddonMgr.h | 71 ------------ src/server/game/Server/WorldSession.cpp | 84 -------------- src/server/game/Server/WorldSession.h | 6 - src/server/game/Server/WorldSocket.cpp | 1 - src/server/game/World/World.cpp | 3 - 9 files changed, 2 insertions(+), 296 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_05.sql delete mode 100644 src/server/game/Addons/AddonMgr.cpp delete mode 100644 src/server/game/Addons/AddonMgr.h (limited to 'src/server/database') diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_05.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_05.sql new file mode 100644 index 00000000000..ed820fc55df --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_05.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `addons`; +DROP TABLE IF EXISTS `banned_addons`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 8dbfbb150a7..240337afac8 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -431,7 +431,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, "DELETE FROM character_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD, "DELETE FROM guild_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_ACHIEVMENT, "DELETE FROM character_achievement WHERE achievement = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ADDON, "INSERT INTO addons (name, crc) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_PET_SPELL, "DELETE FROM pet_spell WHERE spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, "DELETE FROM group_instance WHERE instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_GUID, "DELETE FROM group_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 81847f12c58..1941f221eb3 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -348,7 +348,6 @@ enum CharacterDatabaseStatements CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD, CHAR_DEL_INVALID_ACHIEVMENT, - CHAR_INS_ADDON, CHAR_DEL_INVALID_PET_SPELL, CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, CHAR_DEL_GROUP_INSTANCE_BY_GUID, diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp deleted file mode 100644 index 55728de5bd1..00000000000 --- a/src/server/game/Addons/AddonMgr.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "AddonMgr.h" -#include "DatabaseEnv.h" -#include "DB2Stores.h" -#include "Log.h" -#include "Timer.h" - -namespace AddonMgr -{ - -// Anonymous namespace ensures file scope of all the stuff inside it, even -// if you add something more to this namespace somewhere else. -namespace -{ - // List of saved addons (in DB). - typedef std::list SavedAddonsList; - - SavedAddonsList m_knownAddons; - - BannedAddonList m_bannedAddons; -} - -void LoadFromDB() -{ - uint32 oldMSTime = getMSTime(); - - QueryResult result = CharacterDatabase.Query("SELECT name, crc FROM addons"); - if (result) - { - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - - std::string name = fields[0].GetString(); - uint32 crc = fields[1].GetUInt32(); - - m_knownAddons.push_back(SavedAddon(name, crc)); - - ++count; - } - while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u known addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - } - else - TC_LOG_INFO("server.loading", ">> Loaded 0 known addons. DB table `addons` is empty!"); - - oldMSTime = getMSTime(); - result = CharacterDatabase.Query("SELECT id, name, version, UNIX_TIMESTAMP(timestamp) FROM banned_addons"); - if (result) - { - uint32 count = 0; - uint32 dbcMaxBannedAddon = sBannedAddOnsStore.GetNumRows(); - - do - { - Field* fields = result->Fetch(); - - BannedAddon addon; - addon.Id = fields[0].GetUInt32() + dbcMaxBannedAddon; - addon.Timestamp = uint32(fields[3].GetUInt64()); - - std::string name = fields[1].GetString(); - std::string version = fields[2].GetString(); - - MD5(reinterpret_cast(name.c_str()), name.length(), addon.NameMD5); - MD5(reinterpret_cast(version.c_str()), version.length(), addon.VersionMD5); - - m_bannedAddons.push_back(addon); - - ++count; - } - while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u banned addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - } -} - -void SaveAddon(AddonInfo const& addon) -{ - std::string name = addon.Name; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ADDON); - - stmt->setString(0, name); - stmt->setUInt32(1, addon.CRC); - - CharacterDatabase.Execute(stmt); - - m_knownAddons.push_back(SavedAddon(addon.Name, addon.CRC)); -} - -SavedAddon const* GetAddonInfo(const std::string& name) -{ - for (SavedAddonsList::const_iterator it = m_knownAddons.begin(); it != m_knownAddons.end(); ++it) - { - SavedAddon const& addon = (*it); - if (addon.Name == name) - return &addon; - } - - return NULL; -} - -BannedAddonList const* GetBannedAddons() -{ - return &m_bannedAddons; -} - -} // Namespace diff --git a/src/server/game/Addons/AddonMgr.h b/src/server/game/Addons/AddonMgr.h deleted file mode 100644 index 2b50ab7033d..00000000000 --- a/src/server/game/Addons/AddonMgr.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef _ADDONMGR_H -#define _ADDONMGR_H - -#include "Define.h" -#include -#include -#include - -struct AddonInfo -{ - AddonInfo(const std::string& name, uint8 enabled, uint32 crc, uint8 state, bool crcOrPubKey) - : Name(name), Enabled(enabled), CRC(crc), Status(state), UsePublicKeyOrCRC(crcOrPubKey) - { } - - std::string Name; - uint8 Enabled; - uint32 CRC; - uint8 Status; - bool UsePublicKeyOrCRC; -}; - -struct SavedAddon -{ - SavedAddon(std::string const& name, uint32 crc) : Name(name) - { - CRC = crc; - } - - std::string Name; - uint32 CRC; -}; - -struct BannedAddon -{ - uint32 Id; - uint8 NameMD5[MD5_DIGEST_LENGTH]; - uint8 VersionMD5[MD5_DIGEST_LENGTH]; - uint32 Timestamp; -}; - -#define STANDARD_ADDON_CRC 0x4C1C776D - -namespace AddonMgr -{ - void LoadFromDB(); - void SaveAddon(AddonInfo const& addon); - SavedAddon const* GetAddonInfo(const std::string& name); - - typedef std::list BannedAddonList; - BannedAddonList const* GetBannedAddons(); -} - -#endif diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 41141148922..5203cdc1f9b 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -827,89 +827,6 @@ void WorldSession::SaveTutorialsData(SQLTransaction& trans) _tutorialsChanged = false; } -void WorldSession::ReadAddonsInfo(ByteBuffer& data) -{ - if (data.rpos() + 4 > data.size()) - return; - - uint32 size; - data >> size; - - if (!size) - return; - - if (size > 0xFFFFF) - { - TC_LOG_DEBUG("addon", "WorldSession::ReadAddonsInfo: AddOnInfo too big, size %u", size); - return; - } - - uLongf uSize = size; - - uint32 pos = data.rpos(); - - ByteBuffer addonInfo; - addonInfo.resize(size); - - m_addonsList.clear(); - - if (uncompress(addonInfo.contents(), &uSize, data.contents() + pos, data.size() - pos) == Z_OK) - { - uint32 addonsCount; - addonInfo >> addonsCount; // addons count - - for (uint32 i = 0; i < addonsCount; ++i) - { - std::string addonName; - uint8 enabled; - uint32 crc, unk1; - - // check next addon data format correctness - if (addonInfo.rpos() + 1 > addonInfo.size()) - return; - - addonInfo >> addonName; - - addonInfo >> enabled >> crc >> unk1; - - TC_LOG_DEBUG("addon", "AddOn: %s (CRC: 0x%x) - enabled: 0x%x - Unknown2: 0x%x", addonName.c_str(), crc, enabled, unk1); - - AddonInfo addon(addonName, enabled, crc, 2, true); - - SavedAddon const* savedAddon = AddonMgr::GetAddonInfo(addonName); - if (savedAddon) - { - if (addon.CRC != savedAddon->CRC) - TC_LOG_WARN("addon", " Addon: %s: modified (CRC: 0x%x) - accountID %d)", addon.Name.c_str(), savedAddon->CRC, GetAccountId()); - else - TC_LOG_DEBUG("addon", "Addon: %s: validated (CRC: 0x%x) - accountID %d", addon.Name.c_str(), savedAddon->CRC, GetAccountId()); - } - else - { - AddonMgr::SaveAddon(addon); - TC_LOG_WARN("addon", "Addon: %s: unknown (CRC: 0x%x) - accountId %d (storing addon name and checksum to database)", addon.Name.c_str(), addon.CRC, GetAccountId()); - } - - /// @todo Find out when to not use CRC/pubkey, and other possible states. - m_addonsList.push_back(addon); - } - - uint32 currentTime; - addonInfo >> currentTime; - TC_LOG_DEBUG("addon", "AddOn: CurrentTime: %u", currentTime); - } - else - TC_LOG_DEBUG("addon", "AddOn: Addon packet uncompress error!"); -} - -void WorldSession::SendAddonsInfo() -{ - WorldPackets::ClientConfig::AddonInfo addonInfo; - addonInfo.Addons = &m_addonsList; - addonInfo.BannedAddons = AddonMgr::GetBannedAddons(); - SendPacket(addonInfo.Write()); -} - bool WorldSession::IsAddonRegistered(const std::string& prefix) const { if (!_filterAddonMessages) // if we have hit the softcap (64) nothing should be filtered @@ -1234,7 +1151,6 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue SendSetTimeZoneInformation(); SendFeatureSystemStatusGlueScreen(); - SendAddonsInfo(); SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); SendTutorialsData(); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index d58b03ebb2c..53119742c4c 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -25,7 +25,6 @@ #include "Common.h" #include "SharedDefines.h" -#include "AddonMgr.h" #include "DatabaseEnv.h" #include "World.h" #include "Packet.h" @@ -896,8 +895,6 @@ class TC_GAME_API WorldSession bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } bool PlayerDisconnected() const; - void ReadAddonsInfo(ByteBuffer& data); - void SendAddonsInfo(); bool IsAddonRegistered(const std::string& prefix) const; void SendPacket(WorldPacket const* packet, bool forced = false); @@ -1815,8 +1812,6 @@ class TC_GAME_API WorldSession std::unordered_map> _battlenetResponseCallbacks; uint32 _battlenetRequestToken; - typedef std::list AddonsList; - // Warden Warden* _warden; // Remains NULL if Warden system is not enabled by config @@ -1833,7 +1828,6 @@ class TC_GAME_API WorldSession AccountData _accountData[NUM_ACCOUNT_DATA_TYPES]; uint32 _tutorials[MAX_ACCOUNT_TUTORIAL_VALUES]; bool _tutorialsChanged; - AddonsList m_addonsList; std::vector _registeredAddonPrefixes; bool _filterAddonMessages; uint32 recruiterId; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 82acf2b1811..25b7116aa99 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -838,7 +838,6 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptrRealmJoinTicket), account.BattleNet.Id, shared_from_this(), account.Game.Security, account.Game.Expansion, mutetime, account.Game.OS, account.BattleNet.Locale, account.Game.Recruiter, account.Game.IsRectuiter); - _worldSession->ReadAddonsInfo(authSession->AddonInfo); // Initialize Warden system only if it is enabled by config if (wardenActive) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 28dabaefeb6..4262cf11e27 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1941,9 +1941,6 @@ void World::SetInitialWorldSettings() /*TC_LOG_INFO("server.loading", "Loading GM surveys..."); sSupportMgr->LoadSurveys();*/ - TC_LOG_INFO("server.loading", "Loading client addons..."); - AddonMgr::LoadFromDB(); - TC_LOG_INFO("server.loading", "Loading garrison info..."); sGarrisonMgr.Initialize(); -- cgit v1.2.3 From f14c66b5e4c157fa3ba4d18532a274f651d6c741 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 9 Jun 2016 21:33:18 +0200 Subject: Core/Players: Updated talent specializations --- .../2016_xx_xx_xx_characters_legion_06.sql | 9 + .../Database/Implementation/CharacterDatabase.cpp | 14 +- src/server/game/AI/PlayerAI/PlayerAI.cpp | 14 +- src/server/game/Battlegrounds/Battleground.cpp | 2 +- src/server/game/Conditions/ConditionMgr.cpp | 2 +- src/server/game/DataStores/DB2Stores.cpp | 4 +- src/server/game/Entities/Item/ItemTemplate.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 255 +++++++-------------- src/server/game/Entities/Player/Player.h | 56 ++--- src/server/game/Entities/Unit/StatSystem.cpp | 2 +- src/server/game/Handlers/InspectHandler.cpp | 2 +- src/server/game/Handlers/SkillHandler.cpp | 47 ++-- src/server/game/Server/Packets/TalentPackets.cpp | 43 ++-- src/server/game/Server/Packets/TalentPackets.h | 36 +-- src/server/game/Server/Protocol/Opcodes.cpp | 9 +- src/server/game/Server/Protocol/Opcodes.h | 5 +- src/server/game/Server/WorldSession.h | 2 - src/server/game/Spells/Spell.cpp | 4 + src/server/game/Spells/Spell.h | 4 +- src/server/game/Spells/SpellEffects.cpp | 15 +- src/server/game/Spells/SpellInfo.cpp | 2 +- src/server/scripts/Spells/spell_druid.cpp | 2 +- 22 files changed, 210 insertions(+), 321 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_06.sql (limited to 'src/server/database') diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_06.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_06.sql new file mode 100644 index 00000000000..1b6c28cb328 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_06.sql @@ -0,0 +1,9 @@ +-- Force reset all specialization data +-- talents +-- spells +-- spec ids in characters table +TRUNCATE `character_talent`; +DELETE FROM `character_spell` WHERE `spell` IN (10,53,116,133,139,348,527,596,674,689,740,755,770,772,871,879,974,980,1038,1064,1079,1160,1329,1449,1454,1535,1680,1719,1822,1943,1949,2060,2120,2565,2782,2812,2912,2944,2948,3045,3674,5143,5217,5308,5740,6117,6343,6353,6572,6807,7302,8042,8092,8190,8936,10400,11129,11366,12042,12043,12051,12294,12323,12328,12472,12712,12846,12950,12975,12982,13046,13750,13877,14117,14161,14183,14190,14914,15286,15407,15473,15487,16196,16213,16282,16511,16864,16931,16949,16974,17007,17073,17364,17877,17962,18562,19387,19434,19574,19596,19623,19750,20113,20154,20164,20243,20473,20711,20782,22570,22812,23588,23881,23922,24858,26573,27243,29000,29144,29722,30108,30146,30451,30455,30482,30814,30823,31220,31223,31589,31661,31687,31801,31821,31842,31850,31868,31884,31935,32379,32546,32645,33206,33605,33745,33757,33763,33873,34026,34483,34861,34914,34954,35110,35551,44425,44448,44549,44572,45243,46584,46915,46917,46953,47515,47517,47536,47540,47585,47788,48181,48438,48484,48500,48505,48982,49020,49028,49143,49184,49206,49222,49509,49530,49572,49868,50029,50034,50371,50385,50392,50887,51128,51160,51271,51490,51505,51522,51530,51533,51564,51667,51690,51701,51713,51723,52127,52610,52798,53184,53209,53253,53260,53270,53301,53351,53385,53478,53480,53482,53490,53497,53503,53551,53563,53576,53592,53595,53600,53651,54637,55090,55233,55453,55610,55709,56222,56315,56835,58423,58875,59057,60103,60188,61295,61329,61336,61684,61685,61688,61882,62099,62606,62618,63458,63560,63733,63900,64044,64843,66192,73510,73680,73685,74434,76547,76613,76657,76658,76659,76669,76671,76672,76803,76806,76808,76838,76856,76857,77130,77215,77219,77220,77223,77226,77472,77484,77485,77486,77492,77493,77495,77513,77514,77515,77756,77767,78203,78674,78675,79134,79140,79147,79152,79206,79577,79684,80240,81099,81127,81136,81164,81206,81208,81209,81333,81662,81700,81749,82326,82327,82692,84601,84608,84617,84654,84714,85043,85101,85222,85256,85288,85948,86093,86096,86097,86099,86100,86101,86102,86103,86104,86108,86110,86113,86121,86535,86536,86537,86539,86629,86659,87138,87336,87935,88423,88625,88747,88766,88821,91023,91107,92364,93399,95649,95740,95860,95861,95862,97462,98008,100130,101545,102342,103103,103958,104315,105174,105424,105805,106732,106733,106734,106735,106785,106839,106952,107428,108280,108299,108558,108647,108683,108853,108869,109145,109151,109784,111240,111546,112071,112857,112858,112859,112965,113043,113656,113858,113860,113861,114050,114051,114052,114192,114592,114635,114664,114866,115069,115070,115151,115175,115176,115180,115181,115288,115294,115295,115308,115310,115313,115315,115451,115460,115636,115768,115869,115921,115939,116092,116095,116346,116645,116670,116680,116740,116781,116849,116852,116858,117197,117198,117216,117896,117906,117907,117967,118038,119072,119582,120224,120225,120227,120451,121152,121196,121253,121278,121783,122098,122351,122470,122509,123099,123766,123980,124146,124502,124682,124913,126060,126086,126135,127663,128595,128938,130735,131086,132157,132158,135288,137006,137007,137008,137010,137011,137012,137013,137015,137016,137017,137019,137020,137021,137023,137024,137025,137027,137028,137029,137031,137032,137033,137035,137036,137037,137039,137040,137041,137043,137044,137046,137048,137049,137050,137384,137639,139598,140333,145205,145518,148040,154436,154555,155522,155783,156843,157444,157445,157447,158298,158920,159195,159232,159362,159374,161608,161797,161798,161800,162697,162698,162699,162700,162701,162702,163201,163952,164856,165201,165357,165359,165360,165362,165363,165365,165367,165368,165370,165372,165374,165375,165376,165378,165379,165380,165381,165383,165386,165387,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165462,166142,166163,166221,166916,167105,167187,167188,170374,174597,174926,177851,179333); +UPDATE `characters` SET `talentTree`='0', `at_login`=`at_login`|0x14; +ALTER TABLE `characters` CHANGE `talentTree` `primarySpecialization` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `characters` DROP `talentGroupsCount`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 240337afac8..7d8023fa272 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -77,9 +77,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " - "resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "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, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " + "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " "FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); @@ -391,17 +391,17 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " "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, talentTree, " + "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, latency, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) 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=?,bankSlots=?,restState=?,playerFlags=?," "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=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp index 006cbd07116..dffc49949a3 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -41,13 +41,13 @@ bool PlayerAI::IsPlayerHealer(Player const* who) default: return false; case CLASS_PALADIN: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_PALADIN_HOLY; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_PALADIN_HOLY; case CLASS_PRIEST: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_PRIEST_DISCIPLINE || who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_PRIEST_HOLY; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_PRIEST_DISCIPLINE || who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_PRIEST_HOLY; case CLASS_SHAMAN: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_SHAMAN_RESTORATION; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_SHAMAN_RESTORATION; case CLASS_DRUID: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_DRUID_RESTORATION; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_DRUID_RESTORATION; } } @@ -74,11 +74,11 @@ bool PlayerAI::IsPlayerRangedAttacker(Player const* who) return false; } case CLASS_PRIEST: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_PRIEST_SHADOW; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_PRIEST_SHADOW; case CLASS_SHAMAN: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_SHAMAN_ELEMENTAL; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_SHAMAN_ELEMENTAL; case CLASS_DRUID: - return who->GetSpecId(who->GetActiveTalentGroup()) == TALENT_SPEC_DRUID_BALANCE; + return who->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == TALENT_SPEC_DRUID_BALANCE; } } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 8a5cc02bcf6..825a56820f2 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1089,7 +1089,7 @@ void Battleground::AddPlayer(Player* player) BattlegroundPlayer bp; bp.OfflineRemoveTime = 0; bp.Team = team; - bp.ActiveSpec = player->GetSpecId(player->GetActiveTalentGroup()); + bp.ActiveSpec = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); // Add to list/maps m_Players[player->GetGUID()] = bp; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 79d05ecb2bb..a052d4d44d4 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2397,7 +2397,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player* player, PlayerConditionEntry if (condition->ChrSpecializationIndex >= 0 || condition->ChrSpecializationRole >= 0) { - if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(player->GetSpecId(player->GetActiveTalentGroup()))) + if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) { if (condition->ChrSpecializationIndex >= 0 && spec->OrderIndex != uint32(condition->ChrSpecializationIndex)) return false; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2ef4a85c679..ff6fb779650 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -711,8 +711,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (TalentEntry const* talentInfo : sTalentStore) { ASSERT(talentInfo->ClassID < MAX_CLASSES); - ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", MAX_TALENT_TIERS); - ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", MAX_TALENT_COLUMNS); + ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", talentInfo->TierID); + ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", talentInfo->ColumnIndex); _talentsByPosition[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo); } diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index 67f683849a9..e33bea37e54 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -218,7 +218,7 @@ bool ItemTemplate::CanWinForPlayer(Player const* player) const if (specs.empty()) return true; - uint32 spec = player->GetSpecId(player->GetActiveTalentGroup()); + uint32 spec = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); if (!spec) spec = player->GetDefaultSpecId(); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2f626fc39ea..fd96b65b2cf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2510,12 +2510,6 @@ void Player::InitTalentForLevel() } else { - if (level < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL) || GetTalentGroupsCount() == 0) - { - SetTalentGroupsCount(1); - SetActiveTalentGroup(0); - } - if (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED)) for (uint32 t = talentTiers; t < MAX_TALENT_TIERS; ++t) for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) @@ -3227,7 +3221,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const bool Player::IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const { - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) return spellInfo->Id == chrSpec->MasterySpellID[0] || spellInfo->Id == chrSpec->MasterySpellID[1]; return false; @@ -13303,8 +13297,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool break; } case GOSSIP_OPTION_LEARNDUALSPEC: - if (!(GetTalentGroupsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)))) - canTalk = false; + canTalk = false; break; case GOSSIP_OPTION_UNLEARNTALENTS: if (!creature->isCanTrainingAndResetTalentsOf(this)) @@ -13508,16 +13501,6 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men GetSession()->SendTrainerList(guid); break; case GOSSIP_OPTION_LEARNDUALSPEC: - if (GetTalentGroupsCount() == 1 && getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)) - { - // Cast spells that teach dual spec - // Both are also ImplicitTarget self and must be cast by player - CastSpell(this, 63680, true, nullptr, nullptr, GetGUID()); - CastSpell(this, 63624, true, nullptr, nullptr, GetGUID()); - - // Should show another Gossip text with "Congratulations..." - PlayerTalkClass->SendCloseGossip(); - } break; case GOSSIP_OPTION_UNLEARNTALENTS: PlayerTalkClass->SendCloseGossip(); @@ -16285,12 +16268,12 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //"SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " // 20 21 22 23 24 25 26 27 28 29 30 31 32 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " - // 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 - //"resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + // 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 + //"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, " // 48 49 50 51 52 53 //"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - // 54 55 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, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " + // 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 + //"health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " // //"FROM characters WHERE guid = ?", CONNECTION_ASYNC); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); @@ -16360,8 +16343,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[65].GetString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[67].GetString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2); + _LoadIntoDataField(fields[64].GetString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[65].GetString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2); SetObjectScale(1.0f); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); @@ -16403,7 +16386,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[68].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[66].GetUInt8()); InitDisplayIds(); @@ -16439,8 +16422,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) uint32 instanceId = fields[61].GetUInt32(); SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[47].GetUInt8()))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[70].GetUInt8()))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[71].GetUInt8()))); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[68].GetUInt8()))); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[69].GetUInt8()))); std::string taxi_nodes = fields[46].GetString(); @@ -16751,6 +16734,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetTalentResetCost(fields[32].GetUInt32()); SetTalentResetTime(time_t(fields[33].GetUInt32())); + SetPrimarySpecialization(fields[34].GetUInt32()); + ChrSpecializationEntry const* primarySpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()); + if (!primarySpec || primarySpec->ClassID != getClass()) + SetPrimarySpecialization(0); m_taxi.LoadTaxiMask(fields[25].GetString()); // must be before InitTaxiNodesForLevel @@ -16833,42 +16820,29 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadSkills(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS)); UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load - SetTalentGroupsCount(fields[62].GetUInt8()); - SetActiveTalentGroup(fields[63].GetUInt8()); + SetActiveTalentGroup(fields[62].GetUInt8()); - uint32 lootSpecId = fields[64].GetUInt32(); + uint32 lootSpecId = fields[63].GetUInt32(); if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(lootSpecId)) - { if (chrSpec->ClassID == getClass()) SetLootSpecId(lootSpecId); - } // sanity check - if (GetTalentGroupsCount() > MAX_TALENT_GROUPS || GetActiveTalentGroup() > MAX_TALENT_GROUP || GetTalentGroupsCount() < MIN_TALENT_GROUPS) + if (GetActiveTalentGroup() >= MAX_SPECIALIZATIONS) { - TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player %s (%s) has invalid SpecCount = %u and/or invalid ActiveSpec = %u.", - GetName().c_str(), GetGUID().ToString().c_str(), GetTalentGroupsCount(), GetActiveTalentGroup()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player %s (%s) has invalid invalid ActiveSpec = %u.", + GetName().c_str(), GetGUID().ToString().c_str(), GetActiveTalentGroup()); SetActiveTalentGroup(0); } - // Only load selected specializations, learning mastery spells requires this - Tokenizer talentSpecs(fields[34].GetString(), ' ', MAX_TALENT_GROUPS); - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) + if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), GetActiveTalentGroup())) { - if (i >= talentSpecs.size()) - break; - - uint32 talentSpec = atoul(talentSpecs[i]); - if (talentSpec) - { - if (sChrSpecializationStore.LookupEntry(talentSpec)) - SetSpecId(i, talentSpec); - else - SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); - } + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); + if (!GetPrimarySpecialization()) + SetPrimarySpecialization(spec->ID); } - - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, GetSpecId(GetActiveTalentGroup())); + else + ResetTalentSpecialization(); _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); @@ -17012,7 +16986,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[69].GetUInt8(); + m_grantableLevels = fields[67].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -18598,11 +18572,7 @@ void Player::SaveToDB(bool create /*=false*/) //save, but in tavern/city stmt->setUInt32(index++, GetTalentResetCost()); stmt->setUInt32(index++, GetTalentResetTime()); - - ss.str(""); - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - ss << GetSpecId(i) << " "; - stmt->setString(index++, ss.str()); + stmt->setUInt32(index++, GetPrimarySpecialization()); stmt->setUInt16(index++, (uint16)m_ExtraFlags); stmt->setUInt8(index++, m_stableSlots); stmt->setUInt16(index++, (uint16)m_atLoginFlags); @@ -18637,7 +18607,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -18744,11 +18713,7 @@ void Player::SaveToDB(bool create /*=false*/) //save, but in tavern/city stmt->setUInt32(index++, GetTalentResetCost()); stmt->setUInt32(index++, GetTalentResetTime()); - - ss.str(""); - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - ss << GetSpecId(i) << " "; - stmt->setString(index++, ss.str()); + stmt->setUInt32(index++, GetPrimarySpecialization()); stmt->setUInt16(index++, (uint16)m_ExtraFlags); stmt->setUInt8(index++, m_stableSlots); stmt->setUInt16(index++, (uint16)m_atLoginFlags); @@ -18783,7 +18748,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -24614,22 +24578,33 @@ bool Player::ModifierTreeSatisfied(uint32 modifierTreeId) const return m_achievementMgr->ModifierTreeSatisfied(modifierTreeId); } -bool Player::LearnTalent(uint32 talentId) +TalentLearnResult Player::LearnTalent(uint32 talentId, int32* spellOnCooldown) { + if (IsInCombat()) + return TALENT_FAILED_AFFECTING_COMBAT; + + if (isDead() || GetMap()->IsBattlegroundOrArena()) + return TALENT_FAILED_CANT_DO_THAT_RIGHT_NOW; + + if (!GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) + return TALENT_FAILED_NO_PRIMARY_TREE_SELECTED; + TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); if (!talentInfo) - return false; + return TALENT_FAILED_UNKNOWN; - if (talentInfo->SpecID && talentInfo->SpecID != GetSpecId(GetActiveTalentGroup())) - return false; + if (talentInfo->SpecID && talentInfo->SpecID != GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) + return TALENT_FAILED_UNKNOWN; // prevent learn talent for different class (cheating) if (talentInfo->ClassID != getClass()) - return false; + return TALENT_FAILED_UNKNOWN; // check if we have enough talent points if (talentInfo->TierID >= GetUInt32Value(PLAYER_FIELD_MAX_TALENT_TIERS)) - return false; + return TALENT_FAILED_UNKNOWN; + + // TODO: prevent changing talents that are on cooldown // Check if there is a different talent for us to learn in selected slot // Example situation: @@ -24642,7 +24617,7 @@ bool Player::LearnTalent(uint32 talentId) { if (!talent->SpecID) bestSlotMatch = talent; - else if (talent->SpecID == GetSpecId(GetActiveTalentGroup())) + else if (talent->SpecID == GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) { bestSlotMatch = talent; break; @@ -24650,63 +24625,53 @@ bool Player::LearnTalent(uint32 talentId) } if (talentInfo != bestSlotMatch) - return false; + return TALENT_FAILED_UNKNOWN; // Check if player doesn't have any talent in current tier for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) + { for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, c)) - if (HasTalent(talent->ID, GetActiveTalentGroup())) - return false; + { + if (HasTalent(talent->ID, GetActiveTalentGroup()) && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC)) + return TALENT_FAILED_REST_AREA; + + if (GetSpellHistory()->HasCooldown(talent->SpellID)) + { + *spellOnCooldown = talent->SpellID; + return TALENT_FAILED_CANT_REMOVE_TALENT; + } + + RemoveTalent(talent); + } + } // spell not set in talent.dbc uint32 spellid = talentInfo->SpellID; if (!spellid) { TC_LOG_ERROR("entities.player", "Player::LearnTalent: Talent.dbc has no spellInfo for talent: %u (spell id = 0)", talentId); - return false; + return TALENT_FAILED_UNKNOWN; } // already known if (HasTalent(talentId, GetActiveTalentGroup()) || HasSpell(spellid)) - return false; + return TALENT_FAILED_UNKNOWN; if (!AddTalent(talentInfo, GetActiveTalentGroup(), true)) - return false; + return TALENT_FAILED_UNKNOWN; LearnSpell(spellid, false); TC_LOG_DEBUG("misc", "Player::LearnTalent: TalentID: %u Spell: %u Group: %u\n", talentId, spellid, GetActiveTalentGroup()); - return true; -} - -void Player::LearnTalentSpecialization(uint32 talentSpec) -{ - if (GetSpecId(GetActiveTalentGroup())) - return; - - SetSpecId(GetActiveTalentGroup(), talentSpec); - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, talentSpec); - - // Reset only talents that have different spells for each spec - uint32 class_ = getClass(); - for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t) - for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1) - for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c)) - RemoveTalent(talent); - - LearnSpecializationSpells(); - SendTalentsInfoData(); - UpdateItemSetAuras(false); + return TALENT_LEARN_OK; } void Player::ResetTalentSpecialization() { - if (!GetSpecId(GetActiveTalentGroup())) + if (!GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) return; - SetSpecId(GetActiveTalentGroup(), 0); SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0); // Reset only talents that have different spells for each spec @@ -24791,16 +24756,17 @@ bool Player::CanSeeSpellClickOn(Creature const* c) const void Player::SendTalentsInfoData() { WorldPackets::Talent::UpdateTalentData packet; - + packet.Info.PrimarySpecialization = GetPrimarySpecialization(); packet.Info.ActiveGroup = GetActiveTalentGroup(); - uint8 groupsCount = GetTalentGroupsCount(); - - for (uint8 i = 0; i < groupsCount; ++i) + for (uint8 i = 0; i < MAX_SPECIALIZATIONS; ++i) { - WorldPackets::Talent::TalentGroupInfo groupInfoPkt; + ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), i); + if (!spec) + continue; - groupInfoPkt.SpecID = GetSpecId(i); + WorldPackets::Talent::TalentGroupInfo groupInfoPkt; + groupInfoPkt.SpecID = spec->ID; groupInfoPkt.TalentIDs.reserve(GetTalentMap(i)->size()); for (PlayerTalentMap::const_iterator itr = GetTalentMap(i)->begin(); itr != GetTalentMap(i)->end(); ++itr) @@ -25048,58 +25014,9 @@ void Player::_SaveTalents(SQLTransaction& trans) } } -void Player::UpdateTalentGroupCount(uint8 count) +void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) { - uint32 curCount = GetTalentGroupsCount(); - if (curCount == count) - return; - - if (GetActiveTalentGroup() >= count) - ActivateTalentGroup(0); - - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - PreparedStatement* stmt; - - // Copy spec data - if (count > curCount) - { - _SaveActions(trans); // make sure the button list is cleaned up - for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end(); ++itr) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt8(1, 1); - stmt->setUInt8(2, itr->first); - stmt->setUInt32(3, itr->second.GetAction()); - stmt->setUInt8(4, uint8(itr->second.GetType())); - trans->Append(stmt); - } - } - // Delete spec data for removed spec. - else if (count < curCount) - { - _SaveActions(trans); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC); - stmt->setUInt8(0, GetActiveTalentGroup()); - stmt->setUInt64(1, GetGUID().GetCounter()); - trans->Append(stmt); - - } - - CharacterDatabase.CommitTransaction(trans); - - SetTalentGroupsCount(count); - - SendTalentsInfoData(); -} - -void Player::ActivateTalentGroup(uint8 spec) -{ - if (GetActiveTalentGroup() == spec) - return; - - if (spec > GetTalentGroupsCount()) + if (GetActiveTalentGroup() == spec->OrderIndex) return; if (IsNonMeleeSpellCast(false)) @@ -25160,8 +25077,10 @@ void Player::ActivateTalentGroup(uint8 spec) // Remove spec specific spells RemoveSpecializationSpells(); - SetActiveTalentGroup(spec); - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, GetSpecId(spec)); + SetActiveTalentGroup(spec->OrderIndex); + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); + if (!GetPrimarySpecialization()) + SetPrimarySpecialization(spec->ID); for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { @@ -25188,10 +25107,9 @@ void Player::ActivateTalentGroup(uint8 spec) LearnSpecializationSpells(); if (CanUseMastery()) - if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (uint32 mastery = specialization->MasterySpellID[i]) - LearnSpell(mastery, false); + for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) + if (uint32 mastery = spec->MasterySpellID[i]) + LearnSpell(mastery, false); InitTalentForLevel(); @@ -25211,9 +25129,6 @@ void Player::ActivateTalentGroup(uint8 spec) SetPower(pw, 0); UpdateItemSetAuras(false); - - if (!sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - ResetTalents(true); } void Player::ResetTimeSync() @@ -25850,7 +25765,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy bool Player::CanUseMastery() const { - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) return HasSpell(chrSpec->MasterySpellID[0]) || HasSpell(chrSpec->MasterySpellID[1]); return false; @@ -26068,7 +25983,7 @@ void Player::RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) void Player::LearnSpecializationSpells() { - if (std::vector const* specSpells = sDB2Manager.GetSpecializationSpells(GetSpecId(GetActiveTalentGroup()))) + if (std::vector const* specSpells = sDB2Manager.GetSpecializationSpells(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) { for (size_t j = 0; j < specSpells->size(); ++j) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5bee6c6c117..e46712d0580 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1136,42 +1136,38 @@ struct ResurrectionData uint32 Aura; }; +enum TalentLearnResult +{ + TALENT_LEARN_OK = 0, + TALENT_FAILED_UNKNOWN = 1, + TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 2, + TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 3, + TALENT_FAILED_CANT_DO_THAT_RIGHT_NOW = 4, + TALENT_FAILED_AFFECTING_COMBAT = 5, + TALENT_FAILED_CANT_REMOVE_TALENT = 6, + TALENT_FAILED_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 7, + TALENT_FAILED_REST_AREA = 8 +}; + static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 }; struct TC_GAME_API PlayerTalentInfo { - PlayerTalentInfo() : - ResetTalentsCost(0), ResetTalentsTime(0), - ActiveGroup(0), GroupsCount(1) - { - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - { - GroupInfo[i].Talents = new PlayerTalentMap(); - GroupInfo[i].SpecId = 0; - } - } - - ~PlayerTalentInfo() + PlayerTalentInfo() : ResetTalentsCost(0), ResetTalentsTime(0), PrimarySpecialization(0), ActiveGroup(0) { - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - delete GroupInfo[i].Talents; } - struct TalentGroupInfo - { - PlayerTalentMap* Talents; - uint32 SpecId; - } GroupInfo[MAX_TALENT_GROUPS]; - + PlayerTalentMap Talents[MAX_SPECIALIZATIONS]; uint32 ResetTalentsCost; time_t ResetTalentsTime; + uint32 PrimarySpecialization; uint8 ActiveGroup; - uint8 GroupsCount; private: - PlayerTalentInfo(PlayerTalentInfo const&); + PlayerTalentInfo(PlayerTalentInfo const&) = delete; + PlayerTalentInfo& operator=(PlayerTalentInfo const&) = delete; }; class TC_GAME_API Player : public Unit, public GridObject @@ -1753,32 +1749,28 @@ class TC_GAME_API Player : public Unit, public GridObject void SetTalentResetCost(uint32 cost) { _talentMgr->ResetTalentsCost = cost; } time_t GetTalentResetTime() const { return _talentMgr->ResetTalentsTime; } void SetTalentResetTime(time_t time_) { _talentMgr->ResetTalentsTime = time_; } - uint32 GetSpecId(uint8 group) const { return _talentMgr->GroupInfo[group].SpecId; } - void SetSpecId(uint8 group, uint32 tree) { _talentMgr->GroupInfo[group].SpecId = tree; } + uint32 GetPrimarySpecialization() const { return _talentMgr->PrimarySpecialization; } + void SetPrimarySpecialization(uint32 spec) { _talentMgr->PrimarySpecialization = spec; } uint8 GetActiveTalentGroup() const { return _talentMgr->ActiveGroup; } void SetActiveTalentGroup(uint8 group){ _talentMgr->ActiveGroup = group; } - uint8 GetTalentGroupsCount() const { return _talentMgr->GroupsCount; } - void SetTalentGroupsCount(uint8 count) { _talentMgr->GroupsCount = count; } uint32 GetDefaultSpecId() const; bool ResetTalents(bool noCost = false); uint32 GetNextResetTalentsCost() const; void InitTalentForLevel(); void SendTalentsInfoData(); - bool LearnTalent(uint32 talentId); + TalentLearnResult LearnTalent(uint32 talentId, int32* spellOnCooldown); bool AddTalent(TalentEntry const* talent, uint8 spec, bool learning); bool HasTalent(uint32 spell_id, uint8 spec) const; void RemoveTalent(TalentEntry const* talent); uint32 CalculateTalentsTiers() const; - void LearnTalentSpecialization(uint32 talentSpec); void ResetTalentSpecialization(); // Dual Spec - void UpdateTalentGroupCount(uint8 count); - void ActivateTalentGroup(uint8 group); + void ActivateTalentGroup(ChrSpecializationEntry const* spec); - PlayerTalentMap const* GetTalentMap(uint8 spec) const { return _talentMgr->GroupInfo[spec].Talents; } - PlayerTalentMap* GetTalentMap(uint8 spec) { return _talentMgr->GroupInfo[spec].Talents; } + PlayerTalentMap const* GetTalentMap(uint8 spec) const { return &_talentMgr->Talents[spec]; } + PlayerTalentMap* GetTalentMap(uint8 spec) { return &_talentMgr->Talents[spec]; } ActionButtonList const& GetActionButtons() const { return m_actionButtons; } uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS); } diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 447169a28d0..c3b8ef8e07e 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -534,7 +534,7 @@ void Player::UpdateMastery() value += GetRatingBonusValue(CR_MASTERY); SetFloatValue(PLAYER_MASTERY, value); - ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup())); + ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)); if (!chrSpec) return; diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index 3ac39c2d500..02746109348 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -69,7 +69,7 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) } inspectResult.InspecteeGUID = inspect.Target; - inspectResult.SpecializationID = player->GetSpecId(player->GetActiveTalentGroup()); + inspectResult.SpecializationID = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); SendPacket(inspectResult.Write()); } diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 3596eee68f6..e9fafac5d1d 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -28,10 +28,23 @@ void WorldSession::HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet) { + WorldPackets::Talent::LearnTalentsFailed learnTalentsFailed; bool anythingLearned = false; for (uint32 talentId : packet.Talents) - if (_player->LearnTalent(talentId)) + { + if (TalentLearnResult result = _player->LearnTalent(talentId, &learnTalentsFailed.SpellID)) + { + if (!learnTalentsFailed.Reason) + learnTalentsFailed.Reason = result; + + learnTalentsFailed.Talents.push_back(talentId); + } + else anythingLearned = true; + } + + if (learnTalentsFailed.Reason) + SendPacket(learnTalentsFailed.Write()); if (anythingLearned) _player->SendTalentsInfoData(); @@ -77,35 +90,3 @@ void WorldSession::HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& GetPlayer()->SetSkill(packet.SkillLine, 0, 0, 0); } - -void WorldSession::HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet) -{ - Player* player = GetPlayer(); - - if (packet.SpecGroupIndex >= MAX_SPECIALIZATIONS) - { - TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization index %u out of range", packet.SpecGroupIndex); - return; - } - - ChrSpecializationEntry const* chrSpec = sDB2Manager.GetChrSpecializationByIndex(player->getClass(), packet.SpecGroupIndex); - if (!chrSpec) - { - TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization index %u not found", packet.SpecGroupIndex); - return; - } - - if (chrSpec->ClassID != player->getClass()) - { - TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - specialization %u does not belong to class %u", chrSpec->ID, player->getClass()); - return; - } - - if (player->getLevel() < MIN_SPECIALIZATION_LEVEL) - { - TC_LOG_DEBUG("network", "WORLD: HandleSetSpecializationOpcode - player level too low for specializations"); - return; - } - - player->LearnTalentSpecialization(chrSpec->ID); -} diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index bc7b6aec20c..1069b8a89f7 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -19,41 +19,31 @@ WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write() { - _worldPacket << Info.ActiveGroup; + _worldPacket << uint8(Info.ActiveGroup); + _worldPacket << uint32(Info.PrimarySpecialization); _worldPacket << uint32(Info.TalentGroups.size()); for (auto& talentGroupInfo : Info.TalentGroups) { - _worldPacket << talentGroupInfo.SpecID; + _worldPacket << uint32(talentGroupInfo.SpecID); _worldPacket << uint32(talentGroupInfo.TalentIDs.size()); - - //for (uint32 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i) - // _worldPacket << talentGroupInfo.GlyphIDs[i]; + _worldPacket << uint32(talentGroupInfo.PvPTalentIDs.size()); for (uint16 talentID : talentGroupInfo.TalentIDs) - _worldPacket << talentID; + _worldPacket << uint16(talentID); + + for (uint16 talentID : talentGroupInfo.PvPTalentIDs) + _worldPacket << uint16(talentID); } return &_worldPacket; } -void WorldPackets::Talent::SetSpecialization::Read() -{ - _worldPacket >> SpecGroupIndex; -} - - void WorldPackets::Talent::LearnTalents::Read() { - uint32 count; - _worldPacket >> count; - - for (uint32 i = 0; i < count; ++i) - { - uint16 talent; - _worldPacket >> talent; - Talents.push_back(talent); - } + Talents.resize(_worldPacket.ReadBits(6)); + for (uint32 i = 0; i < Talents.size(); ++i) + _worldPacket >> Talents[i]; } WorldPacket const* WorldPackets::Talent::RespecWipeConfirm::Write() @@ -69,3 +59,14 @@ void WorldPackets::Talent::ConfirmRespecWipe::Read() _worldPacket >> RespecMaster; _worldPacket >> RespecType; } + +WorldPacket const* WorldPackets::Talent::LearnTalentsFailed::Write() +{ + _worldPacket.WriteBits(Reason, 4); + _worldPacket << int32(SpellID); + _worldPacket << uint32(Talents.size()); + if (!Talents.empty()) + _worldPacket.append(Talents.data(), Talents.size()); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index 9e09605b362..57893bb94a4 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -19,6 +19,7 @@ #define TalentPackets_h__ #include "Packet.h" +#include "PacketUtilities.h" #include "Player.h" namespace WorldPackets @@ -27,14 +28,15 @@ namespace WorldPackets { struct TalentGroupInfo { - uint32 SpecID; + uint32 SpecID = 0; std::vector TalentIDs; - //uint16 GlyphIDs[MAX_GLYPH_SLOT_INDEX]; + std::vector PvPTalentIDs; }; struct TalentInfoUpdate { - uint8 ActiveGroup; + uint8 ActiveGroup = 0; + uint32 PrimarySpecialization = 0; std::vector TalentGroups; }; @@ -48,26 +50,13 @@ namespace WorldPackets TalentInfoUpdate Info; }; - class SetSpecialization final : public ClientPacket - { - public: - SetSpecialization(WorldPacket&& packet) : ClientPacket(CMSG_SET_SPECIALIZATION, std::move(packet)) { } - - void Read() override; - - uint32 SpecGroupIndex = 0; - }; - class LearnTalents final : public ClientPacket { public: - LearnTalents(WorldPacket&& packet) : ClientPacket(std::move(packet)) - { - ASSERT(packet.GetOpcode() == CMSG_LEARN_TALENTS); - } + LearnTalents(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_TALENTS, std::move(packet)) { } void Read() override; - std::vector Talents; + Array Talents; }; class RespecWipeConfirm final : public ServerPacket @@ -93,6 +82,17 @@ namespace WorldPackets uint8 RespecType = 0; }; + class LearnTalentsFailed final : public ServerPacket + { + public: + LearnTalentsFailed() : ServerPacket(SMSG_LEARN_TALENTS_FAILED, 1 + 4 + 4 + 2 * MAX_TALENT_TIERS) { } + + WorldPacket const* Write() override; + + uint32 Reason = 0; + int32 SpellID = 0; + std::vector Talents; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ca6f86e8a18..8cd8dd7cd84 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -428,7 +428,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); + DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode); DEFINE_HANDLER(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_APPLY_TO_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -701,7 +701,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); DEFINE_HANDLER(CMSG_SET_SHEATHED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::SetSheathed, &WorldSession::HandleSetSheathedOpcode); DEFINE_HANDLER(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_HANDLER(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::SetTaxiBenchmarkMode, &WorldSession::HandleSetTaxiBenchmark); DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetTitle, &WorldSession::HandleSetTitleOpcode); DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode); @@ -1234,8 +1233,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENTS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UP_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1696,7 +1695,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TALENT_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TALENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 571a1473aa1..d6ce4971a15 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -736,7 +736,6 @@ enum OpcodeClient : uint32 CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0xBADD, CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0xBADD, CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0xBADD, - CMSG_SET_SPECIALIZATION = 0xBADD, }; enum OpcodeServer : uint32 @@ -1174,8 +1173,8 @@ enum OpcodeServer : uint32 SMSG_ITEM_TIME_UPDATE = 0x2793, SMSG_KICK_REASON = 0x2821, SMSG_LEARNED_SPELLS = 0x2C4C, - SMSG_LEARN_PVP_TALENT_FAILED = 0x25E7, - SMSG_LEARN_TALENT_FAILED = 0x25E6, + SMSG_LEARN_PVP_TALENTS_FAILED = 0x25E7, + SMSG_LEARN_TALENTS_FAILED = 0x25E6, SMSG_LEVEL_UPDATE = 0x2587, SMSG_LEVEL_UP_INFO = 0x271C, SMSG_LFG_BOOT_PLAYER = 0x2A36, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 53119742c4c..5b06c9ce03f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -613,7 +613,6 @@ namespace WorldPackets namespace Talent { - class SetSpecialization; class LearnTalents; class ConfirmRespecWipe; } @@ -1433,7 +1432,6 @@ class TC_GAME_API WorldSession void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet); void HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe); void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet); - void HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet); void HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet); void HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& packet); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c0746016ff1..8aa8bfc404d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5404,6 +5404,10 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_TALENT_SPEC_SELECT: { + ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(m_misc.SpecializationId); + if (!spec || spec->ClassID != m_caster->getClass()) + return SPELL_FAILED_NO_SPEC; + // can't change during already started arena/battleground if (m_caster->GetTypeId() == TYPEID_PLAYER) if (Battleground const* bg = m_caster->ToPlayer()->GetBattleground()) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 523796eb56d..5917ed512c3 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -430,7 +430,6 @@ class TC_GAME_API Spell void EffectTitanGrip(SpellEffIndex effIndex); void EffectEnchantItemPrismatic(SpellEffIndex effIndex); void EffectPlayMusic(SpellEffIndex effIndex); - void EffectSpecCount(SpellEffIndex effIndex); void EffectActivateSpec(SpellEffIndex effIndex); void EffectPlaySound(SpellEffIndex effIndex); void EffectRemoveAura(SpellEffIndex effIndex); @@ -572,6 +571,9 @@ class TC_GAME_API Spell uint32 TalentId; uint32 GlyphSlot; + // SPELL_EFFECT_TALENT_SPEC_SELECT + uint32 SpecializationId; + // SPELL_EFFECT_SET_FOLLOWER_QUALITY // SPELL_EFFECT_INCREASE_FOLLOWER_ITEM_LEVEL // SPELL_EFFECT_INCREASE_FOLLOWER_EXPERIENCE diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d7aa6769b8b..3e9dec9f485 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -226,7 +226,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling &Spell::EffectRenamePet, //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again &Spell::EffectForceCast, //160 SPELL_EFFECT_FORCE_CAST_2 - &Spell::EffectSpecCount, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) + &Spell::EffectNULL, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) &Spell::EffectActivateSpec, //162 SPELL_EFFECT_TALENT_SPEC_SELECT activate primary/secondary spec &Spell::EffectUnused, //163 SPELL_EFFECT_163 unused &Spell::EffectRemoveAura, //164 SPELL_EFFECT_REMOVE_AURA @@ -5357,17 +5357,6 @@ void Spell::EffectPlayMusic(SpellEffIndex /*effIndex*/) unitTarget->ToPlayer()->GetSession()->SendPacket(WorldPackets::Misc::PlayMusic(soundid).Write()); } -void Spell::EffectSpecCount(SpellEffIndex /*effIndex*/) -{ - if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) - return; - - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) - return; - - unitTarget->ToPlayer()->UpdateTalentGroupCount(damage); -} - void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) @@ -5376,7 +5365,7 @@ void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - unitTarget->ToPlayer()->ActivateTalentGroup(damage-1); // damage is 1 or 2, spec is 0 or 1 + unitTarget->ToPlayer()->ActivateTalentGroup(sChrSpecializationStore.AssertEntry(m_misc.SpecializationId)); } void Spell::EffectPlaySound(SpellEffIndex /*effIndex*/) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 743237ada6e..6e8db741a3d 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2843,7 +2843,7 @@ float SpellInfo::CalcProcPPM(Unit* caster, int32 itemLevel) const case SPELL_PPM_MOD_SPEC: { if (Player* plrCaster = caster->ToPlayer()) - if (plrCaster->GetSpecId(plrCaster->GetActiveTalentGroup()) == mod->Param) + if (plrCaster->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) == mod->Param) ppm *= 1.0f + mod->Coeff; break; } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index a4665973009..2c941a4f757 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -162,7 +162,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); // No boomy, no deal. - if (caster->GetSpecId(caster->GetActiveTalentGroup()) != TALENT_SPEC_DRUID_BALANCE) + if (caster->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) != TALENT_SPEC_DRUID_BALANCE) return; switch (GetSpellInfo()->Id) -- cgit v1.2.3 From 3903482eb810625fce64c616a4edca3f06975e94 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 13 Jun 2016 19:54:06 +0200 Subject: Core: Updated to 7.0.3.21916 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_07.sql | 10 + .../Database/Implementation/HotfixDatabase.cpp | 10 +- src/server/game/DataStores/DB2Metadata.h | 28 +- src/server/game/DataStores/DB2Structure.h | 6 +- src/server/game/Entities/Object/Object.cpp | 2 - src/server/game/Entities/Player/Player.cpp | 1 + src/server/game/Miscellaneous/SharedDefines.h | 12 + .../game/Server/Packets/AuthenticationPackets.h | 8 + .../game/Server/Packets/CharacterPackets.cpp | 6 +- src/server/game/Server/Packets/CharacterPackets.h | 5 +- src/server/game/Server/Packets/GuildPackets.cpp | 7 +- src/server/game/Server/Packets/NPCPackets.cpp | 9 - src/server/game/Server/Packets/NPCPackets.h | 11 - .../game/Server/Packets/ReputationPackets.cpp | 2 +- src/server/game/Server/Packets/SystemPackets.cpp | 8 + src/server/game/Server/Packets/SystemPackets.h | 2 + src/server/game/Server/Protocol/Opcodes.cpp | 20 +- src/server/game/Server/Protocol/Opcodes.h | 1048 ++++++++++---------- src/server/game/Server/Protocol/ServerPktHeader.h | 41 - src/server/game/Server/WorldSocket.cpp | 149 +-- src/server/game/Server/WorldSocket.h | 26 +- src/server/game/Spells/Spell.cpp | 2 +- 22 files changed, 676 insertions(+), 737 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_07.sql delete mode 100644 src/server/game/Server/Protocol/ServerPktHeader.h (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_07.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_07.sql new file mode 100644 index 00000000000..4d76e75fbf3 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_07.sql @@ -0,0 +1,10 @@ +ALTER TABLE `char_sections` CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT 0 FIRST; + +ALTER TABLE `chr_races` + CHANGE `Unk` `Unk1` int(10) unsigned NOT NULL DEFAULT 0 AFTER `HighResFemaleDisplayID`, + ADD `Unk2` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Unk1`, + ADD `Unk3` int(10) unsigned NOT NULL DEFAULT 0 AFTER `Unk2`; + +ALTER TABLE `spell_scaling` + CHANGE `MinScalingLevel` `MinScalingLevel` int(10) unsigned NOT NULL DEFAULT 0 AFTER `ScalingClass`, + CHANGE `MaxScalingLevel` `MaxScalingLevel` int(10) unsigned NOT NULL DEFAULT 0 AFTER `MinScalingLevel`; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 344b3bd5004..cf5ab499a6a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -96,7 +96,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); // CharSections.db2 - PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT Id, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3, Flags, Race, Gender, GenType, " + PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT ID, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3, Flags, Race, Gender, GenType, " "Type, Color FROM char_sections ORDER BY ID DESC", CONNECTION_SYNCH); // CharStartOutfit.db2 @@ -126,9 +126,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() "FacialHairCustomization2, HairCustomization, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, " "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, " "ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, " - "UAFemaleCreatureSoundDataID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " - "DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, CharComponentTexLayoutHiResID, HighResMaleDisplayID, HighResFemaleDisplayID" - " FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); + "UAFemaleCreatureSoundDataID, BaseLanguage, CreatureType, TeamID, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " + "DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, CharComponentTexLayoutHiResID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk1, " + "Unk2, Unk3 FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrSpecialization.db2 @@ -766,7 +766,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellScaling.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, MinScalingLevel, MaxScalingLevel, ScalingClass" + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MinScalingLevel, MaxScalingLevel" " FROM spell_scaling ORDER BY ID DESC", CONNECTION_SYNCH); // SpellShapeshift.db2 diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 7bc32ba286e..21dadfc3793 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -970,9 +970,9 @@ struct ChrRacesMeta { static DB2Meta const* Instance() { - static char const* types = "iSSsssSSiiffihhhhhhhhhhbbbbbbbbbbii"; - static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 35, 0x26E7581C, types, arraySizes); + static char const* types = "iSSsssSSiiffihhhhhhhhhbbbbbbbbbbiii"; + static uint8 const arraySizes[35] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; + static DB2Meta instance(-1, 35, 0x6B0D0422, types, arraySizes); return &instance; } }; @@ -1047,9 +1047,9 @@ struct CloakDampeningMeta { static DB2Meta const* Instance() { - static char const* types = "fffff"; - static uint8 const arraySizes[5] = { 5, 5, 2, 2, 1 }; - static DB2Meta instance(-1, 5, 0x01CB22C0, types, arraySizes); + static char const* types = "fffffff"; + static uint8 const arraySizes[7] = { 5, 5, 2, 2, 1, 1, 1 }; + static DB2Meta instance(-1, 7, 0x4BEFEBC2, types, arraySizes); return &instance; } }; @@ -1960,9 +1960,9 @@ struct GarrFollowerUICreatureMeta { static DB2Meta const* Instance() { - static char const* types = "ifhbb"; - static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, 0x25A4DCAF, types, arraySizes); + static char const* types = "ifhbbb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, 0xE375F0A0, types, arraySizes); return &instance; } }; @@ -2510,9 +2510,9 @@ struct InvasionClientDataMeta { static DB2Meta const* Instance() { - static char const* types = "sfiiiiiii"; - static uint8 const arraySizes[9] = { 1, 2, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(2, 9, 0x12F82601, types, arraySizes); + static char const* types = "sfiiiiiiii"; + static uint8 const arraySizes[10] = { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(2, 10, 0x0C8EFD74, types, arraySizes); return &instance; } }; @@ -5282,9 +5282,9 @@ struct SpellScalingMeta { static DB2Meta const* Instance() { - static char const* types = "ihbbi"; + static char const* types = "ihiii"; static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, 0xB0DB56A9, types, arraySizes); + static DB2Meta instance(-1, 5, 0x47D87C91, types, arraySizes); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 9f2fbb55d64..e5359fb4907 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -326,7 +326,6 @@ struct ChrRacesEntry uint16 CinematicSequenceID; uint16 UAMaleCreatureSoundDataID; uint16 UAFemaleCreatureSoundDataID; - uint16 Unk; uint8 BaseLanguage; uint8 CreatureType; uint8 TeamID; @@ -339,6 +338,7 @@ struct ChrRacesEntry uint8 CharComponentTexLayoutHiResID; uint32 HighResMaleDisplayID; uint32 HighResFemaleDisplayID; + uint32 Unk[3]; }; #define MAX_MASTERY_SPELLS 2 @@ -2294,9 +2294,9 @@ struct SpellScalingEntry uint32 ID; uint32 SpellID; uint16 ScalesFromItemLevel; - uint8 MinScalingLevel; - uint8 MaxScalingLevel; int32 ScalingClass; + uint32 MinScalingLevel; + uint32 MaxScalingLevel; }; struct SpellShapeshiftEntry diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 0a1a0739616..47751548922 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -340,7 +340,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const bool NoBirthAnim = false; bool EnablePortals = false; bool PlayHoverAnim = false; - bool IsSuppressingGreetings = false; bool HasMovementUpdate = (flags & UPDATEFLAG_LIVING) != 0; bool HasMovementTransport = (flags & UPDATEFLAG_TRANSPORT_POSITION) != 0; bool Stationary = (flags & UPDATEFLAG_STATIONARY_POSITION) != 0; @@ -363,7 +362,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(NoBirthAnim); data->WriteBit(EnablePortals); data->WriteBit(PlayHoverAnim); - data->WriteBit(IsSuppressingGreetings); data->WriteBit(HasMovementUpdate); data->WriteBit(HasMovementTransport); data->WriteBit(Stationary); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5775441d781..e119c1d8199 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2548,6 +2548,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(UNIT_FIELD_MOD_HASTE, 1.0f); SetFloatValue(UNIT_FIELD_MOD_RANGED_HASTE, 1.0f); SetFloatValue(UNIT_FIELD_MOD_HASTE_REGEN, 1.0f); + SetFloatValue(UNIT_FIELD_MOD_TIME_RATE, 1.0f); // reset size before reapply auras SetObjectScale(1.0f); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 00c926acbb0..a1114c0e28c 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -935,6 +935,18 @@ enum CharacterCustomizeFlags CHAR_CUSTOMIZE_FLAG_RACE = 0x00100000 // name, gender, race, etc... }; +enum CharacterFlags3 : uint32 +{ + CHARACTER_FLAG_3_LOCKED_BY_REVOKED_VAS_TRANSACTION = 0x00100000, + CHARACTER_FLAG_3_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 0x80000000, +}; + +enum CharacterFlags4 : uint32 +{ + CHARACTER_FLAG_4_TRIAL_BOOST = 0x00000080, + CHARACTER_FLAG_4_TRIAL_BOOST_LOCKED = 0x00040000, +}; + enum CharacterSlot { SLOT_HEAD = 0, diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 0912c85dcb4..f17e079f0fb 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -209,6 +209,14 @@ namespace WorldPackets ConnectToSerial Serial = ConnectToSerial::None; uint8 Con = 0; }; + + class EnableEncryption final : public ServerPacket + { + public: + EnableEncryption() : ServerPacket(SMSG_ENABLE_ENCRYPTION, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 4907e42f808..5e7efd257f7 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -88,6 +88,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel CustomizationFlag = CHAR_CUSTOMIZE_FLAG_RACE; Flags3 = 0; + Flags4 = 0; FirstLogin = (atLoginFlags & AT_LOGIN_FIRST) != 0; // show pet at selection character in character list only for non-ghost character @@ -177,8 +178,9 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() } _worldPacket << uint32(charInfo.LastPlayedTime); - _worldPacket << uint16(charInfo.UnkLegion); - _worldPacket << uint32(charInfo.ClassTrialFlags); + _worldPacket << uint16(charInfo.SpecID); + _worldPacket << uint32(charInfo.Unknown703); + _worldPacket << uint32(charInfo.Flags4); _worldPacket.WriteBits(charInfo.Name.length(), 6); _worldPacket.WriteBit(charInfo.FirstLogin); _worldPacket.WriteBit(charInfo.BoostInProgress); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index e61b7535cca..ec3ac9dc172 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -135,10 +135,12 @@ namespace WorldPackets uint32 Flags = 0; ///< Character flag @see enum CharacterFlags uint32 CustomizationFlag = 0; ///< Character customization flags @see enum CharacterCustomizeFlags uint32 Flags3 = 0; ///< Character flags 3 @todo research + uint32 Flags4 = 0; bool FirstLogin = false; uint8 unkWod61x = 0; uint32 LastPlayedTime = 0; - uint16 UnkLegion = 0; // may be spec id + uint16 SpecID = 0; + uint32 Unknown703; struct PetInfo { @@ -149,7 +151,6 @@ namespace WorldPackets bool BoostInProgress = false; ///< @todo int32 ProfessionIds[2]; ///< @todo - uint32 ClassTrialFlags = 0; struct VisualItemInfo { diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 21626fd8640..8cc97ca2557 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -69,14 +69,13 @@ WorldPacket const* WorldPackets::Guild::GuildRoster::Write() _worldPacket.AppendPackedTime(CreateDate); _worldPacket << GuildFlags; _worldPacket << uint32(MemberData.size()); + _worldPacket.WriteBits(WelcomeText.length(), 10); + _worldPacket.WriteBits(InfoText.length(), 11); + _worldPacket.FlushBits(); for (GuildRosterMemberData const& member : MemberData) _worldPacket << member; - _worldPacket.WriteBits(WelcomeText.length(), 10); - _worldPacket.WriteBits(InfoText.length(), 10); - _worldPacket.FlushBits(); - _worldPacket.WriteString(WelcomeText); _worldPacket.WriteString(InfoText); diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 9e8090b03b2..33721e23d5b 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -142,15 +142,6 @@ WorldPacket const* WorldPackets::NPC::PlayerTabardVendorActivate::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::NPC::SuppressNPCGreetings::Write() -{ - _worldPacket << UnitGUID; - _worldPacket.WriteBit(SuppressNPCGreeting); - _worldPacket.FlushBits(); - - return &_worldPacket; -} - WorldPacket const* WorldPackets::NPC::GossipPOI::Write() { _worldPacket.WriteBits(Flags, 14); diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 98fa079afaa..b18ce340ae0 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -172,17 +172,6 @@ namespace WorldPackets ObjectGuid Vendor; }; - class SuppressNPCGreetings final : public ServerPacket - { - public: - SuppressNPCGreetings() : ServerPacket(SMSG_SUPPRESS_NPC_GREETINGS, 16 + 1) { } - - WorldPacket const* Write() override; - - ObjectGuid UnitGUID; - bool SuppressNPCGreeting = false; - }; - class GossipPOI final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/ReputationPackets.cpp b/src/server/game/Server/Packets/ReputationPackets.cpp index b3d4572f550..524ab132c80 100644 --- a/src/server/game/Server/Packets/ReputationPackets.cpp +++ b/src/server/game/Server/Packets/ReputationPackets.cpp @@ -42,7 +42,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Reputation::ForcedReactio WorldPacket const* WorldPackets::Reputation::SetForcedReactions::Write() { - _worldPacket.WriteBits(Reactions.size(), 6); + _worldPacket << uint32(Reactions.size()); for (ForcedReaction const& reaction : Reactions) _worldPacket << reaction; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 395a7c66fe6..e39182b280f 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -49,6 +49,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(Unk67); _worldPacket.WriteBit(WillKickFromWorld); _worldPacket.WriteBit(KioskModeEnabled); + _worldPacket.WriteBit(RaceClassExpansionLevels.is_initialized()); _worldPacket.FlushBits(); @@ -72,6 +73,13 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket << int32(SessionAlert->DisplayTime); } + if (RaceClassExpansionLevels) + { + _worldPacket << uint32(RaceClassExpansionLevels->size()); + if (!RaceClassExpansionLevels->empty()) + _worldPacket.append(RaceClassExpansionLevels->data(), RaceClassExpansionLevels->size()); + } + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 1ae7d73d28e..7a420df6859 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -85,6 +85,8 @@ namespace WorldPackets bool TutorialsEnabled = false; bool NPETutorialsEnabled = false; bool KioskModeEnabled = false; + + Optional> RaceClassExpansionLevels; }; class FeatureSystemStatusGlueScreen final : public ServerPacket diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 1d6be511871..8efd98c19f9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -282,7 +282,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHAT_MESSAGE_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); DEFINE_HANDLER(CMSG_CHAT_MESSAGE_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageWhisper, &WorldSession::HandleChatMessageWhisperOpcode); DEFINE_HANDLER(CMSG_CHAT_MESSAGE_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); - DEFINE_HANDLER(CMSG_CHAT_REGISTER_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatRegisterAddonPrefixes, &WorldSession::HandleAddonRegisteredPrefixesOpcode); + DEFINE_HANDLER(CMSG_CHAT_REGISTER_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatRegisterAddonPrefixes, &WorldSession::HandleAddonRegisteredPrefixesOpcode); DEFINE_HANDLER(CMSG_CHAT_REPORT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHAT_REPORT_IGNORED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatReportIgnored, &WorldSession::HandleChatIgnoredOpcode); DEFINE_HANDLER(CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatUnregisterAllAddonPrefixes, &WorldSession::HandleUnregisterAllAddonPrefixesOpcode); @@ -335,6 +335,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode); DEFINE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::EjectPassenger, &WorldSession::HandleEjectPassenger); DEFINE_HANDLER(CMSG_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::EmoteClient, &WorldSession::HandleEmoteOpcode); + DEFINE_HANDLER(CMSG_ENABLE_ENCRYPTION_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_ENABLE_TAXI_NODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::EnableTaxiNode, &WorldSession::HandleEnableTaxiNodeOpcode); DEFINE_HANDLER(CMSG_ENGINE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -627,6 +628,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_GIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery); DEFINE_HANDLER(CMSG_QUEST_GIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_UNIGNORE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUEST_LOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QuestPOIQuery, &WorldSession::HandleQuestPOIQuery); DEFINE_HANDLER(CMSG_QUEST_PUSH_RESULT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestPushResult, &WorldSession::HandleQuestPushResult); @@ -824,7 +826,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVE_GLYPHS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_BATTLENET_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -837,7 +839,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_GUILD_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_GUILD_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARCHAEOLOGY_SURVERY_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -985,6 +987,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_CLASS_TRIAL_CREATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_ITEM_FIXUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_OBJECT_TEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_RENAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1068,6 +1071,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_ENCRYPTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1163,8 +1167,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1204,7 +1208,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NAME_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1212,7 +1216,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SEND_RANK_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1529,6 +1533,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UNIGNORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1681,7 +1686,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 40e469acea6..a3346f5e6cb 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -258,7 +258,8 @@ enum OpcodeClient : uint32 CMSG_DUEL_RESPONSE = 0x34D2, CMSG_EJECT_PASSENGER = 0x321E, CMSG_EMOTE = 0x352E, - CMSG_ENABLE_NAGLE = 0x376A, + CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, + CMSG_ENABLE_NAGLE = 0x376B, CMSG_ENABLE_TAXI_NODE = 0x34A4, CMSG_ENGINE_SURVEY = 0x36E9, CMSG_ENUM_CHARACTERS = 0x35E6, @@ -392,8 +393,8 @@ enum OpcodeClient : uint32 CMSG_LOGOUT_CANCEL = 0x34C8, CMSG_LOGOUT_INSTANT = 0x34C9, CMSG_LOGOUT_REQUEST = 0x34C7, - CMSG_LOG_DISCONNECT = 0x3768, - CMSG_LOG_STREAMING_ERROR = 0x376C, + CMSG_LOG_DISCONNECT = 0x3769, + CMSG_LOG_STREAMING_ERROR = 0x376D, CMSG_LOOT_ITEM = 0x31F3, CMSG_LOOT_MONEY = 0x31F2, CMSG_LOOT_RELEASE = 0x31F7, @@ -512,9 +513,9 @@ enum OpcodeClient : uint32 CMSG_PET_SET_ACTION = 0x3481, CMSG_PET_SPELL_AUTOCAST = 0x3486, CMSG_PET_STOP_ATTACK = 0x3483, - CMSG_PING = 0x3767, + CMSG_PING = 0x3768, CMSG_PLAYER_LOGIN = 0x35E8, - CMSG_PROTOCOL_MISMATCH = 0x376D, + CMSG_PROTOCOL_MISMATCH = 0x376E, CMSG_PUSH_QUEST_TO_PARTY = 0x349A, CMSG_PVP_LOG_DATA = 0x3179, CMSG_PVP_PRESTIGE_RANK_UP = 0x331E, @@ -545,15 +546,16 @@ enum OpcodeClient : uint32 CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3495, CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3493, CMSG_QUEST_GIVER_HELLO = 0x348D, - CMSG_QUEST_GIVER_INGORE_QUEST = 0x3491, + CMSG_QUEST_GIVER_IGNORE_QUEST = 0x3491, CMSG_QUEST_GIVER_QUERY_QUEST = 0x348E, CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3496, CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3498, CMSG_QUEST_GIVER_STATUS_QUERY = 0x3497, + CMSG_QUEST_GIVER_UNIGNORE_QUEST = 0x3492, CMSG_QUEST_LOG_REMOVE_QUEST = 0x351B, CMSG_QUEST_POI_QUERY = 0x36B6, CMSG_QUEST_PUSH_RESULT = 0x349B, - CMSG_QUEUED_MESSAGES_END = 0x376B, + CMSG_QUEUED_MESSAGES_END = 0x376C, CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, CMSG_RANDOM_ROLL = 0x3654, CMSG_READY_CHECK_RESPONSE = 0x3634, @@ -670,7 +672,7 @@ enum OpcodeClient : uint32 CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, CMSG_SUSPEND_COMMS_ACK = 0x3764, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x3769, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, CMSG_SWAP_INV_ITEM = 0x399D, CMSG_SWAP_ITEM = 0x399C, CMSG_SWAP_SUB_GROUPS = 0x364D, @@ -730,7 +732,7 @@ enum OpcodeClient : uint32 CMSG_WHO = 0x3686, CMSG_WHO_IS = 0x3685, CMSG_WORLD_PORT_RESPONSE = 0x35F6, - CMSG_WORLD_TELEPORT = 0x3324, + CMSG_WORLD_TELEPORT = 0x3326, CMSG_WRAP_ITEM = 0x3994, CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0xBADD, @@ -741,60 +743,60 @@ enum OpcodeClient : uint32 enum OpcodeServer : uint32 { SMSG_ABORT_NEW_WORLD = 0x25AB, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x264E, - SMSG_ACCOUNT_DATA_TIMES = 0x2745, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x264D, + SMSG_ACCOUNT_DATA_TIMES = 0x2744, SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C1, SMSG_ACCOUNT_TOYS_UPDATE = 0x25C2, - SMSG_ACHIEVEMENT_DELETED = 0x271B, - SMSG_ACHIEVEMENT_EARNED = 0x265C, - SMSG_ACTIVATE_TAXI_REPLY = 0x26A2, + SMSG_ACHIEVEMENT_DELETED = 0x271A, + SMSG_ACHIEVEMENT_EARNED = 0x265B, + SMSG_ACTIVATE_TAXI_REPLY = 0x26A1, SMSG_ACTIVE_GLYPHS = 0x2C52, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2656, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2655, SMSG_ADD_ITEM_PASSIVE = 0x25BD, - SMSG_ADD_LOSS_OF_CONTROL = 0x2692, - SMSG_ADD_RUNE_POWER = 0x26DF, - SMSG_ADJUST_SPLINE_DURATION = 0x25E5, - SMSG_AE_LOOT_TARGETS = 0x2629, - SMSG_AE_LOOT_TARGET_ACK = 0x262A, - SMSG_AI_REACTION = 0x26DC, + SMSG_ADD_LOSS_OF_CONTROL = 0x2691, + SMSG_ADD_RUNE_POWER = 0x26DE, + SMSG_ADJUST_SPLINE_DURATION = 0x25E4, + SMSG_AE_LOOT_TARGETS = 0x2628, + SMSG_AE_LOOT_TARGET_ACK = 0x2629, + SMSG_AI_REACTION = 0x26DB, SMSG_ALL_ACCOUNT_CRITERIA = 0x2570, SMSG_ALL_ACHIEVEMENT_DATA = 0x256F, SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x277F, - SMSG_AREA_TRIGGER_DENIED = 0x2699, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x2751, - SMSG_AREA_TRIGGER_RE_PATH = 0x263C, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x263A, - SMSG_ARENA_ERROR = 0x270E, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2661, - SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DF, - SMSG_ARTIFACT_FORGE_OPENED = 0x27DD, - SMSG_ARTIFACT_POWERS_UPDATED = 0x27DE, - SMSG_ARTIFACT_XP_GAIN = 0x281E, - SMSG_ATTACKER_STATE_UPDATE = 0x27CA, - SMSG_ATTACK_START = 0x2669, - SMSG_ATTACK_STOP = 0x266A, - SMSG_ATTACK_SWING_ERROR = 0x2730, - SMSG_ATTACK_SWING_LANDED_LOG = 0x2731, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2725, - SMSG_AUCTION_COMMAND_RESULT = 0x2722, - SMSG_AUCTION_HELLO_RESPONSE = 0x2720, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x2729, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2727, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2728, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272A, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2724, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2726, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x2721, - SMSG_AUCTION_WON_NOTIFICATION = 0x2723, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x277E, + SMSG_AREA_TRIGGER_DENIED = 0x2698, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2750, + SMSG_AREA_TRIGGER_RE_PATH = 0x263B, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x2639, + SMSG_ARENA_ERROR = 0x270D, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2660, + SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DE, + SMSG_ARTIFACT_FORGE_OPENED = 0x27DC, + SMSG_ARTIFACT_POWERS_UPDATED = 0x27DD, + SMSG_ARTIFACT_XP_GAIN = 0x281D, + SMSG_ATTACKER_STATE_UPDATE = 0x27C9, + SMSG_ATTACK_START = 0x2668, + SMSG_ATTACK_STOP = 0x2669, + SMSG_ATTACK_SWING_ERROR = 0x272F, + SMSG_ATTACK_SWING_LANDED_LOG = 0x2730, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2724, + SMSG_AUCTION_COMMAND_RESULT = 0x2721, + SMSG_AUCTION_HELLO_RESPONSE = 0x271F, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x2728, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2726, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2727, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x2729, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2723, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2725, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x2720, + SMSG_AUCTION_WON_NOTIFICATION = 0x2722, SMSG_AURA_POINTS_DEPLETED = 0x2C22, SMSG_AURA_UPDATE = 0x2C21, SMSG_AUTH_CHALLENGE = 0x3048, SMSG_AUTH_RESPONSE = 0x256C, SMSG_AVAILABLE_VOICE_CHANNEL = 0x2BB2, - SMSG_BAN_REASON = 0x26AE, - SMSG_BARBER_SHOP_RESULT = 0x26E5, + SMSG_BAN_REASON = 0x26AD, + SMSG_BARBER_SHOP_RESULT = 0x26E4, SMSG_BATTLEFIELD_LIST = 0x2594, SMSG_BATTLEFIELD_PORT_DENIED = 0x259A, SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2590, @@ -804,114 +806,115 @@ enum OpcodeServer : uint32 SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2591, SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A3, SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259B, - SMSG_BATTLEGROUND_INIT = 0x279D, + SMSG_BATTLEGROUND_INIT = 0x279C, SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, - SMSG_BATTLEGROUND_POINTS = 0x279C, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C9, - SMSG_BATTLENET_CHALLENGE_START = 0x27C8, - SMSG_BATTLENET_NOTIFICATION = 0x2833, - SMSG_BATTLENET_REALM_LIST_TICKET = 0x2835, - SMSG_BATTLENET_RESPONSE = 0x2832, - SMSG_BATTLENET_SET_SESSION_STATE = 0x2834, - SMSG_BATTLE_PAY_ACK_FAILED = 0x27C1, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C0, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B7, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B6, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B5, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B3, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B1, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B2, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BF, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BD, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27BC, - SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B4, - SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2822, - SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2825, - SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2826, - SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2824, - SMSG_BATTLE_PETS_HEALED = 0x2607, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269C, - SMSG_BATTLE_PET_DELETED = 0x2604, - SMSG_BATTLE_PET_ERROR = 0x2651, - SMSG_BATTLE_PET_JOURNAL = 0x2603, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2601, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2602, - SMSG_BATTLE_PET_LICENSE_CHANGED = 0x2608, - SMSG_BATTLE_PET_MAX_COUNT_CHANGED = 0x25FF, - SMSG_BATTLE_PET_RESTORED = 0x2606, - SMSG_BATTLE_PET_REVOKED = 0x2605, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x25FE, - SMSG_BATTLE_PET_UPDATES = 0x25FD, - SMSG_BINDER_CONFIRM = 0x2736, + SMSG_BATTLEGROUND_POINTS = 0x279B, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C8, + SMSG_BATTLENET_CHALLENGE_START = 0x27C7, + SMSG_BATTLENET_NOTIFICATION = 0x2832, + SMSG_BATTLENET_REALM_LIST_TICKET = 0x2834, + SMSG_BATTLENET_RESPONSE = 0x2831, + SMSG_BATTLENET_SET_SESSION_STATE = 0x2833, + SMSG_BATTLE_PAY_ACK_FAILED = 0x27C0, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27BF, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B6, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B5, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B4, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B2, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B0, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B1, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BE, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BC, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27BB, + SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B3, + SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2821, + SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2824, + SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2825, + SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2823, + SMSG_BATTLE_PETS_HEALED = 0x2606, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269B, + SMSG_BATTLE_PET_DELETED = 0x2603, + SMSG_BATTLE_PET_ERROR = 0x2650, + SMSG_BATTLE_PET_JOURNAL = 0x2602, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2600, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2601, + SMSG_BATTLE_PET_LICENSE_CHANGED = 0x2607, + SMSG_BATTLE_PET_MAX_COUNT_CHANGED = 0x25FE, + SMSG_BATTLE_PET_RESTORED = 0x2605, + SMSG_BATTLE_PET_REVOKED = 0x2604, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x25FD, + SMSG_BATTLE_PET_UPDATES = 0x25FC, + SMSG_BINDER_CONFIRM = 0x2735, SMSG_BIND_POINT_UPDATE = 0x257C, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2641, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x263F, - SMSG_BLACK_MARKET_OUTBID = 0x2642, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2640, - SMSG_BLACK_MARKET_WON = 0x2643, - SMSG_BONUS_ROLL_EMPTY = 0x265E, - SMSG_BOSS_KILL_CREDIT = 0x27BB, - SMSG_BREAK_TARGET = 0x2668, - SMSG_BUY_FAILED = 0x26EE, - SMSG_BUY_SUCCEEDED = 0x26ED, - SMSG_CACHE_VERSION = 0x273F, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C2, - SMSG_CALENDAR_COMMAND_RESULT = 0x26C3, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B2, - SMSG_CALENDAR_EVENT_INVITE = 0x26B3, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26B4, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26B7, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26BC, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26BD, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26B8, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26B9, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26B5, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26B6, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26BA, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26BB, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26BE, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26BF, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26C0, - SMSG_CALENDAR_SEND_CALENDAR = 0x26B0, - SMSG_CALENDAR_SEND_EVENT = 0x26B1, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C1, - SMSG_CAMERA_EFFECT = 0x2763, - SMSG_CAMERA_SHAKE = 0x2764, - SMSG_CANCEL_AUTO_REPEAT = 0x270F, - SMSG_CANCEL_COMBAT = 0x272E, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2640, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x263E, + SMSG_BLACK_MARKET_OUTBID = 0x2641, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x263F, + SMSG_BLACK_MARKET_WON = 0x2642, + SMSG_BONUS_ROLL_EMPTY = 0x265D, + SMSG_BOSS_KILL_CREDIT = 0x27BA, + SMSG_BREAK_TARGET = 0x2667, + SMSG_BUY_FAILED = 0x26ED, + SMSG_BUY_SUCCEEDED = 0x26EC, + SMSG_CACHE_VERSION = 0x273E, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C1, + SMSG_CALENDAR_COMMAND_RESULT = 0x26C2, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B1, + SMSG_CALENDAR_EVENT_INVITE = 0x26B2, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26B3, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26B6, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26BB, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26BC, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26B7, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26B8, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26B4, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26B5, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26B9, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26BA, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26BD, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26BE, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26BF, + SMSG_CALENDAR_SEND_CALENDAR = 0x26AF, + SMSG_CALENDAR_SEND_EVENT = 0x26B0, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C0, + SMSG_CAMERA_EFFECT = 0x2762, + SMSG_CAMERA_SHAKE = 0x2763, + SMSG_CANCEL_AUTO_REPEAT = 0x270E, + SMSG_CANCEL_COMBAT = 0x272D, SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45, - SMSG_CANCEL_SCENE = 0x2650, + SMSG_CANCEL_SCENE = 0x264F, SMSG_CANCEL_SPELL_VISUAL = 0x2C43, SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C47, - SMSG_CAN_DUEL_RESULT = 0x2672, + SMSG_CAN_DUEL_RESULT = 0x2671, SMSG_CAST_FAILED = 0x2C55, SMSG_CATEGORY_COOLDOWN = 0x2C16, - SMSG_CHALLEGE_MODE_REWARDS = 0x261E, - SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x261F, - SMSG_CHALLENGE_MODE_COMPLETE = 0x261D, - SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x2620, - SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x2622, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2621, - SMSG_CHALLENGE_MODE_RESET = 0x261C, - SMSG_CHALLENGE_MODE_START = 0x261B, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2732, + SMSG_CHALLEGE_MODE_REWARDS = 0x261D, + SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x261E, + SMSG_CHALLENGE_MODE_COMPLETE = 0x261C, + SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x261F, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x2621, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2620, + SMSG_CHALLENGE_MODE_RESET = 0x261B, + SMSG_CHALLENGE_MODE_START = 0x261A, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2731, SMSG_CHANNEL_LIST = 0x2BC8, SMSG_CHANNEL_NOTIFY = 0x2BC5, SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC6, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC7, - SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x27F8, - SMSG_CHARACTER_LOGIN_FAILED = 0x2740, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C7, - SMSG_CHARACTER_RENAME_RESULT = 0x27A3, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F7, - SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F6, - SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F2, - SMSG_CHARACTER_UPGRADE_STARTED = 0x27F5, - SMSG_CHAR_CUSTOMIZE = 0x2716, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x2715, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E4, + SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x27F7, + SMSG_CHARACTER_ITEM_FIXUP = 0x283C, + SMSG_CHARACTER_LOGIN_FAILED = 0x273F, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C6, + SMSG_CHARACTER_RENAME_RESULT = 0x27A2, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F6, + SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F5, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F1, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27F4, + SMSG_CHAR_CUSTOMIZE = 0x2715, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x2714, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E3, SMSG_CHAT = 0x2BAD, SMSG_CHAT_AUTO_RESPONDED = 0x2BBD, SMSG_CHAT_DOWN = 0x2BC2, @@ -927,95 +930,96 @@ enum OpcodeServer : uint32 SMSG_CHECK_WARGAME_ENTRY = 0x259E, SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C26, SMSG_CLEAR_BOSS_EMOTES = 0x25CA, - SMSG_CLEAR_COOLDOWN = 0x26E1, + SMSG_CLEAR_COOLDOWN = 0x26E0, SMSG_CLEAR_COOLDOWNS = 0x2C25, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x2694, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x2693, SMSG_CLEAR_SPELL_CHARGES = 0x2C27, - SMSG_CLEAR_TARGET = 0x26D8, - SMSG_COIN_REMOVED = 0x2628, - SMSG_COMBAT_EVENT_FAILED = 0x266B, - SMSG_COMMENTATOR_MAP_INFO = 0x2742, - SMSG_COMMENTATOR_PLAYER_INFO = 0x2743, - SMSG_COMMENTATOR_STATE_CHANGED = 0x2741, - SMSG_COMPLAINT_RESULT = 0x26D0, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D9, - SMSG_CONNECT_TO = 0x304C, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C2, - SMSG_CONSOLE_WRITE = 0x264D, - SMSG_CONTACT_LIST = 0x27C5, - SMSG_CONTROL_UPDATE = 0x2660, - SMSG_COOLDOWN_CHEAT = 0x2778, - SMSG_COOLDOWN_EVENT = 0x26E0, - SMSG_CORPSE_LOCATION = 0x2667, - SMSG_CORPSE_RECLAIM_DELAY = 0x278B, - SMSG_CORPSE_TRANSPORT_QUERY = 0x274D, - SMSG_CREATE_CHAR = 0x273B, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D8, - SMSG_CRITERIA_DELETED = 0x271A, - SMSG_CRITERIA_UPDATE = 0x2714, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26E9, - SMSG_CUSTOM_LOAD_SCREEN = 0x25E0, + SMSG_CLEAR_TARGET = 0x26D7, + SMSG_COIN_REMOVED = 0x2627, + SMSG_COMBAT_EVENT_FAILED = 0x266A, + SMSG_COMMENTATOR_MAP_INFO = 0x2741, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2742, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2740, + SMSG_COMPLAINT_RESULT = 0x26CF, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D8, + SMSG_CONNECT_TO = 0x304D, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C1, + SMSG_CONSOLE_WRITE = 0x264C, + SMSG_CONTACT_LIST = 0x27C4, + SMSG_CONTROL_UPDATE = 0x265F, + SMSG_COOLDOWN_CHEAT = 0x2777, + SMSG_COOLDOWN_EVENT = 0x26DF, + SMSG_CORPSE_LOCATION = 0x2666, + SMSG_CORPSE_RECLAIM_DELAY = 0x278A, + SMSG_CORPSE_TRANSPORT_QUERY = 0x274C, + SMSG_CREATE_CHAR = 0x273A, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D7, + SMSG_CRITERIA_DELETED = 0x2719, + SMSG_CRITERIA_UPDATE = 0x2713, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26E8, + SMSG_CUSTOM_LOAD_SCREEN = 0x25DF, SMSG_DAILY_QUESTS_RESET = 0x2A80, - SMSG_DAMAGE_CALC_LOG = 0x27FF, - SMSG_DANCE_STUDIO_CREATE_RESULT = 0x27A0, + SMSG_DAMAGE_CALC_LOG = 0x27FE, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x279F, SMSG_DB_REPLY = 0x25A0, - SMSG_DEATH_RELEASE_LOC = 0x2702, + SMSG_DEATH_RELEASE_LOC = 0x2701, SMSG_DEFENSE_MESSAGE = 0x2BBB, - SMSG_DELETE_CHAR = 0x273C, - SMSG_DESTROY_ARENA_UNIT = 0x2781, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272F, + SMSG_DELETE_CHAR = 0x273B, + SMSG_DESTROY_ARENA_UNIT = 0x2780, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272E, SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, SMSG_DISENCHANT_CREDIT = 0x25BA, - SMSG_DISMOUNT = 0x26D7, + SMSG_DISMOUNT = 0x26D6, SMSG_DISMOUNT_RESULT = 0x257B, SMSG_DISPEL_FAILED = 0x2C2F, SMSG_DISPLAY_GAME_ERROR = 0x25B3, - SMSG_DISPLAY_PLAYER_CHOICE = 0x269D, - SMSG_DISPLAY_PROMOTION = 0x2664, + SMSG_DISPLAY_PLAYER_CHOICE = 0x269C, + SMSG_DISPLAY_PROMOTION = 0x2663, SMSG_DISPLAY_QUEST_POPUP = 0x2A9C, - SMSG_DISPLAY_TOAST = 0x2636, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F4, - SMSG_DROP_NEW_CONNECTION = 0x304B, - SMSG_DUEL_COMPLETE = 0x2670, - SMSG_DUEL_COUNTDOWN = 0x266F, - SMSG_DUEL_IN_BOUNDS = 0x266E, - SMSG_DUEL_OUT_OF_BOUNDS = 0x266D, - SMSG_DUEL_REQUESTED = 0x266C, - SMSG_DUEL_WINNER = 0x2671, - SMSG_DURABILITY_DAMAGE_DEATH = 0x2787, - SMSG_EMOTE = 0x2800, - SMSG_ENABLE_BARBER_SHOP = 0x26E4, - SMSG_ENCHANTMENT_LOG = 0x274E, - SMSG_ENCOUNTER_END = 0x27BA, - SMSG_ENCOUNTER_START = 0x27B9, + SMSG_DISPLAY_TOAST = 0x2635, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F3, + SMSG_DROP_NEW_CONNECTION = 0x304C, + SMSG_DUEL_COMPLETE = 0x266F, + SMSG_DUEL_COUNTDOWN = 0x266E, + SMSG_DUEL_IN_BOUNDS = 0x266D, + SMSG_DUEL_OUT_OF_BOUNDS = 0x266C, + SMSG_DUEL_REQUESTED = 0x266B, + SMSG_DUEL_WINNER = 0x2670, + SMSG_DURABILITY_DAMAGE_DEATH = 0x2786, + SMSG_EMOTE = 0x27FF, + SMSG_ENABLE_BARBER_SHOP = 0x26E3, + SMSG_ENABLE_ENCRYPTION = 0x3049, + SMSG_ENCHANTMENT_LOG = 0x274D, + SMSG_ENCOUNTER_END = 0x27B9, + SMSG_ENCOUNTER_START = 0x27B8, SMSG_ENUM_CHARACTERS_RESULT = 0x2582, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C20, - SMSG_EQUIPMENT_SET_ID = 0x26D9, + SMSG_EQUIPMENT_SET_ID = 0x26D8, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, - SMSG_EXPLORATION_EXPERIENCE = 0x279F, - SMSG_FACTION_BONUS_INFO = 0x2762, - SMSG_FAILED_PLAYER_CONDITION = 0x25DF, - SMSG_FEATURE_SYSTEM_STATUS = 0x25CF, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D0, - SMSG_FEIGN_DEATH_RESISTED = 0x2784, - SMSG_FISH_ESCAPED = 0x26F6, - SMSG_FISH_NOT_HOOKED = 0x26F5, + SMSG_EXPLORATION_EXPERIENCE = 0x279E, + SMSG_FACTION_BONUS_INFO = 0x2761, + SMSG_FAILED_PLAYER_CONDITION = 0x25DE, + SMSG_FEATURE_SYSTEM_STATUS = 0x25CE, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25CF, + SMSG_FEIGN_DEATH_RESISTED = 0x2783, + SMSG_FISH_ESCAPED = 0x26F5, + SMSG_FISH_NOT_HOOKED = 0x26F4, SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, - SMSG_FORCED_DEATH_UPDATE = 0x2703, - SMSG_FORCE_ANIM = 0x2791, - SMSG_FORCE_OBJECT_RELINK = 0x2663, - SMSG_FRIEND_STATUS = 0x27C6, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D3, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D4, - SMSG_GAME_OBJECT_DESPAWN = 0x25D5, + SMSG_FORCED_DEATH_UPDATE = 0x2702, + SMSG_FORCE_ANIM = 0x2790, + SMSG_FORCE_OBJECT_RELINK = 0x2662, + SMSG_FRIEND_STATUS = 0x27C5, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D2, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D3, + SMSG_GAME_OBJECT_DESPAWN = 0x25D4, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4A, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C49, - SMSG_GAME_OBJECT_RESET_STATE = 0x2759, - SMSG_GAME_OBJECT_SET_STATE = 0x2831, - SMSG_GAME_OBJECT_UI_ACTION = 0x2756, - SMSG_GAME_SPEED_SET = 0x26A6, - SMSG_GAME_TIME_SET = 0x2747, - SMSG_GAME_TIME_UPDATE = 0x2746, + SMSG_GAME_OBJECT_RESET_STATE = 0x2758, + SMSG_GAME_OBJECT_SET_STATE = 0x2830, + SMSG_GAME_OBJECT_UI_ACTION = 0x2755, + SMSG_GAME_SPEED_SET = 0x26A5, + SMSG_GAME_TIME_SET = 0x2746, + SMSG_GAME_TIME_UPDATE = 0x2745, SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906, SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918, @@ -1033,7 +1037,7 @@ enum OpcodeServer : uint32 SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915, SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912, SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27DB, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27DA, SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7, SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5, SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2905, @@ -1061,25 +1065,25 @@ enum OpcodeServer : uint32 SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A0, SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27DA, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D6, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FB, - SMSG_GM_PLAYER_INFO = 0x2777, - SMSG_GM_REQUEST_PLAYER_INFO = 0x25EA, - SMSG_GM_TICKET_CASE_STATUS = 0x26C9, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C8, - SMSG_GOD_MODE = 0x2735, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27D9, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D5, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FA, + SMSG_GM_PLAYER_INFO = 0x2776, + SMSG_GM_REQUEST_PLAYER_INFO = 0x25E9, + SMSG_GM_TICKET_CASE_STATUS = 0x26C8, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C7, + SMSG_GOD_MODE = 0x2734, SMSG_GOSSIP_COMPLETE = 0x2A96, SMSG_GOSSIP_MESSAGE = 0x2A97, - SMSG_GOSSIP_POI = 0x27D3, + SMSG_GOSSIP_POI = 0x27D2, SMSG_GROUP_ACTION_THROTTLED = 0x259C, - SMSG_GROUP_DECLINE = 0x27CE, - SMSG_GROUP_DESTROYED = 0x27D0, - SMSG_GROUP_NEW_LEADER = 0x2646, - SMSG_GROUP_UNINVITE = 0x27CF, + SMSG_GROUP_DECLINE = 0x27CD, + SMSG_GROUP_DESTROYED = 0x27CF, + SMSG_GROUP_NEW_LEADER = 0x2645, + SMSG_GROUP_UNINVITE = 0x27CE, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, @@ -1132,51 +1136,51 @@ enum OpcodeServer : uint32 SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x26F9, - SMSG_HIGHEST_THREAT_UPDATE = 0x2709, + SMSG_HEALTH_UPDATE = 0x26F8, + SMSG_HIGHEST_THREAT_UPDATE = 0x2708, SMSG_HOTFIX_NOTIFY = 0x25A1, SMSG_HOTFIX_NOTIFY_BLOB = 0x25A2, - SMSG_INITIALIZE_FACTIONS = 0x2761, + SMSG_INITIALIZE_FACTIONS = 0x2760, SMSG_INITIAL_SETUP = 0x257F, - SMSG_INIT_WORLD_STATES = 0x2788, + SMSG_INIT_WORLD_STATES = 0x2787, SMSG_INSPECT_HONOR_STATS = 0x25B0, - SMSG_INSPECT_PVP = 0x275D, - SMSG_INSPECT_RESULT = 0x264A, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27EA, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E9, - SMSG_INSTANCE_ENCOUNTER_END = 0x27F0, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E8, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F2, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F1, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27ED, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27EC, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EF, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F3, - SMSG_INSTANCE_ENCOUNTER_START = 0x27EE, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EB, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2733, - SMSG_INSTANCE_INFO = 0x264C, - SMSG_INSTANCE_RESET = 0x26AB, - SMSG_INSTANCE_RESET_FAILED = 0x26AC, - SMSG_INSTANCE_SAVE_CREATED = 0x27B8, - SMSG_INVALIDATE_PAGE_TEXT = 0x26FE, - SMSG_INVALIDATE_PLAYER = 0x26CF, - SMSG_INVALID_PROMOTION_CODE = 0x2792, - SMSG_INVENTORY_CHANGE_FAILURE = 0x275F, + SMSG_INSPECT_PVP = 0x275C, + SMSG_INSPECT_RESULT = 0x2649, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27E9, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E8, + SMSG_INSTANCE_ENCOUNTER_END = 0x27EF, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E7, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F1, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F0, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27EC, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27EB, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EE, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F2, + SMSG_INSTANCE_ENCOUNTER_START = 0x27ED, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EA, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2732, + SMSG_INSTANCE_INFO = 0x264B, + SMSG_INSTANCE_RESET = 0x26AA, + SMSG_INSTANCE_RESET_FAILED = 0x26AB, + SMSG_INSTANCE_SAVE_CREATED = 0x27B7, + SMSG_INVALIDATE_PAGE_TEXT = 0x26FD, + SMSG_INVALIDATE_PLAYER = 0x26CE, + SMSG_INVALID_PROMOTION_CODE = 0x2791, + SMSG_INVENTORY_CHANGE_FAILURE = 0x275E, SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, - SMSG_ITEM_CHANGED = 0x271D, - SMSG_ITEM_COOLDOWN = 0x27FE, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2794, + SMSG_ITEM_CHANGED = 0x271C, + SMSG_ITEM_COOLDOWN = 0x27FD, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2793, SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25AF, SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AD, - SMSG_ITEM_PUSH_RESULT = 0x2635, - SMSG_ITEM_TIME_UPDATE = 0x2793, - SMSG_KICK_REASON = 0x2821, + SMSG_ITEM_PUSH_RESULT = 0x2634, + SMSG_ITEM_TIME_UPDATE = 0x2792, + SMSG_KICK_REASON = 0x2820, SMSG_LEARNED_SPELLS = 0x2C4C, - SMSG_LEARN_PVP_TALENTS_FAILED = 0x25E7, - SMSG_LEARN_TALENTS_FAILED = 0x25E6, + SMSG_LEARN_PVP_TALENTS_FAILED = 0x25E6, + SMSG_LEARN_TALENTS_FAILED = 0x25E5, SMSG_LEVEL_UPDATE = 0x2587, - SMSG_LEVEL_UP_INFO = 0x271C, + SMSG_LEVEL_UP_INFO = 0x271B, SMSG_LFG_BOOT_PLAYER = 0x2A36, SMSG_LFG_DISABLED = 0x2A34, SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x2A25, @@ -1205,45 +1209,45 @@ enum OpcodeServer : uint32 SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0, SMSG_LF_GUILD_POST = 0x29CD, SMSG_LF_GUILD_RECRUITS = 0x29CF, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AF, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AD, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A2, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AE, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AC, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1, SMSG_LOAD_CUF_PROFILES = 0x25CB, - SMSG_LOAD_EQUIPMENT_SET = 0x2749, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27FC, - SMSG_LOGIN_SET_TIME_SPEED = 0x2748, + SMSG_LOAD_EQUIPMENT_SET = 0x2748, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27FB, + SMSG_LOGIN_SET_TIME_SPEED = 0x2747, SMSG_LOGIN_VERIFY_WORLD = 0x25AA, - SMSG_LOGOUT_CANCEL_ACK = 0x26AA, - SMSG_LOGOUT_COMPLETE = 0x26A9, - SMSG_LOGOUT_RESPONSE = 0x26A8, - SMSG_LOG_XP_GAIN = 0x2718, - SMSG_LOOT_ALL_PASSED = 0x2633, - SMSG_LOOT_ITEM_LIST = 0x2631, - SMSG_LOOT_LIST = 0x2780, - SMSG_LOOT_MONEY_NOTIFY = 0x262D, - SMSG_LOOT_RELEASE = 0x262C, - SMSG_LOOT_RELEASE_ALL = 0x262B, - SMSG_LOOT_REMOVED = 0x2626, - SMSG_LOOT_RESPONSE = 0x2625, - SMSG_LOOT_ROLL = 0x262F, - SMSG_LOOT_ROLLS_COMPLETE = 0x2632, - SMSG_LOOT_ROLL_WON = 0x2634, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2691, - SMSG_MAIL_COMMAND_RESULT = 0x2654, - SMSG_MAIL_LIST_RESULT = 0x2795, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2796, - SMSG_MAP_OBJECTIVES_INIT = 0x279E, - SMSG_MAP_OBJ_EVENTS = 0x25D6, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2630, + SMSG_LOGOUT_CANCEL_ACK = 0x26A9, + SMSG_LOGOUT_COMPLETE = 0x26A8, + SMSG_LOGOUT_RESPONSE = 0x26A7, + SMSG_LOG_XP_GAIN = 0x2717, + SMSG_LOOT_ALL_PASSED = 0x2632, + SMSG_LOOT_ITEM_LIST = 0x2630, + SMSG_LOOT_LIST = 0x277F, + SMSG_LOOT_MONEY_NOTIFY = 0x262C, + SMSG_LOOT_RELEASE = 0x262B, + SMSG_LOOT_RELEASE_ALL = 0x262A, + SMSG_LOOT_REMOVED = 0x2625, + SMSG_LOOT_RESPONSE = 0x2624, + SMSG_LOOT_ROLL = 0x262E, + SMSG_LOOT_ROLLS_COMPLETE = 0x2631, + SMSG_LOOT_ROLL_WON = 0x2633, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2690, + SMSG_MAIL_COMMAND_RESULT = 0x2653, + SMSG_MAIL_LIST_RESULT = 0x2794, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2795, + SMSG_MAP_OBJECTIVES_INIT = 0x279D, + SMSG_MAP_OBJ_EVENTS = 0x25D5, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x262F, SMSG_MESSAGE_BOX = 0x2575, - SMSG_MINIMAP_PING = 0x26F4, + SMSG_MINIMAP_PING = 0x26F3, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, - SMSG_MISSILE_CANCEL = 0x25D7, - SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A6, - SMSG_MODIFY_COOLDOWN = 0x27A4, - SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A5, - SMSG_MODIFY_PARTY_RANGE = 0x2783, + SMSG_MISSILE_CANCEL = 0x25D6, + SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A5, + SMSG_MODIFY_COOLDOWN = 0x27A3, + SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A4, + SMSG_MODIFY_PARTY_RANGE = 0x2782, SMSG_MOTD = 0x2BAF, SMSG_MOUNT_RESULT = 0x257A, SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, @@ -1326,108 +1330,108 @@ enum OpcodeServer : uint32 SMSG_MOVE_UPDATE_TELEPORT = 0x2DAF, SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25EF, - SMSG_NEW_TAXI_PATH = 0x26A3, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25EE, + SMSG_NEW_TAXI_PATH = 0x26A2, SMSG_NEW_WORLD = 0x25A9, SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CE, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CD, SMSG_NOTIFY_MONEY = 0x25AC, - SMSG_NOTIFY_RECEIVED_MAIL = 0x2655, - SMSG_OFFER_PETITION_ERROR = 0x26DD, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2719, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2654, + SMSG_OFFER_PETITION_ERROR = 0x26DC, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2718, SMSG_ON_MONSTER_MOVE = 0x2DA2, - SMSG_OPEN_CONTAINER = 0x2760, + SMSG_OPEN_CONTAINER = 0x275F, SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D5, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D7, - SMSG_OVERRIDE_LIGHT = 0x26E3, - SMSG_PAGE_TEXT = 0x2755, - SMSG_PARTY_COMMAND_RESULT = 0x27D2, - SMSG_PARTY_INVITE = 0x25CD, - SMSG_PARTY_KILL_LOG = 0x279A, - SMSG_PARTY_MEMBER_STATE = 0x2798, - SMSG_PARTY_UPDATE = 0x2609, - SMSG_PAUSE_MIRROR_TIMER = 0x274B, - SMSG_PENDING_RAID_LOCK = 0x272D, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D4, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D6, + SMSG_OVERRIDE_LIGHT = 0x26E2, + SMSG_PAGE_TEXT = 0x2754, + SMSG_PARTY_COMMAND_RESULT = 0x27D1, + SMSG_PARTY_INVITE = 0x25CC, + SMSG_PARTY_KILL_LOG = 0x2799, + SMSG_PARTY_MEMBER_STATE = 0x2797, + SMSG_PARTY_UPDATE = 0x2608, + SMSG_PAUSE_MIRROR_TIMER = 0x274A, + SMSG_PENDING_RAID_LOCK = 0x272C, SMSG_PETITION_ALREADY_SIGNED = 0x25B6, SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7, - SMSG_PETITION_SHOW_LIST = 0x26E6, - SMSG_PETITION_SHOW_SIGNATURES = 0x26E7, - SMSG_PETITION_SIGN_RESULTS = 0x278C, - SMSG_PET_ACTION_FEEDBACK = 0x278A, - SMSG_PET_ACTION_SOUND = 0x26C5, + SMSG_PETITION_SHOW_LIST = 0x26E5, + SMSG_PETITION_SHOW_SIGNATURES = 0x26E6, + SMSG_PETITION_SIGN_RESULTS = 0x278B, + SMSG_PET_ACTION_FEEDBACK = 0x2789, + SMSG_PET_ACTION_SOUND = 0x26C4, SMSG_PET_ADDED = 0x25A6, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2616, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2698, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x260F, - SMSG_PET_BATTLE_FINAL_ROUND = 0x2614, - SMSG_PET_BATTLE_FINISHED = 0x2615, - SMSG_PET_BATTLE_FIRST_ROUND = 0x2611, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2610, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2617, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x260E, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2652, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x2653, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2613, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x260D, - SMSG_PET_BATTLE_ROUND_RESULT = 0x2612, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x2600, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2615, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2697, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x260E, + SMSG_PET_BATTLE_FINAL_ROUND = 0x2613, + SMSG_PET_BATTLE_FINISHED = 0x2614, + SMSG_PET_BATTLE_FIRST_ROUND = 0x2610, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x260F, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2616, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x260D, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2651, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2652, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2612, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x260C, + SMSG_PET_BATTLE_ROUND_RESULT = 0x2611, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x25FF, SMSG_PET_CAST_FAILED = 0x2C56, SMSG_PET_CLEAR_SPELLS = 0x2C23, - SMSG_PET_DISMISS_SOUND = 0x26C6, - SMSG_PET_GOD_MODE = 0x26A0, - SMSG_PET_GUIDS = 0x273E, + SMSG_PET_DISMISS_SOUND = 0x26C5, + SMSG_PET_GOD_MODE = 0x269F, + SMSG_PET_GUIDS = 0x273D, SMSG_PET_LEARNED_SPELLS = 0x2C4E, SMSG_PET_MODE = 0x2589, - SMSG_PET_NAME_INVALID = 0x26EB, + SMSG_PET_NAME_INVALID = 0x26EA, SMSG_PET_SLOT_UPDATED = 0x2588, SMSG_PET_SPELLS_MESSAGE = 0x2C24, SMSG_PET_STABLE_LIST = 0x25A7, SMSG_PET_STABLE_RESULT = 0x25A8, - SMSG_PET_TAME_FAILURE = 0x26DA, + SMSG_PET_TAME_FAILURE = 0x26D9, SMSG_PET_UNLEARNED_SPELLS = 0x2C4F, SMSG_PHASE_SHIFT_CHANGE = 0x2577, - SMSG_PLAYED_TIME = 0x2705, + SMSG_PLAYED_TIME = 0x2704, SMSG_PLAYER_BOUND = 0x257D, SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, - SMSG_PLAYER_SKINNED = 0x2785, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2799, - SMSG_PLAY_MUSIC = 0x27A9, - SMSG_PLAY_OBJECT_SOUND = 0x27AA, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276F, + SMSG_PLAYER_SKINNED = 0x2784, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2798, + SMSG_PLAY_MUSIC = 0x27A8, + SMSG_PLAY_OBJECT_SOUND = 0x27A9, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276E, SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46, - SMSG_PLAY_SCENE = 0x264F, - SMSG_PLAY_SOUND = 0x27A8, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AB, + SMSG_PLAY_SCENE = 0x264E, + SMSG_PLAY_SOUND = 0x27A7, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AA, SMSG_PLAY_SPELL_VISUAL = 0x2C44, SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48, - SMSG_PLAY_TIME_WARNING = 0x2737, - SMSG_PONG = 0x304D, - SMSG_POWER_UPDATE = 0x26FA, - SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2754, - SMSG_PRE_RESSURECT = 0x27A7, - SMSG_PRINT_NOTIFICATION = 0x25DE, - SMSG_PROC_RESIST = 0x279B, - SMSG_PROPOSE_LEVEL_GRANT = 0x270D, + SMSG_PLAY_TIME_WARNING = 0x2736, + SMSG_PONG = 0x304E, + SMSG_POWER_UPDATE = 0x26F9, + SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2753, + SMSG_PRE_RESSURECT = 0x27A6, + SMSG_PRINT_NOTIFICATION = 0x25DD, + SMSG_PROC_RESIST = 0x279A, + SMSG_PROPOSE_LEVEL_GRANT = 0x270C, SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C50, - SMSG_PVP_CREDIT = 0x2713, + SMSG_PVP_CREDIT = 0x2712, SMSG_PVP_LOG_DATA = 0x25B1, SMSG_PVP_OPTIONS_ENABLED = 0x25B4, - SMSG_PVP_SEASON = 0x25D1, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2700, - SMSG_QUERY_CREATURE_RESPONSE = 0x26F7, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F8, + SMSG_PVP_SEASON = 0x25D0, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x26FF, + SMSG_QUERY_CREATURE_RESPONSE = 0x26F6, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F7, SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27FD, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FB, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FD, - SMSG_QUERY_PETITION_RESPONSE = 0x2701, - SMSG_QUERY_PET_NAME_RESPONSE = 0x26FF, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FC, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27FC, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FA, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FC, + SMSG_QUERY_PETITION_RESPONSE = 0x2700, + SMSG_QUERY_PET_NAME_RESPONSE = 0x26FE, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FB, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A95, - SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2836, - SMSG_QUERY_TIME_RESPONSE = 0x2717, + SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2835, + SMSG_QUERY_TIME_RESPONSE = 0x2716, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8E, SMSG_QUEST_FORCE_REMOVED = 0x2A9A, @@ -1445,6 +1449,7 @@ enum OpcodeServer : uint32 SMSG_QUEST_POI_CHANGED = 0x2A9E, SMSG_QUEST_POI_QUERY_RESPONSE = 0x2A9B, SMSG_QUEST_PUSH_RESULT = 0x2A8F, + SMSG_QUEST_UNIGNORED = 0x2AA0, SMSG_QUEST_UPDATE_ADD_CREDIT = 0x2A8B, SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x2A8C, SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x2A8D, @@ -1452,113 +1457,113 @@ enum OpcodeServer : uint32 SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL = 0x2A87, SMSG_QUEST_UPDATE_FAILED = 0x2A89, SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A8A, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C3, - SMSG_RAID_DIFFICULTY_SET = 0x27E5, - SMSG_RAID_GROUP_ONLY = 0x27E7, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C2, + SMSG_RAID_DIFFICULTY_SET = 0x27E4, + SMSG_RAID_GROUP_ONLY = 0x27E6, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB9, SMSG_RAID_MARKERS_CHANGED = 0x25B7, - SMSG_RANDOM_ROLL = 0x2649, + SMSG_RANDOM_ROLL = 0x2648, SMSG_RATED_BATTLEFIELD_INFO = 0x25A4, - SMSG_READY_CHECK_COMPLETED = 0x260C, - SMSG_READY_CHECK_RESPONSE = 0x260B, - SMSG_READY_CHECK_STARTED = 0x260A, - SMSG_READ_ITEM_RESULT_FAILED = 0x27E1, - SMSG_READ_ITEM_RESULT_OK = 0x27DC, - SMSG_REALM_QUERY_RESPONSE = 0x26E2, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C4, - SMSG_REFER_A_FRIEND_EXPIRED = 0x275E, - SMSG_REFER_A_FRIEND_FAILURE = 0x26E8, - SMSG_REFRESH_COMPONENT = 0x2674, + SMSG_READY_CHECK_COMPLETED = 0x260B, + SMSG_READY_CHECK_RESPONSE = 0x260A, + SMSG_READY_CHECK_STARTED = 0x2609, + SMSG_READ_ITEM_RESULT_FAILED = 0x27E0, + SMSG_READ_ITEM_RESULT_OK = 0x27DB, + SMSG_REALM_QUERY_RESPONSE = 0x26E1, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C3, + SMSG_REFER_A_FRIEND_EXPIRED = 0x275D, + SMSG_REFER_A_FRIEND_FAILURE = 0x26E7, + SMSG_REFRESH_COMPONENT = 0x2673, SMSG_REFRESH_SPELL_HISTORY = 0x2C2B, SMSG_REMOVE_ITEM_PASSIVE = 0x25BE, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x2693, - SMSG_REPLACE_TROPHY_RESPONSE = 0x27FA, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D6, - SMSG_REQUEST_ADDON_LIST = 0x265B, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x2692, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27F9, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D5, + SMSG_REQUEST_ADDON_LIST = 0x265A, SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D2, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D1, SMSG_RESEARCH_COMPLETE = 0x2585, - SMSG_RESET_AREA_TRIGGER = 0x263D, - SMSG_RESET_COMPRESSION_CONTEXT = 0x304E, - SMSG_RESET_FAILED_NOTIFY = 0x26DE, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x2710, + SMSG_RESET_AREA_TRIGGER = 0x263C, + SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, + SMSG_RESET_FAILED_NOTIFY = 0x26DD, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x270F, SMSG_RESET_WEEKLY_CURRENCY = 0x2574, - SMSG_RESPEC_WIPE_CONFIRM = 0x2623, + SMSG_RESPEC_WIPE_CONFIRM = 0x2622, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571, SMSG_RESUME_CAST_BAR = 0x2C3D, - SMSG_RESUME_COMMS = 0x304A, + SMSG_RESUME_COMMS = 0x304B, SMSG_RESUME_TOKEN = 0x25BC, SMSG_RESURRECT_REQUEST = 0x257E, - SMSG_RESYNC_RUNES = 0x273A, + SMSG_RESYNC_RUNES = 0x2739, SMSG_ROLE_CHANGED_INFORM = 0x258C, SMSG_ROLE_CHOSEN = 0x2A3A, SMSG_ROLE_POLL_INFORM = 0x258D, SMSG_RUNE_REGEN_DEBUG = 0x25C5, - SMSG_SCENARIO_BOOT = 0x27E2, - SMSG_SCENARIO_COMPLETED = 0x281D, - SMSG_SCENARIO_POIS = 0x264B, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x2645, - SMSG_SCENARIO_SPELL_UPDATE = 0x2829, - SMSG_SCENARIO_STATE = 0x2644, - SMSG_SCENE_OBJECT_EVENT = 0x25F5, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FA, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FB, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F7, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F6, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25F9, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25F8, + SMSG_SCENARIO_BOOT = 0x27E1, + SMSG_SCENARIO_COMPLETED = 0x281C, + SMSG_SCENARIO_POIS = 0x264A, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2644, + SMSG_SCENARIO_SPELL_UPDATE = 0x2828, + SMSG_SCENARIO_STATE = 0x2643, + SMSG_SCENE_OBJECT_EVENT = 0x25F4, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25F9, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FA, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F6, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F5, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25F8, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25F7, SMSG_SCRIPT_CAST = 0x2C54, - SMSG_SELL_RESPONSE = 0x26EC, + SMSG_SELL_RESPONSE = 0x26EB, SMSG_SEND_ITEM_PASSIVES = 0x25BF, SMSG_SEND_KNOWN_SPELLS = 0x2C29, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2647, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2648, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2646, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2647, SMSG_SEND_SPELL_CHARGES = 0x2C2C, SMSG_SEND_SPELL_HISTORY = 0x2C2A, SMSG_SEND_UNLEARN_SPELLS = 0x2C2D, SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2BC1, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2666, - SMSG_SERVER_TIME = 0x26A7, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2665, + SMSG_SERVER_TIME = 0x26A6, SMSG_SETUP_CURRENCY = 0x2572, SMSG_SETUP_RESEARCH_HISTORY = 0x2584, - SMSG_SET_AI_ANIM_KIT = 0x276E, - SMSG_SET_ALL_TASK_PROGRESS = 0x27CC, - SMSG_SET_ANIM_TIER = 0x2772, + SMSG_SET_AI_ANIM_KIT = 0x276D, + SMSG_SET_ALL_TASK_PROGRESS = 0x27CB, + SMSG_SET_ANIM_TIER = 0x2771, SMSG_SET_CURRENCY = 0x2573, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, - SMSG_SET_DUNGEON_DIFFICULTY = 0x26CA, - SMSG_SET_FACTION_AT_WAR = 0x2739, - SMSG_SET_FACTION_NOT_VISIBLE = 0x2769, - SMSG_SET_FACTION_STANDING = 0x276A, - SMSG_SET_FACTION_VISIBLE = 0x2768, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26C9, + SMSG_SET_FACTION_AT_WAR = 0x2738, + SMSG_SET_FACTION_NOT_VISIBLE = 0x2768, + SMSG_SET_FACTION_STANDING = 0x2769, + SMSG_SET_FACTION_VISIBLE = 0x2767, SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, - SMSG_SET_FORCED_REACTIONS = 0x2758, + SMSG_SET_FORCED_REACTIONS = 0x2757, SMSG_SET_ITEM_PURCHASE_DATA = 0x25AE, - SMSG_SET_LOOT_METHOD_FAILED = 0x2809, + SMSG_SET_LOOT_METHOD_FAILED = 0x2808, SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B5, - SMSG_SET_MELEE_ANIM_KIT = 0x2771, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x2770, + SMSG_SET_MELEE_ANIM_KIT = 0x2770, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x276F, SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x263E, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2704, + SMSG_SET_PET_SPECIALIZATION = 0x263D, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2703, SMSG_SET_PLAY_HOVER_ANIM = 0x25C9, - SMSG_SET_PROFICIENCY = 0x2773, + SMSG_SET_PROFICIENCY = 0x2772, SMSG_SET_SPELL_CHARGES = 0x2C28, - SMSG_SET_TASK_COMPLETE = 0x27CD, - SMSG_SET_TIME_ZONE_INFORMATION = 0x269B, - SMSG_SET_VEHICLE_REC_ID = 0x272C, - SMSG_SHOW_ADVENTURE_MAP = 0x2827, - SMSG_SHOW_BANK = 0x26A4, - SMSG_SHOW_MAILBOX = 0x27E3, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25EE, - SMSG_SHOW_TAXI_NODES = 0x26F3, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B0, - SMSG_SOCKET_GEMS = 0x2765, - SMSG_SOCKET_GEMS_FAILURE = 0x2766, - SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F0, - SMSG_SPECIALIZATION_CHANGED = 0x25E9, - SMSG_SPECIAL_MOUNT_ANIM = 0x26C4, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2753, + SMSG_SET_TASK_COMPLETE = 0x27CC, + SMSG_SET_TIME_ZONE_INFORMATION = 0x269A, + SMSG_SET_VEHICLE_REC_ID = 0x272B, + SMSG_SHOW_ADVENTURE_MAP = 0x2826, + SMSG_SHOW_BANK = 0x26A3, + SMSG_SHOW_MAILBOX = 0x27E2, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25ED, + SMSG_SHOW_TAXI_NODES = 0x26F2, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27AF, + SMSG_SOCKET_GEMS = 0x2764, + SMSG_SOCKET_GEMS_FAILURE = 0x2765, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25EF, + SMSG_SPECIALIZATION_CHANGED = 0x25E8, + SMSG_SPECIAL_MOUNT_ANIM = 0x26C3, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2752, SMSG_SPELL_ABSORB_LOG = 0x2C1E, SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17, SMSG_SPELL_CHANNEL_START = 0x2C34, @@ -1582,112 +1587,111 @@ enum OpcodeServer : uint32 SMSG_SPELL_PREPARE = 0x2C38, SMSG_SPELL_START = 0x2C3A, SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2C33, - SMSG_SPIRIT_HEALER_CONFIRM = 0x2750, - SMSG_STAND_STATE_UPDATE = 0x2757, - SMSG_START_ELAPSED_TIMER = 0x2618, - SMSG_START_ELAPSED_TIMERS = 0x261A, - SMSG_START_LOOT_ROLL = 0x262E, - SMSG_START_MIRROR_TIMER = 0x274A, + SMSG_SPIRIT_HEALER_CONFIRM = 0x274F, + SMSG_STAND_STATE_UPDATE = 0x2756, + SMSG_START_ELAPSED_TIMER = 0x2617, + SMSG_START_ELAPSED_TIMERS = 0x2619, + SMSG_START_LOOT_ROLL = 0x262D, + SMSG_START_MIRROR_TIMER = 0x2749, SMSG_START_TIMER = 0x25B9, - SMSG_STOP_ELAPSED_TIMER = 0x2619, - SMSG_STOP_MIRROR_TIMER = 0x274C, - SMSG_STOP_SPEAKERBOT_SOUND = 0x27AC, + SMSG_STOP_ELAPSED_TIMER = 0x2618, + SMSG_STOP_MIRROR_TIMER = 0x274B, + SMSG_STOP_SPEAKERBOT_SOUND = 0x27AB, SMSG_STREAMING_MOVIES = 0x25B8, - SMSG_SUMMON_CANCEL = 0x26D5, + SMSG_SUMMON_CANCEL = 0x26D4, SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, - SMSG_SUMMON_REQUEST = 0x275C, + SMSG_SUMMON_REQUEST = 0x275B, SMSG_SUPERCEDED_SPELLS = 0x2C4B, - SMSG_SUPPRESS_NPC_GREETINGS = 0x25CC, - SMSG_SUSPEND_COMMS = 0x3049, + SMSG_SUSPEND_COMMS = 0x304A, SMSG_SUSPEND_TOKEN = 0x25BB, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2752, - SMSG_TAXI_NODE_STATUS = 0x26A1, - SMSG_TEXT_EMOTE = 0x269F, - SMSG_THREAT_CLEAR = 0x270C, - SMSG_THREAT_REMOVE = 0x270B, - SMSG_THREAT_UPDATE = 0x270A, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2751, + SMSG_TAXI_NODE_STATUS = 0x26A0, + SMSG_TEXT_EMOTE = 0x269E, + SMSG_THREAT_CLEAR = 0x270B, + SMSG_THREAT_REMOVE = 0x270A, + SMSG_THREAT_UPDATE = 0x2709, SMSG_TIME_ADJUSTMENT = 0x2DA1, SMSG_TIME_SYNC_REQUEST = 0x2DA0, - SMSG_TITLE_EARNED = 0x2707, - SMSG_TITLE_LOST = 0x2708, - SMSG_TOTEM_CREATED = 0x26EF, - SMSG_TOTEM_MOVED = 0x26F0, + SMSG_TITLE_EARNED = 0x2706, + SMSG_TITLE_LOST = 0x2707, + SMSG_TOTEM_CREATED = 0x26EE, + SMSG_TOTEM_MOVED = 0x26EF, SMSG_TRADE_STATUS = 0x2581, SMSG_TRADE_UPDATED = 0x2580, - SMSG_TRAINER_BUY_FAILED = 0x2712, - SMSG_TRAINER_LIST = 0x2711, - SMSG_TRANSFER_ABORTED = 0x273D, - SMSG_TRANSFER_PENDING = 0x25E2, + SMSG_TRAINER_BUY_FAILED = 0x2711, + SMSG_TRAINER_LIST = 0x2710, + SMSG_TRANSFER_ABORTED = 0x273C, + SMSG_TRANSFER_PENDING = 0x25E1, SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C4, - SMSG_TRIGGER_CINEMATIC = 0x2801, - SMSG_TRIGGER_MOVIE = 0x26F1, - SMSG_TURN_IN_PETITION_RESULT = 0x278E, - SMSG_TUTORIAL_FLAGS = 0x27F4, - SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x2830, - SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x282F, + SMSG_TRIGGER_CINEMATIC = 0x2800, + SMSG_TRIGGER_MOVIE = 0x26F0, + SMSG_TURN_IN_PETITION_RESULT = 0x278D, + SMSG_TUTORIAL_FLAGS = 0x27F3, + SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x282F, + SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x282E, SMSG_TWITTER_STATUS = 0x2FFD, - SMSG_UI_TIME = 0x274F, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2804, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2805, + SMSG_UI_TIME = 0x274E, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2803, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2804, SMSG_UNLEARNED_SPELLS = 0x2C4D, - SMSG_UPDATE_ACCOUNT_DATA = 0x2744, - SMSG_UPDATE_ACTION_BUTTONS = 0x25F3, - SMSG_UPDATE_CHARACTER_FLAGS = 0x27F9, + SMSG_UPDATE_ACCOUNT_DATA = 0x2743, + SMSG_UPDATE_ACTION_BUTTONS = 0x25F2, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27F8, SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A31, - SMSG_UPDATE_EXPANSION_LEVEL = 0x265F, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26CD, - SMSG_UPDATE_LAST_INSTANCE = 0x26AD, - SMSG_UPDATE_OBJECT = 0x2802, - SMSG_UPDATE_TALENT_DATA = 0x25E8, - SMSG_UPDATE_TASK_PROGRESS = 0x27CB, + SMSG_UPDATE_EXPANSION_LEVEL = 0x265E, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26CC, + SMSG_UPDATE_LAST_INSTANCE = 0x26AC, + SMSG_UPDATE_OBJECT = 0x2801, + SMSG_UPDATE_TALENT_DATA = 0x25E7, + SMSG_UPDATE_TASK_PROGRESS = 0x27CA, SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, - SMSG_UPDATE_WORLD_STATE = 0x2789, + SMSG_UPDATE_WORLD_STATE = 0x2788, SMSG_USERLIST_ADD = 0x2BBE, SMSG_USERLIST_REMOVE = 0x2BBF, SMSG_USERLIST_UPDATE = 0x2BC0, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x278F, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x278E, SMSG_VENDOR_INVENTORY = 0x25C7, - SMSG_VIGNETTE_UPDATE = 0x27AE, + SMSG_VIGNETTE_UPDATE = 0x27AD, SMSG_VOICE_CHAT_STATUS = 0x2BB3, SMSG_VOICE_PARENTAL_CONTROLS = 0x2BB4, SMSG_VOICE_SESSION_LEAVE = 0x2BB6, SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2BB5, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DC, - SMSG_VOID_STORAGE_CONTENTS = 0x25D9, - SMSG_VOID_STORAGE_FAILED = 0x25D8, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DA, - SMSG_VOID_TRANSFER_RESULT = 0x25DB, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DB, + SMSG_VOID_STORAGE_CONTENTS = 0x25D8, + SMSG_VOID_STORAGE_FAILED = 0x25D7, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25D9, + SMSG_VOID_TRANSFER_RESULT = 0x25DA, SMSG_WAIT_QUEUE_FINISH = 0x256E, SMSG_WAIT_QUEUE_UPDATE = 0x256D, SMSG_WARDEN_DATA = 0x2576, SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B2, - SMSG_WEATHER = 0x26CC, + SMSG_WEATHER = 0x26CB, SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, - SMSG_WHO_IS = 0x26CB, + SMSG_WHO_IS = 0x26CA, SMSG_WORLD_SERVER_INFO = 0x25C0, - SMSG_WORLD_TEXT = 0x281F, - SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280F, - SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2811, - SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2812, - SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x2810, - SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x280A, - SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280B, - SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x280C, - SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2813, - SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2814, - SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2815, - SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x280D, - SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x280E, - SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2816, - SMSG_XP_GAIN_ABORTED = 0x25DD, - SMSG_XP_GAIN_ENABLED = 0x27E6, + SMSG_WORLD_TEXT = 0x281E, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280E, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2810, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2811, + SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280F, + SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2809, + SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280A, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x280B, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2812, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2813, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2814, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x280C, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x280D, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2815, + SMSG_XP_GAIN_ABORTED = 0x25DC, + SMSG_XP_GAIN_ENABLED = 0x27E5, SMSG_ZONE_UNDER_ATTACK = 0x2BBA, // Opcodes that are not generated automatically SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0xBADD, // no client handler - SMSG_COMPRESSED_PACKET = 0x3051, - SMSG_MULTIPLE_PACKETS = 0x3050, + SMSG_COMPRESSED_PACKET = 0x3052, + SMSG_MULTIPLE_PACKETS = 0x3051, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = 0xBADD, diff --git a/src/server/game/Server/Protocol/ServerPktHeader.h b/src/server/game/Server/Protocol/ServerPktHeader.h deleted file mode 100644 index d3fe37de94a..00000000000 --- a/src/server/game/Server/Protocol/ServerPktHeader.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef __SERVERPKTHDR_H__ -#define __SERVERPKTHDR_H__ - -#pragma pack(push, 1) - -union ServerPktHeader -{ - struct - { - uint16 Size; - uint16 Command; - } Setup; - - struct - { - uint32 Size; - uint16 Command; - } Normal; -}; - -#pragma pack(pop) - -#endif diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 25b7116aa99..12a62619798 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -56,24 +56,23 @@ private: using boost::asio::ip::tcp; -uint32 const WorldSocket::ConnectionInitializeMagic = 0xF5EB1CE; std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"); -std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER", 48); +std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER"); uint32 const WorldSocket::MinSizeForCompression = 0x400; -uint32 const SizeOfClientHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) }; -uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) }; +uint32 const SizeOfClientHeader = sizeof(uint32) + sizeof(uint16); +uint32 const SizeOfServerHeader = sizeof(uint32) + sizeof(uint16); uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3F, 0x1D, 0xCD, 0xB6, 0xA1, 0x37, 0x28, 0xB3, 0x12, 0xFF, 0x8A }; uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B }; uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F }; WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), - _type(CONNECTION_TYPE_REALM), _OverSpeedPings(0), + _type(CONNECTION_TYPE_REALM), _key(0), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _compressionStream(nullptr) { _serverChallenge.SetRand(8 * 16); - _headerBuffer.Resize(SizeOfClientHeader[0]); + _headerBuffer.Resize(SizeOfClientHeader); } WorldSocket::~WorldSocket() @@ -120,16 +119,13 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) } } - _packetBuffer.Resize(4 + 2 + ClientConnectionInitialize.length()); + _packetBuffer.Resize(ClientConnectionInitialize.length() + 1); AsyncReadWithCallback(&WorldSocket::InitializeHandler); MessageBuffer initializer; - ServerPktHeader header; - header.Setup.Size = ServerConnectionInitialize.size(); - initializer.Write(&ConnectionInitializeMagic, sizeof(ConnectionInitializeMagic)); - initializer.Write(&header, sizeof(header.Setup.Size)); initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length()); + initializer.Write("\n", 1); // - io_service.run thread, safe. QueuePacket(std::move(initializer)); @@ -163,26 +159,17 @@ void WorldSocket::InitializeHandler(boost::system::error_code error, std::size_t return; } - uint32 magic; - uint16 length; ByteBuffer buffer(std::move(_packetBuffer)); - - buffer >> magic; - if (magic != ConnectionInitializeMagic) - { - CloseSocket(); - return; - } - - buffer >> length; - if (length > ClientConnectionInitialize.length()) + std::string initializer = buffer.ReadString(ClientConnectionInitialize.length()); + if (initializer != ClientConnectionInitialize) { CloseSocket(); return; } - std::string initializer = buffer.ReadString(length); - if (initializer != ClientConnectionInitialize) + uint8 terminator; + buffer >> terminator; + if (terminator != '\n') { CloseSocket(); return; @@ -218,22 +205,21 @@ bool WorldSocket::Update() MessageBuffer buffer; while (_bufferQueue.Dequeue(queued)) { - uint32 sizeOfHeader = SizeOfServerHeader[queued->NeedsEncryption()]; uint32 packetSize = queued->size(); if (packetSize > MinSizeForCompression && queued->NeedsEncryption()) packetSize = compressBound(packetSize) + sizeof(CompressedWorldPacket); - if (buffer.GetRemainingSpace() < packetSize + sizeOfHeader) + if (buffer.GetRemainingSpace() < packetSize + SizeOfServerHeader) { QueuePacket(std::move(buffer)); buffer.Resize(4096); } - if (buffer.GetRemainingSpace() >= packetSize + sizeOfHeader) + if (buffer.GetRemainingSpace() >= packetSize + SizeOfServerHeader) WritePacketToBuffer(*queued, buffer); else // single packet larger than 4096 bytes { - MessageBuffer packetBuffer(packetSize + sizeOfHeader); + MessageBuffer packetBuffer(packetSize + SizeOfServerHeader); WritePacketToBuffer(*queued, packetBuffer); QueuePacket(std::move(packetBuffer)); } @@ -340,20 +326,6 @@ void WorldSocket::ReadHandler() AsyncRead(); } -void WorldSocket::ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const -{ - if (_authCrypt.IsInitialized()) - { - opcode = header->Normal.Command; - size = header->Normal.Size - 2; - } - else - { - opcode = header->Setup.Command; - size = header->Setup.Size - 2; - } -} - void WorldSocket::SetWorldSession(WorldSession* session) { std::lock_guard sessionGuard(_worldSessionLock); @@ -363,36 +335,28 @@ void WorldSocket::SetWorldSession(WorldSession* session) bool WorldSocket::ReadHeaderHandler() { - ASSERT(_headerBuffer.GetActiveSize() == SizeOfClientHeader[_authCrypt.IsInitialized()], "Header size " SZFMTD " different than expected %u", _headerBuffer.GetActiveSize(), SizeOfClientHeader[_authCrypt.IsInitialized()]); + ASSERT(_headerBuffer.GetActiveSize() == SizeOfClientHeader, "Header size " SZFMTD " different than expected %u", _headerBuffer.GetActiveSize(), SizeOfClientHeader); _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), 4); - ClientPktHeader* header = reinterpret_cast(_headerBuffer.GetReadPointer()); - uint32 opcode; - uint32 size; - - ExtractOpcodeAndSize(header, opcode, size); + PacketHeader* header = reinterpret_cast(_headerBuffer.GetReadPointer()); + header->Size -= 2; - if (!ClientPktHeader::IsValidSize(size) || !ClientPktHeader::IsValidOpcode(opcode)) + if (!header->IsValidSize() || !header->IsValidOpcode()) { TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client %s sent malformed packet (size: %u, cmd: %u)", - GetRemoteIpAddress().to_string().c_str(), size, opcode); + GetRemoteIpAddress().to_string().c_str(), header->Size, header->Command); return false; } - _packetBuffer.Resize(size); + _packetBuffer.Resize(header->Size); return true; } WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() { - ClientPktHeader* header = reinterpret_cast(_headerBuffer.GetReadPointer()); - uint32 cmd; - uint32 size; - - ExtractOpcodeAndSize(header, cmd, size); - - OpcodeClient opcode = static_cast(cmd); + PacketHeader* header = reinterpret_cast(_headerBuffer.GetReadPointer()); + OpcodeClient opcode = static_cast(header->Command); WorldPacket packet(opcode, std::move(_packetBuffer), GetConnectionType()); @@ -459,6 +423,10 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() HandleConnectToFailed(connectToFailed); break; } + case CMSG_ENABLE_ENCRYPTION_ACK: + LogOpcodeText(opcode, sessionGuard); + HandleEnableEncryptionAck(); + break; default: { sessionGuard.lock(); @@ -523,14 +491,12 @@ void WorldSocket::SendPacket(WorldPacket const& packet) void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBuffer& buffer) { - ServerPktHeader header; - uint32 sizeOfHeader = SizeOfServerHeader[packet.NeedsEncryption()]; uint32 opcode = packet.GetOpcode(); uint32 packetSize = packet.size(); // Reserve space for buffer uint8* headerPos = buffer.GetWritePointer(); - buffer.WriteCompleted(sizeOfHeader); + buffer.WriteCompleted(SizeOfServerHeader); if (packetSize > MinSizeForCompression && packet.NeedsEncryption()) { @@ -557,19 +523,12 @@ void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBu packetSize += 2 /*opcode*/; - if (packet.NeedsEncryption()) - { - header.Normal.Size = packetSize; - header.Normal.Command = opcode; - _authCrypt.EncryptSend((uint8*)&header, 4); - } - else - { - header.Setup.Size = packetSize; - header.Setup.Command = opcode; - } + PacketHeader header; + header.Size = packetSize; + header.Command = opcode; + _authCrypt.EncryptSend((uint8*)&header, 4); - memcpy(headerPos, &header, sizeOfHeader); + memcpy(headerPos, &header, SizeOfServerHeader); } uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet) @@ -666,9 +625,6 @@ struct AccountInfo void WorldSocket::HandleAuthSession(std::shared_ptr authSession) { - // Client switches packet headers after sending CMSG_AUTH_SESSION - _headerBuffer.Resize(SizeOfClientHeader[1]); - // Get the account information from the auth database PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME); stmt->setInt32(0, int32(realm.Id.Realm)); @@ -718,10 +674,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr sessionKeyGenerator(sessionKeyHmac.GetDigest(), sessionKeyHmac.GetLength()); sessionKeyGenerator.Generate(sessionKey, 40); - BigNumber K; - K.SetBinary(sessionKey, 40); - - _authCrypt.Init(&K); + _sessionKey.SetBinary(sessionKey, 40); // As we don't know if attempted login process by ip works, we update last_attempt_ip right away PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_ATTEMPT_IP); @@ -731,7 +684,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptrsetString(0, K.AsHexStr()); + stmt->setString(0, _sessionKey.AsHexStr()); stmt->setUInt32(1, account.Game.Id); LoginDatabase.Execute(stmt); @@ -841,7 +794,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptrInitWarden(&account.Game.SessionKey); + _worldSession->InitWarden(&_sessionKey); _queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1); _queryFuture = _worldSession->LoadPermissionsAsync(); @@ -853,7 +806,7 @@ void WorldSocket::LoadSessionPermissionsCallback(PreparedQueryResult result) // RBAC must be loaded before adding session to check for skip queue permission _worldSession->GetRBACData()->LoadFromDBCallback(result); - sWorld->AddSession(_worldSession); + SendPacketAndLogOpcode(*WorldPackets::Auth::EnableEncryption().Write()); } void WorldSocket::HandleAuthContinuedSession(std::shared_ptr authSession) @@ -869,9 +822,6 @@ void WorldSocket::HandleAuthContinuedSession(std::shared_ptrsetUInt32(0, accountId); @@ -890,17 +840,14 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptrKey; + _key = key.Raw = authSession->Key; uint32 accountId = uint32(key.Fields.AccountId); Field* fields = result->Fetch(); std::string login = fields[0].GetString(); - BigNumber k; - k.SetHexStr(fields[1].GetCString()); + _sessionKey.SetHexStr(fields[1].GetCString()); - _authCrypt.Init(&k, _encryptSeed.AsByteArray().get(), _decryptSeed.AsByteArray().get()); - - HmacSha256 hmac(40, k.AsByteArray(40).get()); + HmacSha256 hmac(40, _sessionKey.AsByteArray(40).get()); hmac.UpdateData(reinterpret_cast(&authSession->Key), sizeof(authSession->Key)); hmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size()); hmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16); @@ -914,7 +861,7 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptrAddInstanceSocket(shared_from_this(), authSession->Key); + SendPacketAndLogOpcode(*WorldPackets::Auth::EnableEncryption().Write()); AsyncRead(); } @@ -956,6 +903,20 @@ void WorldSocket::HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& con } } +void WorldSocket::HandleEnableEncryptionAck() +{ + if (_type == CONNECTION_TYPE_REALM) + { + _authCrypt.Init(&_sessionKey); + sWorld->AddSession(_worldSession); + } + else + { + _authCrypt.Init(&_sessionKey, _encryptSeed.AsByteArray().get(), _decryptSeed.AsByteArray().get()); + sWorld->AddInstanceSocket(shared_from_this(), _key); + } +} + void WorldSocket::SendAuthResponseError(uint32 code) { WorldPackets::Auth::AuthResponse response; diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 5aed861e613..44f253d0864 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -21,7 +21,6 @@ #include "Common.h" #include "WorldPacketCrypt.h" -#include "ServerPktHeader.h" #include "Socket.h" #include "Util.h" #include "WorldPacket.h" @@ -47,29 +46,19 @@ namespace WorldPackets #pragma pack(push, 1) -union ClientPktHeader +struct PacketHeader { - struct - { - uint16 Size; - uint16 Command; - } Setup; - - struct - { - uint32 Size; - uint16 Command; - } Normal; + uint32 Size; + uint16 Command; - static bool IsValidSize(uint32 size) { return size < 10240; } - static bool IsValidOpcode(uint32 opcode) { return opcode < NUM_OPCODE_HANDLERS; } + bool IsValidSize() { return Size < 10240; } + bool IsValidOpcode() { return Command < NUM_OPCODE_HANDLERS; } }; #pragma pack(pop) class TC_GAME_API WorldSocket : public Socket { - static uint32 const ConnectionInitializeMagic; static std::string const ServerConnectionInitialize; static std::string const ClientConnectionInitialize; static uint32 const MinSizeForCompression; @@ -129,17 +118,18 @@ private: void HandleAuthContinuedSessionCallback(std::shared_ptr authSession, PreparedQueryResult result); void LoadSessionPermissionsCallback(PreparedQueryResult result); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); + void HandleEnableEncryptionAck(); bool HandlePing(WorldPacket& recvPacket); - void ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const; - ConnectionType _type; + uint64 _key; BigNumber _serverChallenge; WorldPacketCrypt _authCrypt; BigNumber _encryptSeed; BigNumber _decryptSeed; + BigNumber _sessionKey; std::chrono::steady_clock::time_point _LastPingTime; uint32 _OverSpeedPings; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 8aa8bfc404d..005d15d8291 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -7330,7 +7330,7 @@ void Spell::PrepareTriggersExecutedOnHit() // Global cooldowns management enum GCDLimits { - MIN_GCD = 1000, + MIN_GCD = 750, MAX_GCD = 1500 }; -- cgit v1.2.3 From 49d0823b7062fba05725d27c406dbbe1a88a40f3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 18 Jun 2016 17:38:44 +0200 Subject: Core: Update to 7.0.3.21963 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_08.sql | 2 + .../Database/Implementation/HotfixDatabase.cpp | 4 +- src/server/game/Achievements/CriteriaHandler.cpp | 8 + .../game/AuctionHouseBot/AuctionHouseBotSeller.cpp | 20 +-- src/server/game/DataStores/DB2Metadata.h | 12 +- src/server/game/DataStores/DB2Structure.h | 1 - src/server/game/DataStores/DBCEnums.h | 16 +- src/server/game/Entities/GameObject/GameObject.h | 1 + src/server/game/Entities/Item/Item.cpp | 5 +- src/server/game/Entities/Item/Item.h | 5 +- src/server/game/Entities/Item/ItemTemplate.cpp | 8 +- src/server/game/Entities/Item/ItemTemplate.h | 115 +++++++----- .../Entities/Object/Updates/UpdateFieldFlags.cpp | 6 +- .../game/Entities/Object/Updates/UpdateFields.h | 8 +- src/server/game/Entities/Player/Player.cpp | 18 +- src/server/game/Globals/ObjectMgr.cpp | 99 +++++++---- src/server/game/Miscellaneous/SharedDefines.h | 113 +++++------- src/server/game/Server/Protocol/Opcodes.h | 194 ++++++++++----------- src/server/game/Spells/Spell.cpp | 20 +-- 19 files changed, 343 insertions(+), 312 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_08.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_08.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_08.sql new file mode 100644 index 00000000000..6cce565b905 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_08.sql @@ -0,0 +1,2 @@ +ALTER TABLE `item_random_suffix` DROP `InternalName`; +ALTER TABLE `item_random_suffix_locale` DROP `InternalName_lang`; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index cf5ab499a6a..c34c9ac72aa 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -437,9 +437,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemRandomSuffix.db2 - PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang, InternalName_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSet.db2 PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index e9ec1299f96..3c8a5241809 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -1457,6 +1457,14 @@ bool CriteriaHandler::AdditionalRequirementsSatisfied(ModifierTreeNode const* tr switch (CriteriaAdditionalCondition(reqType)) { + case CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL: // 3 + { + // miscValue1 is itemid + ItemTemplate const* const item = sObjectMgr->GetItemTemplate(uint32(miscValue1)); + if (!item || item->GetBaseItemLevel() < reqValue) + return false; + break; + } case CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY: // 4 if (!unit || unit->GetEntry() != reqValue) return false; diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp index d5d5816f4c1..0ba27b1b7ce 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp @@ -303,7 +303,7 @@ bool AuctionBotSeller::Initialize() break; } case ITEM_CLASS_MISCELLANEOUS: - if (prototype->GetSubClass() == ITEM_SUBCLASS_JUNK_MOUNT) + if (prototype->GetSubClass() == ITEM_SUBCLASS_MISCELLANEOUS_MOUNT) { if (uint32 value = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_REQ_LEVEL)) if (prototype->GetBaseRequiredLevel() < static_cast(value)) @@ -427,7 +427,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_PROJECTILE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_RECIPE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_QUIVER, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GRAY, ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUEST_AMOUNT)); @@ -443,7 +443,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_REAGENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_REAGENT_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_PROJECTILE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_GENERIC, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_GENERIC_AMOUNT)); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_ITEM_ENHANCEMENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_GENERIC_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RECIPE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUIVER_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_WHITE, ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUEST_AMOUNT)); @@ -459,7 +459,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_PROJECTILE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RECIPE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUIVER_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_GREEN, ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUEST_AMOUNT)); @@ -475,7 +475,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_PROJECTILE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RECIPE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUIVER_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_BLUE, ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUEST_AMOUNT)); @@ -491,7 +491,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_PROJECTILE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RECIPE_AMOUNT)); config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_QUIVER, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_PURPLE, ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUEST_AMOUNT)); @@ -507,7 +507,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_PROJECTILE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_AMOUNT)); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_RECIPE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_QUIVER, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_ORANGE, ITEM_CLASS_QUEST, 0); @@ -523,7 +523,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_REAGENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_PROJECTILE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_TRADE_GOODS, 0); - config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_GENERIC, 0); + config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_ITEM_ENHANCEMENT, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_RECIPE, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_QUIVER, 0); config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_QUEST, 0); @@ -541,7 +541,7 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config) config.SetRandomStackRatioPerClass(ITEM_CLASS_REAGENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_REAGENT)); config.SetRandomStackRatioPerClass(ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_PROJECTILE)); config.SetRandomStackRatioPerClass(ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_TRADEGOOD)); - config.SetRandomStackRatioPerClass(ITEM_CLASS_GENERIC, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC)); + config.SetRandomStackRatioPerClass(ITEM_CLASS_ITEM_ENHANCEMENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC)); config.SetRandomStackRatioPerClass(ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_RECIPE)); config.SetRandomStackRatioPerClass(ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUIVER)); config.SetRandomStackRatioPerClass(ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUEST)); @@ -597,7 +597,7 @@ void AuctionBotSeller::LoadSellerValues(SellerConfiguration& config) config.SetPriceRatioPerClass(ITEM_CLASS_REAGENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_REAGENT_PRICE_RATIO)); config.SetPriceRatioPerClass(ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_PROJECTILE_PRICE_RATIO)); config.SetPriceRatioPerClass(ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_PRICE_RATIO)); - config.SetPriceRatioPerClass(ITEM_CLASS_GENERIC, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_GENERIC_PRICE_RATIO)); + config.SetPriceRatioPerClass(ITEM_CLASS_ITEM_ENHANCEMENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_GENERIC_PRICE_RATIO)); config.SetPriceRatioPerClass(ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RECIPE_PRICE_RATIO)); config.SetPriceRatioPerClass(ITEM_CLASS_MONEY, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_MONEY_PRICE_RATIO)); config.SetPriceRatioPerClass(ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_QUIVER_PRICE_RATIO)); diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 21dadfc3793..1ec1b0fe856 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -310,9 +310,9 @@ struct ArtifactAppearanceSetMeta { static DB2Meta const* Instance() { - static char const* types = "sshhbbbi"; - static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(7, 8, 0x144B4DF1, types, arraySizes); + static char const* types = "sshhbbbbi"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(8, 9, 0xB11A5708, types, arraySizes); return &instance; } }; @@ -2895,9 +2895,9 @@ struct ItemRandomSuffixMeta { static DB2Meta const* Instance() { - static char const* types = "sshh"; - static uint8 const arraySizes[4] = { 1, 1, 5, 5 }; - static DB2Meta instance(-1, 4, 0x451B7E5A, types, arraySizes); + static char const* types = "shh"; + static uint8 const arraySizes[3] = { 1, 5, 5 }; + static DB2Meta instance(-1, 3, 0x20CC67CD, types, arraySizes); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index e5359fb4907..993d8b1c315 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -1315,7 +1315,6 @@ struct ItemRandomSuffixEntry { uint32 ID; LocalizedString* Name; - LocalizedString* InternalName; uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; }; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 50eeeaa7ad8..dd29591e22f 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -628,8 +628,20 @@ enum ItemSpecStat ITEM_SPEC_STAT_HASTE = 25, ITEM_SPEC_STAT_BONUS_ARMOR = 26, ITEM_SPEC_STAT_CLOAK = 27, - - ITEM_SPEC_STAT_NONE = 28 + ITEM_SPEC_STAT_WARGLAIVES = 28, + ITEM_SPEC_STAT_RELIC_IRON = 29, + ITEM_SPEC_STAT_RELIC_BLOOD = 30, + ITEM_SPEC_STAT_RELIC_SHADOW = 31, + ITEM_SPEC_STAT_RELIC_FEL = 32, + ITEM_SPEC_STAT_RELIC_ARCANE = 33, + ITEM_SPEC_STAT_RELIC_FROST = 34, + ITEM_SPEC_STAT_RELIC_FIRE = 35, + ITEM_SPEC_STAT_RELIC_WATER = 36, + ITEM_SPEC_STAT_RELIC_LIFE = 37, + ITEM_SPEC_STAT_RELIC_WIND = 38, + ITEM_SPEC_STAT_RELIC_HOLY = 39, + + ITEM_SPEC_STAT_NONE = 40 }; enum MountCapabilityFlags diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 40e00531497..cd26364a365 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -166,6 +166,7 @@ struct GameObjectTemplate uint32 conditionID1; // 15 conditionID1, References: PlayerCondition, NoValue = 0 uint32 playerCast; // 16 playerCast, enum { false, true, }; Default: false uint32 SummonerTriggered; // 17 Summoner Triggered, enum { false, true, }; Default: false + uint32 requireLOS; // 18 require LOS, enum { false, true, }; Default: false } trap; // 7 GAMEOBJECT_TYPE_CHAIR struct diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index ab6e26627be..e5904ebc476 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1414,6 +1414,7 @@ static ItemTransmogrificationWeaponCategory GetTransmogrificationWeaponCategory( case ITEM_SUBCLASS_WEAPON_AXE: case ITEM_SUBCLASS_WEAPON_MACE: case ITEM_SUBCLASS_WEAPON_SWORD: + case ITEM_SUBCLASS_WEAPON_WARGLAIVES: return ItemTransmogrificationWeaponCategory::AXE_MACE_SWORD_1H; case ITEM_SUBCLASS_WEAPON_DAGGER: return ItemTransmogrificationWeaponCategory::DAGGER; @@ -1477,10 +1478,8 @@ bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets: if (source->GetClass() != target->GetClass()) return false; - if (source->GetInventoryType() == INVTYPE_TABARD || - source->GetInventoryType() == INVTYPE_BAG || + if (source->GetInventoryType() == INVTYPE_BAG || source->GetInventoryType() == INVTYPE_RELIC || - source->GetInventoryType() == INVTYPE_BODY || source->GetInventoryType() == INVTYPE_FINGER || source->GetInventoryType() == INVTYPE_TRINKET || source->GetInventoryType() == INVTYPE_AMMO || diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 44c4e546188..30d8c56ecb3 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -142,7 +142,10 @@ enum InventoryResult EQUIP_ERR_ITEM_IS_BATTLE_PAY_LOCKED = 94, // Your purchased item is still waiting to be unlocked EQUIP_ERR_REAGENT_BANK_FULL = 95, // Your reagent bank is full EQUIP_ERR_REAGENT_BANK_LOCKED = 96, - EQUIP_ERR_WRONG_BAG_TYPE_3 = 97 + EQUIP_ERR_WRONG_BAG_TYPE_3 = 97, + EQUIP_ERR_CANT_USE_ITEM = 98, // You can't use that item. + EQUIP_ERR_CANT_BE_OBLITERATED = 99, // You can't obliterate that item + EQUIP_ERR_GUILD_BANK_CONJURED_ITEM = 100,// You cannot store conjured items in the guild bank }; enum BuyResult diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index e33bea37e54..3f2563345f9 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -79,10 +79,10 @@ uint32 ItemTemplate::GetSkill() const { const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] = { - SKILL_AXES, SKILL_2H_AXES, SKILL_BOWS, SKILL_GUNS, SKILL_MACES, - SKILL_2H_MACES, SKILL_POLEARMS, SKILL_SWORDS, SKILL_2H_SWORDS, 0, - SKILL_STAVES, 0, 0, SKILL_FIST_WEAPONS, 0, - SKILL_DAGGERS, SKILL_THROWN, SKILL_ASSASSINATION, SKILL_CROSSBOWS, SKILL_WANDS, + SKILL_AXES, SKILL_TWO_HANDED_AXES, SKILL_BOWS, SKILL_GUNS, SKILL_MACES, + SKILL_TWO_HANDED_MACES, SKILL_POLEARMS, SKILL_SWORDS, SKILL_TWO_HANDED_SWORDS, SKILL_WARGLAIVES, + SKILL_STAVES, 0, 0, SKILL_FIST_WEAPONS, 0, + SKILL_DAGGERS, 0, 0, SKILL_CROSSBOWS, SKILL_WANDS, SKILL_FISHING }; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index fdc65af1cee..2627f9cf328 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -386,7 +386,7 @@ enum ItemClass : uint8 ITEM_CLASS_REAGENT = 5, ITEM_CLASS_PROJECTILE = 6, ITEM_CLASS_TRADE_GOODS = 7, - ITEM_CLASS_GENERIC = 8, // OBSOLETE + ITEM_CLASS_ITEM_ENHANCEMENT = 8, ITEM_CLASS_RECIPE = 9, ITEM_CLASS_MONEY = 10, // OBSOLETE ITEM_CLASS_QUIVER = 11, @@ -394,10 +394,12 @@ enum ItemClass : uint8 ITEM_CLASS_KEY = 13, ITEM_CLASS_PERMANENT = 14, // OBSOLETE ITEM_CLASS_MISCELLANEOUS = 15, - ITEM_CLASS_GLYPH = 16 + ITEM_CLASS_GLYPH = 16, + ITEM_CLASS_BATTLE_PETS = 17, + ITEM_CLASS_WOW_TOKEN = 18 }; -#define MAX_ITEM_CLASS 17 +#define MAX_ITEM_CLASS 19 enum ItemSubclassConsumable { @@ -409,10 +411,11 @@ enum ItemSubclassConsumable ITEM_SUBCLASS_FOOD_DRINK = 5, ITEM_SUBCLASS_ITEM_ENHANCEMENT = 6, ITEM_SUBCLASS_BANDAGE = 7, - ITEM_SUBCLASS_CONSUMABLE_OTHER = 8 + ITEM_SUBCLASS_CONSUMABLE_OTHER = 8, + ITEM_SUBCLASS_VANTUS_RUNE = 9 }; -#define MAX_ITEM_SUBCLASS_CONSUMABLE 9 +#define MAX_ITEM_SUBCLASS_CONSUMABLE 10 enum ItemSubclassContainer { @@ -442,7 +445,7 @@ enum ItemSubclassWeapon ITEM_SUBCLASS_WEAPON_POLEARM = 6, ITEM_SUBCLASS_WEAPON_SWORD = 7, // One-Handed Swords ITEM_SUBCLASS_WEAPON_SWORD2 = 8, // Two-Handed Swords - ITEM_SUBCLASS_WEAPON_Obsolete = 9, + ITEM_SUBCLASS_WEAPON_WARGLAIVES = 9, ITEM_SUBCLASS_WEAPON_STAFF = 10, ITEM_SUBCLASS_WEAPON_EXOTIC = 11, // One-Handed Exotics ITEM_SUBCLASS_WEAPON_EXOTIC2 = 12, // Two-Handed Exotics @@ -464,20 +467,21 @@ enum ItemSubclassWeapon enum ItemSubclassGem { - ITEM_SUBCLASS_GEM_RED = 0, - ITEM_SUBCLASS_GEM_BLUE = 1, - ITEM_SUBCLASS_GEM_YELLOW = 2, - ITEM_SUBCLASS_GEM_PURPLE = 3, - ITEM_SUBCLASS_GEM_GREEN = 4, - ITEM_SUBCLASS_GEM_ORANGE = 5, - ITEM_SUBCLASS_GEM_META = 6, - ITEM_SUBCLASS_GEM_SIMPLE = 7, - ITEM_SUBCLASS_GEM_PRISMATIC = 8, - ITEM_SUBCLASS_GEM_HYDRAULIC = 9, - ITEM_SUBCLASS_GEM_COGWHEEL = 10 + ITEM_SUBCLASS_GEM_INTELLECT = 0, + ITEM_SUBCLASS_GEM_AGILITY = 1, + ITEM_SUBCLASS_GEM_STRENGTH = 2, + ITEM_SUBCLASS_GEM_STAMINA = 3, + ITEM_SUBCLASS_GEM_SPIRIT = 4, + ITEM_SUBCLASS_GEM_CRITICAL_STRIKE = 5, + ITEM_SUBCLASS_GEM_MASTERY = 6, + ITEM_SUBCLASS_GEM_HASTE = 7, + ITEM_SUBCLASS_GEM_VERSATILITY = 8, + ITEM_SUBCLASS_GEM_OTHER = 9, + ITEM_SUBCLASS_GEM_MULTIPLE_STATS = 10, + ITEM_SUBCLASS_GEM_ARTIFACT_RELIC = 11 }; -#define MAX_ITEM_SUBCLASS_GEM 11 +#define MAX_ITEM_SUBCLASS_GEM 12 enum ItemSubclassArmor { @@ -499,10 +503,11 @@ enum ItemSubclassArmor enum ItemSubclassReagent { - ITEM_SUBCLASS_REAGENT = 0 + ITEM_SUBCLASS_REAGENT = 0, + ITEM_SUBCLASS_KEYSTONE = 1 }; -#define MAX_ITEM_SUBCLASS_REAGENT 1 +#define MAX_ITEM_SUBCLASS_REAGENT 2 enum ItemSubclassProjectile { @@ -532,16 +537,32 @@ enum ItemSubclassTradeGoods ITEM_SUBCLASS_ENCHANTING = 12, ITEM_SUBCLASS_MATERIAL = 13, ITEM_SUBCLASS_ENCHANTMENT = 14, + ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15, + ITEM_SUBCLASS_INSCRIPTION = 16, + ITEM_SUBCLASS_EXPLOSIVES_DEVICES = 17 }; -#define MAX_ITEM_SUBCLASS_TRADE_GOODS 15 +#define MAX_ITEM_SUBCLASS_TRADE_GOODS 18 -enum ItemSubclassGeneric +enum ItemSubclassItemEnhancement { - ITEM_SUBCLASS_GENERIC = 0 // OBSOLETE + ITEM_SUBCLASS_ITEM_ENHANCEMENT_HEAD = 0, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_NECK = 1, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_SHOULDER = 2, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_CLOAK = 3, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_CHEST = 4, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_WRIST = 5, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_HANDS = 6, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_WAIST = 7, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_LEGS = 8, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_FEET = 9, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_FINGER = 10, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_WEAPON = 11, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_TWO_HANDED_WEAPON = 12, + ITEM_SUBCLASS_ITEM_ENHANCEMENT_SHIELD_OFF_HAND = 13 }; -#define MAX_ITEM_SUBCLASS_GENERIC 1 +#define MAX_ITEM_SUBCLASS_ITEM_ENHANCEMENT 14 enum ItemSubclassRecipe { @@ -564,10 +585,9 @@ enum ItemSubclassRecipe enum ItemSubclassMoney { ITEM_SUBCLASS_MONEY = 0, // OBSOLETE - ITEM_SUBCLASS_MONEY_UNK_7 = 7, // OBSOLETE, 1 item (41749) }; -#define MAX_ITEM_SUBCLASS_MONEY 8 +#define MAX_ITEM_SUBCLASS_MONEY 1 enum ItemSubclassQuiver { @@ -605,16 +625,15 @@ enum ItemSubclassPermanent enum ItemSubclassJunk { - ITEM_SUBCLASS_JUNK = 0, - ITEM_SUBCLASS_JUNK_REAGENT = 1, - ITEM_SUBCLASS_JUNK_PET = 2, - ITEM_SUBCLASS_JUNK_HOLIDAY = 3, - ITEM_SUBCLASS_JUNK_OTHER = 4, - ITEM_SUBCLASS_JUNK_MOUNT = 5, - ITEM_SUBCLASS_JUNK_UNK12 = 12, // 1 item (37677) + ITEM_SUBCLASS_MISCELLANEOUS_JUNK = 0, + ITEM_SUBCLASS_MISCELLANEOUS_REAGENT = 1, + ITEM_SUBCLASS_MISCELLANEOUS_COMPANION_PET = 2, + ITEM_SUBCLASS_MISCELLANEOUS_HOLIDAY = 3, + ITEM_SUBCLASS_MISCELLANEOUS_OTHER = 4, + ITEM_SUBCLASS_MISCELLANEOUS_MOUNT = 5, }; -#define MAX_ITEM_SUBCLASS_JUNK 13 +#define MAX_ITEM_SUBCLASS_MISCELLANEOUS 6 enum ItemSubclassGlyph { @@ -627,10 +646,26 @@ enum ItemSubclassGlyph ITEM_SUBCLASS_GLYPH_SHAMAN = 7, ITEM_SUBCLASS_GLYPH_MAGE = 8, ITEM_SUBCLASS_GLYPH_WARLOCK = 9, - ITEM_SUBCLASS_GLYPH_DRUID = 11 + ITEM_SUBCLASS_GLYPH_MONK = 10, + ITEM_SUBCLASS_GLYPH_DRUID = 11, + ITEM_SUBCLASS_GLYPH_DEMON_HUNTER = 12 }; -#define MAX_ITEM_SUBCLASS_GLYPH 12 +#define MAX_ITEM_SUBCLASS_GLYPH 13 + +enum ItemSubclassBattlePet +{ + ITEM_SUBCLASS_BATTLE_PET = 0 +}; + +#define MAX_ITEM_SUBCLASS_BATTLE_PET 1 + +enum ItemSubclassWowToken +{ + ITEM_SUBCLASS_WOW_TOKEN = 0 +}; + +#define MAX_ITEM_SUBCLASS_WOW_TOKEN 1 const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = { @@ -642,15 +677,17 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = MAX_ITEM_SUBCLASS_REAGENT, MAX_ITEM_SUBCLASS_PROJECTILE, MAX_ITEM_SUBCLASS_TRADE_GOODS, - MAX_ITEM_SUBCLASS_GENERIC, + MAX_ITEM_SUBCLASS_ITEM_ENHANCEMENT, MAX_ITEM_SUBCLASS_RECIPE, MAX_ITEM_SUBCLASS_MONEY, MAX_ITEM_SUBCLASS_QUIVER, MAX_ITEM_SUBCLASS_QUEST, MAX_ITEM_SUBCLASS_KEY, MAX_ITEM_SUBCLASS_PERMANENT, - MAX_ITEM_SUBCLASS_JUNK, - MAX_ITEM_SUBCLASS_GLYPH + MAX_ITEM_SUBCLASS_MISCELLANEOUS, + MAX_ITEM_SUBCLASS_GLYPH, + MAX_ITEM_SUBCLASS_BATTLE_PET, + MAX_ITEM_SUBCLASS_WOW_TOKEN }; #define MAX_ITEM_SUBCLASS_TOTAL 21 diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp index 9cc08c4ee7e..13476043204 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -360,9 +360,9 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+3 UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+4 UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+5 - UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS - UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS_2 - UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS_3 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_FIELD_FLAGS + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_FIELD_FLAGS_2 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_FIELD_FLAGS_3 UF_FLAG_PUBLIC, // UNIT_FIELD_AURASTATE UF_FLAG_PUBLIC, // UNIT_FIELD_BASEATTACKTIME UF_FLAG_PUBLIC, // UNIT_FIELD_BASEATTACKTIME+1 diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 200478eeefe..1f87c98842d 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_H #define _UPDATEFIELDS_H -// Auto generated for version 7, 0, 3, 21796 +// Auto generated for version 7, 0, 3, 21963 enum ObjectFields { @@ -113,9 +113,9 @@ enum UnitFields UNIT_FIELD_SCALING_LEVEL_DELTA = OBJECT_END + 0x050, // Size: 1, Flags: PUBLIC UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x051, // Size: 1, Flags: PUBLIC UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x052, // Size: 6, Flags: PUBLIC - UNIT_FIELD_FLAGS = OBJECT_END + 0x058, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x059, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC + UNIT_FIELD_FLAGS = OBJECT_END + 0x058, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x059, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC, URGENT UNIT_FIELD_AURASTATE = OBJECT_END + 0x05B, // Size: 1, Flags: PUBLIC UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x05C, // Size: 2, Flags: PUBLIC UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x05E, // Size: 1, Flags: PRIVATE diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c4bd0c0fc3e..d98c18bf6db 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3137,7 +3137,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent continue; // Runeforging special case - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(_spell_idx->second->SkillLine, getRace(), getClass())) LearnDefaultSkill(rcInfo); } @@ -5219,7 +5219,6 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve switch (SkillId) { case SKILL_HERBALISM: - case SKILL_LOCKPICKING: case SKILL_JEWELCRAFTING: case SKILL_INSCRIPTION: return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator, gathering_skill_gain); @@ -10991,17 +10990,8 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje if (!proto) return EQUIP_ERR_ITEM_NOT_FOUND; - // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player - - const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] = - { - SKILL_AXES, SKILL_2H_AXES, SKILL_BOWS, SKILL_GUNS, SKILL_MACES, - SKILL_2H_MACES, SKILL_POLEARMS, SKILL_SWORDS, SKILL_2H_SWORDS, 0, - SKILL_STAVES, 0, 0, SKILL_FIST_WEAPONS, 0, - SKILL_DAGGERS, SKILL_THROWN, SKILL_ASSASSINATION, SKILL_CROSSBOWS, SKILL_WANDS, - SKILL_FISHING - }; //Copy from function Item::GetSkill() + // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player if ((proto->GetAllowableClass() & getClassMask()) == 0 || (proto->GetAllowableRace() & getRaceMask()) == 0) return EQUIP_ERR_CANT_EQUIP_EVER; @@ -11018,7 +11008,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje uint8 _class = getClass(); - if (proto->GetClass() == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->GetSubClass()]) == 0) + if (proto->GetClass() == ITEM_CLASS_WEAPON && GetSkillValue(proto->GetSkill()) == 0) return EQUIP_ERR_PROFICIENCY_NEEDED; if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() > ITEM_SUBCLASS_ARMOR_MISCELLANEOUS && proto->GetSubClass() < ITEM_SUBCLASS_ARMOR_BUCKLER && proto->GetInventoryType() != INVTYPE_CLOAK) @@ -22503,8 +22493,6 @@ void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo) skillValue = std::min(std::max({ 1, uint16((getLevel() - 1) * 5) }), maxValue); else if (skillId == SKILL_FIST_WEAPONS) skillValue = std::max(1, GetSkillValue(SKILL_UNARMED)); - else if (skillId == SKILL_LOCKPICKING) - skillValue = std::max(1, GetSkillValue(SKILL_LOCKPICKING)); SetSkill(skillId, 0, skillValue, maxValue); break; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 24c2c52387a..1bfbd85e96b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -177,12 +177,12 @@ LanguageDesc lang_description[LANGUAGES_COUNT] = { LANG_KALIMAG, 817, SKILL_LANG_OLD_TONGUE }, { LANG_GNOMISH, 7340, SKILL_LANG_GNOMISH }, { LANG_TROLL, 7341, SKILL_LANG_TROLL }, - { LANG_GUTTERSPEAK, 17737, SKILL_LANG_GUTTERSPEAK }, + { LANG_GUTTERSPEAK, 17737, SKILL_LANG_FORSAKEN }, { LANG_DRAENEI, 29932, SKILL_LANG_DRAENEI }, { LANG_ZOMBIE, 0, 0 }, { LANG_GNOMISH_BINARY, 0, 0 }, { LANG_GOBLIN_BINARY, 0, 0 }, - { LANG_WORGEN, 69270, SKILL_LANG_WORGEN }, + { LANG_WORGEN, 69270, SKILL_LANG_GILNEAN }, { LANG_GOBLIN, 69269, SKILL_LANG_GOBLIN }, { LANG_PANDAREN_NEUTRAL, 108127, SKILL_LANG_PANDAREN_NEUTRAL }, { LANG_PANDAREN_ALLIANCE, 108130, SKILL_LANG_PANDAREN_ALLIANCE }, @@ -2323,26 +2323,26 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory static float const qualityMultipliers[MAX_ITEM_QUALITY] = { - 1.0f, 1.0f, 1.0f, 1.17f, 1.37f, 1.68f, 0.0f, 0.0f + 0.92f, 0.92f, 0.92f, 1.11f, 1.32f, 1.61f, 0.0f, 0.0f }; static float const armorMultipliers[MAX_INVTYPE] = { 0.00f, // INVTYPE_NON_EQUIP - 0.59f, // INVTYPE_HEAD + 0.60f, // INVTYPE_HEAD 0.00f, // INVTYPE_NECK - 0.59f, // INVTYPE_SHOULDERS + 0.60f, // INVTYPE_SHOULDERS 0.00f, // INVTYPE_BODY 1.00f, // INVTYPE_CHEST - 0.35f, // INVTYPE_WAIST - 0.75f, // INVTYPE_LEGS - 0.49f, // INVTYPE_FEET - 0.35f, // INVTYPE_WRISTS - 0.35f, // INVTYPE_HANDS + 0.33f, // INVTYPE_WAIST + 0.72f, // INVTYPE_LEGS + 0.48f, // INVTYPE_FEET + 0.33f, // INVTYPE_WRISTS + 0.33f, // INVTYPE_HANDS 0.00f, // INVTYPE_FINGER 0.00f, // INVTYPE_TRINKET 0.00f, // INVTYPE_WEAPON - 1.00f, // INVTYPE_SHIELD + 0.72f, // INVTYPE_SHIELD 0.00f, // INVTYPE_RANGED 0.00f, // INVTYPE_CLOAK 0.00f, // INVTYPE_2HWEAPON @@ -2361,27 +2361,27 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory static float const weaponMultipliers[MAX_ITEM_SUBCLASS_WEAPON] = { - 0.89f, // ITEM_SUBCLASS_WEAPON_AXE - 1.03f, // ITEM_SUBCLASS_WEAPON_AXE2 - 0.77f, // ITEM_SUBCLASS_WEAPON_BOW - 0.77f, // ITEM_SUBCLASS_WEAPON_GUN - 0.89f, // ITEM_SUBCLASS_WEAPON_MACE - 1.03f, // ITEM_SUBCLASS_WEAPON_MACE2 - 1.03f, // ITEM_SUBCLASS_WEAPON_POLEARM - 0.89f, // ITEM_SUBCLASS_WEAPON_SWORD - 1.03f, // ITEM_SUBCLASS_WEAPON_SWORD2 - 0.00f, // ITEM_SUBCLASS_WEAPON_Obsolete - 1.03f, // ITEM_SUBCLASS_WEAPON_STAFF + 0.91f, // ITEM_SUBCLASS_WEAPON_AXE + 1.00f, // ITEM_SUBCLASS_WEAPON_AXE2 + 1.00f, // ITEM_SUBCLASS_WEAPON_BOW + 1.00f, // ITEM_SUBCLASS_WEAPON_GUN + 0.91f, // ITEM_SUBCLASS_WEAPON_MACE + 1.00f, // ITEM_SUBCLASS_WEAPON_MACE2 + 1.00f, // ITEM_SUBCLASS_WEAPON_POLEARM + 0.91f, // ITEM_SUBCLASS_WEAPON_SWORD + 1.00f, // ITEM_SUBCLASS_WEAPON_SWORD2 + 1.00f, // ITEM_SUBCLASS_WEAPON_WARGLAIVES + 1.00f, // ITEM_SUBCLASS_WEAPON_STAFF 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC2 - 0.64f, // ITEM_SUBCLASS_WEAPON_FIST_WEAPON + 0.66f, // ITEM_SUBCLASS_WEAPON_FIST_WEAPON 0.00f, // ITEM_SUBCLASS_WEAPON_MISCELLANEOUS - 0.64f, // ITEM_SUBCLASS_WEAPON_DAGGER - 0.64f, // ITEM_SUBCLASS_WEAPON_THROWN + 0.66f, // ITEM_SUBCLASS_WEAPON_DAGGER + 0.00f, // ITEM_SUBCLASS_WEAPON_THROWN 0.00f, // ITEM_SUBCLASS_WEAPON_SPEAR - 0.77f, // ITEM_SUBCLASS_WEAPON_CROSSBOW - 0.64f, // ITEM_SUBCLASS_WEAPON_WAND - 0.64f, // ITEM_SUBCLASS_WEAPON_FISHING_POLE + 1.00f, // ITEM_SUBCLASS_WEAPON_CROSSBOW + 0.66f, // ITEM_SUBCLASS_WEAPON_WAND + 0.66f, // ITEM_SUBCLASS_WEAPON_FISHING_POLE }; float levelPenalty = 1.0f; @@ -2393,10 +2393,10 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory if (inventoryType > INVTYPE_ROBE) return 0; - return 5 * uint32(23.0f * qualityMultipliers[quality] * armorMultipliers[inventoryType] * levelPenalty + 0.5f); + return 5 * uint32(round(25.0f * qualityMultipliers[quality] * armorMultipliers[inventoryType] * levelPenalty)); } - return 5 * uint32(17.0f * qualityMultipliers[quality] * weaponMultipliers[itemSubClass] * levelPenalty + 0.5f); + return 5 * uint32(round(18.0f * qualityMultipliers[quality] * weaponMultipliers[itemSubClass] * levelPenalty)); }; void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, ItemTemplate const& itemTemplate) @@ -2482,6 +2482,9 @@ struct ItemSpecStats case ITEM_SUBCLASS_WEAPON_SWORD2: AddStat(ITEM_SPEC_STAT_TWO_HANDED_SWORD); break; + case ITEM_SUBCLASS_WEAPON_WARGLAIVES: + AddStat(ITEM_SPEC_STAT_WARGLAIVES); + break; case ITEM_SUBCLASS_WEAPON_STAFF: AddStat(ITEM_SPEC_STAT_STAFF); break; @@ -2536,6 +2539,34 @@ struct ItemSpecStats break; } } + else if (item->Class == ITEM_CLASS_GEM) + { + if (GemPropertiesEntry const* gem = sGemPropertiesStore.LookupEntry(sparse->GemProperties)) + { + if (gem->Type & SOCKET_COLOR_RELIC_IRON) + AddStat(ITEM_SPEC_STAT_RELIC_IRON); + if (gem->Type & SOCKET_COLOR_RELIC_BLOOD) + AddStat(ITEM_SPEC_STAT_RELIC_BLOOD); + if (gem->Type & SOCKET_COLOR_RELIC_SHADOW) + AddStat(ITEM_SPEC_STAT_RELIC_SHADOW); + if (gem->Type & SOCKET_COLOR_RELIC_FEL) + AddStat(ITEM_SPEC_STAT_RELIC_FEL); + if (gem->Type & SOCKET_COLOR_RELIC_ARCANE) + AddStat(ITEM_SPEC_STAT_RELIC_ARCANE); + if (gem->Type & SOCKET_COLOR_RELIC_FROST) + AddStat(ITEM_SPEC_STAT_RELIC_FROST); + if (gem->Type & SOCKET_COLOR_RELIC_FIRE) + AddStat(ITEM_SPEC_STAT_RELIC_FIRE); + if (gem->Type & SOCKET_COLOR_RELIC_WATER) + AddStat(ITEM_SPEC_STAT_RELIC_WATER); + if (gem->Type & SOCKET_COLOR_RELIC_LIFE) + AddStat(ITEM_SPEC_STAT_RELIC_LIFE); + if (gem->Type & SOCKET_COLOR_RELIC_WIND) + AddStat(ITEM_SPEC_STAT_RELIC_WIND); + if (gem->Type & SOCKET_COLOR_RELIC_HOLY) + AddStat(ITEM_SPEC_STAT_RELIC_HOLY); + } + } else ItemType = 0; @@ -2569,9 +2600,6 @@ struct ItemSpecStats case ITEM_MOD_INTELLECT: AddStat(ITEM_SPEC_STAT_INTELLECT); break; - case ITEM_MOD_SPIRIT: - AddStat(ITEM_SPEC_STAT_SPIRIT); - break; case ITEM_MOD_DODGE_RATING: AddStat(ITEM_SPEC_STAT_DODGE); break; @@ -2584,9 +2612,6 @@ struct ItemSpecStats case ITEM_MOD_CRIT_RATING: AddStat(ITEM_SPEC_STAT_CRIT); break; - case ITEM_MOD_HASTE_MELEE_RATING: - case ITEM_MOD_HASTE_RANGED_RATING: - case ITEM_MOD_HASTE_SPELL_RATING: case ITEM_MOD_HASTE_RATING: AddStat(ITEM_SPEC_STAT_HASTE); break; @@ -7881,7 +7906,7 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry) if (sObjectMgr->GetSkillTier(rcEntry->SkillTierID)) return SKILL_RANGE_RANK; - if (rcEntry->SkillID == SKILL_RUNEFORGING || rcEntry->SkillID == SKILL_RUNEFORGING_2) + if (rcEntry->SkillID == SKILL_RUNEFORGING) return SKILL_RANGE_MONO; switch (skill->CategoryID) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 9b6680b7358..54461828da4 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4085,58 +4085,45 @@ enum SkillType { SKILL_NONE = 0, - SKILL_FROST = 6, - SKILL_FIRE = 8, - SKILL_ARMS = 26, - SKILL_COMBAT = 38, - SKILL_SUBTLETY = 39, SKILL_SWORDS = 43, SKILL_AXES = 44, SKILL_BOWS = 45, SKILL_GUNS = 46, - SKILL_BEAST_MASTERY = 50, - SKILL_SURVIVAL = 51, SKILL_MACES = 54, - SKILL_2H_SWORDS = 55, - SKILL_HOLY = 56, - SKILL_SHADOW = 78, + SKILL_TWO_HANDED_SWORDS = 55, SKILL_DEFENSE = 95, SKILL_LANG_COMMON = 98, - SKILL_RACIAL_DWARVEN = 101, + SKILL_RACIAL_DWARF = 101, SKILL_LANG_ORCISH = 109, SKILL_LANG_DWARVEN = 111, SKILL_LANG_DARNASSIAN = 113, SKILL_LANG_TAURAHE = 115, SKILL_DUAL_WIELD = 118, SKILL_RACIAL_TAUREN = 124, - SKILL_ORC_RACIAL = 125, + SKILL_RACIAL_ORC = 125, SKILL_RACIAL_NIGHT_ELF = 126, SKILL_FIRST_AID = 129, - SKILL_FERAL_COMBAT = 134, SKILL_STAVES = 136, SKILL_LANG_THALASSIAN = 137, SKILL_LANG_DRACONIC = 138, SKILL_LANG_DEMON_TONGUE = 139, SKILL_LANG_TITAN = 140, SKILL_LANG_OLD_TONGUE = 141, - SKILL_SURVIVAL2 = 142, - SKILL_RIDING_HORSE = 148, - SKILL_RIDING_WOLF = 149, - SKILL_RIDING_TIGER = 150, - SKILL_RIDING_RAM = 152, - SKILL_SWIMING = 155, - SKILL_2H_MACES = 160, + SKILL_SURVIVAL = 142, + SKILL_HORSE_RIDING = 148, + SKILL_WOLF_RIDING = 149, + SKILL_TIGER_RIDING = 150, + SKILL_RAM_RIDING = 152, + SKILL_SWIMMING = 155, + SKILL_TWO_HANDED_MACES = 160, SKILL_UNARMED = 162, - SKILL_MARKSMANSHIP = 163, SKILL_BLACKSMITHING = 164, SKILL_LEATHERWORKING = 165, SKILL_ALCHEMY = 171, - SKILL_2H_AXES = 172, + SKILL_TWO_HANDED_AXES = 172, SKILL_DAGGERS = 173, - SKILL_THROWN = 176, SKILL_HERBALISM = 182, SKILL_GENERIC_DND = 183, - SKILL_RETRIBUTION = 184, SKILL_COOKING = 185, SKILL_MINING = 186, SKILL_PET_IMP = 188, @@ -4152,61 +4139,45 @@ enum SkillType SKILL_PET_CAT = 209, SKILL_PET_BEAR = 210, SKILL_PET_BOAR = 211, - SKILL_PET_CROCILISK = 212, + SKILL_PET_CROCOLISK = 212, SKILL_PET_CARRION_BIRD = 213, SKILL_PET_CRAB = 214, SKILL_PET_GORILLA = 215, SKILL_PET_RAPTOR = 217, SKILL_PET_TALLSTRIDER = 218, - SKILL_RACIAL_UNDED = 220, + SKILL_RACIAL_UNDEAD = 220, SKILL_CROSSBOWS = 226, SKILL_WANDS = 228, SKILL_POLEARMS = 229, SKILL_PET_SCORPID = 236, - SKILL_ARCANE = 237, SKILL_PET_TURTLE = 251, - SKILL_ASSASSINATION = 253, - SKILL_FURY = 256, - SKILL_PROTECTION = 257, - SKILL_PROTECTION2 = 267, - SKILL_PET_TALENTS = 270, + SKILL_PET_GENERIC_HUNTER = 270, SKILL_PLATE_MAIL = 293, SKILL_LANG_GNOMISH = 313, SKILL_LANG_TROLL = 315, SKILL_ENCHANTING = 333, - SKILL_DEMONOLOGY = 354, - SKILL_AFFLICTION = 355, SKILL_FISHING = 356, - SKILL_ENHANCEMENT = 373, - SKILL_RESTORATION = 374, - SKILL_ELEMENTAL_COMBAT = 375, SKILL_SKINNING = 393, SKILL_MAIL = 413, SKILL_LEATHER = 414, SKILL_CLOTH = 415, SKILL_SHIELD = 433, SKILL_FIST_WEAPONS = 473, - SKILL_RIDING_RAPTOR = 533, - SKILL_RIDING_MECHANOSTRIDER = 553, - SKILL_RIDING_UNDEAD_HORSE = 554, - SKILL_RESTORATION2 = 573, - SKILL_BALANCE = 574, - SKILL_DESTRUCTION = 593, - SKILL_HOLY2 = 594, - SKILL_DISCIPLINE = 613, - SKILL_LOCKPICKING = 633, + SKILL_RAPTOR_RIDING = 533, + SKILL_MECHANOSTRIDER_PILOTING = 553, + SKILL_UNDEAD_HORSEMANSHIP = 554, SKILL_PET_BAT = 653, SKILL_PET_HYENA = 654, SKILL_PET_BIRD_OF_PREY = 655, SKILL_PET_WIND_SERPENT = 656, - SKILL_LANG_GUTTERSPEAK = 673, - SKILL_RIDING_KODO = 713, + SKILL_LANG_FORSAKEN = 673, + SKILL_KODO_RIDING = 713, SKILL_RACIAL_TROLL = 733, SKILL_RACIAL_GNOME = 753, SKILL_RACIAL_HUMAN = 754, SKILL_JEWELCRAFTING = 755, - SKILL_RACIAL_BLOODELF = 756, - SKILL_PET_EVENT_RC = 758, // SkillCategory = -1 + SKILL_RACIAL_BLOOD_ELF = 756, + SKILL_PET_EVENT_REMOTE_CONTROL = 758, SKILL_LANG_DRAENEI = 759, SKILL_RACIAL_DRAENEI = 760, SKILL_PET_FELGUARD = 761, @@ -4218,12 +4189,8 @@ enum SkillType SKILL_PET_RAVAGER = 767, SKILL_PET_SERPENT = 768, SKILL_INTERNAL = 769, - SKILL_DK_BLOOD = 770, - SKILL_DK_FROST = 771, - SKILL_DK_UNHOLY = 772, SKILL_INSCRIPTION = 773, SKILL_PET_MOTH = 775, - SKILL_RUNEFORGING = 776, SKILL_MOUNTS = 777, SKILL_COMPANIONS = 778, SKILL_PET_EXOTIC_CHIMAERA = 780, @@ -4232,31 +4199,26 @@ enum SkillType SKILL_PET_EXOTIC_SILITHID = 783, SKILL_PET_EXOTIC_WORM = 784, SKILL_PET_WASP = 785, - SKILL_PET_EXOTIC_RHINO = 786, + SKILL_PET_EXOTIC_CLEFTHOOF = 786, SKILL_PET_EXOTIC_CORE_HOUND = 787, SKILL_PET_EXOTIC_SPIRIT_BEAST = 788, SKILL_RACIAL_WORGEN = 789, SKILL_RACIAL_GOBLIN = 790, - SKILL_LANG_WORGEN = 791, + SKILL_LANG_GILNEAN = 791, SKILL_LANG_GOBLIN = 792, SKILL_ARCHAEOLOGY = 794, - SKILL_GENERAL_HUNTER = 795, - SKILL_GENERAL_DEATH_KNIGHT = 796, - SKILL_GENERAL_ROGUE = 797, - SKILL_GENERAL_DRUID = 798, - SKILL_GENERAL_MAGE = 799, - SKILL_GENERAL_PALADIN = 800, - SKILL_GENERAL_SHAMAN = 801, - SKILL_GENERAL_WARLOCK = 802, - SKILL_GENERAL_WARRIOR = 803, - SKILL_GENERAL_PRIEST = 804, + SKILL_HUNTER = 795, + SKILL_DEATH_KNIGHT = 796, + SKILL_DRUID = 798, + SKILL_PALADIN = 800, + SKILL_PRIEST = 804, SKILL_PET_WATER_ELEMENTAL = 805, SKILL_PET_FOX = 808, SKILL_ALL_GLYPHS = 810, SKILL_PET_DOG = 811, SKILL_PET_MONKEY = 815, SKILL_PET_SHALE_SPIDER = 817, - SKILL_PET_BEETLE = 818, + SKILL_BEETLE = 818, SKILL_ALL_GUILD_PERKS = 821, SKILL_PET_HYDRA = 824, SKILL_MONK = 829, @@ -4275,7 +4237,7 @@ enum SkillType SKILL_OBSERVER = 930, SKILL_WRATHGUARD = 931, SKILL_ALL_SPECIALIZATIONS = 934, - SKILL_RUNEFORGING_2 = 960, + SKILL_RUNEFORGING = 960, SKILL_PET_PRIMAL_FIRE_ELEMENTAL = 962, SKILL_PET_PRIMAL_EARTH_ELEMENTAL = 963, SKILL_WAY_OF_THE_GRILL = 975, @@ -4295,28 +4257,31 @@ enum SkillType SKILL_NO_PLAYERS = 999, SKILL_DIREHORN = 1305, SKILL_PET_PRIMAL_STORM_ELEMENTAL = 1748, - SKILL_PET_WATER_MINOR_TALENT_VERSION = 1777, - SKILL_PET_EXOTIC_HOOK_WASP = 1818, + SKILL_PET_WATER_ELEMENTAL_MINOR_TALENT_VERSION = 1777, + SKILL_PET_EXOTIC_RYLAK = 1818, SKILL_PET_RIVERBEAST = 1819, SKILL_UNUSED = 1830, + SKILL_DEMON_HUNTER = 1848, SKILL_LOGGING = 1945, SKILL_PET_TERRORGUARD = 1981, SKILL_PET_ABYSSAL = 1982, SKILL_PET_STAG = 1993, - SKILL_TRADING_POST = 2000 + SKILL_TRADING_POST = 2000, + SKILL_WARGLAIVES = 2152, + SKILL_PET_MECHANICAL = 2189, + SKILL_PET_ABOMINATION = 2216, }; -#define MAX_SKILL_TYPE 2000 - inline SkillType SkillByLockType(LockType locktype) { switch (locktype) { - case LOCKTYPE_PICKLOCK: return SKILL_LOCKPICKING; case LOCKTYPE_HERBALISM: return SKILL_HERBALISM; case LOCKTYPE_MINING: return SKILL_MINING; case LOCKTYPE_FISHING: return SKILL_FISHING; case LOCKTYPE_INSCRIPTION: return SKILL_INSCRIPTION; + case LOCKTYPE_ARCHAELOGY: return SKILL_ARCHAEOLOGY; + case LOCKTYPE_LUMBER_MILL: return SKILL_LOGGING; default: break; } return SKILL_NONE; diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index a3346f5e6cb..5ec7d87a36e 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -52,8 +52,8 @@ enum OpcodeClient : uint32 CMSG_ACTIVATE_TAXI = 0x34A6, CMSG_ADDON_LIST = 0x35D7, CMSG_ADD_BATTLENET_FRIEND = 0x365E, - CMSG_ADD_FRIEND = 0x36D5, - CMSG_ADD_IGNORE = 0x36D9, + CMSG_ADD_FRIEND = 0x36D4, + CMSG_ADD_IGNORE = 0x36D8, CMSG_ADD_TOY = 0x3272, CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31E8, CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x331A, @@ -91,18 +91,18 @@ enum OpcodeClient : uint32 CMSG_BATTLEMASTER_JOIN = 0x3510, CMSG_BATTLEMASTER_JOIN_ARENA = 0x3511, CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3512, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D8, - CMSG_BATTLENET_REQUEST = 0x36FC, - CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FD, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CF, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CE, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C6, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36C1, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36C2, - CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C8, - CMSG_BATTLE_PAY_START_PURCHASE = 0x36F8, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F9, - CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C7, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D7, + CMSG_BATTLENET_REQUEST = 0x36FB, + CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FC, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CE, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CD, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C5, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36C0, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36C1, + CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C7, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36F7, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F8, + CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C6, CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, CMSG_BATTLE_PET_DELETE_PET = 0x3623, CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3624, @@ -118,30 +118,30 @@ enum OpcodeClient : uint32 CMSG_BLACK_MARKET_BID_ON_ITEM = 0x351A, CMSG_BLACK_MARKET_OPEN = 0x3518, CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3519, - CMSG_BUG_REPORT = 0x368C, + CMSG_BUG_REPORT = 0x368B, CMSG_BUSY_TRADE = 0x3158, CMSG_BUY_BACK_ITEM = 0x349F, CMSG_BUY_BANK_SLOT = 0x34AF, CMSG_BUY_ITEM = 0x349E, CMSG_BUY_REAGENT_BANK = 0x34B0, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1, - CMSG_BUY_WOW_TOKEN_START = 0x36F0, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F0, + CMSG_BUY_WOW_TOKEN_START = 0x36EF, CMSG_CAGE_BATTLE_PET = 0x31D8, - CMSG_CALENDAR_ADD_EVENT = 0x3682, - CMSG_CALENDAR_COMPLAIN = 0x367E, - CMSG_CALENDAR_COPY_EVENT = 0x367D, - CMSG_CALENDAR_EVENT_INVITE = 0x3677, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x367B, - CMSG_CALENDAR_EVENT_RSVP = 0x3679, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x3680, - CMSG_CALENDAR_EVENT_STATUS = 0x367A, - CMSG_CALENDAR_GET = 0x3674, - CMSG_CALENDAR_GET_EVENT = 0x3675, - CMSG_CALENDAR_GET_NUM_PENDING = 0x367F, - CMSG_CALENDAR_GUILD_FILTER = 0x3676, - CMSG_CALENDAR_REMOVE_EVENT = 0x367C, - CMSG_CALENDAR_REMOVE_INVITE = 0x3678, - CMSG_CALENDAR_UPDATE_EVENT = 0x3683, + CMSG_CALENDAR_ADD_EVENT = 0x3681, + CMSG_CALENDAR_COMPLAIN = 0x367D, + CMSG_CALENDAR_COPY_EVENT = 0x367C, + CMSG_CALENDAR_EVENT_INVITE = 0x3676, + CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x367A, + CMSG_CALENDAR_EVENT_RSVP = 0x3678, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x367F, + CMSG_CALENDAR_EVENT_STATUS = 0x3679, + CMSG_CALENDAR_GET = 0x3673, + CMSG_CALENDAR_GET_EVENT = 0x3674, + CMSG_CALENDAR_GET_NUM_PENDING = 0x367E, + CMSG_CALENDAR_GUILD_FILTER = 0x3675, + CMSG_CALENDAR_REMOVE_EVENT = 0x367B, + CMSG_CALENDAR_REMOVE_INVITE = 0x3677, + CMSG_CALENDAR_UPDATE_EVENT = 0x3682, CMSG_CANCEL_AURA = 0x31A7, CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D7, CMSG_CANCEL_CAST = 0x3277, @@ -153,17 +153,17 @@ enum OpcodeClient : uint32 CMSG_CANCEL_QUEUED_SPELL = 0x317D, CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34E2, CMSG_CANCEL_TRADE = 0x315C, - CMSG_CAN_DUEL = 0x3667, + CMSG_CAN_DUEL = 0x3666, CMSG_CAST_SPELL = 0x3275, CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, CMSG_CHANGE_BAG_SLOT_FLAG = 0x32FC, CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32DC, CMSG_CHANGE_SUB_GROUP = 0x364C, - CMSG_CHARACTER_RENAME_REQUEST = 0x36C4, - CMSG_CHAR_CUSTOMIZE = 0x3694, - CMSG_CHAR_DELETE = 0x36A1, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x369A, + CMSG_CHARACTER_RENAME_REQUEST = 0x36C3, + CMSG_CHAR_CUSTOMIZE = 0x3693, + CMSG_CHAR_DELETE = 0x36A0, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3699, CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x37D0, CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x37D4, CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x37F7, @@ -212,8 +212,8 @@ enum OpcodeClient : uint32 CMSG_CHAT_REPORT_FILTERED = 0x37CC, CMSG_CHAT_REPORT_IGNORED = 0x37CB, CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36D0, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EF, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36CF, + CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EE, CMSG_CHOICE_RESPONSE = 0x3279, CMSG_CLEAR_RAID_MARKER = 0x319F, CMSG_CLEAR_TRADE_ITEM = 0x315E, @@ -225,7 +225,7 @@ enum OpcodeClient : uint32 CMSG_COMMENTATOR_GET_MAP_INFO = 0x35EF, CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F0, CMSG_COMMENTATOR_START_WARGAME = 0x35ED, - CMSG_COMPLAINT = 0x3671, + CMSG_COMPLAINT = 0x3670, CMSG_COMPLETE_CINEMATIC = 0x3532, CMSG_COMPLETE_MOVIE = 0x34CD, CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A4, @@ -238,8 +238,8 @@ enum OpcodeClient : uint32 CMSG_DECLINE_GUILD_INVITES = 0x350E, CMSG_DECLINE_PETITION = 0x3521, CMSG_DELETE_EQUIPMENT_SET = 0x34FC, - CMSG_DEL_FRIEND = 0x36D6, - CMSG_DEL_IGNORE = 0x36DA, + CMSG_DEL_FRIEND = 0x36D5, + CMSG_DEL_IGNORE = 0x36D9, CMSG_DEPOSIT_REAGENT_BANK = 0x3305, CMSG_DESTROY_ITEM = 0x326C, CMSG_DF_BOOT_PLAYER_VOTE = 0x3614, @@ -261,9 +261,9 @@ enum OpcodeClient : uint32 CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, CMSG_ENABLE_NAGLE = 0x376B, CMSG_ENABLE_TAXI_NODE = 0x34A4, - CMSG_ENGINE_SURVEY = 0x36E9, + CMSG_ENGINE_SURVEY = 0x36E8, CMSG_ENUM_CHARACTERS = 0x35E6, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E2, CMSG_FAR_SIGHT = 0x34D8, CMSG_GAME_OBJ_REPORT_USE = 0x34DF, CMSG_GAME_OBJ_USE = 0x34DE, @@ -291,17 +291,17 @@ enum OpcodeClient : uint32 CMSG_GARRISON_START_MISSION = 0x32E8, CMSG_GARRISON_SWAP_BUILDINGS = 0x32A5, CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E5, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3688, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3687, CMSG_GET_GARRISON_INFO = 0x329A, CMSG_GET_ITEM_PURCHASE_DATA = 0x351C, CMSG_GET_MIRROR_IMAGE_DATA = 0x3270, CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EC, - CMSG_GET_REMAINING_GAME_TIME = 0x36F2, + CMSG_GET_REMAINING_GAME_TIME = 0x36F1, CMSG_GET_TROPHY_LIST = 0x32D9, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E5, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3698, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3697, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3696, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E4, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3697, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3696, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3695, CMSG_GOSSIP_SELECT_OPTION = 0x348B, CMSG_GRANT_LEVEL = 0x34E7, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D, @@ -343,7 +343,7 @@ enum OpcodeClient : uint32 CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3088, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x306F, CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3070, - CMSG_GUILD_SET_GUILD_MASTER = 0x36CA, + CMSG_GUILD_SET_GUILD_MASTER = 0x36C9, CMSG_GUILD_SET_MEMBER_NOTE = 0x3072, CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3067, CMSG_GUILD_SHIFT_RANK = 0x3066, @@ -354,13 +354,13 @@ enum OpcodeClient : uint32 CMSG_INITIATE_ROLE_POLL = 0x35D9, CMSG_INITIATE_TRADE = 0x3156, CMSG_INSPECT = 0x3517, - CMSG_INSPECT_PVP = 0x36A7, + CMSG_INSPECT_PVP = 0x36A6, CMSG_INSTANCE_LOCK_RESPONSE = 0x34FD, CMSG_ITEM_PURCHASE_REFUND = 0x351D, CMSG_ITEM_TEXT_QUERY = 0x32F9, CMSG_JOIN_PET_BATTLE_QUEUE = 0x31C6, CMSG_JOIN_RATED_BATTLEGROUND = 0x3175, - CMSG_KEEP_ALIVE = 0x3684, + CMSG_KEEP_ALIVE = 0x3683, CMSG_KEYBOUND_OVERRIDE = 0x3207, CMSG_LEARN_PVP_TALENTS = 0x3540, CMSG_LEARN_TALENTS = 0x353F, @@ -385,9 +385,9 @@ enum OpcodeClient : uint32 CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307A, CMSG_LF_GUILD_SET_GUILD_POST = 0x361B, CMSG_LIST_INVENTORY = 0x349C, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36C0, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BF, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BE, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36BF, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BE, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BD, CMSG_LOADING_SCREEN_NOTIFY = 0x35F5, CMSG_LOAD_SELECTED_TROPHY = 0x32DA, CMSG_LOGOUT_CANCEL = 0x34C8, @@ -400,7 +400,7 @@ enum OpcodeClient : uint32 CMSG_LOOT_RELEASE = 0x31F7, CMSG_LOOT_ROLL = 0x31F8, CMSG_LOOT_UNIT = 0x31F1, - CMSG_LOW_LEVEL_RAID1 = 0x36A5, + CMSG_LOW_LEVEL_RAID1 = 0x36A4, CMSG_LOW_LEVEL_RAID2 = 0x3503, CMSG_MAIL_CREATE_TEXT_ITEM = 0x3528, CMSG_MAIL_DELETE = 0x3209, @@ -481,7 +481,7 @@ enum OpcodeClient : uint32 CMSG_NEXT_CINEMATIC_CAMERA = 0x3531, CMSG_OBJECT_UPDATE_FAILED = 0x317E, CMSG_OBJECT_UPDATE_RESCUED = 0x317F, - CMSG_OFFER_PETITION = 0x36B5, + CMSG_OFFER_PETITION = 0x36B4, CMSG_OPENING_CINEMATIC = 0x3530, CMSG_OPEN_ITEM = 0x32FA, CMSG_OPEN_MISSION_NPC = 0x32BF, @@ -492,7 +492,7 @@ enum OpcodeClient : uint32 CMSG_PARTY_INVITE_RESPONSE = 0x3600, CMSG_PARTY_UNINVITE = 0x3647, CMSG_PETITION_BUY = 0x34B9, - CMSG_PETITION_RENAME_GUILD = 0x36CB, + CMSG_PETITION_RENAME_GUILD = 0x36CA, CMSG_PETITION_SHOW_LIST = 0x34B8, CMSG_PETITION_SHOW_SIGNATURES = 0x34BA, CMSG_PET_ABANDON = 0x3484, @@ -509,7 +509,7 @@ enum OpcodeClient : uint32 CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31C3, CMSG_PET_CANCEL_AURA = 0x3485, CMSG_PET_CAST_SPELL = 0x3274, - CMSG_PET_RENAME = 0x368B, + CMSG_PET_RENAME = 0x368A, CMSG_PET_SET_ACTION = 0x3481, CMSG_PET_SPELL_AUTOCAST = 0x3486, CMSG_PET_STOP_ATTACK = 0x3483, @@ -520,24 +520,24 @@ enum OpcodeClient : uint32 CMSG_PVP_LOG_DATA = 0x3179, CMSG_PVP_PRESTIGE_RANK_UP = 0x331E, CMSG_QUERY_BATTLE_PET_NAME = 0x3251, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3665, - CMSG_QUERY_CORPSE_TRANSPORT = 0x3666, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3664, + CMSG_QUERY_CORPSE_TRANSPORT = 0x3665, CMSG_QUERY_COUNTDOWN_TIMER = 0x31A2, CMSG_QUERY_CREATURE = 0x324B, CMSG_QUERY_GAME_OBJECT = 0x324C, CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3252, - CMSG_QUERY_GUILD_INFO = 0x3693, + CMSG_QUERY_GUILD_INFO = 0x3692, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x34F2, CMSG_QUERY_NEXT_MAIL_TIME = 0x3526, CMSG_QUERY_NPC_TEXT = 0x324D, CMSG_QUERY_PAGE_TEXT = 0x324F, CMSG_QUERY_PETITION = 0x3253, CMSG_QUERY_PET_NAME = 0x3250, - CMSG_QUERY_PLAYER_NAME = 0x3691, + CMSG_QUERY_PLAYER_NAME = 0x3690, CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3172, CMSG_QUERY_QUEST_INFO = 0x324E, CMSG_QUERY_QUEST_REWARDS = 0x3321, - CMSG_QUERY_REALM_NAME = 0x3692, + CMSG_QUERY_REALM_NAME = 0x3691, CMSG_QUERY_SCENARIO_POI = 0x3659, CMSG_QUERY_TIME = 0x34C6, CMSG_QUERY_VOID_STORAGE = 0x319B, @@ -553,23 +553,23 @@ enum OpcodeClient : uint32 CMSG_QUEST_GIVER_STATUS_QUERY = 0x3497, CMSG_QUEST_GIVER_UNIGNORE_QUEST = 0x3492, CMSG_QUEST_LOG_REMOVE_QUEST = 0x351B, - CMSG_QUEST_POI_QUERY = 0x36B6, + CMSG_QUEST_POI_QUERY = 0x36B5, CMSG_QUEST_PUSH_RESULT = 0x349B, CMSG_QUEUED_MESSAGES_END = 0x376C, - CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E9, CMSG_RANDOM_ROLL = 0x3654, CMSG_READY_CHECK_RESPONSE = 0x3634, CMSG_READ_ITEM = 0x32FB, CMSG_RECLAIM_CORPSE = 0x34CB, - CMSG_RECRUIT_A_FRIEND = 0x36D1, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4, - CMSG_REDEEM_WOW_TOKEN_START = 0x36F3, + CMSG_RECRUIT_A_FRIEND = 0x36D0, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F3, + CMSG_REDEEM_WOW_TOKEN_START = 0x36F2, CMSG_REORDER_CHARACTERS = 0x35E7, CMSG_REPAIR_ITEM = 0x34DC, CMSG_REPLACE_TROPHY = 0x32DB, CMSG_REPOP_REQUEST = 0x3514, CMSG_REPORT_PVP_PLAYER_AFK = 0x34E4, - CMSG_REQUEST_ACCOUNT_DATA = 0x369B, + CMSG_REQUEST_ACCOUNT_DATA = 0x369A, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DB, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317B, CMSG_REQUEST_CEMETERY_LIST = 0x3173, @@ -584,7 +584,7 @@ enum OpcodeClient : uint32 CMSG_REQUEST_PET_INFO = 0x3487, CMSG_REQUEST_PLAYED_TIME = 0x3256, CMSG_REQUEST_PVP_REWARDS = 0x318F, - CMSG_REQUEST_RAID_INFO = 0x36CC, + CMSG_REQUEST_RAID_INFO = 0x36CB, CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E2, CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, CMSG_REQUEST_STABLED_PETS = 0x3488, @@ -592,10 +592,10 @@ enum OpcodeClient : uint32 CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321B, CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321A, CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321C, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EB, CMSG_RESET_CHALLENGE_MODE = 0x31EA, - CMSG_RESET_INSTANCES = 0x366D, - CMSG_RESURRECT_RESPONSE = 0x368A, + CMSG_RESET_INSTANCES = 0x366C, + CMSG_RESURRECT_RESPONSE = 0x3689, CMSG_REVERT_MONUMENT_APPEARANCE = 0x32DD, CMSG_RIDE_VEHICLE_INTERACT = 0x321D, CMSG_SAVE_CUF_PROFILES = 0x3189, @@ -606,9 +606,9 @@ enum OpcodeClient : uint32 CMSG_SCENE_TRIGGER_EVENT = 0x3205, CMSG_SELF_RES = 0x351E, CMSG_SELL_ITEM = 0x349D, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE, - CMSG_SELL_WOW_TOKEN_START = 0x36ED, - CMSG_SEND_CONTACT_LIST = 0x36D4, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36ED, + CMSG_SELL_WOW_TOKEN_START = 0x36EC, + CMSG_SEND_CONTACT_LIST = 0x36D3, CMSG_SEND_MAIL = 0x35F7, CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x361F, CMSG_SEND_TEXT_EMOTE = 0x347E, @@ -622,10 +622,10 @@ enum OpcodeClient : uint32 CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32FE, CMSG_SET_BANK_AUTOSORT_DISABLED = 0x32FF, CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32FD, - CMSG_SET_CONTACT_NOTES = 0x36D7, + CMSG_SET_CONTACT_NOTES = 0x36D6, CMSG_SET_CURRENCY_FLAGS = 0x3169, CMSG_SET_DIFFICULTY_ID = 0x3206, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3687, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3686, CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3616, CMSG_SET_FACTION_AT_WAR = 0x34CE, CMSG_SET_FACTION_INACTIVE = 0x34D0, @@ -637,12 +637,12 @@ enum OpcodeClient : uint32 CMSG_SET_PARTY_ASSIGNMENT = 0x3651, CMSG_SET_PARTY_LEADER = 0x364A, CMSG_SET_PET_SLOT = 0x3168, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x3690, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x368F, CMSG_SET_PREFERRED_CEMETERY = 0x3174, CMSG_SET_PVP = 0x3283, - CMSG_SET_RAID_DIFFICULTY = 0x36E1, + CMSG_SET_RAID_DIFFICULTY = 0x36E0, CMSG_SET_ROLE = 0x35D8, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368E, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368D, CMSG_SET_SELECTION = 0x3516, CMSG_SET_SHEATHED = 0x347F, CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3300, @@ -653,7 +653,7 @@ enum OpcodeClient : uint32 CMSG_SET_TRADE_ITEM = 0x315D, CMSG_SET_USING_PARTY_GARRISON = 0x32C1, CMSG_SET_WATCHED_FACTION = 0x34D1, - CMSG_SHOW_TRADE_SKILL = 0x36C5, + CMSG_SHOW_TRADE_SKILL = 0x36C4, CMSG_SIGN_PETITION = 0x3520, CMSG_SILENCE_PARTY_TALKER = 0x3652, CMSG_SOCKET_GEMS = 0x34DB, @@ -667,7 +667,7 @@ enum OpcodeClient : uint32 CMSG_START_CHALLENGE_MODE = 0x3537, CMSG_START_SPECTATOR_WAR_GAME = 0x35DE, CMSG_START_WAR_GAME = 0x35DD, - CMSG_SUMMON_RESPONSE = 0x366F, + CMSG_SUMMON_RESPONSE = 0x366E, CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3645, CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, @@ -683,7 +683,7 @@ enum OpcodeClient : uint32 CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A5, CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A7, CMSG_TELEPORT_TO_GUID = 0x39F5, - CMSG_TELEPORT_TO_UNIT = 0x3668, + CMSG_TELEPORT_TO_UNIT = 0x3667, CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3B, CMSG_TIME_SYNC_RESPONSE = 0x3A38, CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A, @@ -698,24 +698,24 @@ enum OpcodeClient : uint32 CMSG_TRANSMOGRIFY_ITEMS = 0x3190, CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE = 0x3632, CMSG_TURN_IN_PETITION = 0x3522, - CMSG_TUTORIAL = 0x36E2, + CMSG_TUTORIAL = 0x36E1, CMSG_TWITTER_CHECK_STATUS = 0x312A, CMSG_TWITTER_CONNECT = 0x3127, CMSG_TWITTER_DISCONNECT = 0x312B, CMSG_TWITTER_POST = 0x3306, - CMSG_UI_TIME_REQUEST = 0x36A0, + CMSG_UI_TIME_REQUEST = 0x369F, CMSG_UNACCEPT_TRADE = 0x315B, - CMSG_UNDELETE_CHARACTER = 0x36E4, + CMSG_UNDELETE_CHARACTER = 0x36E3, CMSG_UNLEARN_SKILL = 0x34D5, CMSG_UNLEARN_SPECIALIZATION = 0x319E, CMSG_UNLOCK_VOID_STORAGE = 0x319A, - CMSG_UPDATE_ACCOUNT_DATA = 0x369C, - CMSG_UPDATE_CLIENT_SETTINGS = 0x3669, + CMSG_UPDATE_ACCOUNT_DATA = 0x369B, + CMSG_UPDATE_CLIENT_SETTINGS = 0x3668, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, CMSG_UPDATE_RAID_TARGET = 0x3650, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F9, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F4, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EA, CMSG_UPGRADE_GARRISON = 0x3293, CMSG_UPGRADE_ITEM = 0x320B, CMSG_USED_FOLLOW = 0x3184, @@ -726,11 +726,11 @@ enum OpcodeClient : uint32 CMSG_VIOLENCE_LEVEL = 0x3182, CMSG_VOICE_ADD_IGNORE = 0x3656, CMSG_VOICE_DEL_IGNORE = 0x3657, - CMSG_VOICE_SESSION_ENABLE = 0x3689, + CMSG_VOICE_SESSION_ENABLE = 0x3688, CMSG_VOID_STORAGE_TRANSFER = 0x319C, CMSG_WARDEN_DATA = 0x35EA, - CMSG_WHO = 0x3686, - CMSG_WHO_IS = 0x3685, + CMSG_WHO = 0x3685, + CMSG_WHO_IS = 0x3684, CMSG_WORLD_PORT_RESPONSE = 0x35F6, CMSG_WORLD_TELEPORT = 0x3326, CMSG_WRAP_ITEM = 0x3994, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a3553f6b762..b7239b21a7b 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5251,17 +5251,6 @@ SpellCastResult Spell::CheckCast(bool strict) SpellCastResult res = CanOpenLock(effect->EffectIndex, lockId, skillId, reqSkillValue, skillValue); if (res != SPELL_CAST_OK) return res; - - // chance for fail at orange mining/herb/LockPicking gathering attempt - // second check prevent fail at rechecks - if (skillId != SKILL_NONE && (!m_selfContainer || ((*m_selfContainer) != this))) - { - bool canFailAtMax = skillId != SKILL_HERBALISM && skillId != SKILL_MINING; - - // chance for failure in orange gather / lockpick (gathering skill can't fail at maxskill) - if ((canFailAtMax || skillValue < sWorld->GetConfigMaxSkillValue()) && reqSkillValue > irand(skillValue - 25, skillValue + 37)) - return SPELL_FAILED_TRY_AGAIN; - } break; } case SPELL_EFFECT_RESURRECT_PET: @@ -6948,13 +6937,16 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk skillId = SkillByLockType(LockType(lockInfo->Index[j])); - if (skillId != SKILL_NONE) + if (skillId != SKILL_NONE || lockInfo->Index[j] == LOCKTYPE_PICKLOCK) { reqSkillValue = lockInfo->Skill[j]; // castitem check: rogue using skeleton keys. the skill values should not be added in this case. - skillValue = m_CastItem || m_caster->GetTypeId()!= TYPEID_PLAYER ? - 0 : m_caster->ToPlayer()->GetSkillValue(skillId); + skillValue = 0; + if (!m_CastItem && m_caster->GetTypeId() == TYPEID_PLAYER) + skillValue = m_caster->ToPlayer()->GetSkillValue(skillId); + else if (lockInfo->Index[j] == LOCKTYPE_PICKLOCK) + skillValue = m_caster->getLevel() * 5; // skill bonus provided by casting spell (mostly item spells) // add the effect base points modifier from the spell cast (cheat lock / skeleton key etc.) -- cgit v1.2.3 From 0de1adf2812a4fa896dc5cd21314e596b44457b9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 18 Jun 2016 23:03:16 +0200 Subject: Core/PacketIO: Updated equipment set packets and implemented saving transmog outfits (even if transmog itself isnt updated) --- .../2016_xx_xx_xx_characters_legion_07.sql | 33 +++++ .../Database/Implementation/CharacterDatabase.cpp | 12 ++ .../Database/Implementation/CharacterDatabase.h | 6 + src/server/game/DataStores/DB2Stores.h | 1 + src/server/game/Entities/Player/Player.cpp | 141 +++++++++++++++++---- src/server/game/Entities/Player/Player.h | 19 ++- src/server/game/Handlers/CharacterHandler.cpp | 46 +++++-- .../game/Server/Packets/EquipmentSetPackets.cpp | 18 ++- .../game/Server/Packets/EquipmentSetPackets.h | 1 + src/server/game/Server/Protocol/Opcodes.cpp | 6 +- 10 files changed, 237 insertions(+), 46 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_07.sql (limited to 'src/server/database') diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_07.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_07.sql new file mode 100644 index 00000000000..96d45a97a01 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_07.sql @@ -0,0 +1,33 @@ +DROP TABLE IF EXISTS `character_transmog_outfits`; +CREATE TABLE `character_transmog_outfits` ( + `guid` bigint(20) NOT NULL DEFAULT '0', + `setguid` bigint(20) NOT NULL AUTO_INCREMENT, + `setindex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `name` varchar(128) NOT NULL, + `iconname` varchar(256) NOT NULL, + `ignore_mask` int(11) NOT NULL DEFAULT '0', + `appearance0` int(10) NOT NULL DEFAULT '0', + `appearance1` int(10) NOT NULL DEFAULT '0', + `appearance2` int(10) NOT NULL DEFAULT '0', + `appearance3` int(10) NOT NULL DEFAULT '0', + `appearance4` int(10) NOT NULL DEFAULT '0', + `appearance5` int(10) NOT NULL DEFAULT '0', + `appearance6` int(10) NOT NULL DEFAULT '0', + `appearance7` int(10) NOT NULL DEFAULT '0', + `appearance8` int(10) NOT NULL DEFAULT '0', + `appearance9` int(10) NOT NULL DEFAULT '0', + `appearance10` int(10) NOT NULL DEFAULT '0', + `appearance11` int(10) NOT NULL DEFAULT '0', + `appearance12` int(10) NOT NULL DEFAULT '0', + `appearance13` int(10) NOT NULL DEFAULT '0', + `appearance14` int(10) NOT NULL DEFAULT '0', + `appearance15` int(10) NOT NULL DEFAULT '0', + `appearance16` int(10) NOT NULL DEFAULT '0', + `appearance17` int(10) NOT NULL DEFAULT '0', + `appearance18` int(10) NOT NULL DEFAULT '0', + `mainHandEnchant` int(10) NOT NULL DEFAULT '0', + `offHandEnchant` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`setguid`), + UNIQUE KEY `idx_set` (`guid`,`setguid`,`setindex`), + KEY `Idx_setindex` (`setindex`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 14e7ac54bab..ea5cc8ae3ae 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -126,6 +126,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_CRITERIAPROGRESS, "SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_TRANSMOG_OUTFITS, "SELECT setguid, setindex, name, iconname, ignore_mask, appearance0, appearance1, appearance2, appearance3, appearance4, " + "appearance5, appearance6, appearance7, appearance8, appearance9, appearance10, appearance11, appearance12, appearance13, appearance14, appearance15, appearance16, " + "appearance17, appearance18, mainHandEnchant, offHandEnchant FROM character_transmog_outfits WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); @@ -263,6 +266,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() "item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_TRANSMOG_OUTFIT, "UPDATE character_transmog_outfits SET name=?, iconname=?, ignore_mask=?, appearance0=?, appearance1=?, appearance2=?, appearance3=?, " + "appearance4=?, appearance5=?, appearance6=?, appearance7=?, appearance8=?, appearance9=?, appearance10=?, appearance11=?, appearance12=?, appearance13=?, appearance14=?, " + "appearance15=?, appearance16=?, appearance17=?, appearance18=?, mainHandEnchant=?, offHandEnchant=? WHERE guid=? AND setguid=? AND setindex=?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_TRANSMOG_OUTFIT, "INSERT INTO character_transmog_outfits (guid, setguid, setindex, name, iconname, ignore_mask, appearance0, appearance1, appearance2, " + "appearance3, appearance4, appearance5, appearance6, appearance7, appearance8, appearance9, appearance10, appearance11, appearance12, appearance13, appearance14, appearance15, " + "appearance16, appearance17, appearance18, mainHandEnchant, offHandEnchant) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_TRANSMOG_OUTFIT, "DELETE FROM character_transmog_outfits WHERE setguid=?", CONNECTION_ASYNC); // Auras PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges, castItemLevel) " @@ -550,6 +561,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_MAIL_ITEMS, "DELETE FROM mail_items WHERE receiver = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENTS, "DELETE FROM character_achievement WHERE guid = ? AND achievement NOT IN (456,457,458,459,460,461,462,463,464,465,466,467,1400,1402,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1463,3117,3259,4078,4576,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5008,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,6433,6523,6524,6743,6744,6745,6746,6747,6748,6749,6750,6751,6752,6829,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,6873)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_TRANSMOG_OUTFITS, "DELETE FROM character_transmog_outfits WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index ea6d9bd186f..fedc4087704 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -109,6 +109,7 @@ enum CharacterDatabaseStatements CHAR_SEL_CHARACTER_ACHIEVEMENTS, CHAR_SEL_CHARACTER_CRITERIAPROGRESS, CHAR_SEL_CHARACTER_EQUIPMENTSETS, + CHAR_SEL_CHARACTER_TRANSMOG_OUTFITS, CHAR_SEL_CHARACTER_BGDATA, CHAR_SEL_CHARACTER_TALENTS, CHAR_SEL_CHARACTER_SKILLS, @@ -219,6 +220,10 @@ enum CharacterDatabaseStatements CHAR_INS_EQUIP_SET, CHAR_DEL_EQUIP_SET, + CHAR_UPD_TRANSMOG_OUTFIT, + CHAR_INS_TRANSMOG_OUTFIT, + CHAR_DEL_TRANSMOG_OUTFIT, + CHAR_INS_AURA, CHAR_INS_AURA_EFFECT, @@ -466,6 +471,7 @@ enum CharacterDatabaseStatements CHAR_DEL_MAIL_ITEMS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_EQUIPMENTSETS, + CHAR_DEL_CHAR_TRANSMOG_OUTFITS, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_CHAR_TALENT, diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 78bebed07d0..72f7f741b78 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -102,6 +102,7 @@ TC_GAME_API extern DB2Storage sItemEffectS TC_GAME_API extern DB2Storage sItemStore; TC_GAME_API extern DB2Storage sItemExtendedCostStore; TC_GAME_API extern DB2Storage sItemLimitCategoryStore; +TC_GAME_API extern DB2Storage sItemModifiedAppearanceStore; TC_GAME_API extern DB2Storage sItemPriceBaseStore; TC_GAME_API extern DB2Storage sItemRandomPropertiesStore; TC_GAME_API extern DB2Storage sItemRandomSuffixStore; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d98c18bf6db..bf85a856d96 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4003,6 +4003,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRANSMOG_OUTFITS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER); stmt->setUInt64(0, guid); stmt->setUInt64(1, guid); @@ -16131,7 +16135,7 @@ void Player::_LoadArenaTeamInfo(PreparedQueryResult result) void Player::_LoadEquipmentSets(PreparedQueryResult result) { - // SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid)); + // SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid)); if (!result) return; @@ -16141,6 +16145,7 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) EquipmentSetInfo eqSet; eqSet.Data.Guid = fields[0].GetUInt64(); + eqSet.Data.Type = EquipmentSetInfo::EQUIPMENT; eqSet.Data.SetID = fields[1].GetUInt8(); eqSet.Data.SetName = fields[2].GetString(); eqSet.Data.SetIcon = fields[3].GetString(); @@ -16151,14 +16156,55 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) if (ObjectGuid::LowType guid = fields[5 + i].GetUInt64()) eqSet.Data.Pieces[i] = ObjectGuid::Create(guid); + eqSet.Data.Appearances.fill(0); + eqSet.Data.Enchants.fill(0); + if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit continue; - _equipmentSets[eqSet.Data.SetID] = eqSet; + _equipmentSets[eqSet.Data.Guid] = eqSet; } while (result->NextRow()); } +void Player::_LoadTransmogOutfits(PreparedQueryResult result) +{ + // 0 1 2 3 4 5 6 7 8 9 + //SELECT setguid, setindex, name, iconname, ignore_mask, appearance0, appearance1, appearance2, appearance3, appearance4, + // 10 11 12 13 14 15 16 17 18 19 20 21 + // appearance5, appearance6, appearance7, appearance8, appearance9, appearance10, appearance11, appearance12, appearance13, appearance14, appearance15, appearance16, + // 22 23 24 25 + // appearance17, appearance18, mainHandEnchant, offHandEnchant FROM character_transmog_outfits WHERE guid = ? ORDER BY setindex + if (!result) + return; + + do + { + Field* fields = result->Fetch(); + EquipmentSetInfo eqSet; + + eqSet.Data.Guid = fields[0].GetUInt64(); + eqSet.Data.Type = EquipmentSetInfo::TRANSMOG; + eqSet.Data.SetID = fields[1].GetUInt8(); + eqSet.Data.SetName = fields[2].GetString(); + eqSet.Data.SetIcon = fields[3].GetString(); + eqSet.Data.IgnoreMask = fields[4].GetUInt32(); + eqSet.State = EQUIPMENT_SET_UNCHANGED; + eqSet.Data.Pieces.fill(ObjectGuid::Empty); + + for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) + eqSet.Data.Appearances[i] = fields[5 + i].GetInt32(); + + for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i) + eqSet.Data.Enchants[i] = fields[24 + i].GetInt32(); + + if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit + continue; + + _equipmentSets[eqSet.Data.Guid] = eqSet; + } while (result->NextRow()); +} + void Player::_LoadBGData(PreparedQueryResult result) { if (!result) @@ -16972,6 +17018,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadDeclinedNames(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES)); _LoadEquipmentSets(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS)); + _LoadTransmogOutfits(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TRANSMOG_OUTFITS)); _LoadCUFProfiles(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CUF_PROFILES)); @@ -24799,12 +24846,12 @@ void Player::SendEquipmentSetList() SendDirectMessage(data.Write()); } -void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) +void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData const& newEqSet) { if (newEqSet.Guid != 0) { // something wrong... - EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.SetID); + EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.Guid); if (itr == _equipmentSets.end() || itr->second.Data.Guid != newEqSet.Guid) { TC_LOG_ERROR("entities.player", "Player::SetEquipmentSet: Player '%s' (%s) tried to save nonexistent equipment set " UI64FMTD " (index: %u)", @@ -24813,7 +24860,7 @@ void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) } } - EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.SetID]; + EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.Guid]; EquipmentSetUpdateState oldState = eqSlot.State; @@ -24825,6 +24872,7 @@ void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) WorldPackets::EquipmentSet::EquipmentSetID data; data.GUID = eqSlot.Data.Guid; + data.Type = eqSlot.Data.Type; data.SetID = eqSlot.Data.SetID; SendDirectMessage(data.Write()); } @@ -24845,39 +24893,76 @@ void Player::_SaveEquipmentSets(SQLTransaction& trans) ++itr; break; // nothing do case EQUIPMENT_SET_CHANGED: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET); - stmt->setString(j++, eqSet.Data.SetName); - stmt->setString(j++, eqSet.Data.SetIcon); - stmt->setUInt32(j++, eqSet.Data.IgnoreMask); - - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) - stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); - - stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqSet.Data.Guid); - stmt->setUInt32(j, eqSet.Data.SetID); + { + if (eqSet.Data.Type == EquipmentSetInfo::EQUIPMENT) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + stmt->setUInt64(j++, GetGUID().GetCounter()); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j, eqSet.Data.SetID); + } + else + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_TRANSMOG_OUTFIT); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setInt32(j++, eqSet.Data.Appearances[i]); + for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i) + stmt->setInt32(j++, eqSet.Data.Enchants[i]); + stmt->setUInt64(j++, GetGUID().GetCounter()); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j, eqSet.Data.SetID); + } trans->Append(stmt); eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; + } case EQUIPMENT_SET_NEW: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET); - stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqSet.Data.Guid); - stmt->setUInt32(j++, eqSet.Data.SetID); - stmt->setString(j++, eqSet.Data.SetName); - stmt->setString(j++, eqSet.Data.SetIcon); - stmt->setUInt32(j++, eqSet.Data.IgnoreMask); - - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) - stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); - + { + if (eqSet.Data.Type == EquipmentSetInfo::EQUIPMENT) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET); + stmt->setUInt64(j++, GetGUID().GetCounter()); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j++, eqSet.Data.SetID); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + } + else + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_TRANSMOG_OUTFIT); + stmt->setUInt64(j++, GetGUID().GetCounter()); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j++, eqSet.Data.SetID); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setInt32(j++, eqSet.Data.Appearances[i]); + for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i) + stmt->setInt32(j++, eqSet.Data.Enchants[i]); + } trans->Append(stmt); eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; + } case EQUIPMENT_SET_DELETED: - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET); + if (eqSet.Data.Type == EquipmentSetInfo::EQUIPMENT) + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET); + else + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TRANSMOG_OUTFIT); stmt->setUInt64(0, eqSet.Data.Guid); trans->Append(stmt); itr = _equipmentSets.erase(itr); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 4e4e116f65e..bf1880a1f6e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -808,24 +808,33 @@ enum EquipmentSetUpdateState struct EquipmentSetInfo { + enum EquipmentSetType : int32 + { + EQUIPMENT = 0, + TRANSMOG = 1 + }; + /// Data sent in EquipmentSet related packets struct EquipmentSetData { + EquipmentSetType Type = EQUIPMENT; uint64 Guid = 0; ///< Set Identifier uint32 SetID = 0; ///< Index uint32 IgnoreMask = 0; ///< Mask of EquipmentSlot std::string SetName; std::string SetIcon; - ObjectGuid Pieces[EQUIPMENT_SLOT_END]; + std::array Pieces; + std::array Appearances; ///< ItemModifiedAppearanceID + std::array Enchants; ///< SpellItemEnchantmentID } Data; /// Server-side data EquipmentSetUpdateState State = EQUIPMENT_SET_NEW; }; -#define MAX_EQUIPMENT_SET_INDEX 10 // client limit +#define MAX_EQUIPMENT_SET_INDEX 20 // client limit -typedef std::map EquipmentSetContainer; +typedef std::map EquipmentSetContainer; struct ItemPosCount { @@ -955,6 +964,7 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, + PLAYER_LOGIN_QUERY_LOAD_TRANSMOG_OUTFITS, PLAYER_LOGIN_QUERY_LOAD_BG_DATA, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA, @@ -2139,7 +2149,7 @@ class TC_GAME_API Player : public Unit, public GridObject void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto); void SendEquipmentSetList(); - void SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet); + void SetEquipmentSet(EquipmentSetInfo::EquipmentSetData const& newEqSet); void DeleteEquipmentSet(uint64 id); void SendInitWorldStates(uint32 zone, uint32 area); @@ -2519,6 +2529,7 @@ class TC_GAME_API Player : public Unit, public GridObject void _LoadDeclinedNames(PreparedQueryResult result); void _LoadArenaTeamInfo(PreparedQueryResult result); void _LoadEquipmentSets(PreparedQueryResult result); + void _LoadTransmogOutfits(PreparedQueryResult result); void _LoadBGData(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b8c6072f60e..63a37b42efd 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -192,6 +192,10 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_TRANSMOG_OUTFITS); + stmt->setUInt64(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_TRANSMOG_OUTFITS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_CUF_PROFILES); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_CUF_PROFILES, stmt); @@ -1623,29 +1627,53 @@ void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipm if (saveEquipmentSet.Set.SetID >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount return; + if (saveEquipmentSet.Set.Type > EquipmentSetInfo::TRANSMOG) + return; + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) { if (!(saveEquipmentSet.Set.IgnoreMask & (1 << i))) { - ObjectGuid const& itemGuid = saveEquipmentSet.Set.Pieces[i]; + if (saveEquipmentSet.Set.Type == EquipmentSetInfo::EQUIPMENT) + { + saveEquipmentSet.Set.Appearances[i] = 0; - Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); + ObjectGuid const& itemGuid = saveEquipmentSet.Set.Pieces[i]; - /// cheating check 1 (item equipped but sent empty guid) - if (!item && !itemGuid.IsEmpty()) - return; + Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); - /// cheating check 2 (sent guid does not match equipped item) - if (item && item->GetGUID() != itemGuid) - return; + /// cheating check 1 (item equipped but sent empty guid) + if (!item && !itemGuid.IsEmpty()) + return; + + /// cheating check 2 (sent guid does not match equipped item) + if (item && item->GetGUID() != itemGuid) + return; + } + else + { + saveEquipmentSet.Set.Pieces[i].Clear(); + if (saveEquipmentSet.Set.Appearances[i] && !sItemModifiedAppearanceStore.LookupEntry(saveEquipmentSet.Set.Appearances[i])) + return; + + // TODO: validata whether appearance is known + } } else + { saveEquipmentSet.Set.Pieces[i].Clear(); + saveEquipmentSet.Set.Appearances[i] = 0; + } } saveEquipmentSet.Set.IgnoreMask &= 0x7FFFF; /// clear invalid bits (i > EQUIPMENT_SLOT_END) + if (saveEquipmentSet.Set.Type == EquipmentSetInfo::EQUIPMENT) + { + saveEquipmentSet.Set.Enchants[0] = 0; + saveEquipmentSet.Set.Enchants[1] = 0; + } - _player->SetEquipmentSet(std::move(saveEquipmentSet.Set)); + _player->SetEquipmentSet(saveEquipmentSet.Set); } void WorldSession::HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& deleteEquipmentSet) diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index 783def93e88..dbc40c63e7d 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -20,6 +20,7 @@ WorldPacket const* WorldPackets::EquipmentSet::EquipmentSetID::Write() { _worldPacket << uint64(GUID); + _worldPacket << int32(Type); _worldPacket << uint32(SetID); return &_worldPacket; @@ -31,12 +32,18 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() for (EquipmentSetInfo::EquipmentSetData const* equipSet : SetData) { + _worldPacket << int32(equipSet->Type); _worldPacket << uint64(equipSet->Guid); _worldPacket << uint32(equipSet->SetID); _worldPacket << uint32(equipSet->IgnoreMask); - for (ObjectGuid const& guid : equipSet->Pieces) - _worldPacket << guid; + for (std::size_t i = 0; i < EQUIPMENT_SLOT_END; ++i) + { + _worldPacket << equipSet->Pieces[i]; + _worldPacket << int32(equipSet->Appearances[i]); + } + + _worldPacket.append(equipSet->Enchants.data(), equipSet->Enchants.size()); _worldPacket.WriteBits(equipSet->SetName.length(), 8); _worldPacket.WriteBits(equipSet->SetIcon.length(), 9); @@ -51,12 +58,19 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() { + Set.Type = EquipmentSetInfo::EquipmentSetType(_worldPacket.read()); _worldPacket >> Set.Guid; _worldPacket >> Set.SetID; _worldPacket >> Set.IgnoreMask; for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + { _worldPacket >> Set.Pieces[i]; + _worldPacket >> Set.Appearances[i]; + } + + _worldPacket >> Set.Enchants[0]; + _worldPacket >> Set.Enchants[1]; uint32 setNameLength = _worldPacket.ReadBits(8); uint32 setIconLength = _worldPacket.ReadBits(9); diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h index e33b6a6cdca..42f6fd5df05 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.h +++ b/src/server/game/Server/Packets/EquipmentSetPackets.h @@ -33,6 +33,7 @@ namespace WorldPackets WorldPacket const* Write() override; uint64 GUID = 0; ///< Set Identifier + int32 Type = 0; uint32 SetID = 0; ///< Index }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 7bfbb88e9bd..f4c246068a1 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -676,7 +676,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REVERT_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RideVehicleInteract, &WorldSession::HandleRideVehicleInteract); DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::SaveCUFProfiles, &WorldSession::HandleSaveCUFProfiles); - DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); + DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::SaveGuildEmblem, &WorldSession::HandleSaveGuildEmblem); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackCanceled, &WorldSession::HandleScenePlaybackCanceled); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackComplete, &WorldSession::HandleScenePlaybackComplete); @@ -1077,7 +1077,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_CHARACTERS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1297,7 +1297,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_CHARACTER_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_SELECTED_TROPHY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SET_TIME_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); -- cgit v1.2.3 From 40510c24ed672b0eb4153aac4717dd8e02fbecdd Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 26 Jun 2016 23:50:53 +0200 Subject: Core/DataStores: Updated to 7.0.3.22045 --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_09.sql | 2 ++ .../Database/Implementation/HotfixDatabase.cpp | 8 +++---- src/server/game/DataStores/DB2Metadata.h | 24 +++++++++---------- src/server/game/DataStores/DB2Stores.h | 2 +- src/server/game/DataStores/DB2Structure.h | 2 -- src/server/game/DataStores/GameTables.cpp | 28 +++++++++++++++------- 6 files changed, 38 insertions(+), 28 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_09.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_09.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_09.sql new file mode 100644 index 00000000000..faa3cabc66e --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_09.sql @@ -0,0 +1,2 @@ +ALTER TABLE `char_titles` DROP `ConditionID`; +ALTER TABLE `creature_family` DROP `CategoryEnumID`; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index c34c9ac72aa..e6b4f4480eb 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -105,7 +105,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); // CharTitles.db2 - PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale, NameFemale, ConditionID, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale, NameFemale, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale_lang, NameFemale_lang FROM char_titles_locale WHERE locale = ?", CONNECTION_SYNCH); // ChatChannels.db2 @@ -154,7 +154,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // CreatureFamily.db2 PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, MinScale, MaxScale, Name, IconFile, SkillLine1, SkillLine2, PetFoodMask, MinScaleLevel, " - "MaxScaleLevel, PetTalentType, CategoryEnumID FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); + "MaxScaleLevel, PetTalentType FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); // CreatureModelData.db2 @@ -437,8 +437,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemRandomSuffix.db2 - PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " - "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5, " + "AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSet.db2 diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 1ec1b0fe856..e510bfc23bb 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -827,9 +827,9 @@ struct CharTitlesMeta { static DB2Meta const* Instance() { - static char const* types = "sshhb"; - static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 5, 0x597835B2, types, arraySizes); + static char const* types = "sshb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, 0xECCBDBF9, types, arraySizes); return &instance; } }; @@ -1179,9 +1179,9 @@ struct CreatureFamilyMeta { static DB2Meta const* Instance() { - static char const* types = "ffsShhbbbb"; - static uint8 const arraySizes[10] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 10, 0xD3A903B4, types, arraySizes); + static char const* types = "ffsShhbbb"; + static uint8 const arraySizes[9] = { 1, 1, 1, 1, 2, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 9, 0xC9BA80A3, types, arraySizes); return &instance; } }; @@ -4138,9 +4138,9 @@ struct QuestPOIBlobMeta { static DB2Meta const* Instance() { - static char const* types = "hhbb"; - static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; - static DB2Meta instance(-1, 4, 0x2B6FCF8C, types, arraySizes); + static char const* types = "hhbbi"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, 0xA11D5590, types, arraySizes); return &instance; } }; @@ -4160,9 +4160,9 @@ struct QuestPOIPointCliTaskMeta { static DB2Meta const* Instance() { - static char const* types = "hhhhhb"; - static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; - static DB2Meta instance(-1, 6, 0xB4B42A70, types, arraySizes); + static char const* types = "hhhhhbi"; + static uint8 const arraySizes[7] = { 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 7, 0x6F65A1E7, types, arraySizes); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 72f7f741b78..e5579e080e2 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -189,7 +189,7 @@ typedef std::map TaxiPathSetBySource; typedef std::vector TaxiPathNodeList; typedef std::vector TaxiPathNodesByPath; -#define TaxiMaskSize 235 +#define TaxiMaskSize 236 typedef std::array TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 993d8b1c315..d5ff75ce421 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -257,7 +257,6 @@ struct CharTitlesEntry uint32 ID; LocalizedString* NameMale; LocalizedString* NameFemale; - uint16 ConditionID; uint16 MaskID; uint8 Flags; }; @@ -423,7 +422,6 @@ struct CreatureFamilyEntry uint8 MinScaleLevel; uint8 MaxScaleLevel; uint8 PetTalentType; - uint8 CategoryEnumID; }; struct CreatureModelDataEntry diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp index 3197305b77f..69637914b0e 100644 --- a/src/server/game/DataStores/GameTables.cpp +++ b/src/server/game/DataStores/GameTables.cpp @@ -63,21 +63,31 @@ inline uint32 LoadGameTable(std::vector& errors, GameTable& stor std::string line; while (std::getline(stream, line)) { - Tokenizer values(line, '\t', columnDefs.size(), false); - if (values.size() == 0) + Tokenizer values(line, '\t', columnDefs.size()); + if (!values.size()) break; - ASSERT(values.size() == columnDefs.size(), SZFMTD " == " SZFMTD, values.size(), columnDefs.size()); + // make end point just after last nonempty token + auto end = values.begin() + values.size() - 1; + while (!strlen(*end) && end != values.begin()) + --end; - // as of 21796 blizz doesnt seem to care about id column and just puts in whatever there - ASSERT(strtol(values[0], nullptr, 10) == data.size(), - "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")", - strtol(values[0], nullptr, 10), data.size(), data.size()); + if (values.begin() == end) + break; + + ++end; + + ASSERT(std::distance(values.begin(), end) == columnDefs.size(), SZFMTD " == " SZFMTD, std::distance(values.begin(), end), columnDefs.size()); + + // client ignores id column - CombatRatings has copypasted rows for levels > 110 + //ASSERT(strtol(values[0], nullptr, 10) == data.size(), + // "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")", + // strtol(values[0], nullptr, 10), data.size(), data.size()); data.emplace_back(); float* row = reinterpret_cast(&data.back()); - for (std::size_t col = 1; col < columnDefs.size(); ++col) - *row++ = strtof(values[col], nullptr); + for (auto itr = values.begin() + 1; itr != end; ++itr) + *row++ = strtof(*itr, nullptr); } storage.SetData(std::move(data)); -- cgit v1.2.3 From f7883bd5251a759da1ca8be3ba6f6cead36723ec Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 5 Jul 2016 22:07:35 +0200 Subject: Core/Transmog: Implemented transmog collection and updated transmog handling --- sql/updates/auth/2016_xx_xx_xx_auth_legion_00.sql | 22 ++ .../2016_xx_xx_xx_characters_legion_08.sql | 45 +++ .../hotfixes/2016_xx_xx_xx_hotfixes_legion_10.sql | 37 +++ .../Database/Implementation/CharacterDatabase.cpp | 22 +- .../Database/Implementation/CharacterDatabase.h | 3 + .../Database/Implementation/HotfixDatabase.cpp | 6 + .../Database/Implementation/HotfixDatabase.h | 3 + .../Database/Implementation/LoginDatabase.cpp | 8 + .../Database/Implementation/LoginDatabase.h | 6 + src/server/game/DataStores/DB2Stores.cpp | 2 + src/server/game/DataStores/DB2Stores.h | 1 + src/server/game/DataStores/DB2Structure.h | 20 +- src/server/game/Entities/Item/Item.cpp | 236 ++++++++----- src/server/game/Entities/Item/Item.h | 58 ++-- src/server/game/Entities/Item/ItemTemplate.h | 5 +- src/server/game/Entities/Object/Object.cpp | 19 +- src/server/game/Entities/Player/CollectionMgr.cpp | 364 +++++++++++++++++++++ src/server/game/Entities/Player/CollectionMgr.h | 33 +- src/server/game/Entities/Player/Player.cpp | 98 ++++-- src/server/game/Entities/Player/Player.h | 2 +- src/server/game/Globals/ObjectMgr.cpp | 6 + src/server/game/Guilds/Guild.cpp | 2 +- src/server/game/Guilds/GuildMgr.cpp | 16 +- src/server/game/Handlers/CharacterHandler.cpp | 39 ++- src/server/game/Handlers/ItemHandler.cpp | 158 --------- src/server/game/Handlers/SpellHandler.cpp | 4 +- .../game/Handlers/TransmogrificationHandler.cpp | 293 +++++++++++++++++ src/server/game/Handlers/VoidStorageHandler.cpp | 2 + src/server/game/Server/Packets/AllPackets.h | 1 + src/server/game/Server/Packets/ItemPackets.cpp | 30 -- src/server/game/Server/Packets/ItemPackets.h | 24 -- .../Server/Packets/TransmogrificationPackets.cpp | 54 +++ .../Server/Packets/TransmogrificationPackets.h | 78 +++++ src/server/game/Server/Protocol/Opcodes.cpp | 6 +- src/server/game/Server/WorldSession.cpp | 11 + src/server/game/Server/WorldSession.h | 10 +- src/server/game/Spells/Spell.cpp | 2 +- src/server/game/Spells/SpellEffects.cpp | 4 +- 38 files changed, 1354 insertions(+), 376 deletions(-) create mode 100644 sql/updates/auth/2016_xx_xx_xx_auth_legion_00.sql create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_08.sql create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_10.sql create mode 100644 src/server/game/Handlers/TransmogrificationHandler.cpp create mode 100644 src/server/game/Server/Packets/TransmogrificationPackets.cpp create mode 100644 src/server/game/Server/Packets/TransmogrificationPackets.h (limited to 'src/server/database') diff --git a/sql/updates/auth/2016_xx_xx_xx_auth_legion_00.sql b/sql/updates/auth/2016_xx_xx_xx_auth_legion_00.sql new file mode 100644 index 00000000000..5cbb737f518 --- /dev/null +++ b/sql/updates/auth/2016_xx_xx_xx_auth_legion_00.sql @@ -0,0 +1,22 @@ +-- +-- Table structure for table `battlenet_item_appearances` +-- +DROP TABLE IF EXISTS `battlenet_item_appearances`; +CREATE TABLE `battlenet_item_appearances` ( + `battlenetAccountId` int(10) unsigned NOT NULL, + `blobIndex` smallint(5) unsigned NOT NULL, + `appearanceMask` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`battlenetAccountId`,`blobIndex`), + CONSTRAINT `fk_battlenet_item_appearances` FOREIGN KEY (`battlenetAccountId`) REFERENCES `battlenet_accounts` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `battlenet_item_favorite_appearances` +-- +DROP TABLE IF EXISTS `battlenet_item_favorite_appearances`; +CREATE TABLE `battlenet_item_favorite_appearances` ( + `battlenetAccountId` int(10) unsigned NOT NULL, + `itemModifiedAppearanceId` int(10) unsigned NOT NULL, + PRIMARY KEY (`battlenetAccountId`,`itemModifiedAppearanceId`), + CONSTRAINT `fk_battlenet_item_favorite_appearances` FOREIGN KEY (`battlenetAccountId`) REFERENCES `battlenet_accounts` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_08.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_08.sql new file mode 100644 index 00000000000..4efb4172e19 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_08.sql @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS `item_instance_transmog`; +CREATE TABLE `item_instance_transmog` ( + `itemGuid` bigint(20) unsigned NOT NULL, + `itemModifiedAppearanceAllSpecs` int(11) NOT NULL DEFAULT '0', + `itemModifiedAppearanceSpec1` int(11) NOT NULL DEFAULT '0', + `itemModifiedAppearanceSpec2` int(11) NOT NULL DEFAULT '0', + `itemModifiedAppearanceSpec3` int(11) NOT NULL DEFAULT '0', + `itemModifiedAppearanceSpec4` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentAllSpecs` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentSpec1` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentSpec2` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentSpec3` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentSpec4` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`itemGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `dbc_itemmodifiedappearance`; +CREATE TABLE `dbc_itemmodifiedappearance` ( + `Id` int(11) NOT NULL DEFAULT '0', + `ItemId` int(11) NOT NULL DEFAULT '0', + `AppearanceModID` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`), + UNIQUE KEY `idx_item_apperancemod` (`ItemId`,`AppearanceModID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Export of ItemModifiedAppearance.db2'; + +LOCK TABLES `dbc_itemmodifiedappearance` WRITE; +/*!40000 ALTER TABLE `dbc_itemmodifiedappearance` DISABLE KEYS */; +INSERT INTO `dbc_itemmodifiedappearance` (`Id`, `ItemId`, `AppearanceModID`) VALUES (14,17,0),(15,25,0),(16,35,0),(17,36,0),(18,37,0),(19,38,0),(20,39,0),(21,40,0),(22,43,0),(23,44,0),(24,45,0),(25,47,0),(26,48,0),(27,49,0),(28,51,0),(29,52,0),(30,53,0),(31,55,0),(32,56,0),(33,57,0),(34,59,0),(35,60,0),(36,61,0),(37,79,0),(38,80,0),(39,85,0),(40,120,0),(41,121,0),(42,127,0),(43,129,0),(44,139,0),(45,140,0),(46,143,0),(47,147,0),(48,148,0),(49,153,0),(50,154,0),(51,192,0),(52,193,0),(53,194,0),(54,195,0),(55,200,0),(56,201,0),(57,202,0),(58,203,0),(59,209,0),(60,210,0),(61,236,0),(62,237,0),(63,238,0),(64,239,0),(65,285,0),(66,286,0),(67,287,0),(68,647,0),(69,710,0),(70,711,0),(71,714,0),(72,718,0),(73,719,0),(74,720,0),(75,727,0),(76,746,0),(77,753,0),(78,754,0),(79,756,0),(80,763,0),(81,766,0),(82,767,0),(83,768,0),(84,776,0),(85,778,0),(86,781,0),(87,788,0),(88,789,0),(89,790,0),(90,791,0),(91,792,0),(92,793,0),(93,794,0),(94,795,0),(95,796,0),(96,797,0),(97,798,0),(98,799,0),(99,809,0),(100,810,0),(101,811,0),(102,812,0),(103,816,0),(104,820,0),(105,821,0),(106,826,0),(107,827,0),(108,832,0),(109,837,0),(110,838,0),(111,839,0),(112,840,0),(113,843,0),(114,844,0),(115,845,0),(116,846,0),(117,847,0),(118,848,0),(119,849,0),(120,850,0),(121,851,0),(122,852,0),(123,853,0),(124,854,0),(125,859,0),(126,860,0),(127,863,0),(128,864,0),(129,865,0),(130,866,0),(131,867,0),(132,868,0),(133,869,0),(134,870,0),(135,871,0),(136,872,0),(137,873,0),(138,876,0),(139,880,0),(140,885,0),(141,886,0),(142,888,0),(143,890,0),(144,892,0),(145,897,0),(146,899,0),(147,906,0),(148,907,0),(149,908,0),(150,909,0),(151,911,0),(152,913,0),(153,914,0),(154,920,0),(155,922,0),(156,923,0),(157,924,0),(158,925,0),(159,926,0),(160,927,0),(161,928,0),(162,934,0),(163,935,0),(164,936,0),(165,937,0),(166,940,0),(167,943,0),(168,944,0),(169,945,0),(170,948,0),(171,983,0),(172,1008,0),(173,1009,0),(174,1010,0),(175,1011,0),(176,1018,0),(177,1117,0),(178,1121,0),(179,1131,0),(180,1154,0),(181,1155,0),(182,1158,0),(183,1159,0),(184,1161,0),(185,1162,0),(186,1163,0),(187,1168,0),(188,1169,0),(189,1171,0),(190,1172,0),(191,1173,0),(192,1182,0),(193,1183,0),(194,1190,0),(195,1194,0),(196,1195,0),(197,1196,0),(198,1197,0),(199,1198,0),(200,1200,0),(201,1201,0),(202,1202,0),(203,1203,0),(204,1204,0),(205,1207,0),(206,1211,0),(207,1213,0),(208,1214,0),(209,1215,0),(210,1216,0),(211,1218,0),(212,1219,0),(213,1220,0),(214,1259,0),(215,1263,0),(216,1264,0),(217,1265,0),(218,1270,0),(219,1273,0),(220,1275,0),(221,1276,0),(222,1280,0),(223,1282,0),(224,1287,0),(225,1292,0),(226,1296,0),(227,1297,0),(228,1299,0),(229,1300,0),(230,1302,0),(231,1303,0),(232,1304,0),(233,1306,0),(234,1310,0),(235,1314,0),(236,1317,0),(237,1318,0),(238,1351,0),(239,1355,0),(240,1359,0),(241,1360,0),(242,1364,0),(243,1366,0),(244,1367,0),(245,1368,0),(246,1369,0),(247,1370,0),(248,1372,0),(249,1374,0),(250,1376,0),(251,1377,0),(252,1378,0),(253,1380,0),(254,1382,0),(255,1383,0),(256,1384,0),(257,1386,0),(258,1387,0),(259,1388,0),(260,1389,0),(261,1391,0),(262,1394,0),(263,1395,0),(264,1396,0),(265,1405,0),(266,1406,0),(267,1411,0),(268,1412,0),(269,1413,0),(270,1414,0),(271,1415,0),(272,1416,0),(273,1417,0),(274,1418,0),(275,1419,0),(276,1420,0),(277,1421,0),(278,1422,0),(279,1423,0),(280,1425,0),(281,1427,0),(282,1429,0),(283,1430,0),(284,1431,0),(285,1433,0),(286,1436,0),(287,1438,0),(288,1440,0),(289,1445,0),(290,1446,0),(291,1448,0),(292,1454,0),(293,1455,0),(294,1457,0),(295,1458,0),(296,1459,0),(297,1460,0),(298,1461,0),(299,1465,0),(300,1469,0),(301,1473,0),(302,1479,0),(303,1480,0),(304,1481,0),(305,1482,0),(306,1483,0),(307,1484,0),(308,1485,0),(309,1486,0),(310,1488,0),(311,1489,0),(312,1493,0),(313,1495,0),(314,1497,0),(315,1498,0),(316,1499,0),(317,1501,0),(318,1502,0),(319,1503,0),(320,1504,0),(321,1505,0),(322,1506,0),(323,1507,0),(324,1509,0),(325,1510,0),(326,1511,0),(327,1512,0),(328,1513,0),(329,1514,0),(330,1515,0),(331,1516,0),(332,1521,0),(333,1522,0),(334,1523,0),(335,1539,0),(336,1547,0),(337,1557,0),(338,1560,0),(339,1561,0),(340,1566,0),(341,1602,0),(342,1604,0),(343,1607,0),(344,1608,0),(345,1613,0),(346,1624,0),(347,1625,0),(348,1639,0),(349,1640,0),(350,1659,0),(351,1664,0),(352,1677,0),(353,1678,0),(354,1679,0),(355,1680,0),(356,1715,0),(357,1716,0),(358,1717,0),(359,1718,0),(360,1720,0),(361,1721,0),(362,1722,0),(363,1726,0),(364,1727,0),(365,1728,0),(366,1730,0),(367,1731,0),(368,1732,0),(369,1733,0),(370,1734,0),(371,1735,0),(372,1737,0),(373,1738,0),(374,1739,0),(375,1740,0),(376,1741,0),(377,1742,0),(378,1743,0),(379,1744,0),(380,1745,0),(381,1746,0),(382,1747,0),(383,1748,0),(384,1749,0),(385,1750,0),(386,1751,0),(387,1752,0),(388,1753,0),(389,1754,0),(390,1755,0),(391,1756,0),(392,1757,0),(393,1758,0),(394,1759,0),(395,1760,0),(396,1761,0),(397,1764,0),(398,1766,0),(399,1767,0),(400,1768,0),(401,1769,0),(402,1770,0),(403,1772,0),(404,1774,0),(405,1775,0),(406,1776,0),(407,1777,0),(408,1778,0),(409,1780,0),(410,1782,0),(411,1783,0),(412,1784,0),(413,1785,0),(414,1786,0),(415,1787,0),(416,1788,0),(417,1789,0),(418,1790,0),(419,1791,0),(420,1792,0),(421,1793,0),(422,1794,0),(423,1795,0),(424,1796,0),(425,1797,0),(426,1798,0),(427,1799,0),(428,1800,0),(429,1801,0),(430,1802,0),(431,1803,0),(432,1804,0),(433,1805,0),(434,1806,0),(435,1807,0),(436,1808,0),(437,1809,0),(438,1810,0),(439,1811,0),(440,1812,0),(441,1813,0),(442,1814,0),(443,1815,0),(444,1816,0),(445,1817,0),(446,1818,0),(447,1819,0),(448,1820,0),(449,1821,0),(450,1822,0),(451,1823,0),(452,1824,0),(453,1825,0),(454,1826,0),(455,1827,0),(456,1828,0),(457,1829,0),(458,1830,0),(459,1831,0),(460,1832,0),(461,1835,0),(462,1836,0),(463,1839,0),(464,1840,0),(465,1843,0),(466,1844,0),(467,1845,0),(468,1846,0),(469,1849,0),(470,1850,0),(471,1852,0),(472,1853,0),(473,1893,0),(474,1895,0),(475,1896,0),(476,1897,0),(477,1899,0),(478,1900,0),(479,1901,0),(480,1902,0),(481,1903,0),(482,1904,0),(483,1905,0),(484,1906,0),(485,1907,0),(486,1908,0),(487,1909,0),(488,1910,0),(489,1911,0),(490,1913,0),(491,1917,0),(492,1925,0),(493,1926,0),(494,1927,0),(495,1928,0),(496,1929,0),(497,1930,0),(498,1933,0),(499,1934,0),(500,1935,0),(501,1936,0),(502,1937,0),(503,1938,0),(504,1943,0),(505,1944,0),(506,1945,0),(507,1951,0),(508,1955,0),(509,1957,0),(510,1958,0),(511,1959,0),(512,1961,0),(513,1965,0),(514,1974,0),(515,1975,0),(516,1976,0),(517,1978,0),(518,1979,0),(519,1981,0),(520,1982,0),(521,1983,0),(522,1984,0),(523,1985,0),(524,1986,0),(525,1988,0),(526,1990,0),(527,1991,0),(528,1992,0),(529,1994,0),(530,1997,0),(531,1998,0),(532,2000,0),(533,2011,0),(534,2013,0),(535,2014,0),(536,2015,0),(537,2016,0),(538,2017,0),(539,2018,0),(540,2020,0),(541,2021,0),(542,2023,0),(543,2024,0),(544,2025,0),(545,2026,0),(546,2027,0),(547,2028,0),(548,2029,0),(549,2030,0),(550,2032,0),(551,2033,0),(552,2034,0),(553,2035,0),(554,2036,0),(555,2037,0),(556,2040,0),(557,2041,0),(558,2042,0),(559,2044,0),(560,2046,0),(561,2047,0),(562,2048,0),(563,2051,0),(564,2052,0),(565,2053,0),(566,2054,0),(567,2055,0),(568,2056,0),(569,2057,0),(570,2058,0),(571,2059,0),(572,2064,0),(573,2065,0),(574,2066,0),(575,2067,0),(576,2069,0),(577,2072,0),(578,2073,0),(579,2074,0),(580,2075,0),(581,2077,0),(582,2078,0),(583,2079,0),(584,2080,0),(585,2081,0),(586,2084,0),(587,2087,0),(588,2088,0),(589,2089,0),(590,2092,0),(591,2098,0),(592,2099,0),(593,2100,0),(594,2105,0),(595,2108,0),(596,2109,0),(597,2110,0),(598,2112,0),(599,2114,0),(600,2117,0),(601,2119,0),(602,2120,0),(603,2121,0),(604,2122,0),(605,2123,0),(606,2124,0),(607,2125,0),(608,2126,0),(609,2127,0),(610,2129,0),(611,2130,0),(612,2131,0),(613,2132,0),(614,2134,0),(615,2137,0),(616,2138,0),(617,2139,0),(618,2140,0),(619,2141,0),(620,2142,0),(621,2143,0),(622,2144,0),(623,2145,0),(624,2146,0),(625,2147,0),(626,2148,0),(627,2149,0),(628,2150,0),(629,2151,0),(630,2152,0),(631,2153,0),(632,2156,0),(633,2158,0),(634,2159,0),(635,2160,0),(636,2163,0),(637,2164,0),(638,2165,0),(639,2166,0),(640,2167,0),(641,2168,0),(642,2169,0),(643,2172,0),(644,2173,0),(645,2175,0),(646,2176,0),(647,2177,0),(648,2178,0),(649,2179,0),(650,2180,0),(651,2181,0),(652,2182,0),(653,2183,0),(654,2184,0),(655,2186,0),(656,2189,0),(657,2194,0),(658,2195,0),(659,2196,0),(660,2197,0),(661,2198,0),(662,2199,0),(663,2200,0),(664,2201,0),(665,2202,0),(666,2203,0),(667,2204,0),(668,2205,0),(669,2207,0),(670,2208,0),(671,2209,0),(672,2210,0),(673,2211,0),(674,2212,0),(675,2213,0),(676,2214,0),(677,2215,0),(678,2216,0),(679,2217,0),(680,2218,0),(681,2219,0),(682,2220,0),(683,2221,0),(684,2222,0),(685,2224,0),(686,2225,0),(687,2226,0),(688,2227,0),(689,2230,0),(690,2231,0),(691,2232,0),(692,2233,0),(693,2234,0),(694,2235,0),(695,2236,0),(696,2237,0),(697,2238,0),(698,2240,0),(699,2241,0),(700,2243,0),(701,2244,0),(702,2245,0),(703,2249,0),(704,2254,0),(705,2256,0),(706,2257,0),(707,2258,0),(708,2259,0),(709,2260,0),(710,2263,0),(711,2264,0),(712,2265,0),(713,2266,0),(714,2267,0),(715,2268,0),(716,2271,0),(717,2273,0),(718,2274,0),(719,2276,0),(720,2277,0),(721,2278,0),(722,2280,0),(723,2281,0),(724,2282,0),(725,2283,0),(726,2284,0),(727,2291,0),(728,2292,0),(729,2299,0),(730,2300,0),(731,2302,0),(732,2303,0),(733,2307,0),(734,2308,0),(735,2309,0),(736,2310,0),(737,2311,0),(738,2312,0),(739,2314,0),(740,2315,0),(741,2316,0),(742,2317,0),(743,2326,0),(744,2327,0),(745,2361,0),(746,2362,0),(747,2364,0),(748,2366,0),(749,2367,0),(750,2369,0),(751,2370,0),(752,2371,0),(753,2372,0),(754,2373,0),(755,2374,0),(756,2375,0),(757,2376,0),(758,2379,0),(759,2380,0),(760,2381,0),(761,2383,0),(762,2384,0),(763,2385,0),(764,2386,0),(765,2387,0),(766,2388,0),(767,2389,0),(768,2390,0),(769,2391,0),(770,2392,0),(771,2393,0),(772,2394,0),(773,2395,0),(774,2396,0),(775,2397,0),(776,2398,0),(777,2399,0),(778,2400,0),(779,2401,0),(780,2402,0),(781,2403,0),(782,2410,0),(783,2417,0),(784,2418,0),(785,2419,0),(786,2420,0),(787,2421,0),(788,2422,0),(789,2423,0),(790,2424,0),(791,2425,0),(792,2426,0),(793,2427,0),(794,2428,0),(795,2429,0),(796,2431,0),(797,2432,0),(798,2434,0),(799,2435,0),(800,2437,0),(801,2438,0),(802,2440,0),(803,2445,0),(804,2446,0),(805,2448,0),(806,2451,0),(807,2463,0),(808,2464,0),(809,2465,0),(810,2467,0),(811,2468,0),(812,2469,0),(813,2470,0),(814,2471,0),(815,2472,0),(816,2473,0),(817,2474,0),(818,2475,0),(819,2479,0),(820,2480,0),(821,2488,0),(822,2489,0),(823,2490,0),(824,2491,0),(825,2492,0),(826,2493,0),(827,2494,0),(828,2495,0),(829,2504,0),(830,2505,0),(831,2506,0),(832,2507,0),(833,2508,0),(834,2509,0),(835,2510,0),(836,2511,0),(837,2512,0),(838,2515,0),(839,2516,0),(840,2519,0),(841,2520,0),(842,2521,0),(843,2522,0),(844,2523,0),(845,2524,0),(846,2525,0),(847,2526,0),(848,2527,0),(849,2528,0),(850,2529,0),(851,2530,0),(852,2531,0),(853,2532,0),(854,2533,0),(855,2534,0),(856,2535,0),(857,2545,0),(858,2546,0),(859,2547,0),(860,2549,0),(861,2550,0),(862,2551,0),(863,2552,0),(864,2557,0),(865,2558,0),(866,2559,0),(867,2562,0),(868,2564,0),(869,2565,0),(870,2566,0),(871,2567,0),(872,2568,0),(873,2569,0),(874,2570,0),(875,2571,0),(876,2572,0),(877,2575,0),(878,2576,0),(879,2577,0),(880,2578,0),(881,2579,0),(882,2580,0),(883,2582,0),(884,2583,0),(885,2584,0),(886,2585,0),(887,2586,0),(888,2587,0),(889,2612,0),(890,2613,0),(891,2614,0),(892,2615,0),(893,2616,0),(894,2617,0),(895,2618,0),(896,2620,0),(897,2621,0),(898,2622,0),(899,2623,0),(900,2624,0),(901,2632,0),(902,2635,0),(903,2642,0),(904,2643,0),(905,2644,0),(906,2645,0),(907,2646,0),(908,2648,0),(909,2649,0),(910,2650,0),(911,2651,0),(912,2652,0),(913,2653,0),(914,2654,0),(915,2656,0),(916,2664,0),(917,2690,0),(918,2691,0),(919,2694,0),(920,2695,0),(921,2703,0),(922,2704,0),(923,2705,0),(924,2706,0),(925,2707,0),(926,2708,0),(927,2709,0),(928,2710,0),(929,2711,0),(930,2714,0),(931,2715,0),(932,2716,0),(933,2717,0),(934,2718,0),(935,2721,0),(936,2754,0),(937,2763,0),(938,2764,0),(939,2765,0),(940,2766,0),(941,2773,0),(942,2774,0),(943,2777,0),(944,2778,0),(945,2780,0),(946,2781,0),(947,2782,0),(948,2783,0),(949,2785,0),(950,2786,0),(951,2787,0),(952,2800,0),(953,2801,0),(954,2805,0),(955,2807,0),(956,2809,0),(957,2810,0),(958,2813,0),(959,2815,0),(960,2816,0),(961,2817,0),(962,2818,0),(963,2819,0),(964,2821,0),(965,2822,0),(966,2823,0),(967,2824,0),(968,2825,0),(969,2827,0),(970,2844,0),(971,2845,0),(972,2847,0),(973,2848,0),(974,2849,0),(975,2850,0),(976,2851,0),(977,2852,0),(978,2853,0),(979,2854,0),(980,2857,0),(981,2864,0),(982,2865,0),(983,2866,0),(984,2867,0),(985,2868,0),(986,2869,0),(987,2870,0),(988,2877,0),(989,2878,0),(990,2879,0),(991,2884,0),(992,2898,0),(993,2899,0),(994,2900,0),(995,2901,0),(996,2902,0),(997,2903,0),(998,2904,0),(999,2905,0),(1000,2906,0),(1001,2907,0),(1002,2908,0),(1003,2910,0),(1004,2911,0),(1005,2912,0),(1006,2913,0),(1007,2915,0),(1008,2916,0),(1009,2941,0),(1010,2942,0),(1011,2943,0),(1012,2944,0),(1013,2949,0),(1014,2950,0),(1015,2953,0),(1016,2954,0),(1017,2955,0),(1018,2957,0),(1019,2958,0),(1020,2959,0),(1021,2960,0),(1022,2961,0),(1023,2962,0),(1024,2963,0),(1025,2964,0),(1026,2965,0),(1027,2966,0),(1028,2967,0),(1029,2968,0),(1030,2969,0),(1031,2970,0),(1032,2971,0),(1033,2972,0),(1034,2973,0),(1035,2974,0),(1036,2975,0),(1037,2976,0),(1038,2977,0),(1039,2978,0),(1040,2979,0),(1041,2980,0),(1042,2981,0),(1043,2982,0),(1044,2983,0),(1045,2984,0),(1046,2985,0),(1047,2986,0),(1048,2987,0),(1049,2988,0),(1050,2989,0),(1051,2990,0),(1052,2991,0),(1053,2992,0),(1054,3000,0),(1055,3008,0),(1056,3011,0),(1057,3018,0),(1058,3019,0),(1059,3020,0),(1060,3021,0),(1061,3022,0),(1062,3023,0),(1063,3024,0),(1064,3025,0),(1065,3026,0),(1066,3027,0),(1067,3028,0),(1068,3030,0),(1069,3033,0),(1070,3036,0),(1071,3037,0),(1072,3039,0),(1073,3040,0),(1074,3041,0),(1075,3042,0),(1076,3045,0),(1077,3047,0),(1078,3048,0),(1079,3049,0),(1080,3053,0),(1081,3055,0),(1082,3056,0),(1083,3057,0),(1084,3058,0),(1085,3065,0),(1086,3066,0),(1087,3067,0),(1088,3069,0),(1089,3070,0),(1090,3071,0),(1091,3072,0),(1092,3073,0),(1093,3074,0),(1094,3075,0),(1095,3076,0),(1096,3078,0),(1097,3079,0),(1098,3103,0),(1099,3145,0),(1100,3151,0),(1101,3152,0),(1102,3153,0),(1103,3154,0),(1104,3158,0),(1105,3160,0),(1106,3161,0),(1107,3166,0),(1108,3184,0),(1109,3185,0),(1110,3186,0),(1111,3187,0),(1112,3188,0),(1113,3189,0),(1114,3190,0),(1115,3191,0),(1116,3192,0),(1117,3193,0),(1118,3194,0),(1119,3195,0),(1120,3196,0),(1121,3197,0),(1122,3198,0),(1123,3199,0),(1124,3200,0),(1125,3201,0),(1126,3202,0),(1127,3203,0),(1128,3204,0),(1129,3205,0),(1130,3206,0),(1131,3207,0),(1132,3208,0),(1133,3209,0),(1134,3210,0),(1135,3211,0),(1136,3212,0),(1137,3213,0),(1138,3214,0),(1139,3216,0),(1140,3217,0),(1141,3222,0),(1142,3223,0),(1143,3224,0),(1144,3225,0),(1145,3227,0),(1146,3228,0),(1147,3229,0),(1148,3230,0),(1149,3231,0),(1150,3260,0),(1151,3261,0),(1152,3262,0),(1153,3263,0),(1154,3267,0),(1155,3268,0),(1156,3269,0),(1157,3270,0),(1158,3272,0),(1159,3273,0),(1160,3274,0),(1161,3275,0),(1162,3276,0),(1163,3277,0),(1164,3278,0),(1165,3279,0),(1166,3280,0),(1167,3281,0),(1168,3282,0),(1169,3283,0),(1170,3284,0),(1171,3285,0),(1172,3286,0),(1173,3287,0),(1174,3288,0),(1175,3289,0),(1176,3290,0),(1177,3291,0),(1178,3292,0),(1179,3293,0),(1180,3294,0),(1181,3295,0),(1182,3296,0),(1183,3302,0),(1184,3303,0),(1185,3304,0),(1186,3305,0),(1187,3306,0),(1188,3307,0),(1189,3308,0),(1190,3309,0),(1191,3310,0),(1192,3311,0),(1193,3312,0),(1194,3313,0),(1195,3314,0),(1196,3315,0),(1197,3319,0),(1198,3320,0),(1199,3321,0),(1200,3322,0),(1201,3323,0),(1202,3324,0),(1203,3325,0),(1204,3326,0),(1205,3327,0),(1206,3328,0),(1207,3329,0),(1208,3330,0),(1209,3331,0),(1210,3332,0),(1211,3334,0),(1212,3335,0),(1213,3336,0),(1214,3341,0),(1215,3342,0),(1216,3344,0),(1217,3345,0),(1218,3346,0),(1219,3350,0),(1220,3351,0),(1221,3360,0),(1222,3361,0),(1223,3362,0),(1224,3363,0),(1225,3364,0),(1226,3365,0),(1227,3366,0),(1228,3367,0),(1229,3368,0),(1230,3370,0),(1231,3373,0),(1232,3374,0),(1233,3375,0),(1234,3376,0),(1235,3377,0),(1236,3378,0),(1237,3379,0),(1238,3380,0),(1239,3381,0),(1240,3392,0),(1241,3400,0),(1242,3413,0),(1243,3414,0),(1244,3415,0),(1245,3416,0),(1246,3417,0),(1247,3419,0),(1248,3420,0),(1249,3421,0),(1250,3422,0),(1251,3423,0),(1252,3424,0),(1253,3426,0),(1254,3427,0),(1255,3428,0),(1256,3429,0),(1257,3430,0),(1258,3431,0),(1259,3432,0),(1260,3433,0),(1261,3435,0),(1262,3437,0),(1263,3439,0),(1264,3440,0),(1265,3442,0),(1266,3443,0),(1267,3444,0),(1268,3445,0),(1269,3446,0),(1270,3447,0),(1271,3449,0),(1272,3450,0),(1273,3451,0),(1274,3452,0),(1275,3453,0),(1276,3454,0),(1277,3455,0),(1278,3457,0),(1279,3458,0),(1280,3461,0),(1281,3462,0),(1282,3464,0),(1283,3465,0),(1284,3469,0),(1285,3471,0),(1286,3472,0),(1287,3473,0),(1288,3474,0),(1289,3475,0),(1290,3480,0),(1291,3481,0),(1292,3482,0),(1293,3483,0),(1294,3484,0),(1295,3485,0),(1296,3487,0),(1297,3488,0),(1298,3489,0),(1299,3490,0),(1300,3491,0),(1301,3492,0),(1302,3493,0),(1303,3494,0),(1304,3511,0),(1305,3528,0),(1306,3532,0),(1307,3533,0),(1308,3534,0),(1309,3535,0),(1310,3537,0),(1311,3539,0),(1312,3541,0),(1313,3543,0),(1314,3545,0),(1315,3547,0),(1316,3548,0),(1317,3549,0),(1318,3555,0),(1319,3556,0),(1320,3557,0),(1321,3558,0),(1322,3559,0),(1323,3560,0),(1324,3561,0),(1325,3562,0),(1326,3563,0),(1327,3565,0),(1328,3566,0),(1329,3567,0),(1330,3569,0),(1331,3570,0),(1332,3571,0),(1333,3572,0),(1334,3578,0),(1335,3581,0),(1336,3582,0),(1337,3583,0),(1338,3585,0),(1339,3586,0),(1340,3587,0),(1341,3588,0),(1342,3589,0),(1343,3590,0),(1344,3591,0),(1345,3592,0),(1346,3593,0),(1347,3594,0),(1348,3595,0),(1349,3596,0),(1350,3597,0),(1351,3598,0),(1352,3599,0),(1353,3600,0),(1354,3602,0),(1355,3603,0),(1356,3606,0),(1357,3607,0),(1358,3641,0),(1359,3642,0),(1360,3643,0),(1361,3644,0),(1362,3645,0),(1363,3647,0),(1364,3649,0),(1365,3650,0),(1366,3651,0),(1367,3652,0),(1368,3653,0),(1369,3654,0),(1370,3655,0),(1371,3656,0),(1372,3661,0),(1373,3694,0),(1374,3695,0),(1375,3696,0),(1376,3697,0),(1377,3698,0),(1378,3699,0),(1379,3719,0),(1380,3732,0),(1381,3733,0),(1382,3738,0),(1383,3740,0),(1384,3741,0),(1385,3742,0),(1386,3743,0),(1387,3747,0),(1388,3748,0),(1389,3749,0),(1390,3750,0),(1391,3751,0),(1392,3752,0),(1393,3753,0),(1394,3754,0),(1395,3755,0),(1396,3756,0),(1397,3757,0),(1398,3758,0),(1399,3759,0),(1400,3761,0),(1401,3763,0),(1402,3764,0),(1403,3765,0),(1404,3774,0),(1405,3778,0),(1406,3779,0),(1407,3780,0),(1408,3781,0),(1409,3782,0),(1410,3783,0),(1411,3784,0),(1412,3785,0),(1413,3786,0),(1414,3787,0),(1415,3792,0),(1416,3793,0),(1417,3794,0),(1418,3795,0),(1419,3796,0),(1420,3797,0),(1421,3798,0),(1422,3799,0),(1423,3800,0),(1424,3801,0),(1425,3802,0),(1426,3803,0),(1427,3804,0),(1428,3805,0),(1429,3806,0),(1430,3807,0),(1431,3808,0),(1432,3809,0),(1433,3810,0),(1434,3811,0),(1435,3812,0),(1436,3813,0),(1437,3814,0),(1438,3815,0),(1439,3816,0),(1440,3817,0),(1441,3822,0),(1442,3833,0),(1443,3834,0),(1444,3835,0),(1445,3836,0),(1446,3837,0),(1447,3840,0),(1448,3841,0),(1449,3842,0),(1450,3843,0),(1451,3844,0),(1452,3845,0),(1453,3846,0),(1454,3847,0),(1455,3848,0),(1456,3849,0),(1457,3850,0),(1458,3851,0),(1459,3852,0),(1460,3853,0),(1461,3854,0),(1462,3855,0),(1463,3856,0),(1464,3865,0),(1465,3889,0),(1466,3890,0),(1467,3891,0),(1468,3892,0),(1469,3893,0),(1470,3894,0),(1471,3895,0),(1472,3902,0),(1473,3935,0),(1474,3936,0),(1475,3937,0),(1476,3938,0),(1477,3939,0),(1478,3940,0),(1479,3941,0),(1480,3942,0),(1481,3943,0),(1482,3944,0),(1483,3945,0),(1484,3946,0),(1485,3947,0),(1486,3948,0),(1487,3949,0),(1488,3950,0),(1489,3951,0),(1490,3952,0),(1491,3953,0),(1492,3954,0),(1493,3955,0),(1494,3956,0),(1495,3957,0),(1496,3958,0),(1497,3959,0),(1498,3961,0),(1499,3962,0),(1500,3963,0),(1501,3964,0),(1502,3965,0),(1503,3966,0),(1504,3967,0),(1505,3968,0),(1506,3969,0),(1507,3970,0),(1508,3971,0),(1509,3972,0),(1510,3973,0),(1511,3974,0),(1512,3975,0),(1513,3976,0),(1514,3977,0),(1515,3978,0),(1516,3979,0),(1517,3980,0),(1518,3981,0),(1519,3982,0),(1520,3983,0),(1521,3984,0),(1522,3985,0),(1523,3986,0),(1524,3987,0),(1525,3988,0),(1526,3989,0),(1527,3990,0),(1528,3991,0),(1529,3992,0),(1530,3993,0),(1531,3994,0),(1532,3995,0),(1533,3996,0),(1534,3997,0),(1535,3998,0),(1536,3999,0),(1537,4000,0),(1538,4001,0),(1539,4002,0),(1540,4003,0),(1541,4004,0),(1542,4005,0),(1543,4006,0),(1544,4007,0),(1545,4008,0),(1546,4009,0),(1547,4010,0),(1548,4011,0),(1549,4012,0),(1550,4013,0),(1551,4014,0),(1552,4015,0),(1553,4017,0),(1554,4018,0),(1555,4019,0),(1556,4020,0),(1557,4021,0),(1558,4022,0),(1559,4023,0),(1560,4024,0),(1561,4025,0),(1562,4026,0),(1563,4035,0),(1564,4036,0),(1565,4037,0),(1566,4038,0),(1567,4039,0),(1568,4040,0),(1569,4041,0),(1570,4042,0),(1571,4043,0),(1572,4044,0),(1573,4045,0),(1574,4046,0),(1575,4047,0),(1576,4048,0),(1577,4049,0),(1578,4050,0),(1579,4051,0),(1580,4052,0),(1581,4054,0),(1582,4055,0),(1583,4057,0),(1584,4058,0),(1585,4059,0),(1586,4060,0),(1587,4061,0),(1588,4062,0),(1589,4063,0),(1590,4064,0),(1591,4065,0),(1592,4066,0),(1593,4067,0),(1594,4068,0),(1595,4069,0),(1596,4070,0),(1597,4071,0),(1598,4072,0),(1599,4073,0),(1600,4074,0),(1601,4075,0),(1602,4076,0),(1603,4077,0),(1604,4078,0),(1605,4079,0),(1606,4080,0),(1607,4082,0),(1608,4083,0),(1609,4084,0),(1610,4086,0),(1611,4087,0),(1612,4088,0),(1613,4089,0),(1614,4090,0),(1615,4091,0),(1616,4107,0),(1617,4108,0),(1618,4109,0),(1619,4113,0),(1620,4114,0),(1621,4115,0),(1622,4116,0),(1623,4117,0),(1624,4118,0),(1625,4119,0),(1626,4120,0),(1627,4121,0),(1628,4122,0),(1629,4123,0),(1630,4124,0),(1631,4125,0),(1632,4126,0),(1633,4127,0),(1634,4128,0),(1635,4129,0),(1636,4131,0),(1637,4132,0),(1638,4133,0),(1639,4134,0),(1640,4136,0),(1641,4137,0),(1642,4138,0),(1643,4139,0),(1644,4140,0),(1645,4190,0),(1646,4191,0),(1647,4192,0),(1648,4194,0),(1649,4195,0),(1650,4197,0),(1651,4237,0),(1652,4239,0),(1653,4242,0),(1654,4243,0),(1655,4244,0),(1656,4246,0),(1657,4247,0),(1658,4248,0),(1659,4249,0),(1660,4250,0),(1661,4251,0),(1662,4252,0),(1663,4253,0),(1664,4254,0),(1665,4255,0),(1666,4256,0),(1667,4257,0),(1668,4258,0),(1669,4259,0),(1670,4260,0),(1671,4261,0),(1672,4262,0),(1673,4263,0),(1674,4264,0),(1675,4290,0),(1676,4302,0),(1677,4303,0),(1678,4307,0),(1679,4308,0),(1680,4309,0),(1681,4310,0),(1682,4311,0),(1683,4312,0),(1684,4313,0),(1685,4314,0),(1686,4315,0),(1687,4316,0),(1688,4317,0),(1689,4318,0),(1690,4319,0),(1691,4320,0),(1692,4321,0),(1693,4322,0),(1694,4323,0),(1695,4324,0),(1696,4325,0),(1697,4326,0),(1698,4327,0),(1699,4328,0),(1700,4329,0),(1701,4330,0),(1702,4331,0),(1703,4332,0),(1704,4333,0),(1705,4334,0),(1706,4335,0),(1707,4336,0),(1708,4343,0),(1709,4344,0),(1710,4362,0),(1711,4368,0),(1712,4369,0),(1713,4372,0),(1714,4373,0),(1715,4379,0),(1716,4383,0),(1717,4385,0),(1718,4393,0),(1719,4434,0),(1720,4436,0),(1721,4437,0),(1722,4438,0),(1723,4439,0),(1724,4443,0),(1725,4444,0),(1726,4445,0),(1727,4446,0),(1728,4447,0),(1729,4448,0),(1730,4449,0),(1731,4454,0),(1732,4455,0),(1733,4456,0),(1734,4462,0),(1735,4463,0),(1736,4464,0),(1737,4465,0),(1738,4474,0),(1739,4476,0),(1740,4477,0),(1741,4478,0),(1742,4491,0),(1743,4504,0),(1744,4505,0),(1745,4507,0),(1746,4508,0),(1747,4509,0),(1748,4511,0),(1749,4534,0),(1750,4543,0),(1751,4545,0),(1752,4547,0),(1753,4548,0),(1754,4560,0),(1755,4561,0),(1756,4562,0),(1757,4563,0),(1758,4564,0),(1759,4565,0),(1760,4566,0),(1761,4567,0),(1762,4568,0),(1763,4569,0),(1764,4570,0),(1765,4571,0),(1766,4575,0),(1767,4576,0),(1768,4577,0),(1769,4616,0),(1770,4643,0),(1771,4652,0),(1772,4653,0),(1773,4658,0),(1774,4659,0),(1775,4660,0),(1776,4661,0),(1777,4662,0),(1778,4663,0),(1779,4665,0),(1780,4666,0),(1781,4668,0),(1782,4669,0),(1783,4671,0),(1784,4672,0),(1785,4674,0),(1786,4675,0),(1787,4676,0),(1788,4677,0),(1789,4678,0),(1790,4680,0),(1791,4681,0),(1792,4683,0),(1793,4684,0),(1794,4686,0),(1795,4687,0),(1796,4689,0),(1797,4690,0),(1798,4692,0),(1799,4693,0),(1800,4694,0),(1801,4695,0),(1802,4696,0),(1803,4697,0),(1804,4698,0),(1805,4699,0),(1806,4700,0),(1807,4701,0),(1808,4705,0),(1809,4706,0),(1810,4707,0),(1811,4708,0),(1812,4709,0),(1813,4710,0),(1814,4711,0),(1815,4712,0),(1816,4713,0),(1817,4714,0),(1818,4715,0),(1819,4716,0),(1820,4717,0),(1821,4718,0),(1822,4719,0),(1823,4720,0),(1824,4721,0),(1825,4722,0),(1826,4723,0),(1827,4724,0),(1828,4725,0),(1829,4726,0),(1830,4727,0),(1831,4728,0),(1832,4729,0),(1833,4731,0),(1834,4732,0),(1835,4733,0),(1836,4734,0),(1837,4735,0),(1838,4736,0),(1839,4737,0),(1840,4738,0),(1841,4741,0),(1842,4744,0),(1843,4745,0),(1844,4746,0),(1845,4765,0),(1846,4766,0),(1847,4767,0),(1848,4768,0),(1849,4771,0),(1850,4772,0),(1851,4777,0),(1852,4778,0),(1853,4781,0),(1854,4782,0),(1855,4785,0),(1856,4786,0),(1857,4788,0),(1858,4789,0),(1859,4790,0),(1860,4792,0),(1861,4793,0),(1862,4794,0),(1863,4795,0),(1864,4796,0),(1865,4797,0),(1866,4798,0),(1867,4799,0),(1868,4800,0),(1869,4810,0),(1870,4816,0),(1871,4817,0),(1872,4818,0),(1873,4820,0),(1874,4821,0),(1875,4822,0),(1876,4824,0),(1877,4825,0),(1878,4826,0),(1879,4827,0),(1880,4828,0),(1881,4829,0),(1882,4830,0),(1883,4831,0),(1884,4832,0),(1885,4833,0),(1886,4835,0),(1887,4836,0),(1888,4837,0),(1889,4838,0),(1890,4840,0),(1891,4854,0),(1892,4861,0),(1893,4899,0),(1894,4900,0),(1895,4901,0),(1896,4906,0),(1897,4907,0),(1898,4908,0),(1899,4909,0),(1900,4910,0),(1901,4911,0),(1902,4912,0),(1903,4913,0),(1904,4914,0),(1905,4915,0),(1906,4916,0),(1907,4917,0),(1908,4919,0),(1909,4920,0),(1910,4921,0),(1911,4922,0),(1912,4923,0),(1913,4924,0),(1914,4925,0),(1915,4928,0),(1916,4929,0),(1917,4931,0),(1918,4932,0),(1919,4933,0),(1920,4935,0),(1921,4936,0),(1922,4937,0),(1923,4938,0),(1924,4939,0),(1925,4940,0),(1926,4942,0),(1927,4944,0),(1928,4946,0),(1929,4947,0),(1930,4948,0),(1931,4949,0),(1932,4951,0),(1933,4954,0),(1934,4956,0),(1935,4958,0),(1936,4960,0),(1937,4961,0),(1938,4962,0),(1939,4963,0),(1940,4964,0),(1941,4967,0),(1942,4968,0),(1943,4969,0),(1944,4970,0),(1945,4971,0),(1946,4972,0),(1947,4973,0),(1948,4974,0),(1949,4975,0),(1950,4976,0),(1951,4977,0),(1952,4978,0),(1953,4979,0),(1954,4980,0),(1955,4982,0),(1956,4983,0),(1957,4984,0),(1958,4985,0),(1959,4987,0),(1960,4989,0),(1961,4990,0),(1962,4991,0),(1963,4993,0),(1964,4994,0),(1965,4996,0),(1966,5016,0),(1967,5028,0),(1968,5040,0),(1969,5069,0),(1970,5071,0),(1971,5092,0),(1972,5093,0),(1973,5094,0),(1974,5107,0),(1975,5109,0),(1976,5110,0),(1977,5111,0),(1978,5112,0),(1979,5181,0),(1980,5182,0),(1981,5183,0),(1982,5187,0),(1983,5191,0),(1984,5192,0),(1985,5193,0),(1986,5194,0),(1987,5195,0),(1988,5196,0),(1989,5197,0),(1990,5198,0),(1991,5199,0),(1992,5200,0),(1993,5201,0),(1994,5202,0),(1995,5207,0),(1996,5208,0),(1997,5209,0),(1998,5210,0),(1999,5211,0),(2000,5212,0),(2001,5213,0),(2002,5214,0),(2003,5215,0),(2004,5216,0),(2005,5236,0),(2006,5238,0),(2007,5239,0),(2008,5240,0),(2009,5241,0),(2010,5242,0),(2011,5243,0),(2012,5244,0),(2013,5245,0),(2014,5246,0),(2015,5247,0),(2016,5248,0),(2017,5249,0),(2018,5250,0),(2019,5252,0),(2020,5253,0),(2021,5254,0),(2022,5255,0),(2023,5256,0),(2024,5257,0),(2025,5258,0),(2026,5259,0),(2027,5260,0),(2028,5261,0),(2029,5262,0),(2030,5267,0),(2031,5274,0),(2032,5275,0),(2033,5276,0),(2034,5277,0),(2035,5278,0),(2036,5279,0),(2037,5280,0),(2038,5281,0),(2039,5282,0),(2040,5283,0),(2041,5284,0),(2042,5285,0),(2043,5286,0),(2044,5287,0),(2045,5288,0),(2046,5289,0),(2047,5291,0),(2048,5292,0),(2049,5293,0),(2050,5299,0),(2051,5300,0),(2052,5301,0),(2053,5302,0),(2054,5303,0),(2055,5304,0),(2056,5305,0),(2057,5306,0),(2058,5309,0),(2059,5310,0),(2060,5311,0),(2061,5312,0),(2062,5314,0),(2063,5315,0),(2064,5316,0),(2065,5317,0),(2066,5318,0),(2067,5319,0),(2068,5320,0),(2069,5321,0),(2070,5322,0),(2071,5323,0),(2072,5324,0),(2073,5325,0),(2074,5326,0),(2075,5327,0),(2076,5328,0),(2077,5337,0),(2078,5340,0),(2079,5341,0),(2080,5343,0),(2081,5344,0),(2082,5345,0),(2083,5346,0),(2084,5347,0),(2085,5355,0),(2086,5356,0),(2087,5357,0),(2088,5387,0),(2089,5392,0),(2090,5393,0),(2091,5394,0),(2092,5395,0),(2093,5398,0),(2094,5399,0),(2095,5404,0),(2096,5405,0),(2097,5419,0),(2098,5420,0),(2099,5422,0),(2100,5423,0),(2101,5425,0),(2102,5426,0),(2103,5443,0),(2104,5444,0),(2105,5458,0),(2106,5459,0),(2107,5491,0),(2108,5495,0),(2109,5502,0),(2110,5516,0),(2111,5532,0),(2112,5540,0),(2113,5541,0),(2114,5542,0),(2115,5545,0),(2116,5546,0),(2117,5548,0),(2118,5549,0),(2119,5550,0),(2120,5551,0),(2121,5552,0),(2122,5553,0),(2123,5554,0),(2124,5555,0),(2125,5556,0),(2126,5557,0),(2127,5558,0),(2128,5560,0),(2129,5561,0),(2130,5568,0),(2131,5579,0),(2132,5580,0),(2133,5581,0),(2134,5586,0),(2135,5587,0),(2136,5589,0),(2137,5590,0),(2138,5591,0),(2139,5592,0),(2140,5593,0),(2141,5595,0),(2142,5596,0),(2143,5597,0),(2144,5598,0),(2145,5599,0),(2146,5600,0),(2147,5604,0),(2148,5605,0),(2149,5606,0),(2150,5608,0),(2151,5609,0),(2152,5610,0),(2153,5611,0),(2154,5612,0),(2155,5613,0),(2156,5614,0),(2157,5615,0),(2158,5616,0),(2159,5617,0),(2160,5618,0),(2161,5624,0),(2162,5626,0),(2163,5627,0),(2164,5629,0),(2165,5630,0),(2166,5739,0),(2167,5742,0),(2168,5744,0),(2169,5745,0),(2170,5746,0),(2171,5747,0),(2172,5748,0),(2173,5749,0),(2174,5750,0),(2175,5751,0),(2176,5752,0),(2177,5753,0),(2178,5755,0),(2179,5756,0),(2180,5757,0),(2181,5761,0),(2182,5766,0),(2183,5767,0),(2184,5770,0),(2185,5776,0),(2186,5777,0),(2187,5778,0),(2188,5779,0),(2189,5780,0),(2190,5781,0),(2191,5782,0),(2192,5783,0),(2193,5812,0),(2194,5813,0),(2195,5814,0),(2196,5815,0),(2197,5817,0),(2198,5818,0),(2199,5819,0),(2200,5820,0),(2201,5821,0),(2202,5822,0),(2203,5856,0),(2204,5870,0),(2205,5936,0),(2206,5939,0),(2207,5940,0),(2208,5941,0),(2209,5943,0),(2210,5944,0),(2211,5953,0),(2212,5954,0),(2213,5956,0),(2214,5957,0),(2215,5958,0),(2216,5961,0),(2217,5962,0),(2218,5963,0),(2219,5964,0),(2220,5965,0),(2221,5966,0),(2222,5967,0),(2223,5968,0),(2224,5969,0),(2225,5970,0),(2226,5971,0),(2227,5975,0),(2228,5976,0),(2229,6036,0),(2230,6040,0),(2231,6058,0),(2232,6059,0),(2233,6060,0),(2234,6061,0),(2235,6062,0),(2236,6063,0),(2237,6070,0),(2238,6076,0),(2239,6078,0),(2240,6084,0),(2241,6085,0),(2242,6087,0),(2243,6088,0),(2244,6092,0),(2245,6093,0),(2246,6094,0),(2247,6095,0),(2248,6096,0),(2249,6097,0),(2250,6098,0),(2251,6116,0),(2252,6117,0),(2253,6118,0),(2254,6119,0),(2255,6120,0),(2256,6121,0),(2257,6122,0),(2258,6123,0),(2259,6124,0),(2260,6125,0),(2261,6126,0),(2262,6127,0),(2263,6129,0),(2264,6134,0),(2265,6135,0),(2266,6136,0),(2267,6137,0),(2268,6138,0),(2269,6139,0),(2270,6140,0),(2271,6144,0),(2272,6147,0),(2273,6148,0),(2274,6171,0),(2275,6173,0),(2276,6174,0),(2277,6176,0),(2278,6177,0),(2279,6179,0),(2280,6180,0),(2281,6182,0),(2282,6185,0),(2283,6186,0),(2284,6187,0),(2285,6188,0),(2286,6189,0),(2287,6191,0),(2288,6194,0),(2289,6195,0),(2290,6196,0),(2291,6197,0),(2292,6198,0),(2293,6200,0),(2294,6201,0),(2295,6202,0),(2296,6203,0),(2297,6204,0),(2298,6205,0),(2299,6206,0),(2300,6214,0),(2301,6215,0),(2302,6219,0),(2303,6220,0),(2304,6223,0),(2305,6224,0),(2306,6225,0),(2307,6226,0),(2308,6227,0),(2309,6228,0),(2310,6229,0),(2311,6230,0),(2312,6231,0),(2313,6232,0),(2314,6233,0),(2315,6234,0),(2316,6235,0),(2317,6236,0),(2318,6237,0),(2319,6238,0),(2320,6239,0),(2321,6240,0),(2322,6241,0),(2323,6242,0),(2324,6243,0),(2325,6254,0),(2326,6256,0),(2327,6263,0),(2328,6264,0),(2329,6266,0),(2330,6267,0),(2331,6268,0),(2332,6269,0),(2333,6282,0),(2334,6292,0),(2335,6294,0),(2336,6295,0),(2337,6309,0),(2338,6310,0),(2339,6311,0),(2340,6314,0),(2341,6315,0),(2342,6318,0),(2343,6319,0),(2344,6320,0),(2345,6322,0),(2346,6323,0),(2347,6324,0),(2348,6327,0),(2349,6331,0),(2350,6333,0),(2351,6334,0),(2352,6335,0),(2353,6336,0),(2354,6337,0),(2355,6340,0),(2356,6341,0),(2357,6350,0),(2358,6360,0),(2359,6363,0),(2360,6364,0),(2361,6365,0),(2362,6366,0),(2363,6367,0),(2364,6378,0),(2365,6379,0),(2366,6380,0),(2367,6381,0),(2368,6382,0),(2369,6383,0),(2370,6384,0),(2371,6385,0),(2372,6386,0),(2373,6387,0),(2374,6388,0),(2375,6389,0),(2376,6392,0),(2377,6393,0),(2378,6394,0),(2379,6395,0),(2380,6396,0),(2381,6397,0),(2382,6398,0),(2383,6399,0),(2384,6400,0),(2385,6402,0),(2386,6403,0),(2387,6404,0),(2388,6405,0),(2389,6406,0),(2390,6407,0),(2391,6408,0),(2392,6409,0),(2393,6410,0),(2394,6411,0),(2395,6412,0),(2396,6413,0),(2397,6415,0),(2398,6416,0),(2399,6417,0),(2400,6418,0),(2401,6419,0),(2402,6420,0),(2403,6421,0),(2404,6422,0),(2405,6423,0),(2406,6424,0),(2407,6425,0),(2408,6426,0),(2409,6427,0),(2410,6428,0),(2411,6429,0),(2412,6430,0),(2413,6431,0),(2414,6432,0),(2415,6433,0),(2416,6434,0),(2417,6447,0),(2418,6448,0),(2419,6449,0),(2420,6459,0),(2421,6460,0),(2422,6461,0),(2423,6465,0),(2424,6466,0),(2425,6467,0),(2426,6468,0),(2427,6469,0),(2428,6472,0),(2429,6473,0),(2430,6477,0),(2431,6478,0),(2432,6480,0),(2433,6481,0),(2434,6482,0),(2435,6502,0),(2436,6503,0),(2437,6504,0),(2438,6505,0),(2439,6506,0),(2440,6507,0),(2441,6508,0),(2442,6509,0),(2443,6510,0),(2444,6511,0),(2445,6512,0),(2446,6513,0),(2447,6514,0),(2448,6515,0),(2449,6517,0),(2450,6518,0),(2451,6519,0),(2452,6520,0),(2453,6521,0),(2454,6523,0),(2455,6524,0),(2456,6525,0),(2457,6526,0),(2458,6527,0),(2459,6528,0),(2460,6531,0),(2461,6536,0),(2462,6537,0),(2463,6538,0),(2464,6539,0),(2465,6540,0),(2466,6541,0),(2467,6542,0),(2468,6543,0),(2469,6545,0),(2470,6546,0),(2471,6547,0),(2472,6548,0),(2473,6549,0),(2474,6550,0),(2475,6551,0),(2476,6552,0),(2477,6553,0),(2478,6554,0),(2479,6555,0),(2480,6556,0),(2481,6557,0),(2482,6558,0),(2483,6559,0),(2484,6560,0),(2485,6561,0),(2486,6562,0),(2487,6563,0),(2488,6564,0),(2489,6565,0),(2490,6566,0),(2491,6567,0),(2492,6568,0),(2493,6569,0),(2494,6570,0),(2495,6571,0),(2496,6572,0),(2497,6573,0),(2498,6574,0),(2499,6575,0),(2500,6576,0),(2501,6577,0),(2502,6578,0),(2503,6579,0),(2504,6580,0),(2505,6581,0),(2506,6582,0),(2507,6583,0),(2508,6584,0),(2509,6585,0),(2510,6586,0),(2511,6587,0),(2512,6588,0),(2513,6590,0),(2514,6591,0),(2515,6592,0),(2516,6593,0),(2517,6594,0),(2518,6595,0),(2519,6596,0),(2520,6597,0),(2521,6598,0),(2522,6599,0),(2523,6600,0),(2524,6601,0),(2525,6602,0),(2526,6603,0),(2527,6604,0),(2528,6605,0),(2529,6607,0),(2530,6608,0),(2531,6609,0),(2532,6610,0),(2533,6611,0),(2534,6612,0),(2535,6613,0),(2536,6614,0),(2537,6615,0),(2538,6616,0),(2539,6617,0),(2540,6618,0),(2541,6622,0),(2542,6627,0),(2543,6628,0),(2544,6629,0),(2545,6630,0),(2546,6631,0),(2547,6632,0),(2548,6633,0),(2549,6641,0),(2550,6642,0),(2551,6651,0),(2552,6653,0),(2553,6654,0),(2554,6659,0),(2555,6660,0),(2556,6664,0),(2557,6665,0),(2558,6666,0),(2559,6667,0),(2560,6668,0),(2561,6670,0),(2562,6671,0),(2563,6675,0),(2564,6676,0),(2565,6677,0),(2566,6679,0),(2567,6680,0),(2568,6681,0),(2569,6682,0),(2570,6685,0),(2571,6686,0),(2572,6687,0),(2573,6688,0),(2574,6689,0),(2575,6690,0),(2576,6691,0),(2577,6692,0),(2578,6694,0),(2579,6696,0),(2580,6697,0),(2581,6709,0),(2582,6713,0),(2583,6719,0),(2584,6720,0),(2585,6721,0),(2586,6722,0),(2587,6725,0),(2588,6726,0),(2589,6727,0),(2590,6729,0),(2591,6730,0),(2592,6731,0),(2593,6732,0),(2594,6733,0),(2595,6737,0),(2596,6738,0),(2597,6739,0),(2598,6740,0),(2599,6741,0),(2600,6742,0),(2601,6744,0),(2602,6745,0),(2603,6746,0),(2604,6747,0),(2605,6751,0),(2606,6752,0),(2607,6773,0),(2608,6774,0),(2609,6780,0),(2610,6784,0),(2611,6786,0),(2612,6787,0),(2613,6788,0),(2614,6789,0),(2615,6791,0),(2616,6792,0),(2617,6793,0),(2618,6794,0),(2619,6795,0),(2620,6796,0),(2621,6797,0),(2622,6798,0),(2623,6801,0),(2624,6802,0),(2625,6803,0),(2626,6804,0),(2627,6806,0),(2628,6828,0),(2629,6829,0),(2630,6830,0),(2631,6831,0),(2632,6832,0),(2633,6833,0),(2634,6834,0),(2635,6835,0),(2636,6836,0),(2637,6886,0),(2638,6896,0),(2639,6898,0),(2640,6900,0),(2641,6901,0),(2642,6902,0),(2643,6903,0),(2644,6904,0),(2645,6905,0),(2646,6906,0),(2647,6907,0),(2648,6908,0),(2649,6909,0),(2650,6910,0),(2651,6911,0),(2652,6946,0),(2653,6953,0),(2654,6966,0),(2655,6967,0),(2656,6968,0),(2657,6969,0),(2658,6970,0),(2659,6971,0),(2660,6972,0),(2661,6973,0),(2662,6974,0),(2663,6975,0),(2664,6976,0),(2665,6977,0),(2666,6978,0),(2667,6979,0),(2668,6980,0),(2669,6981,0),(2670,6982,0),(2671,6983,0),(2672,6984,0),(2673,6985,0),(2674,6998,0),(2675,7000,0),(2676,7001,0),(2677,7002,0),(2678,7003,0),(2679,7004,0),(2680,7005,0),(2681,7026,0),(2682,7027,0),(2683,7046,0),(2684,7047,0),(2685,7048,0),(2686,7049,0),(2687,7050,0),(2688,7051,0),(2689,7052,0),(2690,7053,0),(2691,7054,0),(2692,7055,0),(2693,7056,0),(2694,7057,0),(2695,7058,0),(2696,7059,0),(2697,7060,0),(2698,7061,0),(2699,7062,0),(2700,7063,0),(2701,7064,0),(2702,7065,0),(2703,7094,0),(2704,7095,0),(2705,7106,0),(2706,7107,0),(2707,7108,0),(2708,7109,0),(2709,7110,0),(2710,7111,0),(2711,7112,0),(2712,7113,0),(2713,7115,0),(2714,7116,0),(2715,7117,0),(2716,7118,0),(2717,7120,0),(2718,7129,0),(2719,7130,0),(2720,7132,0),(2721,7133,0),(2722,7166,0),(2723,7170,0),(2724,7171,0),(2725,7187,0),(2726,7188,0),(2727,7189,0),(2728,7229,0),(2729,7230,0),(2730,7248,0),(2731,7276,0),(2732,7277,0),(2733,7280,0),(2734,7281,0),(2735,7282,0),(2736,7283,0),(2737,7284,0),(2738,7285,0),(2739,7297,0),(2740,7298,0),(2741,7299,0),(2742,7326,0),(2743,7327,0),(2744,7328,0),(2745,7329,0),(2746,7330,0),(2747,7331,0),(2748,7332,0),(2749,7334,0),(2750,7335,0),(2751,7336,0),(2752,7344,0),(2753,7348,0),(2754,7349,0),(2755,7350,0),(2756,7351,0),(2757,7352,0),(2758,7353,0),(2759,7354,0),(2760,7355,0),(2761,7356,0),(2762,7357,0),(2763,7358,0),(2764,7359,0),(2765,7366,0),(2766,7367,0),(2767,7368,0),(2768,7369,0),(2769,7370,0),(2770,7373,0),(2771,7374,0),(2772,7375,0),(2773,7377,0),(2774,7378,0),(2775,7386,0),(2776,7387,0),(2777,7390,0),(2778,7391,0),(2779,7406,0),(2780,7407,0),(2781,7408,0),(2782,7409,0),(2783,7410,0),(2784,7411,0),(2785,7412,0),(2786,7413,0),(2787,7414,0),(2788,7415,0),(2789,7416,0),(2790,7417,0),(2791,7418,0),(2792,7419,0),(2793,7420,0),(2794,7421,0),(2795,7422,0),(2796,7423,0),(2797,7424,0),(2798,7429,0),(2799,7430,0),(2800,7431,0),(2801,7432,0),(2802,7433,0),(2803,7434,0),(2804,7435,0),(2805,7436,0),(2806,7437,0),(2807,7438,0),(2808,7439,0),(2809,7440,0),(2810,7441,0),(2811,7443,0),(2812,7444,0),(2813,7445,0),(2814,7446,0),(2815,7447,0),(2816,7448,0),(2817,7454,0),(2818,7455,0),(2819,7456,0),(2820,7457,0),(2821,7458,0),(2822,7459,0),(2823,7460,0),(2824,7461,0),(2825,7462,0),(2826,7463,0),(2827,7465,0),(2828,7468,0),(2829,7469,0),(2830,7470,0),(2831,7471,0),(2832,7472,0),(2833,7473,0),(2834,7474,0),(2835,7475,0),(2836,7476,0),(2837,7477,0),(2838,7478,0),(2839,7479,0),(2840,7480,0),(2841,7481,0),(2842,7482,0),(2843,7483,0),(2844,7484,0),(2845,7485,0),(2846,7486,0),(2847,7487,0),(2848,7488,0),(2849,7489,0),(2850,7490,0),(2851,7491,0),(2852,7492,0),(2853,7493,0),(2854,7494,0),(2855,7495,0),(2856,7496,0),(2857,7507,0),(2858,7508,0),(2859,7509,0),(2860,7510,0),(2861,7511,0),(2862,7512,0),(2863,7513,0),(2864,7514,0),(2865,7515,0),(2866,7517,0),(2867,7518,0),(2868,7519,0),(2869,7520,0),(2870,7521,0),(2871,7522,0),(2872,7523,0),(2873,7524,0),(2874,7525,0),(2875,7526,0),(2876,7527,0),(2877,7528,0),(2878,7529,0),(2879,7530,0),(2880,7531,0),(2881,7532,0),(2882,7533,0),(2883,7534,0),(2884,7535,0),(2885,7536,0),(2886,7537,0),(2887,7538,0),(2888,7539,0),(2889,7540,0),(2890,7541,0),(2891,7542,0),(2892,7543,0),(2893,7544,0),(2894,7545,0),(2895,7546,0),(2896,7554,0),(2897,7555,0),(2898,7556,0),(2899,7557,0),(2900,7558,0),(2901,7559,0),(2902,7606,0),(2903,7607,0),(2904,7608,0),(2905,7609,0),(2906,7610,0),(2907,7611,0),(2908,7612,0),(2909,7682,0),(2910,7683,0),(2911,7684,0),(2912,7685,0),(2913,7687,0),(2914,7688,0),(2915,7689,0),(2916,7690,0),(2917,7691,0),(2918,7706,0),(2919,7707,0),(2920,7708,0),(2921,7709,0),(2922,7710,0),(2923,7711,0),(2924,7712,0),(2925,7713,0),(2926,7714,0),(2927,7717,0),(2928,7718,0),(2929,7719,0),(2930,7720,0),(2931,7721,0),(2932,7723,0),(2933,7724,0),(2934,7726,0),(2935,7727,0),(2936,7728,0),(2937,7729,0),(2938,7730,0),(2939,7736,0),(2940,7738,0),(2941,7739,0),(2942,7747,0),(2943,7749,0),(2944,7750,0),(2945,7751,0),(2946,7752,0),(2947,7753,0),(2948,7754,0),(2949,7755,0),(2950,7756,0),(2951,7757,0),(2952,7758,0),(2953,7759,0),(2954,7760,0),(2955,7761,0),(2956,7786,0),(2957,7787,0),(2958,7826,0),(2959,7913,0),(2960,7914,0),(2961,7915,0),(2962,7916,0),(2963,7917,0),(2964,7918,0),(2965,7919,0),(2966,7920,0),(2967,7921,0),(2968,7922,0),(2969,7924,0),(2970,7925,0),(2971,7926,0),(2972,7927,0),(2973,7928,0),(2974,7929,0),(2975,7930,0),(2976,7931,0),(2977,7932,0),(2978,7933,0),(2979,7934,0),(2980,7935,0),(2981,7936,0),(2982,7937,0),(2983,7938,0),(2984,7939,0),(2985,7941,0),(2986,7942,0),(2987,7943,0),(2988,7944,0),(2989,7945,0),(2990,7946,0),(2991,7947,0),(2992,7948,0),(2993,7949,0),(2994,7950,0),(2995,7951,0),(2996,7952,0),(2997,7953,0),(2998,7954,0),(2999,7955,0),(3000,7956,0),(3001,7957,0),(3002,7958,0),(3003,7959,0),(3004,7960,0),(3005,7961,0),(3006,7963,0),(3007,7996,0),(3008,7997,0),(3009,8006,0),(3010,8067,0),(3011,8068,0),(3012,8069,0),(3013,8071,0),(3014,8080,0),(3015,8081,0),(3016,8082,0),(3017,8083,0),(3018,8084,0),(3019,8085,0),(3020,8086,0),(3021,8088,0),(3022,8089,0),(3023,8090,0),(3024,8091,0),(3025,8092,0),(3026,8093,0),(3027,8094,0),(3028,8106,0),(3029,8107,0),(3030,8108,0),(3031,8109,0),(3032,8110,0),(3033,8111,0),(3034,8112,0),(3035,8113,0),(3036,8114,0),(3037,8115,0),(3038,8116,0),(3039,8117,0),(3040,8118,0),(3041,8119,0),(3042,8120,0),(3043,8121,0),(3044,8122,0),(3045,8123,0),(3046,8124,0),(3047,8125,0),(3048,8126,0),(3049,8127,0),(3050,8128,0),(3051,8129,0),(3052,8130,0),(3053,8131,0),(3054,8132,0),(3055,8133,0),(3056,8134,0),(3057,8135,0),(3058,8137,0),(3059,8138,0),(3060,8139,0),(3061,8140,0),(3062,8141,0),(3063,8142,0),(3064,8143,0),(3065,8144,0),(3066,8156,0),(3067,8157,0),(3068,8158,0),(3069,8159,0),(3070,8160,0),(3071,8161,0),(3072,8162,0),(3073,8163,0),(3074,8174,0),(3075,8175,0),(3076,8176,0),(3077,8177,0),(3078,8178,0),(3079,8179,0),(3080,8180,0),(3081,8181,0),(3082,8182,0),(3083,8183,0),(3084,8184,0),(3085,8185,0),(3086,8186,0),(3087,8187,0),(3088,8188,0),(3089,8189,0),(3090,8190,0),(3091,8191,0),(3092,8192,0),(3093,8193,0),(3094,8194,0),(3095,8195,0),(3096,8196,0),(3097,8197,0),(3098,8198,0),(3099,8199,0),(3100,8200,0),(3101,8201,0),(3102,8202,0),(3103,8203,0),(3104,8204,0),(3105,8205,0),(3106,8206,0),(3107,8207,0),(3108,8208,0),(3109,8209,0),(3110,8210,0),(3111,8211,0),(3112,8212,0),(3113,8213,0),(3114,8214,0),(3115,8215,0),(3116,8216,0),(3117,8223,0),(3118,8224,0),(3119,8225,0),(3120,8226,0),(3121,8245,0),(3122,8246,0),(3123,8247,0),(3124,8248,0),(3125,8249,0),(3126,8250,0),(3127,8251,0),(3128,8252,0),(3129,8253,0),(3130,8254,0),(3131,8255,0),(3132,8256,0),(3133,8257,0),(3134,8258,0),(3135,8259,0),(3136,8260,0),(3137,8261,0),(3138,8262,0),(3139,8263,0),(3140,8264,0),(3141,8265,0),(3142,8266,0),(3143,8267,0),(3144,8268,0),(3145,8269,0),(3146,8270,0),(3147,8271,0),(3148,8272,0),(3149,8273,0),(3150,8274,0),(3151,8275,0),(3152,8276,0),(3153,8277,0),(3154,8278,0),(3155,8279,0),(3156,8280,0),(3157,8281,0),(3158,8282,0),(3159,8283,0),(3160,8284,0),(3161,8285,0),(3162,8286,0),(3163,8287,0),(3164,8288,0),(3165,8289,0),(3166,8290,0),(3167,8291,0),(3168,8292,0),(3169,8293,0),(3170,8294,0),(3171,8295,0),(3172,8296,0),(3173,8297,0),(3174,8298,0),(3175,8299,0),(3176,8300,0),(3177,8301,0),(3178,8302,0),(3179,8303,0),(3180,8304,0),(3181,8305,0),(3182,8306,0),(3183,8307,0),(3184,8308,0),(3185,8309,0),(3186,8310,0),(3187,8311,0),(3188,8312,0),(3189,8313,0),(3190,8314,0),(3191,8315,0),(3192,8316,0),(3193,8317,0),(3194,8318,0),(3195,8319,0),(3196,8320,0),(3197,8345,0),(3198,8346,0),(3199,8347,0),(3200,8348,0),(3201,8349,0),(3202,8367,0),(3203,8624,0),(3204,8625,0),(3205,8626,0),(3206,8708,0),(3207,8746,0),(3208,8747,0),(3209,8748,0),(3210,8749,0),(3211,8750,0),(3212,8751,0),(3213,8752,0),(3214,8753,0),(3215,8754,0),(3216,8755,0),(3217,9240,0),(3218,9285,0),(3219,9286,0),(3220,9287,0),(3221,9288,0),(3222,9289,0),(3223,9290,0),(3224,9291,0),(3225,9292,0),(3226,9359,0),(3227,9366,0),(3228,9372,0),(3229,9375,0),(3230,9378,0),(3231,9379,0),(3232,9381,0),(3233,9382,0),(3234,9383,0),(3235,9384,0),(3236,9385,0),(3237,9386,0),(3238,9387,0),(3239,9388,0),(3240,9389,0),(3241,9390,0),(3242,9391,0),(3243,9392,0),(3244,9393,0),(3245,9394,0),(3246,9395,0),(3247,9396,0),(3248,9397,0),(3249,9398,0),(3250,9399,0),(3251,9400,0),(3252,9401,0),(3253,9402,0),(3254,9403,0),(3255,9404,0),(3256,9405,0),(3257,9406,0),(3258,9407,0),(3259,9408,0),(3260,9409,0),(3261,9410,0),(3262,9411,0),(3263,9412,0),(3264,9413,0),(3265,9414,0),(3266,9415,0),(3267,9416,0),(3268,9418,0),(3269,9419,0),(3270,9420,0),(3271,9422,0),(3272,9423,0),(3273,9424,0),(3274,9425,0),(3275,9426,0),(3276,9427,0),(3277,9428,0),(3278,9429,0),(3279,9430,0),(3280,9431,0),(3281,9432,0),(3282,9433,0),(3283,9434,0),(3284,9435,0),(3285,9444,0),(3286,9445,0),(3287,9446,0),(3288,9448,0),(3289,9449,0),(3290,9450,0),(3291,9452,0),(3292,9453,0),(3293,9454,0),(3294,9455,0),(3295,9456,0),(3296,9457,0),(3297,9458,0),(3298,9459,0),(3299,9465,0),(3300,9467,0),(3301,9469,0),(3302,9470,0),(3303,9473,0),(3304,9474,0),(3305,9475,0),(3306,9476,0),(3307,9477,0),(3308,9478,0),(3309,9479,0),(3310,9480,0),(3311,9481,0),(3312,9482,0),(3313,9483,0),(3314,9484,0),(3315,9485,0),(3316,9486,0),(3317,9487,0),(3318,9488,0),(3319,9489,0),(3320,9490,0),(3321,9491,0),(3322,9492,0),(3323,9508,0),(3324,9509,0),(3325,9510,0),(3326,9511,0),(3327,9512,0),(3328,9513,0),(3329,9514,0),(3330,9515,0),(3331,9516,0),(3332,9517,0),(3333,9518,0),(3334,9519,0),(3335,9520,0),(3336,9521,0),(3337,9522,0),(3338,9527,0),(3339,9531,0),(3340,9534,0),(3341,9535,0),(3342,9536,0),(3343,9598,0),(3344,9599,0),(3345,9600,0),(3346,9601,0),(3347,9603,0),(3348,9604,0),(3349,9605,0),(3350,9607,0),(3351,9608,0),(3352,9609,0),(3353,9623,0),(3354,9624,0),(3355,9625,0),(3356,9626,0),(3357,9627,0),(3358,9630,0),(3359,9631,0),(3360,9632,0),(3361,9633,0),(3362,9634,0),(3363,9635,0),(3364,9636,0),(3365,9637,0),(3366,9638,0),(3367,9639,0),(3368,9640,0),(3369,9643,0),(3370,9644,0),(3371,9645,0),(3372,9646,0),(3373,9647,0),(3374,9648,0),(3375,9649,0),(3376,9650,0),(3377,9651,0),(3378,9652,0),(3379,9653,0),(3380,9654,0),(3381,9656,0),(3382,9657,0),(3383,9658,0),(3384,9659,0),(3385,9660,0),(3386,9661,0),(3387,9662,0),(3388,9663,0),(3389,9664,0),(3390,9665,0),(3391,9666,0),(3392,9678,0),(3393,9679,0),(3394,9680,0),(3395,9682,0),(3396,9683,0),(3397,9684,0),(3398,9686,0),(3399,9687,0),(3400,9698,0),(3401,9699,0),(3402,9700,0),(3403,9701,0),(3404,9702,0),(3405,9703,0),(3406,9704,0),(3407,9705,0),(3408,9706,0),(3409,9718,0),(3410,9742,0),(3411,9743,0),(3412,9744,0),(3413,9745,0),(3414,9746,0),(3415,9747,0),(3416,9748,0),(3417,9749,0),(3418,9750,0),(3419,9751,0),(3420,9752,0),(3421,9753,0),(3422,9754,0),(3423,9755,0),(3424,9756,0),(3425,9757,0),(3426,9758,0),(3427,9759,0),(3428,9760,0),(3429,9761,0),(3430,9762,0),(3431,9763,0),(3432,9764,0),(3433,9765,0),(3434,9766,0),(3435,9767,0),(3436,9768,0),(3437,9769,0),(3438,9770,0),(3439,9771,0),(3440,9772,0),(3441,9773,0),(3442,9774,0),(3443,9775,0),(3444,9776,0),(3445,9777,0),(3446,9778,0),(3447,9779,0),(3448,9780,0),(3449,9781,0),(3450,9782,0),(3451,9783,0),(3452,9784,0),(3453,9785,0),(3454,9786,0),(3455,9787,0),(3456,9788,0),(3457,9789,0),(3458,9790,0),(3459,9791,0),(3460,9792,0),(3461,9793,0),(3462,9794,0),(3463,9795,0),(3464,9796,0),(3465,9797,0),(3466,9798,0),(3467,9799,0),(3468,9800,0),(3469,9801,0),(3470,9802,0),(3471,9803,0),(3472,9804,0),(3473,9805,0),(3474,9806,0),(3475,9807,0),(3476,9808,0),(3477,9809,0),(3478,9810,0),(3479,9811,0),(3480,9812,0),(3481,9813,0),(3482,9814,0),(3483,9815,0),(3484,9816,0),(3485,9817,0),(3486,9818,0),(3487,9819,0),(3488,9820,0),(3489,9821,0),(3490,9822,0),(3491,9823,0),(3492,9824,0),(3493,9825,0),(3494,9826,0),(3495,9827,0),(3496,9828,0),(3497,9829,0),(3498,9830,0),(3499,9831,0),(3500,9832,0),(3501,9833,0),(3502,9834,0),(3503,9835,0),(3504,9836,0),(3505,9837,0),(3506,9838,0),(3507,9839,0),(3508,9840,0),(3509,9841,0),(3510,9842,0),(3511,9843,0),(3512,9844,0),(3513,9845,0),(3514,9846,0),(3515,9847,0),(3516,9848,0),(3517,9849,0),(3518,9850,0),(3519,9851,0),(3520,9852,0),(3521,9853,0),(3522,9854,0),(3523,9855,0),(3524,9856,0),(3525,9857,0),(3526,9858,0),(3527,9859,0),(3528,9860,0),(3529,9861,0),(3530,9862,0),(3531,9863,0),(3532,9864,0),(3533,9865,0),(3534,9866,0),(3535,9867,0),(3536,9868,0),(3537,9869,0),(3538,9870,0),(3539,9871,0),(3540,9872,0),(3541,9873,0),(3542,9874,0),(3543,9875,0),(3544,9876,0),(3545,9877,0),(3546,9878,0),(3547,9879,0),(3548,9880,0),(3549,9881,0),(3550,9882,0),(3551,9883,0),(3552,9884,0),(3553,9885,0),(3554,9886,0),(3555,9887,0),(3556,9889,0),(3557,9890,0),(3558,9891,0),(3559,9892,0),(3560,9893,0),(3561,9894,0),(3562,9895,0),(3563,9896,0),(3564,9897,0),(3565,9898,0),(3566,9899,0),(3567,9900,0),(3568,9901,0),(3569,9902,0),(3570,9903,0),(3571,9904,0),(3572,9905,0),(3573,9906,0),(3574,9907,0),(3575,9908,0),(3576,9909,0),(3577,9910,0),(3578,9911,0),(3579,9912,0),(3580,9913,0),(3581,9914,0),(3582,9915,0),(3583,9916,0),(3584,9917,0),(3585,9918,0),(3586,9919,0),(3587,9920,0),(3588,9921,0),(3589,9922,0),(3590,9923,0),(3591,9924,0),(3592,9925,0),(3593,9926,0),(3594,9927,0),(3595,9928,0),(3596,9929,0),(3597,9930,0),(3598,9931,0),(3599,9932,0),(3600,9933,0),(3601,9934,0),(3602,9935,0),(3603,9936,0),(3604,9937,0),(3605,9938,0),(3606,9939,0),(3607,9940,0),(3608,9941,0),(3609,9942,0),(3610,9943,0),(3611,9944,0),(3612,9945,0),(3613,9946,0),(3614,9947,0),(3615,9948,0),(3616,9949,0),(3617,9950,0),(3618,9951,0),(3619,9952,0),(3620,9953,0),(3621,9954,0),(3622,9955,0),(3623,9956,0),(3624,9957,0),(3625,9958,0),(3626,9959,0),(3627,9960,0),(3628,9961,0),(3629,9962,0),(3630,9963,0),(3631,9964,0),(3632,9965,0),(3633,9966,0),(3634,9967,0),(3635,9968,0),(3636,9969,0),(3637,9970,0),(3638,9971,0),(3639,9972,0),(3640,9973,0),(3641,9974,0),(3642,9978,0),(3643,9998,0),(3644,9999,0),(3645,10001,0),(3646,10002,0),(3647,10003,0),(3648,10004,0),(3649,10007,0),(3650,10008,0),(3651,10009,0),(3652,10010,0),(3653,10011,0),(3654,10018,0),(3655,10019,0),(3656,10020,0),(3657,10021,0),(3658,10023,0),(3659,10024,0),(3660,10025,0),(3661,10026,0),(3662,10027,0),(3663,10028,0),(3664,10029,0),(3665,10030,0),(3666,10031,0),(3667,10032,0),(3668,10033,0),(3669,10034,0),(3670,10035,0),(3671,10036,0),(3672,10038,0),(3673,10039,0),(3674,10040,0),(3675,10041,0),(3676,10042,0),(3677,10043,0),(3678,10044,0),(3679,10045,0),(3680,10046,0),(3681,10047,0),(3682,10048,0),(3683,10052,0),(3684,10053,0),(3685,10054,0),(3686,10055,0),(3687,10056,0),(3688,10057,0),(3689,10058,0),(3690,10059,0),(3691,10060,0),(3692,10061,0),(3693,10062,0),(3694,10063,0),(3695,10064,0),(3696,10065,0),(3697,10066,0),(3698,10067,0),(3699,10068,0),(3700,10069,0),(3701,10070,0),(3702,10071,0),(3703,10072,0),(3704,10073,0),(3705,10074,0),(3706,10075,0),(3707,10076,0),(3708,10077,0),(3709,10078,0),(3710,10079,0),(3711,10080,0),(3712,10081,0),(3713,10082,0),(3714,10083,0),(3715,10084,0),(3716,10085,0),(3717,10086,0),(3718,10087,0),(3719,10088,0),(3720,10089,0),(3721,10090,0),(3722,10091,0),(3723,10092,0),(3724,10093,0),(3725,10094,0),(3726,10095,0),(3727,10096,0),(3728,10097,0),(3729,10098,0),(3730,10099,0),(3731,10100,0),(3732,10101,0),(3733,10102,0),(3734,10103,0),(3735,10104,0),(3736,10105,0),(3737,10106,0),(3738,10107,0),(3739,10108,0),(3740,10109,0),(3741,10110,0),(3742,10111,0),(3743,10112,0),(3744,10113,0),(3745,10118,0),(3746,10119,0),(3747,10120,0),(3748,10121,0),(3749,10122,0),(3750,10123,0),(3751,10124,0),(3752,10125,0),(3753,10126,0),(3754,10127,0),(3755,10128,0),(3756,10129,0),(3757,10130,0),(3758,10131,0),(3759,10132,0),(3760,10133,0),(3761,10134,0),(3762,10135,0),(3763,10136,0),(3764,10137,0),(3765,10138,0),(3766,10139,0),(3767,10140,0),(3768,10141,0),(3769,10142,0),(3770,10143,0),(3771,10144,0),(3772,10145,0),(3773,10146,0),(3774,10147,0),(3775,10148,0),(3776,10149,0),(3777,10150,0),(3778,10151,0),(3779,10152,0),(3780,10153,0),(3781,10154,0),(3782,10155,0),(3783,10156,0),(3784,10157,0),(3785,10158,0),(3786,10159,0),(3787,10160,0),(3788,10161,0),(3789,10162,0),(3790,10163,0),(3791,10164,0),(3792,10165,0),(3793,10166,0),(3794,10167,0),(3795,10168,0),(3796,10169,0),(3797,10170,0),(3798,10171,0),(3799,10172,0),(3800,10173,0),(3801,10174,0),(3802,10175,0),(3803,10176,0),(3804,10177,0),(3805,10178,0),(3806,10179,0),(3807,10180,0),(3808,10181,0),(3809,10182,0),(3810,10183,0),(3811,10184,0),(3812,10185,0),(3813,10186,0),(3814,10187,0),(3815,10188,0),(3816,10189,0),(3817,10190,0),(3818,10191,0),(3819,10192,0),(3820,10193,0),(3821,10194,0),(3822,10195,0),(3823,10196,0),(3824,10197,0),(3825,10198,0),(3826,10199,0),(3827,10200,0),(3828,10201,0),(3829,10202,0),(3830,10203,0),(3831,10204,0),(3832,10205,0),(3833,10206,0),(3834,10207,0),(3835,10208,0),(3836,10209,0),(3837,10210,0),(3838,10211,0),(3839,10212,0),(3840,10213,0),(3841,10214,0),(3842,10215,0),(3843,10216,0),(3844,10217,0),(3845,10218,0),(3846,10219,0),(3847,10220,0),(3848,10221,0),(3849,10222,0),(3850,10223,0),(3851,10224,0),(3852,10225,0),(3853,10226,0),(3854,10227,0),(3855,10228,0),(3856,10229,0),(3857,10230,0),(3858,10231,0),(3859,10232,0),(3860,10233,0),(3861,10234,0),(3862,10235,0),(3863,10236,0),(3864,10237,0),(3865,10238,0),(3866,10239,0),(3867,10240,0),(3868,10241,0),(3869,10242,0),(3870,10243,0),(3871,10244,0),(3872,10245,0),(3873,10246,0),(3874,10247,0),(3875,10248,0),(3876,10249,0),(3877,10250,0),(3878,10251,0),(3879,10252,0),(3880,10253,0),(3881,10254,0),(3882,10255,0),(3883,10256,0),(3884,10257,0),(3885,10258,0),(3886,10259,0),(3887,10260,0),(3888,10261,0),(3889,10262,0),(3890,10263,0),(3891,10264,0),(3892,10265,0),(3893,10266,0),(3894,10267,0),(3895,10268,0),(3896,10269,0),(3897,10270,0),(3898,10271,0),(3899,10272,0),(3900,10273,0),(3901,10274,0),(3902,10275,0),(3903,10276,0),(3904,10277,0),(3905,10278,0),(3906,10279,0),(3907,10280,0),(3908,10281,0),(3909,10282,0),(3910,10287,0),(3911,10288,0),(3912,10289,0),(3913,10328,0),(3914,10329,0),(3915,10330,0),(3916,10331,0),(3917,10332,0),(3918,10333,0),(3919,10358,0),(3920,10359,0),(3921,10362,0),(3922,10363,0),(3923,10364,0),(3924,10365,0),(3925,10366,0),(3926,10367,0),(3927,10368,0),(3928,10369,0),(3929,10370,0),(3930,10371,0),(3931,10372,0),(3932,10373,0),(3933,10374,0),(3934,10375,0),(3935,10376,0),(3936,10377,0),(3937,10378,0),(3938,10379,0),(3939,10380,0),(3940,10381,0),(3941,10382,0),(3942,10383,0),(3943,10384,0),(3944,10385,0),(3945,10386,0),(3946,10387,0),(3947,10388,0),(3948,10389,0),(3949,10390,0),(3950,10391,0),(3951,10399,0),(3952,10400,0),(3953,10401,0),(3954,10402,0),(3955,10403,0),(3956,10404,0),(3957,10405,0),(3958,10406,0),(3959,10407,0),(3960,10408,0),(3961,10409,0),(3962,10410,0),(3963,10411,0),(3964,10412,0),(3965,10413,0),(3966,10421,0),(3967,10423,0),(3968,10461,0),(3969,10462,0),(3970,10499,0),(3971,10500,0),(3972,10501,0),(3973,10502,0),(3974,10503,0),(3975,10504,0),(3976,10506,0),(3977,10508,0),(3978,10510,0),(3979,10512,0),(3980,10513,0),(3981,10518,0),(3982,10542,0),(3983,10543,0),(3984,10544,0),(3985,10545,0),(3986,10547,0),(3987,10549,0),(3988,10550,0),(3989,10553,0),(3990,10554,0),(3991,10567,0),(3992,10568,0),(3993,10570,0),(3994,10571,0),(3995,10572,0),(3996,10573,0),(3997,10574,0),(3998,10578,0),(3999,10579,0),(4000,10581,0),(4001,10582,0),(4002,10583,0),(4003,10584,0),(4004,10588,0),(4005,10591,0),(4006,10611,0),(4007,10612,0),(4008,10613,0),(4009,10614,0),(4010,10615,0),(4011,10616,0),(4012,10617,0),(4013,10618,0),(4014,10619,0),(4015,10623,0),(4016,10624,0),(4017,10625,0),(4018,10626,0),(4019,10627,0),(4020,10628,0),(4021,10629,0),(4022,10630,0),(4023,10631,0),(4024,10632,0),(4025,10633,0),(4026,10635,0),(4027,10636,0),(4028,10637,0),(4029,10638,0),(4030,10652,0),(4031,10653,0),(4032,10654,0),(4033,10655,0),(4034,10656,0),(4035,10657,0),(4036,10658,0),(4037,10685,0),(4038,10686,0),(4039,10696,0),(4040,10697,0),(4041,10698,0),(4042,10700,0),(4043,10701,0),(4044,10702,0),(4045,10703,0),(4046,10704,0),(4047,10705,0),(4048,10706,0),(4049,10707,0),(4050,10708,0),(4051,10709,0),(4052,10721,0),(4053,10724,0),(4054,10726,0),(4055,10740,0),(4056,10741,0),(4057,10742,0),(4058,10743,0),(4059,10744,0),(4060,10745,0),(4061,10746,0),(4062,10747,0),(4063,10748,0),(4064,10749,0),(4065,10750,0),(4066,10751,0),(4067,10756,0),(4068,10758,0),(4069,10760,0),(4070,10761,0),(4071,10762,0),(4072,10763,0),(4073,10764,0),(4074,10765,0),(4075,10766,0),(4076,10767,0),(4077,10768,0),(4078,10770,0),(4079,10771,0),(4080,10772,0),(4081,10774,0),(4082,10775,0),(4083,10776,0),(4084,10777,0),(4085,10781,0),(4086,10782,0),(4087,10783,0),(4088,10784,0),(4089,10785,0),(4090,10786,0),(4091,10787,0),(4092,10788,0),(4093,10796,0),(4094,10797,0),(4095,10798,0),(4096,10799,0),(4097,10800,0),(4098,10801,0),(4099,10802,0),(4100,10803,0),(4101,10804,0),(4102,10805,0),(4103,10806,0),(4104,10807,0),(4105,10808,0),(4106,10820,0),(4107,10821,0),(4108,10823,0),(4109,10825,0),(4110,10826,0),(4111,10827,0),(4112,10828,0),(4113,10833,0),(4114,10835,0),(4115,10836,0),(4116,10837,0),(4117,10838,0),(4118,10842,0),(4119,10843,0),(4120,10844,0),(4121,10845,0),(4122,10846,0),(4123,10847,0),(4124,10878,0),(4125,10898,0),(4126,10919,0),(4127,11019,0),(4128,11021,0),(4129,11025,0),(4130,11041,0),(4131,11042,0),(4132,11086,0),(4133,11087,0),(4134,11120,0),(4135,11121,0),(4136,11123,0),(4137,11124,0),(4138,11187,0),(4139,11189,0),(4140,11190,0),(4141,11191,0),(4142,11192,0),(4143,11193,0),(4144,11194,0),(4145,11195,0),(4146,11199,0),(4147,11200,0),(4148,11201,0),(4149,11229,0),(4150,11262,0),(4151,11263,0),(4152,11264,0),(4153,11265,0),(4154,11284,0),(4155,11285,0),(4156,11287,0),(4157,11288,0),(4158,11289,0),(4159,11290,0),(4160,11303,0),(4161,11304,0),(4162,11305,0),(4163,11306,0),(4164,11307,0),(4165,11308,0),(4166,11310,0),(4167,11311,0),(4168,11314,0),(4169,11317,0),(4170,11321,0),(4171,11322,0),(4172,11323,0),(4173,11342,0),(4174,11343,0),(4175,11365,0),(4176,11369,0),(4177,11383,0),(4178,11411,0),(4179,11424,0),(4180,11469,0),(4181,11475,0),(4182,11502,0),(4183,11505,0),(4184,11506,0),(4185,11508,0),(4186,11522,0),(4187,11542,0),(4188,11585,0),(4189,11586,0),(4190,11587,0),(4191,11588,0),(4192,11589,0),(4193,11591,0),(4194,11603,0),(4195,11604,0),(4196,11605,0),(4197,11606,0),(4198,11607,0),(4199,11608,0),(4200,11623,0),(4201,11624,0),(4202,11625,0),(4203,11626,0),(4204,11627,0),(4205,11628,0),(4206,11629,0),(4207,11630,0),(4208,11631,0),(4209,11632,0),(4210,11633,0),(4211,11634,0),(4212,11635,0),(4213,11662,0),(4214,11665,0),(4215,11675,0),(4216,11677,0),(4217,11678,0),(4218,11679,0),(4219,11684,0),(4220,11685,0),(4221,11686,0),(4222,11702,0),(4223,11703,0),(4224,11722,0),(4225,11726,0),(4226,11728,0),(4227,11729,0),(4228,11730,0),(4229,11731,0),(4230,11735,0),(4231,11743,0),(4232,11744,0),(4233,11745,0),(4234,11746,0),(4235,11747,0),(4236,11748,0),(4237,11749,0),(4238,11750,0),(4239,11762,0),(4240,11763,0),(4241,11764,0),(4242,11765,0),(4243,11766,0),(4244,11767,0),(4245,11768,0),(4246,11782,0),(4247,11783,0),(4248,11784,0),(4249,11785,0),(4250,11786,0),(4251,11787,0),(4252,11802,0),(4253,11803,0),(4254,11805,0),(4255,11807,0),(4256,11808,0),(4257,11809,0),(4258,11812,0),(4259,11814,0),(4260,11816,0),(4261,11817,0),(4262,11820,0),(4263,11821,0),(4264,11822,0),(4265,11823,0),(4266,11838,0),(4267,11839,0),(4268,11840,0),(4269,11841,0),(4270,11842,0),(4271,11847,0),(4272,11848,0),(4273,11849,0),(4274,11850,0),(4275,11851,0),(4276,11852,0),(4277,11853,0),(4278,11854,0),(4279,11855,0),(4280,11856,0),(4281,11857,0),(4282,11858,0),(4283,11859,0),(4284,11860,0),(4285,11861,0),(4286,11863,0),(4287,11864,0),(4288,11865,0),(4289,11866,0),(4290,11867,0),(4291,11870,0),(4292,11871,0),(4293,11872,0),(4294,11873,0),(4295,11874,0),(4296,11875,0),(4297,11876,0),(4298,11882,0),(4299,11884,0),(4300,11888,0),(4301,11889,0),(4302,11902,0),(4303,11904,0),(4304,11906,0),(4305,11907,0),(4306,11908,0),(4307,11909,0),(4308,11910,0),(4309,11911,0),(4310,11913,0),(4311,11915,0),(4312,11916,0),(4313,11917,0),(4314,11918,0),(4315,11919,0),(4316,11920,0),(4317,11921,0),(4318,11922,0),(4319,11923,0),(4320,11924,0),(4321,11925,0),(4322,11926,0),(4323,11927,0),(4324,11928,0),(4325,11929,0),(4326,11930,0),(4327,11931,0),(4328,11932,0),(4329,11935,0),(4330,11936,0),(4331,11962,0),(4332,11963,0),(4333,11964,0),(4334,12000,0),(4335,12018,0),(4336,12021,0),(4337,12041,0),(4338,12049,0),(4339,12050,0),(4340,12051,0),(4341,12061,0),(4342,12062,0),(4343,12063,0),(4344,12064,0),(4345,12066,0),(4346,12082,0),(4347,12083,0),(4348,12104,0),(4349,12105,0),(4350,12106,0),(4351,12107,0),(4352,12108,0),(4353,12109,0),(4354,12110,0),(4355,12111,0),(4356,12112,0),(4357,12113,0),(4358,12114,0),(4359,12115,0),(4360,12142,0),(4361,12182,0),(4362,12183,0),(4363,12185,0),(4364,12187,0),(4365,12188,0),(4366,12189,0),(4367,12225,0),(4368,12243,0),(4369,12244,0),(4370,12245,0),(4371,12247,0),(4372,12248,0),(4373,12249,0),(4374,12250,0),(4375,12251,0),(4376,12252,0),(4377,12253,0),(4378,12254,0),(4379,12255,0),(4380,12256,0),(4381,12257,0),(4382,12258,0),(4383,12259,0),(4384,12260,0),(4385,12282,0),(4386,12285,0),(4387,12290,0),(4388,12294,0),(4389,12295,0),(4390,12296,0),(4391,12297,0),(4392,12298,0),(4393,12299,0),(4394,12304,0),(4395,12322,0),(4396,12328,0),(4397,12329,0),(4398,12331,0),(4399,12332,0),(4400,12338,0),(4401,12348,0),(4402,12385,0),(4403,12403,0),(4404,12405,0),(4405,12406,0),(4406,12408,0),(4407,12409,0),(4408,12410,0),(4409,12414,0),(4410,12415,0),(4411,12416,0),(4412,12417,0),(4413,12418,0),(4414,12419,0),(4415,12420,0),(4416,12421,0),(4417,12422,0),(4418,12424,0),(4419,12425,0),(4420,12426,0),(4421,12427,0),(4422,12428,0),(4423,12429,0),(4424,12442,0),(4425,12443,0),(4426,12446,0),(4427,12447,0),(4428,12448,0),(4429,12449,0),(4430,12452,0),(4431,12453,0),(4432,12454,0),(4433,12456,0),(4434,12461,0),(4435,12462,0),(4436,12463,0),(4437,12464,0),(4438,12465,0),(4439,12466,0),(4440,12468,0),(4441,12469,0),(4442,12470,0),(4443,12471,0),(4444,12482,0),(4445,12502,0),(4446,12522,0),(4447,12523,0),(4448,12527,0),(4449,12528,0),(4450,12531,0),(4451,12532,0),(4452,12535,0),(4453,12542,0),(4454,12546,0),(4455,12547,0),(4456,12549,0),(4457,12550,0),(4458,12551,0),(4459,12552,0),(4460,12553,0),(4461,12554,0),(4462,12555,0),(4463,12556,0),(4464,12557,0),(4465,12582,0),(4466,12583,0),(4467,12584,0),(4468,12587,0),(4469,12588,0),(4470,12589,0),(4471,12590,0),(4472,12591,0),(4473,12592,0),(4474,12593,0),(4475,12602,0),(4476,12603,0),(4477,12604,0),(4478,12605,0),(4479,12606,0),(4480,12608,0),(4481,12609,0),(4482,12610,0),(4483,12611,0),(4484,12612,0),(4485,12613,0),(4486,12614,0),(4487,12615,0),(4488,12616,0),(4489,12617,0),(4490,12618,0),(4491,12619,0),(4492,12620,0),(4493,12621,0),(4494,12624,0),(4495,12625,0),(4496,12626,0),(4497,12628,0),(4498,12629,0),(4499,12631,0),(4500,12632,0),(4501,12633,0),(4502,12634,0),(4503,12636,0),(4504,12637,0),(4505,12639,0),(4506,12640,0),(4507,12641,0),(4508,12651,0),(4509,12653,0),(4510,12654,0),(4511,12709,0),(4512,12742,0),(4513,12743,0),(4514,12744,0),(4515,12745,0),(4516,12746,0),(4517,12747,0),(4518,12748,0),(4519,12749,0),(4520,12750,0),(4521,12751,0),(4522,12752,0),(4523,12754,0),(4524,12755,0),(4525,12756,0),(4526,12757,0),(4527,12764,0),(4528,12769,0),(4529,12772,0),(4530,12773,0),(4531,12774,0),(4532,12775,0),(4533,12776,0),(4534,12777,0),(4535,12779,0),(4536,12781,0),(4537,12782,0),(4538,12783,0),(4539,12784,0),(4540,12786,0),(4541,12787,0),(4542,12788,0),(4543,12790,0),(4544,12791,0),(4545,12792,0),(4546,12793,0),(4547,12794,0),(4548,12795,0),(4549,12796,0),(4550,12797,0),(4551,12798,0),(4552,12801,0),(4553,12802,0),(4554,12850,0),(4555,12851,0),(4556,12852,0),(4557,12853,0),(4558,12854,0),(4559,12855,0),(4560,12856,0),(4561,12857,0),(4562,12858,0),(4563,12859,0),(4564,12860,0),(4565,12861,0),(4566,12862,0),(4567,12863,0),(4568,12864,0),(4569,12865,0),(4570,12866,0),(4571,12867,0),(4572,12868,0),(4573,12869,0),(4574,12870,0),(4575,12882,0),(4576,12883,0),(4577,12889,0),(4578,12890,0),(4579,12892,0),(4580,12893,0),(4581,12895,0),(4582,12901,0),(4583,12902,0),(4584,12903,0),(4585,12904,0),(4586,12905,0),(4587,12927,0),(4588,12931,0),(4589,12932,0),(4590,12933,0),(4591,12934,0),(4592,12935,0),(4593,12936,0),(4594,12937,0),(4595,12939,0),(4596,12940,0),(4597,12941,0),(4598,12943,0),(4599,12944,0),(4600,12945,0),(4601,12949,0),(4602,12950,0),(4603,12951,0),(4604,12952,0),(4605,12953,0),(4606,12959,0),(4607,12960,0),(4608,12961,0),(4609,12962,0),(4610,12963,0),(4611,12964,0),(4612,12965,0),(4613,12966,0),(4614,12967,0),(4615,12968,0),(4616,12969,0),(4617,12971,0),(4618,12972,0),(4619,12974,0),(4620,12975,0),(4621,12976,0),(4622,12977,0),(4623,12978,0),(4624,12979,0),(4625,12980,0),(4626,12981,0),(4627,12982,0),(4628,12983,0),(4629,12984,0),(4630,12987,0),(4631,12988,0),(4632,12989,0),(4633,12990,0),(4634,12991,0),(4635,12992,0),(4636,12993,0),(4637,12994,0),(4638,12995,0),(4639,12997,0),(4640,12998,0),(4641,12999,0),(4642,13000,0),(4643,13003,0),(4644,13004,0),(4645,13005,0),(4646,13006,0),(4647,13007,0),(4648,13008,0),(4649,13009,0),(4650,13010,0),(4651,13011,0),(4652,13012,0),(4653,13013,0),(4654,13014,0),(4655,13015,0),(4656,13016,0),(4657,13017,0),(4658,13018,0),(4659,13019,0),(4660,13020,0),(4661,13021,0),(4662,13022,0),(4663,13023,0),(4664,13024,0),(4665,13025,0),(4666,13026,0),(4667,13027,0),(4668,13028,0),(4669,13029,0),(4670,13030,0),(4671,13031,0),(4672,13032,0),(4673,13033,0),(4674,13034,0),(4675,13035,0),(4676,13036,0),(4677,13037,0),(4678,13038,0),(4679,13039,0),(4680,13040,0),(4681,13041,0),(4682,13042,0),(4683,13043,0),(4684,13044,0),(4685,13045,0),(4686,13046,0),(4687,13047,0),(4688,13048,0),(4689,13049,0),(4690,13050,0),(4691,13051,0),(4692,13052,0),(4693,13053,0),(4694,13054,0),(4695,13055,0),(4696,13056,0),(4697,13057,0),(4698,13058,0),(4699,13059,0),(4700,13060,0),(4701,13061,0),(4702,13062,0),(4703,13063,0),(4704,13064,0),(4705,13065,0),(4706,13066,0),(4707,13067,0),(4708,13068,0),(4709,13069,0),(4710,13070,0),(4711,13071,0),(4712,13072,0),(4713,13073,0),(4714,13074,0),(4715,13075,0),(4716,13076,0),(4717,13077,0),(4718,13078,0),(4719,13079,0),(4720,13080,0),(4721,13081,0),(4722,13082,0),(4723,13083,0),(4724,13090,0),(4725,13099,0),(4726,13100,0),(4727,13101,0),(4728,13102,0),(4729,13103,0),(4730,13104,0),(4731,13105,0),(4732,13106,0),(4733,13107,0),(4734,13108,0),(4735,13109,0),(4736,13110,0),(4737,13111,0),(4738,13112,0),(4739,13113,0),(4740,13114,0),(4741,13115,0),(4742,13116,0),(4743,13117,0),(4744,13118,0),(4745,13119,0),(4746,13120,0),(4747,13121,0),(4748,13122,0),(4749,13123,0),(4750,13124,0),(4751,13125,0),(4752,13126,0),(4753,13127,0),(4754,13128,0),(4755,13129,0),(4756,13130,0),(4757,13131,0),(4758,13132,0),(4759,13133,0),(4760,13134,0),(4761,13135,0),(4762,13136,0),(4763,13137,0),(4764,13138,0),(4765,13139,0),(4766,13142,0),(4767,13144,0),(4768,13145,0),(4769,13146,0),(4770,13147,0),(4771,13148,0),(4772,13150,0),(4773,13160,0),(4774,13161,0),(4775,13162,0),(4776,13163,0),(4777,13165,0),(4778,13166,0),(4779,13167,0),(4780,13168,0),(4781,13169,0),(4782,13170,0),(4783,13175,0),(4784,13179,0),(4785,13181,0),(4786,13182,0),(4787,13183,0),(4788,13184,0),(4789,13185,0),(4790,13198,0),(4791,13199,0),(4792,13203,0),(4793,13204,0),(4794,13205,0),(4795,13206,0),(4796,13208,0),(4797,13210,0),(4798,13211,0),(4799,13216,0),(4800,13218,0),(4801,13219,0),(4802,13220,0),(4803,13221,0),(4804,13222,0),(4805,13243,0),(4806,13244,0),(4807,13245,0),(4808,13246,0),(4809,13248,0),(4810,13249,0),(4811,13252,0),(4812,13253,0),(4813,13254,0),(4814,13255,0),(4815,13257,0),(4816,13258,0),(4817,13259,0),(4818,13260,0),(4819,13261,0),(4820,13262,0),(4821,13282,0),(4822,13284,0),(4823,13285,0),(4824,13286,0),(4825,13289,0),(4826,13290,0),(4827,13291,0),(4828,13292,0),(4829,13293,0),(4830,13312,0),(4831,13314,0),(4832,13315,0),(4833,13316,0),(4834,13318,0),(4835,13319,0),(4836,13336,0),(4837,13337,0),(4838,13338,0),(4839,13339,0),(4840,13340,0),(4841,13341,0),(4842,13344,0),(4843,13346,0),(4844,13348,0),(4845,13349,0),(4846,13353,0),(4847,13358,0),(4848,13359,0),(4849,13360,0),(4850,13361,0),(4851,13368,0),(4852,13369,0),(4853,13371,0),(4854,13372,0),(4855,13374,0),(4856,13375,0),(4857,13376,0),(4858,13377,0),(4859,13378,0),(4860,13380,0),(4861,13381,0),(4862,13383,0),(4863,13384,0),(4864,13385,0),(4865,13386,0),(4866,13387,0),(4867,13388,0),(4868,13389,0),(4869,13390,0),(4870,13391,0),(4871,13393,0),(4872,13394,0),(4873,13395,0),(4874,13396,0),(4875,13397,0),(4876,13398,0),(4877,13399,0),(4878,13400,0),(4879,13401,0),(4880,13402,0),(4881,13403,0),(4882,13404,0),(4883,13405,0),(4884,13406,0),(4885,13407,0),(4886,13408,0),(4887,13409,0),(4888,13474,0),(4889,13498,0),(4890,13502,0),(4891,13504,0),(4892,13505,0),(4893,13524,0),(4894,13525,0),(4895,13526,0),(4896,13527,0),(4897,13528,0),(4898,13529,0),(4899,13530,0),(4900,13531,0),(4901,13532,0),(4902,13533,0),(4903,13534,0),(4904,13535,0),(4905,13537,0),(4906,13538,0),(4907,13539,0),(4908,13586,0),(4909,13604,0),(4910,13605,0),(4911,13606,0),(4912,13607,0),(4913,13608,0),(4914,13609,0),(4915,13610,0),(4916,13611,0),(4917,13612,0),(4918,13622,0),(4919,13623,0),(4920,13625,0),(4921,13627,0),(4922,13628,0),(4923,13629,0),(4924,13630,0),(4925,13631,0),(4926,13632,0),(4927,13698,0),(4928,13705,0),(4929,13706,0),(4930,13707,0),(4931,13708,0),(4932,13709,0),(4933,13710,0),(4934,13711,0),(4935,13712,0),(4936,13713,0),(4937,13714,0),(4938,13716,0),(4939,13717,0),(4940,13718,0),(4941,13719,0),(4942,13720,0),(4943,13721,0),(4944,13722,0),(4945,13723,0),(4946,13727,0),(4947,13728,0),(4948,13730,0),(4949,13731,0),(4950,13736,0),(4951,13737,0),(4952,13738,0),(4953,13739,0),(4954,13740,0),(4955,13741,0),(4956,13742,0),(4957,13743,0),(4958,13744,0),(4959,13745,0),(4960,13746,0),(4961,13747,0),(4962,13748,0),(4963,13749,0),(4964,13750,0),(4965,13751,0),(4966,13753,0),(4967,13762,0),(4968,13763,0),(4969,13764,0),(4970,13765,0),(4971,13766,0),(4972,13767,0),(4973,13768,0),(4974,13769,0),(4975,13770,0),(4976,13771,0),(4977,13772,0),(4978,13773,0),(4979,13775,0),(4980,13776,0),(4981,13777,0),(4982,13778,0),(4983,13779,0),(4984,13780,0),(4985,13781,0),(4986,13782,0),(4987,13783,0),(4988,13784,0),(4989,13785,0),(4990,13788,0),(4991,13791,0),(4992,13794,0),(4993,13797,0),(4994,13798,0),(4995,13801,0),(4996,13802,0),(4997,13803,0),(4998,13804,0),(4999,13805,0),(5000,13806,0),(5001,13807,0),(5002,13808,0),(5003,13809,0),(5004,13814,0),(5005,13816,0),(5006,13817,0),(5007,13818,0),(5008,13819,0),(5009,13820,0),(5010,13821,0),(5011,13822,0),(5012,13823,0),(5013,13824,0),(5014,13825,0),(5015,13842,0),(5016,13843,0),(5017,13844,0),(5018,13845,0),(5019,13846,0),(5020,13847,0),(5021,13848,0),(5022,13849,0),(5023,13854,0),(5024,13855,0),(5025,13856,0),(5026,13857,0),(5027,13858,0),(5028,13859,0),(5029,13860,0),(5030,13861,0),(5031,13862,0),(5032,13863,0),(5033,13864,0),(5034,13865,0),(5035,13866,0),(5036,13867,0),(5037,13868,0),(5038,13869,0),(5039,13870,0),(5040,13871,0),(5041,13882,0),(5042,13883,0),(5043,13884,0),(5044,13885,0),(5045,13886,0),(5046,13887,0),(5047,13894,0),(5048,13895,0),(5049,13896,0),(5050,13897,0),(5051,13898,0),(5052,13899,0),(5053,13900,0),(5054,13901,0),(5055,13902,0),(5056,13903,0),(5057,13904,0),(5058,13905,0),(5059,13906,0),(5060,13914,0),(5061,13915,0),(5062,13916,0),(5063,13917,0),(5064,13922,0),(5065,13923,0),(5066,13924,0),(5067,13925,0),(5068,13937,0),(5069,13938,0),(5070,13944,0),(5071,13950,0),(5072,13951,0),(5073,13952,0),(5074,13953,0),(5075,13954,0),(5076,13955,0),(5077,13956,0),(5078,13957,0),(5079,13958,0),(5080,13959,0),(5081,13961,0),(5082,13962,0),(5083,13963,0),(5084,13964,0),(5085,13967,0),(5086,13969,0),(5087,13982,0),(5088,13983,0),(5089,13984,0),(5090,13986,0),(5091,14002,0),(5092,14024,0),(5093,14025,0),(5094,14042,0),(5095,14043,0),(5096,14044,0),(5097,14045,0),(5098,14082,0),(5099,14084,0),(5100,14085,0),(5101,14086,0),(5102,14087,0),(5103,14088,0),(5104,14089,0),(5105,14090,0),(5106,14091,0),(5107,14092,0),(5108,14093,0),(5109,14094,0),(5110,14095,0),(5111,14096,0),(5112,14097,0),(5113,14098,0),(5114,14099,0),(5115,14100,0),(5116,14101,0),(5117,14102,0),(5118,14103,0),(5119,14104,0),(5120,14105,0),(5121,14106,0),(5122,14107,0),(5123,14108,0),(5124,14109,0),(5125,14110,0),(5126,14111,0),(5127,14112,0),(5128,14113,0),(5129,14114,0),(5130,14115,0),(5131,14116,0),(5132,14117,0),(5133,14118,0),(5134,14119,0),(5135,14120,0),(5136,14121,0),(5137,14122,0),(5138,14123,0),(5139,14124,0),(5140,14125,0),(5141,14126,0),(5142,14127,0),(5143,14128,0),(5144,14129,0),(5145,14130,0),(5146,14131,0),(5147,14132,0),(5148,14133,0),(5149,14134,0),(5150,14136,0),(5151,14137,0),(5152,14138,0),(5153,14139,0),(5154,14140,0),(5155,14141,0),(5156,14142,0),(5157,14143,0),(5158,14144,0),(5159,14145,0),(5160,14146,0),(5161,14147,0),(5162,14148,0),(5163,14149,0),(5164,14150,0),(5165,14151,0),(5166,14152,0),(5167,14153,0),(5168,14154,0),(5169,14157,0),(5170,14158,0),(5171,14159,0),(5172,14160,0),(5173,14161,0),(5174,14162,0),(5175,14163,0),(5176,14164,0),(5177,14165,0),(5178,14166,0),(5179,14167,0),(5180,14168,0),(5181,14169,0),(5182,14170,0),(5183,14171,0),(5184,14172,0),(5185,14173,0),(5186,14174,0),(5187,14175,0),(5188,14176,0),(5189,14177,0),(5190,14178,0),(5191,14179,0),(5192,14180,0),(5193,14181,0),(5194,14182,0),(5195,14183,0),(5196,14184,0),(5197,14185,0),(5198,14186,0),(5199,14187,0),(5200,14188,0),(5201,14189,0),(5202,14190,0),(5203,14191,0),(5204,14192,0),(5205,14193,0),(5206,14194,0),(5207,14195,0),(5208,14196,0),(5209,14197,0),(5210,14198,0),(5211,14199,0),(5212,14200,0),(5213,14201,0),(5214,14202,0),(5215,14203,0),(5216,14204,0),(5217,14205,0),(5218,14206,0),(5219,14207,0),(5220,14208,0),(5221,14209,0),(5222,14210,0),(5223,14211,0),(5224,14212,0),(5225,14213,0),(5226,14214,0),(5227,14215,0),(5228,14216,0),(5229,14217,0),(5230,14218,0),(5231,14219,0),(5232,14220,0),(5233,14221,0),(5234,14222,0),(5235,14223,0),(5236,14224,0),(5237,14225,0),(5238,14226,0),(5239,14228,0),(5240,14229,0),(5241,14230,0),(5242,14231,0),(5243,14232,0),(5244,14233,0),(5245,14234,0),(5246,14235,0),(5247,14236,0),(5248,14237,0),(5249,14238,0),(5250,14239,0),(5251,14240,0),(5252,14241,0),(5253,14242,0),(5254,14243,0),(5255,14244,0),(5256,14245,0),(5257,14246,0),(5258,14247,0),(5259,14248,0),(5260,14249,0),(5261,14250,0),(5262,14251,0),(5263,14252,0),(5264,14253,0),(5265,14254,0),(5266,14255,0),(5267,14257,0),(5268,14258,0),(5269,14259,0),(5270,14260,0),(5271,14261,0),(5272,14262,0),(5273,14263,0),(5274,14264,0),(5275,14265,0),(5276,14266,0),(5277,14267,0),(5278,14268,0),(5279,14269,0),(5280,14270,0),(5281,14271,0),(5282,14272,0),(5283,14273,0),(5284,14274,0),(5285,14275,0),(5286,14276,0),(5287,14277,0),(5288,14278,0),(5289,14279,0),(5290,14280,0),(5291,14281,0),(5292,14282,0),(5293,14283,0),(5294,14284,0),(5295,14285,0),(5296,14286,0),(5297,14287,0),(5298,14288,0),(5299,14289,0),(5300,14290,0),(5301,14291,0),(5302,14292,0),(5303,14293,0),(5304,14294,0),(5305,14295,0),(5306,14296,0),(5307,14297,0),(5308,14298,0),(5309,14299,0),(5310,14300,0),(5311,14301,0),(5312,14302,0),(5313,14303,0),(5314,14304,0),(5315,14305,0),(5316,14306,0),(5317,14307,0),(5318,14308,0),(5319,14309,0),(5320,14310,0),(5321,14311,0),(5322,14312,0),(5323,14313,0),(5324,14314,0),(5325,14315,0),(5326,14316,0),(5327,14317,0),(5328,14318,0),(5329,14319,0),(5330,14320,0),(5331,14321,0),(5332,14322,0),(5333,14323,0),(5334,14324,0),(5335,14325,0),(5336,14326,0),(5337,14327,0),(5338,14328,0),(5339,14329,0),(5340,14330,0),(5341,14331,0),(5342,14332,0),(5343,14333,0),(5344,14334,0),(5345,14335,0),(5346,14336,0),(5347,14337,0),(5348,14340,0),(5349,14364,0),(5350,14365,0),(5351,14366,0),(5352,14367,0),(5353,14368,0),(5354,14369,0),(5355,14370,0),(5356,14371,0),(5357,14372,0),(5358,14373,0),(5359,14374,0),(5360,14375,0),(5361,14376,0),(5362,14377,0),(5363,14378,0),(5364,14379,0),(5365,14380,0),(5366,14397,0),(5367,14398,0),(5368,14399,0),(5369,14400,0),(5370,14401,0),(5371,14402,0),(5372,14403,0),(5373,14404,0),(5374,14405,0),(5375,14406,0),(5376,14407,0),(5377,14408,0),(5378,14409,0),(5379,14410,0),(5380,14411,0),(5381,14412,0),(5382,14413,0),(5383,14414,0),(5384,14415,0),(5385,14416,0),(5386,14417,0),(5387,14418,0),(5388,14419,0),(5389,14420,0),(5390,14421,0),(5391,14422,0),(5392,14423,0),(5393,14424,0),(5394,14425,0),(5395,14426,0),(5396,14427,0),(5397,14428,0),(5398,14429,0),(5399,14430,0),(5400,14431,0),(5401,14432,0),(5402,14433,0),(5403,14434,0),(5404,14435,0),(5405,14436,0),(5406,14437,0),(5407,14438,0),(5408,14439,0),(5409,14440,0),(5410,14441,0),(5411,14442,0),(5412,14443,0),(5413,14444,0),(5414,14445,0),(5415,14446,0),(5416,14447,0),(5417,14448,0),(5418,14449,0),(5419,14450,0),(5420,14451,0),(5421,14452,0),(5422,14453,0),(5423,14454,0),(5424,14455,0),(5425,14456,0),(5426,14457,0),(5427,14458,0),(5428,14459,0),(5429,14460,0),(5430,14461,0),(5431,14462,0),(5432,14463,0),(5433,14464,0),(5434,14465,0),(5435,14475,0),(5436,14487,0),(5437,14502,0),(5438,14503,0),(5439,14522,0),(5440,14524,0),(5441,14525,0),(5442,14527,0),(5443,14528,0),(5444,14531,0),(5445,14532,0),(5446,14533,0),(5447,14534,0),(5448,14535,0),(5449,14536,0),(5450,14537,0),(5451,14538,0),(5452,14539,0),(5453,14541,0),(5454,14543,0),(5455,14545,0),(5456,14548,0),(5457,14549,0),(5458,14550,0),(5459,14551,0),(5460,14552,0),(5461,14553,0),(5462,14554,0),(5463,14555,0),(5464,14559,0),(5465,14560,0),(5466,14561,0),(5467,14562,0),(5468,14563,0),(5469,14564,0),(5470,14565,0),(5471,14566,0),(5472,14567,0),(5473,14568,0),(5474,14569,0),(5475,14570,0),(5476,14571,0),(5477,14572,0),(5478,14573,0),(5479,14574,0),(5480,14575,0),(5481,14576,0),(5482,14577,0),(5483,14578,0),(5484,14579,0),(5485,14580,0),(5486,14581,0),(5487,14582,0),(5488,14583,0),(5489,14584,0),(5490,14585,0),(5491,14586,0),(5492,14587,0),(5493,14588,0),(5494,14589,0),(5495,14590,0),(5496,14591,0),(5497,14592,0),(5498,14593,0),(5499,14594,0),(5500,14595,0),(5501,14596,0),(5502,14598,0),(5503,14599,0),(5504,14600,0),(5505,14601,0),(5506,14602,0),(5507,14603,0),(5508,14604,0),(5509,14605,0),(5510,14606,0),(5511,14607,0),(5512,14608,0),(5513,14611,0),(5514,14612,0),(5515,14614,0),(5516,14615,0),(5517,14616,0),(5518,14617,0),(5519,14618,0),(5520,14620,0),(5521,14621,0),(5522,14622,0),(5523,14623,0),(5524,14624,0),(5525,14626,0),(5526,14629,0),(5527,14631,0),(5528,14632,0),(5529,14633,0),(5530,14636,0),(5531,14637,0),(5532,14638,0),(5533,14640,0),(5534,14641,0),(5535,14642,0),(5536,14643,0),(5537,14652,0),(5538,14653,0),(5539,14654,0),(5540,14655,0),(5541,14656,0),(5542,14657,0),(5543,14658,0),(5544,14659,0),(5545,14660,0),(5546,14661,0),(5547,14662,0),(5548,14663,0),(5549,14664,0),(5550,14665,0),(5551,14666,0),(5552,14667,0),(5553,14668,0),(5554,14669,0),(5555,14670,0),(5556,14671,0),(5557,14672,0),(5558,14673,0),(5559,14674,0),(5560,14675,0),(5561,14676,0),(5562,14677,0),(5563,14678,0),(5564,14680,0),(5565,14681,0),(5566,14682,0),(5567,14683,0),(5568,14684,0),(5569,14685,0),(5570,14686,0),(5571,14687,0),(5572,14688,0),(5573,14706,0),(5574,14707,0),(5575,14722,0),(5576,14723,0),(5577,14724,0),(5578,14725,0),(5579,14726,0),(5580,14727,0),(5581,14728,0),(5582,14729,0),(5583,14730,0),(5584,14742,0),(5585,14743,0),(5586,14744,0),(5587,14745,0),(5588,14746,0),(5589,14747,0),(5590,14748,0),(5591,14749,0),(5592,14750,0),(5593,14751,0),(5594,14752,0),(5595,14753,0),(5596,14754,0),(5597,14755,0),(5598,14756,0),(5599,14757,0),(5600,14758,0),(5601,14759,0),(5602,14760,0),(5603,14761,0),(5604,14762,0),(5605,14763,0),(5606,14764,0),(5607,14765,0),(5608,14766,0),(5609,14767,0),(5610,14768,0),(5611,14769,0),(5612,14770,0),(5613,14771,0),(5614,14772,0),(5615,14773,0),(5616,14774,0),(5617,14775,0),(5618,14776,0),(5619,14777,0),(5620,14778,0),(5621,14779,0),(5622,14780,0),(5623,14781,0),(5624,14782,0),(5625,14783,0),(5626,14784,0),(5627,14785,0),(5628,14786,0),(5629,14787,0),(5630,14788,0),(5631,14789,0),(5632,14790,0),(5633,14791,0),(5634,14792,0),(5635,14793,0),(5636,14794,0),(5637,14795,0),(5638,14796,0),(5639,14797,0),(5640,14798,0),(5641,14799,0),(5642,14800,0),(5643,14801,0),(5644,14802,0),(5645,14803,0),(5646,14804,0),(5647,14805,0),(5648,14806,0),(5649,14807,0),(5650,14808,0),(5651,14809,0),(5652,14810,0),(5653,14811,0),(5654,14812,0),(5655,14813,0),(5656,14814,0),(5657,14815,0),(5658,14816,0),(5659,14817,0),(5660,14818,0),(5661,14820,0),(5662,14821,0),(5663,14822,0),(5664,14823,0),(5665,14824,0),(5666,14825,0),(5667,14826,0),(5668,14827,0),(5669,14828,0),(5670,14829,0),(5671,14830,0),(5672,14831,0),(5673,14832,0),(5674,14833,0),(5675,14834,0),(5676,14835,0),(5677,14836,0),(5678,14837,0),(5679,14838,0),(5680,14839,0),(5681,14840,0),(5682,14841,0),(5683,14842,0),(5684,14843,0),(5685,14844,0),(5686,14845,0),(5687,14846,0),(5688,14847,0),(5689,14848,0),(5690,14849,0),(5691,14850,0),(5692,14851,0),(5693,14852,0),(5694,14853,0),(5695,14854,0),(5696,14855,0),(5697,14856,0),(5698,14857,0),(5699,14858,0),(5700,14859,0),(5701,14860,0),(5702,14861,0),(5703,14862,0),(5704,14863,0),(5705,14864,0),(5706,14865,0),(5707,14866,0),(5708,14867,0),(5709,14868,0),(5710,14869,0),(5711,14870,0),(5712,14871,0),(5713,14873,0),(5714,14874,0),(5715,14875,0),(5716,14876,0),(5717,14877,0),(5718,14878,0),(5719,14879,0),(5720,14880,0),(5721,14881,0),(5722,14882,0),(5723,14883,0),(5724,14884,0),(5725,14885,0),(5726,14886,0),(5727,14887,0),(5728,14888,0),(5729,14889,0),(5730,14890,0),(5731,14891,0),(5732,14892,0),(5733,14893,0),(5734,14895,0),(5735,14896,0),(5736,14897,0),(5737,14898,0),(5738,14899,0),(5739,14900,0),(5740,14901,0),(5741,14902,0),(5742,14903,0),(5743,14904,0),(5744,14905,0),(5745,14906,0),(5746,14907,0),(5747,14908,0),(5748,14909,0),(5749,14910,0),(5750,14911,0),(5751,14912,0),(5752,14913,0),(5753,14914,0),(5754,14915,0),(5755,14916,0),(5756,14917,0),(5757,14918,0),(5758,14919,0),(5759,14920,0),(5760,14921,0),(5761,14922,0),(5762,14923,0),(5763,14924,0),(5764,14925,0),(5765,14926,0),(5766,14927,0),(5767,14928,0),(5768,14929,0),(5769,14930,0),(5770,14931,0),(5771,14932,0),(5772,14933,0),(5773,14934,0),(5774,14935,0),(5775,14936,0),(5776,14937,0),(5777,14938,0),(5778,14939,0),(5779,14940,0),(5780,14941,0),(5781,14942,0),(5782,14943,0),(5783,14944,0),(5784,14945,0),(5785,14946,0),(5786,14947,0),(5787,14948,0),(5788,14949,0),(5789,14950,0),(5790,14951,0),(5791,14952,0),(5792,14953,0),(5793,14954,0),(5794,14955,0),(5795,14956,0),(5796,14957,0),(5797,14958,0),(5798,14959,0),(5799,14960,0),(5800,14961,0),(5801,14962,0),(5802,14963,0),(5803,14964,0),(5804,14965,0),(5805,14966,0),(5806,14967,0),(5807,14968,0),(5808,14969,0),(5809,14970,0),(5810,14971,0),(5811,14972,0),(5812,14973,0),(5813,14974,0),(5814,14975,0),(5815,14976,0),(5816,14977,0),(5817,14978,0),(5818,14979,0),(5819,14980,0),(5820,14981,0),(5821,14982,0),(5822,14983,0),(5823,15003,0),(5824,15004,0),(5825,15005,0),(5826,15006,0),(5827,15007,0),(5828,15008,0),(5829,15009,0),(5830,15010,0),(5831,15011,0),(5832,15012,0),(5833,15013,0),(5834,15014,0),(5835,15015,0),(5836,15016,0),(5837,15017,0),(5838,15018,0),(5839,15019,0),(5840,15045,0),(5841,15046,0),(5842,15047,0),(5843,15048,0),(5844,15049,0),(5845,15050,0),(5846,15051,0),(5847,15052,0),(5848,15053,0),(5849,15054,0),(5850,15055,0),(5851,15056,0),(5852,15057,0),(5853,15058,0),(5854,15059,0),(5855,15060,0),(5856,15061,0),(5857,15062,0),(5858,15063,0),(5859,15064,0),(5860,15065,0),(5861,15066,0),(5862,15067,0),(5863,15068,0),(5864,15069,0),(5865,15070,0),(5866,15071,0),(5867,15072,0),(5868,15073,0),(5869,15074,0),(5870,15075,0),(5871,15076,0),(5872,15077,0),(5873,15078,0),(5874,15079,0),(5875,15080,0),(5876,15081,0),(5877,15082,0),(5878,15083,0),(5879,15084,0),(5880,15085,0),(5881,15086,0),(5882,15087,0),(5883,15088,0),(5884,15090,0),(5885,15091,0),(5886,15092,0),(5887,15093,0),(5888,15094,0),(5889,15095,0),(5890,15096,0),(5891,15104,0),(5892,15105,0),(5893,15106,0),(5894,15107,0),(5895,15108,0),(5896,15109,0),(5897,15110,0),(5898,15111,0),(5899,15112,0),(5900,15113,0),(5901,15114,0),(5902,15115,0),(5903,15116,0),(5904,15117,0),(5905,15118,0),(5906,15119,0),(5907,15120,0),(5908,15121,0),(5909,15122,0),(5910,15123,0),(5911,15124,0),(5912,15125,0),(5913,15126,0),(5914,15127,0),(5915,15128,0),(5916,15129,0),(5917,15130,0),(5918,15131,0),(5919,15132,0),(5920,15133,0),(5921,15134,0),(5922,15135,0),(5923,15136,0),(5924,15137,0),(5925,15138,0),(5926,15139,0),(5927,15140,0),(5928,15141,0),(5929,15142,0),(5930,15143,0),(5931,15144,0),(5932,15145,0),(5933,15146,0),(5934,15147,0),(5935,15148,0),(5936,15149,0),(5937,15150,0),(5938,15151,0),(5939,15152,0),(5940,15153,0),(5941,15154,0),(5942,15155,0),(5943,15156,0),(5944,15157,0),(5945,15158,0),(5946,15159,0),(5947,15160,0),(5948,15161,0),(5949,15162,0),(5950,15163,0),(5951,15164,0),(5952,15165,0),(5953,15166,0),(5954,15167,0),(5955,15168,0),(5956,15169,0),(5957,15170,0),(5958,15171,0),(5959,15172,0),(5960,15173,0),(5961,15174,0),(5962,15175,0),(5963,15176,0),(5964,15177,0),(5965,15178,0),(5966,15179,0),(5967,15180,0),(5968,15181,0),(5969,15182,0),(5970,15183,0),(5971,15184,0),(5972,15185,0),(5973,15186,0),(5974,15187,0),(5975,15188,0),(5976,15189,0),(5977,15190,0),(5978,15191,0),(5979,15192,0),(5980,15193,0),(5981,15194,0),(5982,15195,0),(5983,15196,0),(5984,15197,0),(5985,15198,0),(5986,15199,0),(5987,15202,0),(5988,15203,0),(5989,15204,0),(5990,15205,0),(5991,15206,0),(5992,15207,0),(5993,15210,0),(5994,15211,0),(5995,15212,0),(5996,15213,0),(5997,15214,0),(5998,15215,0),(5999,15216,0),(6000,15217,0),(6001,15218,0),(6002,15219,0),(6003,15220,0),(6004,15221,0),(6005,15222,0),(6006,15223,0),(6007,15224,0),(6008,15225,0),(6009,15226,0),(6010,15227,0),(6011,15228,0),(6012,15229,0),(6013,15230,0),(6014,15231,0),(6015,15232,0),(6016,15233,0),(6017,15234,0),(6018,15235,0),(6019,15236,0),(6020,15237,0),(6021,15238,0),(6022,15239,0),(6023,15240,0),(6024,15241,0),(6025,15242,0),(6026,15243,0),(6027,15244,0),(6028,15245,0),(6029,15246,0),(6030,15247,0),(6031,15248,0),(6032,15249,0),(6033,15250,0),(6034,15251,0),(6035,15252,0),(6036,15253,0),(6037,15254,0),(6038,15255,0),(6039,15256,0),(6040,15257,0),(6041,15258,0),(6042,15259,0),(6043,15260,0),(6044,15261,0),(6045,15262,0),(6046,15263,0),(6047,15264,0),(6048,15265,0),(6049,15266,0),(6050,15267,0),(6051,15268,0),(6052,15269,0),(6053,15270,0),(6054,15271,0),(6055,15272,0),(6056,15273,0),(6057,15274,0),(6058,15275,0),(6059,15276,0),(6060,15278,0),(6061,15279,0),(6062,15280,0),(6063,15281,0),(6064,15282,0),(6065,15283,0),(6066,15284,0),(6067,15285,0),(6068,15286,0),(6069,15287,0),(6070,15288,0),(6071,15289,0),(6072,15291,0),(6073,15294,0),(6074,15295,0),(6075,15296,0),(6076,15297,0),(6077,15298,0),(6078,15299,0),(6079,15300,0),(6080,15301,0),(6081,15302,0),(6082,15303,0),(6083,15304,0),(6084,15305,0),(6085,15306,0),(6086,15307,0),(6087,15308,0),(6088,15309,0),(6089,15310,0),(6090,15311,0),(6091,15312,0),(6092,15313,0),(6093,15322,0),(6094,15323,0),(6095,15324,0),(6096,15325,0),(6097,15329,0),(6098,15330,0),(6099,15331,0),(6100,15332,0),(6101,15333,0),(6102,15334,0),(6103,15335,0),(6104,15336,0),(6105,15337,0),(6106,15338,0),(6107,15339,0),(6108,15340,0),(6109,15341,0),(6110,15342,0),(6111,15343,0),(6112,15344,0),(6113,15345,0),(6114,15346,0),(6115,15347,0),(6116,15348,0),(6117,15349,0),(6118,15350,0),(6119,15351,0),(6120,15352,0),(6121,15353,0),(6122,15354,0),(6123,15355,0),(6124,15356,0),(6125,15357,0),(6126,15358,0),(6127,15359,0),(6128,15360,0),(6129,15361,0),(6130,15362,0),(6131,15363,0),(6132,15364,0),(6133,15365,0),(6134,15366,0),(6135,15367,0),(6136,15368,0),(6137,15369,0),(6138,15370,0),(6139,15371,0),(6140,15372,0),(6141,15373,0),(6142,15374,0),(6143,15375,0),(6144,15376,0),(6145,15377,0),(6146,15378,0),(6147,15379,0),(6148,15380,0),(6149,15381,0),(6150,15382,0),(6151,15383,0),(6152,15384,0),(6153,15385,0),(6154,15386,0),(6155,15387,0),(6156,15388,0),(6157,15389,0),(6158,15390,0),(6159,15391,0),(6160,15392,0),(6161,15393,0),(6162,15394,0),(6163,15395,0),(6164,15396,0),(6165,15397,0),(6166,15398,0),(6167,15399,0),(6168,15400,0),(6169,15401,0),(6170,15402,0),(6171,15403,0),(6172,15404,0),(6173,15405,0),(6174,15406,0),(6175,15413,0),(6176,15418,0),(6177,15421,0),(6178,15424,0),(6179,15425,0),(6180,15426,0),(6181,15427,0),(6182,15428,0),(6183,15429,0),(6184,15430,0),(6185,15431,0),(6186,15432,0),(6187,15433,0),(6188,15434,0),(6189,15435,0),(6190,15436,0),(6191,15437,0),(6192,15438,0),(6193,15439,0),(6194,15440,0),(6195,15441,0),(6196,15442,0),(6197,15443,0),(6198,15444,0),(6199,15445,0),(6200,15449,0),(6201,15450,0),(6202,15451,0),(6203,15452,0),(6204,15453,0),(6205,15455,0),(6206,15456,0),(6207,15457,0),(6208,15458,0),(6209,15459,0),(6210,15460,0),(6211,15461,0),(6212,15462,0),(6213,15463,0),(6214,15464,0),(6215,15465,0),(6216,15466,0),(6217,15468,0),(6218,15469,0),(6219,15470,0),(6220,15471,0),(6221,15472,0),(6222,15473,0),(6223,15474,0),(6224,15475,0),(6225,15476,0),(6226,15477,0),(6227,15478,0),(6228,15479,0),(6229,15480,0),(6230,15481,0),(6231,15482,0),(6232,15483,0),(6233,15484,0),(6234,15485,0),(6235,15486,0),(6236,15487,0),(6237,15488,0),(6238,15489,0),(6239,15490,0),(6240,15491,0),(6241,15492,0),(6242,15493,0),(6243,15494,0),(6244,15495,0),(6245,15496,0),(6246,15497,0),(6247,15498,0),(6248,15499,0),(6249,15500,0),(6250,15501,0),(6251,15502,0),(6252,15503,0),(6253,15504,0),(6254,15505,0),(6255,15506,0),(6256,15507,0),(6257,15508,0),(6258,15509,0),(6259,15510,0),(6260,15511,0),(6261,15512,0),(6262,15513,0),(6263,15514,0),(6264,15515,0),(6265,15516,0),(6266,15517,0),(6267,15518,0),(6268,15519,0),(6269,15520,0),(6270,15521,0),(6271,15522,0),(6272,15523,0),(6273,15524,0),(6274,15525,0),(6275,15526,0),(6276,15527,0),(6277,15528,0),(6278,15529,0),(6279,15530,0),(6280,15531,0),(6281,15532,0),(6282,15533,0),(6283,15534,0),(6284,15535,0),(6285,15536,0),(6286,15537,0),(6287,15538,0),(6288,15539,0),(6289,15540,0),(6290,15541,0),(6291,15542,0),(6292,15543,0),(6293,15544,0),(6294,15545,0),(6295,15546,0),(6296,15547,0),(6297,15548,0),(6298,15549,0),(6299,15550,0),(6300,15551,0),(6301,15552,0),(6302,15553,0),(6303,15554,0),(6304,15555,0),(6305,15556,0),(6306,15557,0),(6307,15558,0),(6308,15559,0),(6309,15560,0),(6310,15561,0),(6311,15562,0),(6312,15563,0),(6313,15565,0),(6314,15566,0),(6315,15567,0),(6316,15568,0),(6317,15569,0),(6318,15570,0),(6319,15571,0),(6320,15572,0),(6321,15573,0),(6322,15574,0),(6323,15575,0),(6324,15576,0),(6325,15577,0),(6326,15578,0),(6327,15579,0),(6328,15580,0),(6329,15581,0),(6330,15582,0),(6331,15583,0),(6332,15584,0),(6333,15585,0),(6334,15587,0),(6335,15588,0),(6336,15589,0),(6337,15590,0),(6338,15591,0),(6339,15592,0),(6340,15593,0),(6341,15594,0),(6342,15595,0),(6343,15596,0),(6344,15597,0),(6345,15598,0),(6346,15599,0),(6347,15600,0),(6348,15601,0),(6349,15602,0),(6350,15603,0),(6351,15604,0),(6352,15605,0),(6353,15606,0),(6354,15607,0),(6355,15608,0),(6356,15609,0),(6357,15610,0),(6358,15611,0),(6359,15612,0),(6360,15613,0),(6361,15614,0),(6362,15615,0),(6363,15616,0),(6364,15617,0),(6365,15618,0),(6366,15619,0),(6367,15620,0),(6368,15621,0),(6369,15622,0),(6370,15623,0),(6371,15624,0),(6372,15625,0),(6373,15626,0),(6374,15627,0),(6375,15628,0),(6376,15629,0),(6377,15630,0),(6378,15631,0),(6379,15632,0),(6380,15633,0),(6381,15634,0),(6382,15635,0),(6383,15636,0),(6384,15637,0),(6385,15638,0),(6386,15639,0),(6387,15640,0),(6388,15641,0),(6389,15642,0),(6390,15643,0),(6391,15644,0),(6392,15645,0),(6393,15646,0),(6394,15647,0),(6395,15648,0),(6396,15649,0),(6397,15650,0),(6398,15651,0),(6399,15652,0),(6400,15653,0),(6401,15654,0),(6402,15655,0),(6403,15656,0),(6404,15657,0),(6405,15658,0),(6406,15659,0),(6407,15660,0),(6408,15661,0),(6409,15662,0),(6410,15663,0),(6411,15664,0),(6412,15665,0),(6413,15666,0),(6414,15667,0),(6415,15668,0),(6416,15669,0),(6417,15670,0),(6418,15671,0),(6419,15672,0),(6420,15673,0),(6421,15674,0),(6422,15675,0),(6423,15676,0),(6424,15677,0),(6425,15678,0),(6426,15679,0),(6427,15680,0),(6428,15681,0),(6429,15682,0),(6430,15683,0),(6431,15684,0),(6432,15685,0),(6433,15686,0),(6434,15687,0),(6435,15691,0),(6436,15692,0),(6437,15693,0),(6438,15694,0),(6439,15695,0),(6440,15697,0),(6441,15698,0),(6442,15703,0),(6443,15705,0),(6444,15706,0),(6445,15707,0),(6446,15708,0),(6447,15709,0),(6448,15782,0),(6449,15783,0),(6450,15784,0),(6451,15786,0),(6452,15787,0),(6453,15789,0),(6454,15791,0),(6455,15792,0),(6456,15794,0),(6457,15795,0),(6458,15796,0),(6459,15797,0),(6460,15800,0),(6461,15801,0),(6462,15802,0),(6463,15804,0),(6464,15805,0),(6465,15806,0),(6466,15807,0),(6467,15808,0),(6468,15809,0),(6469,15810,0),(6470,15811,0),(6471,15812,0),(6472,15813,0),(6473,15814,0),(6474,15815,0),(6475,15822,0),(6476,15823,0),(6477,15824,0),(6478,15825,0),(6479,15827,0),(6480,15853,0),(6481,15854,0),(6482,15857,0),(6483,15858,0),(6484,15859,0),(6485,15860,0),(6486,15861,0),(6487,15862,0),(6488,15863,0),(6489,15864,0),(6490,15865,0),(6491,15866,0),(6492,15887,0),(6493,15890,0),(6494,15891,0),(6495,15892,0),(6496,15893,0),(6497,15894,0),(6498,15895,0),(6499,15903,0),(6500,15904,0),(6501,15905,0),(6502,15906,0),(6503,15907,0),(6504,15909,0),(6505,15910,0),(6506,15912,0),(6507,15918,0),(6508,15925,0),(6509,15926,0),(6510,15927,0),(6511,15928,0),(6512,15929,0),(6513,15930,0),(6514,15931,0),(6515,15932,0),(6516,15933,0),(6517,15934,0),(6518,15935,0),(6519,15936,0),(6520,15937,0),(6521,15938,0),(6522,15939,0),(6523,15940,0),(6524,15941,0),(6525,15942,0),(6526,15943,0),(6527,15944,0),(6528,15945,0),(6529,15946,0),(6530,15947,0),(6531,15962,0),(6532,15963,0),(6533,15964,0),(6534,15965,0),(6535,15966,0),(6536,15967,0),(6537,15968,0),(6538,15969,0),(6539,15970,0),(6540,15971,0),(6541,15972,0),(6542,15973,0),(6543,15974,0),(6544,15975,0),(6545,15976,0),(6546,15977,0),(6547,15978,0),(6548,15979,0),(6549,15980,0),(6550,15981,0),(6551,15982,0),(6552,15983,0),(6553,15984,0),(6554,15985,0),(6555,15986,0),(6556,15987,0),(6557,15988,0),(6558,15989,0),(6559,15990,0),(6560,15991,0),(6561,15995,0),(6562,15997,0),(6563,15999,0),(6564,16004,0),(6565,16007,0),(6566,16008,0),(6567,16026,0),(6568,16027,0),(6569,16028,0),(6570,16029,0),(6571,16030,0),(6572,16031,0),(6573,16033,0),(6574,16034,0),(6575,16035,0),(6576,16036,0),(6577,16037,0),(6578,16038,0),(6579,16039,0),(6580,16059,0),(6581,16060,0),(6582,16061,0),(6583,16062,0),(6584,16063,0),(6585,16064,0),(6586,16065,0),(6587,16066,0),(6588,16116,0),(6589,16117,0),(6590,16118,0),(6591,16119,0),(6592,16120,0),(6593,16121,0),(6594,16122,0),(6595,16126,0),(6596,16127,0),(6597,16129,0),(6598,16131,0),(6599,16132,0),(6600,16134,0),(6601,16135,0),(6602,16136,0),(6603,16137,0),(6604,16138,0),(6605,16139,0),(6606,16140,0),(6607,16141,0),(6608,16142,0),(6609,16143,0),(6610,16144,0),(6611,16145,0),(6612,16146,0),(6613,16147,0),(6614,16148,0),(6615,16149,0),(6616,16150,0),(6617,16151,0),(6618,16152,0),(6619,16153,0),(6620,16154,0),(6621,16155,0),(6622,16156,0),(6623,16157,0),(6624,16158,0),(6625,16159,0),(6626,16160,0),(6627,16161,0),(6628,16162,0),(6629,16163,0),(6630,16164,0),(6631,16165,0),(6632,16172,0),(6633,16211,0),(6634,16212,0),(6635,16213,0),(6636,16341,0),(6637,16342,0),(6638,16345,0),(6639,16369,0),(6640,16391,0),(6641,16392,0),(6642,16393,0),(6643,16396,0),(6644,16397,0),(6645,16401,0),(6646,16403,0),(6647,16405,0),(6648,16406,0),(6649,16409,0),(6650,16410,0),(6651,16413,0),(6652,16414,0),(6653,16415,0),(6654,16416,0),(6655,16417,0),(6656,16418,0),(6657,16419,0),(6658,16420,0),(6659,16421,0),(6660,16422,0),(6661,16423,0),(6662,16424,0),(6663,16425,0),(6664,16426,0),(6665,16427,0),(6666,16428,0),(6667,16429,0),(6668,16430,0),(6669,16431,0),(6670,16432,0),(6671,16433,0),(6672,16434,0),(6673,16435,0),(6674,16436,0),(6675,16437,0),(6676,16440,0),(6677,16441,0),(6678,16442,0),(6679,16443,0),(6680,16444,0),(6681,16446,0),(6682,16448,0),(6683,16449,0),(6684,16450,0),(6685,16451,0),(6686,16452,0),(6687,16453,0),(6688,16454,0),(6689,16455,0),(6690,16456,0),(6691,16457,0),(6692,16459,0),(6693,16462,0),(6694,16463,0),(6695,16465,0),(6696,16466,0),(6697,16467,0),(6698,16468,0),(6699,16471,0),(6700,16472,0),(6701,16473,0),(6702,16474,0),(6703,16475,0),(6704,16476,0),(6705,16477,0),(6706,16478,0),(6707,16479,0),(6708,16480,0),(6709,16483,0),(6710,16484,0),(6711,16485,0),(6712,16486,0),(6713,16487,0),(6714,16489,0),(6715,16490,0),(6716,16491,0),(6717,16492,0),(6718,16494,0),(6719,16496,0),(6720,16497,0),(6721,16498,0),(6722,16499,0),(6723,16501,0),(6724,16502,0),(6725,16503,0),(6726,16504,0),(6727,16505,0),(6728,16506,0),(6729,16507,0),(6730,16508,0),(6731,16509,0),(6732,16510,0),(6733,16513,0),(6734,16514,0),(6735,16515,0),(6736,16516,0),(6737,16518,0),(6738,16519,0),(6739,16521,0),(6740,16522,0),(6741,16523,0),(6742,16524,0),(6743,16525,0),(6744,16526,0),(6745,16527,0),(6746,16528,0),(6747,16530,0),(6748,16531,0),(6749,16532,0),(6750,16533,0),(6751,16534,0),(6752,16535,0),(6753,16536,0),(6754,16539,0),(6755,16540,0),(6756,16541,0),(6757,16542,0),(6758,16543,0),(6759,16544,0),(6760,16545,0),(6761,16548,0),(6762,16549,0),(6763,16550,0),(6764,16551,0),(6765,16552,0),(6766,16554,0),(6767,16555,0),(6768,16558,0),(6769,16560,0),(6770,16561,0),(6771,16562,0),(6772,16563,0),(6773,16564,0),(6774,16565,0),(6775,16566,0),(6776,16567,0),(6777,16568,0),(6778,16569,0),(6779,16571,0),(6780,16573,0),(6781,16574,0),(6782,16577,0),(6783,16578,0),(6784,16579,0),(6785,16580,0),(6786,16582,0),(6787,16604,0),(6788,16605,0),(6789,16606,0),(6790,16607,0),(6791,16608,0),(6792,16622,0),(6793,16658,0),(6794,16659,0),(6795,16660,0),(6796,16661,0),(6797,16666,0),(6798,16667,0),(6799,16668,0),(6800,16669,0),(6801,16670,0),(6802,16671,0),(6803,16672,0),(6804,16673,0),(6805,16674,0),(6806,16675,0),(6807,16676,0),(6808,16677,0),(6809,16678,0),(6810,16679,0),(6811,16680,0),(6812,16681,0),(6813,16682,0),(6814,16683,0),(6815,16684,0),(6816,16685,0),(6817,16686,0),(6818,16687,0),(6819,16688,0),(6820,16689,0),(6821,16690,0),(6822,16691,0),(6823,16692,0),(6824,16693,0),(6825,16694,0),(6826,16695,0),(6827,16696,0),(6828,16697,0),(6829,16698,0),(6830,16699,0),(6831,16700,0),(6832,16701,0),(6833,16702,0),(6834,16703,0),(6835,16704,0),(6836,16705,0),(6837,16706,0),(6838,16707,0),(6839,16708,0),(6840,16709,0),(6841,16710,0),(6842,16711,0),(6843,16712,0),(6844,16713,0),(6845,16714,0),(6846,16715,0),(6847,16716,0),(6848,16717,0),(6849,16718,0),(6850,16719,0),(6851,16720,0),(6852,16721,0),(6853,16722,0),(6854,16723,0),(6855,16724,0),(6856,16725,0),(6857,16726,0),(6858,16727,0),(6859,16728,0),(6860,16729,0),(6861,16730,0),(6862,16731,0),(6863,16732,0),(6864,16733,0),(6865,16734,0),(6866,16735,0),(6867,16736,0),(6868,16737,0),(6869,16738,0),(6870,16739,0),(6871,16740,0),(6872,16741,0),(6873,16768,0),(6874,16769,0),(6875,16788,0),(6876,16789,0),(6877,16791,0),(6878,16793,0),(6879,16794,0),(6880,16795,0),(6881,16796,0),(6882,16797,0),(6883,16798,0),(6884,16799,0),(6885,16800,0),(6886,16801,0),(6887,16802,0),(6888,16803,0),(6889,16804,0),(6890,16805,0),(6891,16806,0),(6892,16807,0),(6893,16808,0),(6894,16809,0),(6895,16810,0),(6896,16811,0),(6897,16812,0),(6898,16813,0),(6899,16814,0),(6900,16815,0),(6901,16816,0),(6902,16817,0),(6903,16818,0),(6904,16819,0),(6905,16820,0),(6906,16821,0),(6907,16822,0),(6908,16823,0),(6909,16824,0),(6910,16825,0),(6911,16826,0),(6912,16827,0),(6913,16828,0),(6914,16829,0),(6915,16830,0),(6916,16831,0),(6917,16832,0),(6918,16833,0),(6919,16834,0),(6920,16835,0),(6921,16836,0),(6922,16837,0),(6923,16838,0),(6924,16839,0),(6925,16840,0),(6926,16841,0),(6927,16842,0),(6928,16843,0),(6929,16844,0),(6930,16845,0),(6931,16846,0),(6932,16847,0),(6933,16848,0),(6934,16849,0),(6935,16850,0),(6936,16851,0),(6937,16852,0),(6938,16853,0),(6939,16854,0),(6940,16855,0),(6941,16856,0),(6942,16857,0),(6943,16858,0),(6944,16859,0),(6945,16860,0),(6946,16861,0),(6947,16862,0),(6948,16863,0),(6949,16864,0),(6950,16865,0),(6951,16866,0),(6952,16867,0),(6953,16868,0),(6954,16873,0),(6955,16886,0),(6956,16887,0),(6957,16889,0),(6958,16890,0),(6959,16891,0),(6960,16894,0),(6961,16897,0),(6962,16898,0),(6963,16899,0),(6964,16900,0),(6965,16901,0),(6966,16902,0),(6967,16903,0),(6968,16904,0),(6969,16905,0),(6970,16906,0),(6971,16907,0),(6972,16908,0),(6973,16909,0),(6974,16910,0),(6975,16911,0),(6976,16912,0),(6977,16913,0),(6978,16914,0),(6979,16915,0),(6980,16916,0),(6981,16917,0),(6982,16918,0),(6983,16919,0),(6984,16920,0),(6985,16921,0),(6986,16922,0),(6987,16923,0),(6988,16924,0),(6989,16925,0),(6990,16926,0),(6991,16927,0),(6992,16928,0),(6993,16929,0),(6994,16930,0),(6995,16931,0),(6996,16932,0),(6997,16933,0),(6998,16934,0),(6999,16935,0),(7000,16936,0),(7001,16937,0),(7002,16938,0),(7003,16939,0),(7004,16940,0),(7005,16941,0),(7006,16942,0),(7007,16943,0),(7008,16944,0),(7009,16945,0),(7010,16946,0),(7011,16947,0),(7012,16948,0),(7013,16949,0),(7014,16950,0),(7015,16951,0),(7016,16952,0),(7017,16953,0),(7018,16954,0),(7019,16955,0),(7020,16956,0),(7021,16957,0),(7022,16958,0),(7023,16959,0),(7024,16960,0),(7025,16961,0),(7026,16962,0),(7027,16963,0),(7028,16964,0),(7029,16965,0),(7030,16966,0),(7031,16967,0),(7032,16975,0),(7033,16977,0),(7034,16978,0),(7035,16979,0),(7036,16980,0),(7037,16981,0),(7038,16982,0),(7039,16983,0),(7040,16984,0),(7041,16985,0),(7042,16986,0),(7043,16987,0),(7044,16988,0),(7045,16989,0),(7046,16990,0),(7047,16992,0),(7048,16993,0),(7049,16994,0),(7050,16995,0),(7051,16996,0),(7052,16997,0),(7053,16998,0),(7054,17002,0),(7055,17003,0),(7056,17004,0),(7057,17005,0),(7058,17006,0),(7059,17007,0),(7060,17013,0),(7061,17014,0),(7062,17015,0),(7063,17016,0),(7064,17039,0),(7065,17040,0),(7066,17041,0),(7067,17042,0),(7068,17043,0),(7069,17046,0),(7070,17047,0),(7071,17050,0),(7072,17054,0),(7073,17055,0),(7074,17061,0),(7075,17066,0),(7076,17067,0),(7077,17068,0),(7078,17069,0),(7079,17070,0),(7080,17071,0),(7081,17072,0),(7082,17073,0),(7083,17074,0),(7084,17075,0),(7085,17076,0),(7086,17077,0),(7087,17078,0),(7088,17102,0),(7089,17103,0),(7090,17104,0),(7091,17105,0),(7092,17106,0),(7093,17107,0),(7094,17112,0),(7095,17113,0),(7096,17123,0),(7097,17142,0),(7098,17182,0),(7099,17183,0),(7100,17184,0),(7101,17185,0),(7102,17186,0),(7103,17187,0),(7104,17188,0),(7105,17189,0),(7106,17190,0),(7107,17191,0),(7108,17192,0),(7109,17193,0),(7110,17223,0),(7111,17282,0),(7112,17283,0),(7113,17342,0),(7114,17343,0),(7115,17382,0),(7116,17383,0),(7117,17462,0),(7118,17463,0),(7119,17482,0),(7120,17508,0),(7121,17523,0),(7122,17562,0),(7123,17564,0),(7124,17566,0),(7125,17567,0),(7126,17568,0),(7127,17569,0),(7128,17570,0),(7129,17571,0),(7130,17572,0),(7131,17573,0),(7132,17576,0),(7133,17577,0),(7134,17578,0),(7135,17579,0),(7136,17580,0),(7137,17581,0),(7138,17583,0),(7139,17584,0),(7140,17586,0),(7141,17588,0),(7142,17590,0),(7143,17591,0),(7144,17592,0),(7145,17593,0),(7146,17594,0),(7147,17596,0),(7148,17598,0),(7149,17599,0),(7150,17600,0),(7151,17601,0),(7152,17602,0),(7153,17603,0),(7154,17604,0),(7155,17605,0),(7156,17607,0),(7157,17608,0),(7158,17610,0),(7159,17611,0),(7160,17612,0),(7161,17613,0),(7162,17616,0),(7163,17617,0),(7164,17618,0),(7165,17620,0),(7166,17622,0),(7167,17623,0),(7168,17624,0),(7169,17625,0),(7170,17686,0),(7171,17687,0),(7172,17688,0),(7173,17695,0),(7174,17704,0),(7175,17705,0),(7176,17710,0),(7177,17711,0),(7178,17714,0),(7179,17715,0),(7180,17717,0),(7181,17718,0),(7182,17719,0),(7183,17721,0),(7184,17723,0),(7185,17728,0),(7186,17730,0),(7187,17732,0),(7188,17734,0),(7189,17736,0),(7190,17737,0),(7191,17738,0),(7192,17739,0),(7193,17740,0),(7194,17741,0),(7195,17742,0),(7196,17743,0),(7197,17745,0),(7198,17746,0),(7199,17748,0),(7200,17749,0),(7201,17750,0),(7202,17751,0),(7203,17752,0),(7204,17753,0),(7205,17754,0),(7206,17755,0),(7207,17766,0),(7208,17767,0),(7209,17770,0),(7210,17775,0),(7211,17776,0),(7212,17777,0),(7213,17778,0),(7214,17779,0),(7215,17780,0),(7216,17922,0),(7217,17942,0),(7218,17943,0),(7219,18002,0),(7220,18042,0),(7221,18043,0),(7222,18044,0),(7223,18047,0),(7224,18048,0),(7225,18062,0),(7226,18082,0),(7227,18083,0),(7228,18102,0),(7229,18104,0),(7230,18122,0),(7231,18123,0),(7232,18161,0),(7233,18162,0),(7234,18163,0),(7235,18164,0),(7236,18165,0),(7237,18166,0),(7238,18167,0),(7239,18168,0),(7240,18202,0),(7241,18203,0),(7242,18204,0),(7243,18208,0),(7244,18231,0),(7245,18238,0),(7246,18263,0),(7247,18282,0),(7248,18293,0),(7249,18295,0),(7250,18296,0),(7251,18298,0),(7252,18301,0),(7253,18303,0),(7254,18304,0),(7255,18305,0),(7256,18306,0),(7257,18307,0),(7258,18308,0),(7259,18309,0),(7260,18310,0),(7261,18311,0),(7262,18312,0),(7263,18313,0),(7264,18316,0),(7265,18318,0),(7266,18319,0),(7267,18320,0),(7268,18321,0),(7269,18322,0),(7270,18323,0),(7271,18324,0),(7272,18325,0),(7273,18326,0),(7274,18327,0),(7275,18328,0),(7276,18337,0),(7277,18338,0),(7278,18339,0),(7279,18341,0),(7280,18342,0),(7281,18344,0),(7282,18346,0),(7283,18347,0),(7284,18348,0),(7285,18349,0),(7286,18350,0),(7287,18351,0),(7288,18352,0),(7289,18353,0),(7290,18366,0),(7291,18367,0),(7292,18368,0),(7293,18369,0),(7294,18372,0),(7295,18373,0),(7296,18374,0),(7297,18375,0),(7298,18376,0),(7299,18377,0),(7300,18378,0),(7301,18379,0),(7302,18380,0),(7303,18382,0),(7304,18383,0),(7305,18384,0),(7306,18385,0),(7307,18386,0),(7308,18387,0),(7309,18388,0),(7310,18389,0),(7311,18390,0),(7312,18391,0),(7313,18392,0),(7314,18393,0),(7315,18394,0),(7316,18396,0),(7317,18405,0),(7318,18407,0),(7319,18408,0),(7320,18409,0),(7321,18410,0),(7322,18411,0),(7323,18413,0),(7324,18419,0),(7325,18420,0),(7326,18421,0),(7327,18424,0),(7328,18425,0),(7329,18427,0),(7330,18429,0),(7331,18430,0),(7332,18432,0),(7333,18434,0),(7334,18435,0),(7335,18436,0),(7336,18437,0),(7337,18440,0),(7338,18441,0),(7339,18445,0),(7340,18447,0),(7341,18448,0),(7342,18449,0),(7343,18450,0),(7344,18451,0),(7345,18452,0),(7346,18453,0),(7347,18454,0),(7348,18455,0),(7349,18456,0),(7350,18457,0),(7351,18458,0),(7352,18459,0),(7353,18460,0),(7354,18461,0),(7355,18462,0),(7356,18463,0),(7357,18475,0),(7358,18476,0),(7359,18477,0),(7360,18478,0),(7361,18479,0),(7362,18480,0),(7363,18481,0),(7364,18482,0),(7365,18483,0),(7366,18484,0),(7367,18485,0),(7368,18486,0),(7369,18490,0),(7370,18491,0),(7371,18493,0),(7372,18494,0),(7373,18495,0),(7374,18496,0),(7375,18497,0),(7376,18498,0),(7377,18499,0),(7378,18502,0),(7379,18503,0),(7380,18504,0),(7381,18505,0),(7382,18506,0),(7383,18507,0),(7384,18508,0),(7385,18509,0),(7386,18510,0),(7387,18511,0),(7388,18520,0),(7389,18521,0),(7390,18523,0),(7391,18524,0),(7392,18525,0),(7393,18526,0),(7394,18527,0),(7395,18528,0),(7396,18529,0),(7397,18530,0),(7398,18531,0),(7399,18532,0),(7400,18533,0),(7401,18534,0),(7402,18535,0),(7403,18536,0),(7404,18538,0),(7405,18541,0),(7406,18542,0),(7407,18544,0),(7408,18545,0),(7409,18546,0),(7410,18547,0),(7411,18582,0),(7412,18583,0),(7413,18584,0),(7414,18596,0),(7415,18602,0),(7416,18608,0),(7417,18609,0),(7418,18610,0),(7419,18611,0),(7420,18612,0),(7421,18644,0),(7422,18671,0),(7423,18672,0),(7424,18673,0),(7425,18676,0),(7426,18677,0),(7427,18680,0),(7428,18681,0),(7429,18682,0),(7430,18683,0),(7431,18686,0),(7432,18689,0),(7433,18690,0),(7434,18692,0),(7435,18693,0),(7436,18694,0),(7437,18695,0),(7438,18696,0),(7439,18697,0),(7440,18698,0),(7441,18699,0),(7442,18700,0),(7443,18702,0),(7444,18709,0),(7445,18710,0),(7446,18711,0),(7447,18712,0),(7448,18713,0),(7449,18715,0),(7450,18716,0),(7451,18717,0),(7452,18718,0),(7453,18720,0),(7454,18721,0),(7455,18722,0),(7456,18725,0),(7457,18726,0),(7458,18727,0),(7459,18729,0),(7460,18730,0),(7461,18734,0),(7462,18735,0),(7463,18736,0),(7464,18737,0),(7465,18738,0),(7466,18739,0),(7467,18740,0),(7468,18741,0),(7469,18742,0),(7470,18743,0),(7471,18744,0),(7472,18745,0),(7473,18747,0),(7474,18754,0),(7475,18755,0),(7476,18756,0),(7477,18757,0),(7478,18758,0),(7479,18759,0),(7480,18761,0),(7481,18762,0),(7482,18763,0),(7483,18764,0),(7484,18765,0),(7485,18800,0),(7486,18801,0),(7487,18803,0),(7488,18805,0),(7489,18806,0),(7490,18807,0),(7491,18808,0),(7492,18809,0),(7493,18810,0),(7494,18811,0),(7495,18812,0),(7496,18816,0),(7497,18817,0),(7498,18822,0),(7499,18823,0),(7500,18824,0),(7501,18825,0),(7502,18826,0),(7503,18827,0),(7504,18828,0),(7505,18829,0),(7506,18830,0),(7507,18831,0),(7508,18832,0),(7509,18833,0),(7510,18835,0),(7511,18836,0),(7512,18837,0),(7513,18838,0),(7514,18840,0),(7515,18842,0),(7516,18843,0),(7517,18844,0),(7518,18847,0),(7519,18848,0),(7520,18855,0),(7521,18860,0),(7522,18861,0),(7523,18865,0),(7524,18866,0),(7525,18867,0),(7526,18868,0),(7527,18869,0),(7528,18870,0),(7529,18871,0),(7530,18872,0),(7531,18873,0),(7532,18874,0),(7533,18875,0),(7534,18876,0),(7535,18877,0),(7536,18878,0),(7537,18881,0),(7538,18882,0),(7539,18948,0),(7540,18957,0),(7541,18983,0),(7542,18985,0),(7543,19014,0),(7544,19015,0),(7545,19019,0),(7546,19022,0),(7547,19028,0),(7548,19031,0),(7549,19032,0),(7550,19037,0),(7551,19039,0),(7552,19040,0),(7553,19041,0),(7554,19042,0),(7555,19043,0),(7556,19044,0),(7557,19047,0),(7558,19048,0),(7559,19049,0),(7560,19050,0),(7561,19051,0),(7562,19052,0),(7563,19053,0),(7564,19056,0),(7565,19057,0),(7566,19058,0),(7567,19059,0),(7568,19082,0),(7569,19083,0),(7570,19084,0),(7571,19085,0),(7572,19086,0),(7573,19087,0),(7574,19088,0),(7575,19089,0),(7576,19090,0),(7577,19091,0),(7578,19092,0),(7579,19093,0),(7580,19094,0),(7581,19099,0),(7582,19100,0),(7583,19101,0),(7584,19102,0),(7585,19103,0),(7586,19104,0),(7587,19105,0),(7588,19106,0),(7589,19107,0),(7590,19108,0),(7591,19110,0),(7592,19111,0),(7593,19112,0),(7594,19113,0),(7595,19114,0),(7596,19115,0),(7597,19116,0),(7598,19117,0),(7599,19118,0),(7600,19119,0),(7601,19121,0),(7602,19123,0),(7603,19124,0),(7604,19125,0),(7605,19126,0),(7606,19127,0),(7607,19128,0),(7608,19129,0),(7609,19130,0),(7610,19131,0),(7611,19132,0),(7612,19133,0),(7613,19134,0),(7614,19135,0),(7615,19136,0),(7616,19137,0),(7617,19139,0),(7618,19142,0),(7619,19143,0),(7620,19144,0),(7621,19145,0),(7622,19146,0),(7623,19148,0),(7624,19149,0),(7625,19156,0),(7626,19157,0),(7627,19158,0),(7628,19160,0),(7629,19162,0),(7630,19163,0),(7631,19164,0),(7632,19165,0),(7633,19166,0),(7634,19167,0),(7635,19168,0),(7636,19169,0),(7637,19170,0),(7638,19214,0),(7639,19226,0),(7640,19286,0),(7641,19292,0),(7642,19293,0),(7643,19295,0),(7644,19308,0),(7645,19309,0),(7646,19310,0),(7647,19311,0),(7648,19312,0),(7649,19315,0),(7650,19316,0),(7651,19317,0),(7652,19321,0),(7653,19323,0),(7654,19324,0),(7655,19334,0),(7656,19335,0),(7657,19346,0),(7658,19347,0),(7659,19348,0),(7660,19349,0),(7661,19350,0),(7662,19351,0),(7663,19352,0),(7664,19353,0),(7665,19354,0),(7666,19355,0),(7667,19356,0),(7668,19357,0),(7669,19358,0),(7670,19360,0),(7671,19361,0),(7672,19362,0),(7673,19363,0),(7674,19364,0),(7675,19365,0),(7676,19366,0),(7677,19367,0),(7678,19368,0),(7679,19369,0),(7680,19370,0),(7681,19372,0),(7682,19373,0),(7683,19374,0),(7684,19375,0),(7685,19378,0),(7686,19380,0),(7687,19381,0),(7688,19385,0),(7689,19386,0),(7690,19387,0),(7691,19388,0),(7692,19389,0),(7693,19390,0),(7694,19391,0),(7695,19392,0),(7696,19393,0),(7697,19394,0),(7698,19396,0),(7699,19398,0),(7700,19399,0),(7701,19400,0),(7702,19401,0),(7703,19402,0),(7704,19404,0),(7705,19405,0),(7706,19407,0),(7707,19430,0),(7708,19433,0),(7709,19435,0),(7710,19436,0),(7711,19437,0),(7712,19438,0),(7713,19439,0),(7714,19485,0),(7715,19486,0),(7716,19487,0),(7717,19488,0),(7718,19505,0),(7719,19506,0),(7720,19507,0),(7721,19508,0),(7722,19509,0),(7723,19526,0),(7724,19527,0),(7725,19528,0),(7726,19529,0),(7727,19530,0),(7728,19531,0),(7729,19532,0),(7730,19533,0),(7731,19542,0),(7732,19543,0),(7733,19544,0),(7734,19545,0),(7735,19546,0),(7736,19547,0),(7737,19548,0),(7738,19549,0),(7739,19550,0),(7740,19551,0),(7741,19552,0),(7742,19553,0),(7743,19554,0),(7744,19555,0),(7745,19556,0),(7746,19557,0),(7747,19558,0),(7748,19559,0),(7749,19560,0),(7750,19561,0),(7751,19562,0),(7752,19563,0),(7753,19564,0),(7754,19565,0),(7755,19566,0),(7756,19567,0),(7757,19568,0),(7758,19569,0),(7759,19570,0),(7760,19571,0),(7761,19572,0),(7762,19573,0),(7763,19578,0),(7764,19580,0),(7765,19581,0),(7766,19582,0),(7767,19583,0),(7768,19584,0),(7769,19587,0),(7770,19589,0),(7771,19590,0),(7772,19595,0),(7773,19596,0),(7774,19597,0),(7775,19623,0),(7776,19682,0),(7777,19683,0),(7778,19684,0),(7779,19685,0),(7780,19686,0),(7781,19687,0),(7782,19688,0),(7783,19689,0),(7784,19690,0),(7785,19691,0),(7786,19692,0),(7787,19693,0),(7788,19694,0),(7789,19695,0),(7790,19742,0),(7791,19743,0),(7792,19762,0),(7793,19763,0),(7794,19808,0),(7795,19822,0),(7796,19823,0),(7797,19824,0),(7798,19825,0),(7799,19826,0),(7800,19827,0),(7801,19828,0),(7802,19829,0),(7803,19830,0),(7804,19831,0),(7805,19832,0),(7806,19833,0),(7807,19834,0),(7808,19835,0),(7809,19836,0),(7810,19838,0),(7811,19839,0),(7812,19840,0),(7813,19841,0),(7814,19842,0),(7815,19843,0),(7816,19845,0),(7817,19846,0),(7818,19848,0),(7819,19849,0),(7820,19852,0),(7821,19853,0),(7822,19854,0),(7823,19855,0),(7824,19857,0),(7825,19859,0),(7826,19861,0),(7827,19862,0),(7828,19864,0),(7829,19865,0),(7830,19866,0),(7831,19867,0),(7832,19869,0),(7833,19870,0),(7834,19874,0),(7835,19875,0),(7836,19877,0),(7837,19878,0),(7838,19879,0),(7839,19884,0),(7840,19886,0),(7841,19887,0),(7842,19888,0),(7843,19889,0),(7844,19890,0),(7845,19891,0),(7846,19892,0),(7847,19894,0),(7848,19895,0),(7849,19896,0),(7850,19897,0),(7851,19899,0),(7852,19900,0),(7853,19901,0),(7854,19903,0),(7855,19904,0),(7856,19906,0),(7857,19907,0),(7858,19908,0),(7859,19909,0),(7860,19910,0),(7861,19913,0),(7862,19915,0),(7863,19916,0),(7864,19917,0),(7865,19918,0),(7866,19919,0),(7867,19921,0),(7868,19922,0),(7869,19924,0),(7870,19927,0),(7871,19928,0),(7872,19929,0),(7873,19944,0),(7874,19945,0),(7875,19946,0),(7876,19961,0),(7877,19962,0),(7878,19963,0),(7879,19964,0),(7880,19965,0),(7881,19967,0),(7882,19968,0),(7883,19969,0),(7884,19970,0),(7885,19972,0),(7886,19980,0),(7887,19981,0),(7888,19982,0),(7889,19983,0),(7890,19984,0),(7891,19986,0),(7892,19987,0),(7893,19988,0),(7894,19989,0),(7895,19993,0),(7896,19998,0),(7897,19999,0),(7898,20003,0),(7899,20005,0),(7900,20032,0),(7901,20033,0),(7902,20034,0),(7903,20035,0),(7904,20038,0),(7905,20039,0),(7906,20041,0),(7907,20042,0),(7908,20043,0),(7909,20044,0),(7910,20045,0),(7911,20046,0),(7912,20047,0),(7913,20048,0),(7914,20049,0),(7915,20050,0),(7916,20051,0),(7917,20052,0),(7918,20053,0),(7919,20054,0),(7920,20055,0),(7921,20056,0),(7922,20057,0),(7923,20058,0),(7924,20059,0),(7925,20060,0),(7926,20061,0),(7927,20068,0),(7928,20069,0),(7929,20070,0),(7930,20073,0),(7931,20082,0),(7932,20083,0),(7933,20088,0),(7934,20089,0),(7935,20090,0),(7936,20091,0),(7937,20092,0),(7938,20093,0),(7939,20094,0),(7940,20095,0),(7941,20096,0),(7942,20097,0),(7943,20098,0),(7944,20099,0),(7945,20100,0),(7946,20101,0),(7947,20102,0),(7948,20103,0),(7949,20104,0),(7950,20105,0),(7951,20106,0),(7952,20107,0),(7953,20108,0),(7954,20109,0),(7955,20110,0),(7956,20111,0),(7957,20112,0),(7958,20113,0),(7959,20114,0),(7960,20115,0),(7961,20116,0),(7962,20117,0),(7963,20118,0),(7964,20119,0),(7965,20120,0),(7966,20121,0),(7967,20122,0),(7968,20123,0),(7969,20124,0),(7970,20125,0),(7971,20126,0),(7972,20127,0),(7973,20128,0),(7974,20129,0),(7975,20131,0),(7976,20132,0),(7977,20134,0),(7978,20150,0),(7979,20151,0),(7980,20152,0),(7981,20153,0),(7982,20154,0),(7983,20155,0),(7984,20156,0),(7985,20157,0),(7986,20158,0),(7987,20159,0),(7988,20160,0),(7989,20161,0),(7990,20162,0),(7991,20163,0),(7992,20164,0),(7993,20165,0),(7994,20166,0),(7995,20167,0),(7996,20168,0),(7997,20169,0),(7998,20170,0),(7999,20171,0),(8000,20172,0),(8001,20173,0),(8002,20174,0),(8003,20175,0),(8004,20176,0),(8005,20177,0),(8006,20178,0),(8007,20179,0),(8008,20180,0),(8009,20181,0),(8010,20182,0),(8011,20183,0),(8012,20184,0),(8013,20185,0),(8014,20186,0),(8015,20187,0),(8016,20188,0),(8017,20189,0),(8018,20190,0),(8019,20191,0),(8020,20192,0),(8021,20193,0),(8022,20194,0),(8023,20195,0),(8024,20196,0),(8025,20197,0),(8026,20198,0),(8027,20199,0),(8028,20200,0),(8029,20201,0),(8030,20202,0),(8031,20203,0),(8032,20204,0),(8033,20205,0),(8034,20206,0),(8035,20207,0),(8036,20208,0),(8037,20209,0),(8038,20210,0),(8039,20211,0),(8040,20212,0),(8041,20213,0),(8042,20214,0),(8043,20215,0),(8044,20216,0),(8045,20217,0),(8046,20218,0),(8047,20219,0),(8048,20220,0),(8049,20255,0),(8050,20257,0),(8051,20258,0),(8052,20259,0),(8053,20260,0),(8054,20261,0),(8055,20262,0),(8056,20263,0),(8057,20264,0),(8058,20265,0),(8059,20266,0),(8060,20295,0),(8061,20296,0),(8062,20326,0),(8063,20340,0),(8064,20353,0),(8065,20369,0),(8066,20370,0),(8067,20372,0),(8068,20380,0),(8069,20406,0),(8070,20407,0),(8071,20408,0),(8072,20412,0),(8073,20417,0),(8074,20425,0),(8075,20427,0),(8076,20428,0),(8077,20430,0),(8078,20434,0),(8079,20437,0),(8080,20438,0),(8081,20440,0),(8082,20441,0),(8083,20443,0),(8084,20468,0),(8085,20476,0),(8086,20477,0),(8087,20478,0),(8088,20479,0),(8089,20480,0),(8090,20481,0),(8091,20487,0),(8092,20488,0),(8093,20502,0),(8094,20504,0),(8095,20517,0),(8096,20521,0),(8097,20522,0),(8098,20524,0),(8099,20530,0),(8100,20536,0),(8101,20537,0),(8102,20538,0),(8103,20539,0),(8104,20549,0),(8105,20550,0),(8106,20551,0),(8107,20556,0),(8108,20575,0),(8109,20577,0),(8110,20578,0),(8111,20579,0),(8112,20580,0),(8113,20581,0),(8114,20582,0),(8115,20599,0),(8116,20615,0),(8117,20616,0),(8118,20617,0),(8119,20618,0),(8120,20619,0),(8121,20621,0),(8122,20623,0),(8123,20625,0),(8124,20626,0),(8125,20627,0),(8126,20628,0),(8127,20629,0),(8128,20630,0),(8129,20631,0),(8130,20633,0),(8131,20634,0),(8132,20635,0),(8133,20637,0),(8134,20638,0),(8135,20639,0),(8136,20640,0),(8137,20641,0),(8138,20642,0),(8139,20643,0),(8140,20646,0),(8141,20647,0),(8142,20648,0),(8143,20650,0),(8144,20652,0),(8145,20653,0),(8146,20654,0),(8147,20655,0),(8148,20656,0),(8149,20657,0),(8150,20658,0),(8151,20659,0),(8152,20660,0),(8153,20661,0),(8154,20662,0),(8155,20663,0),(8156,20664,0),(8157,20665,0),(8158,20666,0),(8159,20667,0),(8160,20668,0),(8161,20669,0),(8162,20670,0),(8163,20671,0),(8164,20672,0),(8165,20673,0),(8166,20674,0),(8167,20675,0),(8168,20680,0),(8169,20681,0),(8170,20683,0),(8171,20684,0),(8172,20686,0),(8173,20687,0),(8174,20688,0),(8175,20689,0),(8176,20690,0),(8177,20691,0),(8178,20693,0),(8179,20694,0),(8180,20696,0),(8181,20697,0),(8182,20698,0),(8183,20699,0),(8184,20700,0),(8185,20701,0),(8186,20702,0),(8187,20703,0),(8188,20704,0),(8189,20705,0),(8190,20706,0),(8191,20707,0),(8192,20710,0),(8193,20711,0),(8194,20712,0),(8195,20713,0),(8196,20714,0),(8197,20715,0),(8198,20716,0),(8199,20717,0),(8200,20718,0),(8201,20719,0),(8202,20720,0),(8203,20722,0),(8204,20723,0),(8205,20724,0),(8206,20738,0),(8207,20773,0),(8208,20774,0),(8209,20775,0),(8210,20776,0),(8211,20777,0),(8212,20778,0),(8213,20779,0),(8214,20780,0),(8215,20782,0),(8216,20784,0),(8217,20785,0),(8218,20786,0),(8219,20787,0),(8220,20788,0),(8221,20789,0),(8222,20790,0),(8223,20791,0),(8224,20793,0),(8225,20795,0),(8226,20796,0),(8227,20832,0),(8228,20835,0),(8229,20836,0),(8230,20837,0),(8231,20838,0),(8232,20839,0),(8233,20840,0),(8234,20841,0),(8235,20849,0),(8236,20850,0),(8237,20851,0),(8238,20852,0),(8239,20853,0),(8240,20891,0),(8241,20892,0),(8242,20893,0),(8243,20894,0),(8244,20895,0),(8245,20896,0),(8246,20897,0),(8247,20898,0),(8248,20899,0),(8249,20900,0),(8250,20901,0),(8251,20902,0),(8252,20903,0),(8253,20904,0),(8254,20910,0),(8255,20911,0),(8256,20912,0),(8257,20913,0),(8258,20914,0),(8259,20915,0),(8260,20916,0),(8261,20917,0),(8262,20918,0),(8263,20919,0),(8264,20920,0),(8265,20921,0),(8266,20922,0),(8267,20923,0),(8268,20924,0),(8269,20925,0),(8270,20954,0),(8271,20969,0),(8272,20977,0),(8273,20978,0),(8274,20979,0),(8275,20980,0),(8276,20981,0),(8277,20982,0),(8278,20983,0),(8279,20984,0),(8280,20985,0),(8281,20986,0),(8282,20987,0),(8283,20988,0),(8284,20989,0),(8285,20990,0),(8286,20991,0),(8287,20992,0),(8288,20993,0),(8289,20994,0),(8290,20995,0),(8291,20996,0),(8292,20997,0),(8293,20998,0),(8294,20999,0),(8295,21000,0),(8296,21001,0),(8297,21002,0),(8298,21003,0),(8299,21004,0),(8300,21005,0),(8301,21006,0),(8302,21007,0),(8303,21008,0),(8304,21009,0),(8305,21010,0),(8306,21011,0),(8307,21012,0),(8308,21013,0),(8309,21014,0),(8310,21015,0),(8311,21016,0),(8312,21017,0),(8313,21018,0),(8314,21019,0),(8315,21020,0),(8316,21021,0),(8317,21022,0),(8318,21040,0),(8319,21047,0),(8320,21060,0),(8321,21075,0),(8322,21088,0),(8323,21101,0),(8324,21102,0),(8325,21121,0),(8326,21122,0),(8327,21123,0),(8328,21124,0),(8329,21125,0),(8330,21126,0),(8331,21127,0),(8332,21128,0),(8333,21129,0),(8334,21134,0),(8335,21154,0),(8336,21157,0),(8337,21178,0),(8338,21183,0),(8339,21184,0),(8340,21185,0),(8341,21186,0),(8342,21187,0),(8343,21188,0),(8344,21192,0),(8345,21242,0),(8346,21244,0),(8347,21268,0),(8348,21269,0),(8349,21272,0),(8350,21273,0),(8351,21275,0),(8352,21276,0),(8353,21278,0),(8354,21286,0),(8355,21311,0),(8356,21312,0),(8357,21316,0),(8358,21317,0),(8359,21318,0),(8360,21319,0),(8361,21320,0),(8362,21322,0),(8363,21329,0),(8364,21330,0),(8365,21331,0),(8366,21332,0),(8367,21333,0),(8368,21334,0),(8369,21335,0),(8370,21336,0),(8371,21337,0),(8372,21338,0),(8373,21339,0),(8374,21343,0),(8375,21344,0),(8376,21345,0),(8377,21346,0),(8378,21347,0),(8379,21348,0),(8380,21349,0),(8381,21350,0),(8382,21351,0),(8383,21352,0),(8384,21353,0),(8385,21354,0),(8386,21355,0),(8387,21356,0),(8388,21357,0),(8389,21359,0),(8390,21360,0),(8391,21361,0),(8392,21362,0),(8393,21364,0),(8394,21365,0),(8395,21366,0),(8396,21367,0),(8397,21368,0),(8398,21370,0),(8399,21372,0),(8400,21373,0),(8401,21374,0),(8402,21375,0),(8403,21376,0),(8404,21387,0),(8405,21388,0),(8406,21389,0),(8407,21390,0),(8408,21391,0),(8409,21392,0),(8410,21394,0),(8411,21395,0),(8412,21397,0),(8413,21398,0),(8414,21400,0),(8415,21401,0),(8416,21403,0),(8417,21404,0),(8418,21406,0),(8419,21407,0),(8420,21409,0),(8421,21410,0),(8422,21412,0),(8423,21413,0),(8424,21415,0),(8425,21416,0),(8426,21418,0),(8427,21419,0),(8428,21420,0),(8429,21421,0),(8430,21422,0),(8431,21423,0),(8432,21424,0),(8433,21425,0),(8434,21426,0),(8435,21427,0),(8436,21428,0),(8437,21429,0),(8438,21430,0),(8439,21431,0),(8440,21432,0),(8441,21433,0),(8442,21434,0),(8443,21435,0),(8444,21437,0),(8445,21440,0),(8446,21441,0),(8447,21442,0),(8448,21443,0),(8449,21444,0),(8450,21446,0),(8451,21447,0),(8452,21448,0),(8453,21449,0),(8454,21450,0),(8455,21451,0),(8456,21452,0),(8457,21453,0),(8458,21454,0),(8459,21455,0),(8460,21456,0),(8461,21457,0),(8462,21458,0),(8463,21459,0),(8464,21460,0),(8465,21461,0),(8466,21462,0),(8467,21463,0),(8468,21464,0),(8469,21465,0),(8470,21466,0),(8471,21467,0),(8472,21468,0),(8473,21469,0),(8474,21470,0),(8475,21471,0),(8476,21472,0),(8477,21474,0),(8478,21475,0),(8479,21476,0),(8480,21478,0),(8481,21479,0),(8482,21480,0),(8483,21481,0),(8484,21482,0),(8485,21484,0),(8486,21485,0),(8487,21486,0),(8488,21487,0),(8489,21489,0),(8490,21490,0),(8491,21491,0),(8492,21492,0),(8493,21493,0),(8494,21494,0),(8495,21495,0),(8496,21496,0),(8497,21497,0),(8498,21498,0),(8499,21499,0),(8500,21500,0),(8501,21501,0),(8502,21502,0),(8503,21503,0),(8504,21517,0),(8505,21520,0),(8506,21521,0),(8507,21522,0),(8508,21523,0),(8509,21524,0),(8510,21525,0),(8511,21527,0),(8512,21530,0),(8513,21532,0),(8514,21538,0),(8515,21539,0),(8516,21541,0),(8517,21542,0),(8518,21543,0),(8519,21544,0),(8520,21549,0),(8521,21550,0),(8522,21551,0),(8523,21553,0),(8524,21554,0),(8525,21555,0),(8526,21564,0),(8527,21572,0),(8528,21573,0),(8529,21580,0),(8530,21581,0),(8531,21582,0),(8532,21583,0),(8533,21584,0),(8534,21585,0),(8535,21586,0),(8536,21587,0),(8537,21588,0),(8538,21594,0),(8539,21597,0),(8540,21598,0),(8541,21599,0),(8542,21600,0),(8543,21602,0),(8544,21603,0),(8545,21604,0),(8546,21605,0),(8547,21606,0),(8548,21607,0),(8549,21609,0),(8550,21610,0),(8551,21611,0),(8552,21612,0),(8553,21613,0),(8554,21614,0),(8555,21615,0),(8556,21616,0),(8557,21617,0),(8558,21618,0),(8559,21619,0),(8560,21621,0),(8561,21622,0),(8562,21623,0),(8563,21624,0),(8564,21626,0),(8565,21627,0),(8566,21635,0),(8567,21639,0),(8568,21645,0),(8569,21648,0),(8570,21650,0),(8571,21651,0),(8572,21652,0),(8573,21663,0),(8574,21665,0),(8575,21666,0),(8576,21667,0),(8577,21668,0),(8578,21669,0),(8579,21671,0),(8580,21672,0),(8581,21673,0),(8582,21674,0),(8583,21675,0),(8584,21676,0),(8585,21679,0),(8586,21680,0),(8587,21682,0),(8588,21683,0),(8589,21684,0),(8590,21686,0),(8591,21688,0),(8592,21689,0),(8593,21691,0),(8594,21692,0),(8595,21693,0),(8596,21694,0),(8597,21696,0),(8598,21697,0),(8599,21698,0),(8600,21699,0),(8601,21701,0),(8602,21703,0),(8603,21704,0),(8604,21705,0),(8605,21706,0),(8606,21708,0),(8607,21710,0),(8608,21715,0),(8609,21774,0),(8610,21780,0),(8611,21794,0),(8612,21795,0),(8613,21796,0),(8614,21800,0),(8615,21801,0),(8616,21802,0),(8617,21803,0),(8618,21804,0),(8619,21805,0),(8620,21806,0),(8621,21810,0),(8622,21814,0),(8623,21837,0),(8624,21838,0),(8625,21839,0),(8626,21846,0),(8627,21847,0),(8628,21848,0),(8629,21849,0),(8630,21850,0),(8631,21851,0),(8632,21852,0),(8633,21853,0),(8634,21854,0),(8635,21855,0),(8636,21856,0),(8637,21859,0),(8638,21860,0),(8639,21861,0),(8640,21862,0),(8641,21863,0),(8642,21864,0),(8643,21865,0),(8644,21866,0),(8645,21867,0),(8646,21868,0),(8647,21869,0),(8648,21870,0),(8649,21871,0),(8650,21873,0),(8651,21874,0),(8652,21875,0),(8653,21888,0),(8654,21889,0),(8655,21890,0),(8656,21994,0),(8657,21995,0),(8658,21996,0),(8659,21997,0),(8660,21998,0),(8661,21999,0),(8662,22000,0),(8663,22001,0),(8664,22002,0),(8665,22003,0),(8666,22004,0),(8667,22005,0),(8668,22006,0),(8669,22007,0),(8670,22008,0),(8671,22009,0),(8672,22010,0),(8673,22011,0),(8674,22013,0),(8675,22015,0),(8676,22016,0),(8677,22017,0),(8678,22060,0),(8679,22061,0),(8680,22062,0),(8681,22063,0),(8682,22064,0),(8683,22065,0),(8684,22066,0),(8685,22067,0),(8686,22068,0),(8687,22069,0),(8688,22070,0),(8689,22071,0),(8690,22072,0),(8691,22073,0),(8692,22074,0),(8693,22075,0),(8694,22076,0),(8695,22077,0),(8696,22078,0),(8697,22079,0),(8698,22080,0),(8699,22081,0),(8700,22082,0),(8701,22083,0),(8702,22084,0),(8703,22085,0),(8704,22086,0),(8705,22087,0),(8706,22088,0),(8707,22089,0),(8708,22090,0),(8709,22091,0),(8710,22092,0),(8711,22093,0),(8712,22095,0),(8713,22096,0),(8714,22097,0),(8715,22098,0),(8716,22099,0),(8717,22100,0),(8718,22101,0),(8719,22102,0),(8720,22106,0),(8721,22107,0),(8722,22108,0),(8723,22109,0),(8724,22110,0),(8725,22111,0),(8726,22112,0),(8727,22113,0),(8728,22191,0),(8729,22194,0),(8730,22195,0),(8731,22196,0),(8732,22197,0),(8733,22198,0),(8734,22199,0),(8735,22204,0),(8736,22205,0),(8737,22206,0),(8738,22207,0),(8739,22208,0),(8740,22210,0),(8741,22211,0),(8742,22212,0),(8743,22213,0),(8744,22215,0),(8745,22223,0),(8746,22225,0),(8747,22230,0),(8748,22231,0),(8749,22232,0),(8750,22234,0),(8751,22240,0),(8752,22241,0),(8753,22242,0),(8754,22245,0),(8755,22247,0),(8756,22253,0),(8757,22254,0),(8758,22256,0),(8759,22266,0),(8760,22267,0),(8761,22269,0),(8762,22270,0),(8763,22271,0),(8764,22272,0),(8765,22273,0),(8766,22274,0),(8767,22275,0),(8768,22276,0),(8769,22277,0),(8770,22278,0),(8771,22279,0),(8772,22280,0),(8773,22281,0),(8774,22282,0),(8775,22301,0),(8776,22302,0),(8777,22303,0),(8778,22304,0),(8779,22305,0),(8780,22306,0),(8781,22311,0),(8782,22313,0),(8783,22314,0),(8784,22315,0),(8785,22317,0),(8786,22318,0),(8787,22319,0),(8788,22322,0),(8789,22325,0),(8790,22328,0),(8791,22329,0),(8792,22330,0),(8793,22332,0),(8794,22333,0),(8795,22335,0),(8796,22336,0),(8797,22337,0),(8798,22341,0),(8799,22342,0),(8800,22343,0),(8801,22346,0),(8802,22347,0),(8803,22348,0),(8804,22377,0),(8805,22378,0),(8806,22379,0),(8807,22380,0),(8808,22383,0),(8809,22384,0),(8810,22385,0),(8811,22391,0),(8812,22394,0),(8813,22404,0),(8814,22405,0),(8815,22406,0),(8816,22407,0),(8817,22408,0),(8818,22409,0),(8819,22410,0),(8820,22411,0),(8821,22412,0),(8822,22416,0),(8823,22417,0),(8824,22418,0),(8825,22419,0),(8826,22420,0),(8827,22421,0),(8828,22422,0),(8829,22423,0),(8830,22424,0),(8831,22425,0),(8832,22426,0),(8833,22427,0),(8834,22428,0),(8835,22429,0),(8836,22430,0),(8837,22431,0),(8838,22436,0),(8839,22437,0),(8840,22438,0),(8841,22439,0),(8842,22440,0),(8843,22441,0),(8844,22442,0),(8845,22443,0),(8846,22458,0),(8847,22464,0),(8848,22465,0),(8849,22466,0),(8850,22467,0),(8851,22468,0),(8852,22469,0),(8853,22470,0),(8854,22471,0),(8855,22472,0),(8856,22476,0),(8857,22477,0),(8858,22478,0),(8859,22479,0),(8860,22480,0),(8861,22481,0),(8862,22482,0),(8863,22483,0),(8864,22488,0),(8865,22489,0),(8866,22490,0),(8867,22491,0),(8868,22492,0),(8869,22493,0),(8870,22494,0),(8871,22495,0),(8872,22496,0),(8873,22497,0),(8874,22498,0),(8875,22499,0),(8876,22500,0),(8877,22501,0),(8878,22502,0),(8879,22503,0),(8880,22504,0),(8881,22505,0),(8882,22506,0),(8883,22507,0),(8884,22508,0),(8885,22509,0),(8886,22510,0),(8887,22511,0),(8888,22512,0),(8889,22513,0),(8890,22514,0),(8891,22515,0),(8892,22516,0),(8893,22517,0),(8894,22518,0),(8895,22519,0),(8896,22589,0),(8897,22596,0),(8898,22630,0),(8899,22631,0),(8900,22632,0),(8901,22651,0),(8902,22652,0),(8903,22654,0),(8904,22655,0),(8905,22656,0),(8906,22658,0),(8907,22660,0),(8908,22661,0),(8909,22662,0),(8910,22663,0),(8911,22664,0),(8912,22665,0),(8913,22666,0),(8914,22667,0),(8915,22668,0),(8916,22669,0),(8917,22670,0),(8918,22671,0),(8919,22672,0),(8920,22673,0),(8921,22676,0),(8922,22688,0),(8923,22689,0),(8924,22690,0),(8925,22691,0),(8926,22699,0),(8927,22700,0),(8928,22701,0),(8929,22702,0),(8930,22709,0),(8931,22711,0),(8932,22712,0),(8933,22713,0),(8934,22714,0),(8935,22715,0),(8936,22716,0),(8937,22718,0),(8938,22720,0),(8939,22724,0),(8940,22730,0),(8941,22731,0),(8942,22736,0),(8943,22738,0),(8944,22740,0),(8945,22741,0),(8946,22742,0),(8947,22743,0),(8948,22744,0),(8949,22745,0),(8950,22747,0),(8951,22748,0),(8952,22749,0),(8953,22750,0),(8954,22752,0),(8955,22753,0),(8956,22756,0),(8957,22757,0),(8958,22758,0),(8959,22759,0),(8960,22760,0),(8961,22761,0),(8962,22762,0),(8963,22763,0),(8964,22764,0),(8965,22782,0),(8966,22783,0),(8967,22784,0),(8968,22798,0),(8969,22799,0),(8970,22800,0),(8971,22801,0),(8972,22802,0),(8973,22803,0),(8974,22804,0),(8975,22805,0),(8976,22806,0),(8977,22807,0),(8978,22808,0),(8979,22809,0),(8980,22810,0),(8981,22811,0),(8982,22812,0),(8983,22813,0),(8984,22814,0),(8985,22815,0),(8986,22816,0),(8987,22817,0),(8988,22818,0),(8989,22819,0),(8990,22820,0),(8991,22821,0),(8992,22843,0),(8993,22852,0),(8994,22855,0),(8995,22856,0),(8996,22857,0),(8997,22858,0),(8998,22859,0),(8999,22860,0),(9000,22862,0),(9001,22863,0),(9002,22864,0),(9003,22865,0),(9004,22867,0),(9005,22868,0),(9006,22869,0),(9007,22870,0),(9008,22872,0),(9009,22873,0),(9010,22874,0),(9011,22875,0),(9012,22876,0),(9013,22877,0),(9014,22878,0),(9015,22879,0),(9016,22880,0),(9017,22881,0),(9018,22882,0),(9019,22883,0),(9020,22884,0),(9021,22885,0),(9022,22886,0),(9023,22887,0),(9024,22936,0),(9025,22937,0),(9026,22938,0),(9027,22940,0),(9028,22941,0),(9029,22942,0),(9030,22951,0),(9031,22952,0),(9032,22953,0),(9033,22956,0),(9034,22957,0),(9035,22958,0),(9036,22959,0),(9037,22960,0),(9038,22963,0),(9039,22964,0),(9040,22965,0),(9041,22966,0),(9042,22967,0),(9043,22968,0),(9044,22969,0),(9045,22971,0),(9046,22980,0),(9047,22982,0),(9048,22983,0),(9049,22984,0),(9050,22985,0),(9051,22986,0),(9052,22987,0),(9053,22988,0),(9054,22990,0),(9055,22991,0),(9056,22992,0),(9057,22993,0),(9058,22994,0),(9059,22995,0),(9060,22996,0),(9061,22997,0),(9062,22998,0),(9063,22999,0),(9064,23000,0),(9065,23009,0),(9066,23014,0),(9067,23017,0),(9068,23019,0),(9069,23020,0),(9070,23021,0),(9071,23029,0),(9072,23030,0),(9073,23032,0),(9074,23033,0),(9075,23034,0),(9076,23035,0),(9077,23039,0),(9078,23043,0),(9079,23044,0),(9080,23045,0),(9081,23048,0),(9082,23049,0),(9083,23050,0),(9084,23051,0),(9085,23052,0),(9086,23054,0),(9087,23056,0),(9088,23068,0),(9089,23069,0),(9090,23070,0),(9091,23071,0),(9092,23072,0),(9093,23073,0),(9094,23075,0),(9095,23078,0),(9096,23081,0),(9097,23082,0),(9098,23084,0),(9099,23085,0),(9100,23087,0),(9101,23088,0),(9102,23089,0),(9103,23090,0),(9104,23091,0),(9105,23092,0),(9106,23093,0),(9107,23124,0),(9108,23126,0),(9109,23127,0),(9110,23128,0),(9111,23129,0),(9112,23132,0),(9113,23139,0),(9114,23156,0),(9115,23168,0),(9116,23170,0),(9117,23171,0),(9118,23173,0),(9119,23174,0),(9120,23177,0),(9121,23178,0),(9122,23192,0),(9123,23212,0),(9124,23213,0),(9125,23219,0),(9126,23220,0),(9127,23221,0),(9128,23225,0),(9129,23226,0),(9130,23229,0),(9131,23230,0),(9132,23232,0),(9133,23238,0),(9134,23240,0),(9135,23241,0),(9136,23242,0),(9137,23243,0),(9138,23244,0),(9139,23251,0),(9140,23252,0),(9141,23253,0),(9142,23254,0),(9143,23255,0),(9144,23256,0),(9145,23257,0),(9146,23258,0),(9147,23259,0),(9148,23260,0),(9149,23261,0),(9150,23262,0),(9151,23263,0),(9152,23264,0),(9153,23265,0),(9154,23266,0),(9155,23267,0),(9156,23272,0),(9157,23273,0),(9158,23274,0),(9159,23275,0),(9160,23276,0),(9161,23277,0),(9162,23278,0),(9163,23279,0),(9164,23280,0),(9165,23281,0),(9166,23282,0),(9167,23283,0),(9168,23284,0),(9169,23285,0),(9170,23286,0),(9171,23287,0),(9172,23288,0),(9173,23289,0),(9174,23290,0),(9175,23291,0),(9176,23292,0),(9177,23293,0),(9178,23294,0),(9179,23295,0),(9180,23296,0),(9181,23297,0),(9182,23298,0),(9183,23299,0),(9184,23300,0),(9185,23301,0),(9186,23302,0),(9187,23303,0),(9188,23304,0),(9189,23305,0),(9190,23306,0),(9191,23307,0),(9192,23308,0),(9193,23309,0),(9194,23310,0),(9195,23311,0),(9196,23312,0),(9197,23313,0),(9198,23314,0),(9199,23315,0),(9200,23316,0),(9201,23317,0),(9202,23318,0),(9203,23319,0),(9204,23321,0),(9205,23322,0),(9206,23323,0),(9207,23324,0),(9208,23328,0),(9209,23335,0),(9210,23344,0),(9211,23345,0),(9212,23346,0),(9213,23347,0),(9214,23348,0),(9215,23349,0),(9216,23350,0),(9217,23351,0),(9218,23356,0),(9219,23362,0),(9220,23363,0),(9221,23365,0),(9222,23367,0),(9223,23368,0),(9224,23369,0),(9225,23370,0),(9226,23371,0),(9227,23372,0),(9228,23373,0),(9229,23375,0),(9230,23376,0),(9231,23377,0),(9232,23382,0),(9233,23388,0),(9234,23390,0),(9235,23391,0),(9236,23392,0),(9237,23393,0),(9238,23395,0),(9239,23396,0),(9240,23397,0),(9241,23398,0),(9242,23399,0),(9243,23400,0),(9244,23401,0),(9245,23402,0),(9246,23403,0),(9247,23404,0),(9248,23405,0),(9249,23406,0),(9250,23407,0),(9251,23408,0),(9252,23409,0),(9253,23410,0),(9254,23411,0),(9255,23412,0),(9256,23413,0),(9257,23414,0),(9258,23415,0),(9259,23416,0),(9260,23420,0),(9261,23421,0),(9262,23422,0),(9263,23423,0),(9264,23428,0),(9265,23429,0),(9266,23430,0),(9267,23431,0),(9268,23432,0),(9269,23433,0),(9270,23434,0),(9271,23450,0),(9272,23451,0),(9273,23452,0),(9274,23453,0),(9275,23454,0),(9276,23455,0),(9277,23456,0),(9278,23457,0),(9279,23458,0),(9280,23459,0),(9281,23461,0),(9282,23462,0),(9283,23463,0),(9284,23464,0),(9285,23465,0),(9286,23466,0),(9287,23467,0),(9288,23468,0),(9289,23469,0),(9290,23470,0),(9291,23471,0),(9292,23472,0),(9293,23473,0),(9294,23474,0),(9295,23475,0),(9296,23476,0),(9297,23477,0),(9298,23478,0),(9299,23479,0),(9300,23481,0),(9301,23482,0),(9302,23484,0),(9303,23487,0),(9304,23488,0),(9305,23489,0),(9306,23490,0),(9307,23491,0),(9308,23493,0),(9309,23494,0),(9310,23497,0),(9311,23498,0),(9312,23499,0),(9313,23502,0),(9314,23503,0),(9315,23504,0),(9316,23505,0),(9317,23506,0),(9318,23507,0),(9319,23508,0),(9320,23509,0),(9321,23510,0),(9322,23511,0),(9323,23512,0),(9324,23513,0),(9325,23514,0),(9326,23515,0),(9327,23516,0),(9328,23517,0),(9329,23518,0),(9330,23519,0),(9331,23520,0),(9332,23521,0),(9333,23522,0),(9334,23523,0),(9335,23524,0),(9336,23525,0),(9337,23526,0),(9338,23527,0),(9339,23531,0),(9340,23532,0),(9341,23533,0),(9342,23534,0),(9343,23535,0),(9344,23536,0),(9345,23537,0),(9346,23538,0),(9347,23539,0),(9348,23540,0),(9349,23541,0),(9350,23542,0),(9351,23543,0),(9352,23544,0),(9353,23546,0),(9354,23553,0),(9355,23554,0),(9356,23555,0),(9357,23556,0),(9358,23557,0),(9359,23563,0),(9360,23564,0),(9361,23565,0),(9362,23577,0),(9363,23582,0),(9364,23583,0),(9365,23587,0),(9366,23663,0),(9367,23664,0),(9368,23665,0),(9369,23666,0),(9370,23667,0),(9371,23668,0),(9372,23673,0),(9373,23691,0),(9374,23705,0),(9375,23708,0),(9376,23709,0),(9377,23710,0),(9378,23741,0),(9379,23742,0),(9380,23743,0),(9381,23746,0),(9382,23747,0),(9383,23748,0),(9384,23758,0),(9385,23761,0),(9386,23762,0),(9387,23763,0),(9388,23772,0),(9389,23773,0),(9390,23824,0),(9391,23825,0),(9392,23828,0),(9393,23829,0),(9394,23838,0),(9395,23839,0),(9396,23844,0),(9397,23856,0),(9398,23889,0),(9399,23906,0),(9400,23907,0),(9401,23908,0),(9402,23909,0),(9403,23923,0),(9404,23924,0),(9405,23931,0),(9406,23996,0),(9407,23998,0),(9408,23999,0),(9409,24004,0),(9410,24011,0),(9411,24012,0),(9412,24013,0),(9413,24014,0),(9414,24015,0),(9415,24016,0),(9416,24017,0),(9417,24018,0),(9418,24019,0),(9419,24020,0),(9420,24021,0),(9421,24022,0),(9422,24023,0),(9423,24024,0),(9424,24034,0),(9425,24038,0),(9426,24044,0),(9427,24046,0),(9428,24063,0),(9429,24064,0),(9430,24069,0),(9431,24071,0),(9432,24083,0),(9433,24090,0),(9434,24091,0),(9435,24094,0),(9436,24100,0),(9437,24103,0),(9438,24104,0),(9439,24107,0),(9440,24108,0),(9441,24109,0),(9442,24111,0),(9443,24112,0),(9444,24113,0),(9445,24122,0),(9446,24123,0),(9447,24129,0),(9448,24130,0),(9449,24131,0),(9450,24133,0),(9451,24134,0),(9452,24135,0),(9453,24136,0),(9454,24137,0),(9455,24138,0),(9456,24141,0),(9457,24142,0),(9458,24143,0),(9459,24144,0),(9460,24145,0),(9461,24146,0),(9462,24150,0),(9463,24155,0),(9464,24222,0),(9465,24227,0),(9466,24241,0),(9467,24244,0),(9468,24249,0),(9469,24250,0),(9470,24251,0),(9471,24252,0),(9472,24253,0),(9473,24254,0),(9474,24255,0),(9475,24256,0),(9476,24257,0),(9477,24258,0),(9478,24259,0),(9479,24260,0),(9480,24261,0),(9481,24262,0),(9482,24263,0),(9483,24264,0),(9484,24266,0),(9485,24267,0),(9486,24319,0),(9487,24320,0),(9488,24321,0),(9489,24322,0),(9490,24324,0),(9491,24325,0),(9492,24326,0),(9493,24327,0),(9494,24328,0),(9495,24329,0),(9496,24331,0),(9497,24332,0),(9498,24333,0),(9499,24334,0),(9500,24339,0),(9501,24340,0),(9502,24341,0),(9503,24342,0),(9504,24343,0),(9505,24344,0),(9506,24346,0),(9507,24347,0),(9508,24348,0),(9509,24351,0),(9510,24352,0),(9511,24353,0),(9512,24354,0),(9513,24356,0),(9514,24357,0),(9515,24359,0),(9516,24360,0),(9517,24361,0),(9518,24362,0),(9519,24363,0),(9520,24364,0),(9521,24365,0),(9522,24366,0),(9523,24378,0),(9524,24379,0),(9525,24380,0),(9526,24381,0),(9527,24384,0),(9528,24387,0),(9529,24388,0),(9530,24389,0),(9531,24391,0),(9532,24392,0),(9533,24393,0),(9534,24394,0),(9535,24395,0),(9536,24396,0),(9537,24397,0),(9538,24398,0),(9539,24409,0),(9540,24417,0),(9541,24418,0),(9542,24423,0),(9543,24424,0),(9544,24425,0),(9545,24430,0),(9546,24431,0),(9547,24432,0),(9548,24433,0),(9549,24434,0),(9550,24435,0),(9551,24436,0),(9552,24437,0),(9553,24438,0),(9554,24439,0),(9555,24440,0),(9556,24441,0),(9557,24442,0),(9558,24443,0),(9559,24444,0),(9560,24445,0),(9561,24446,0),(9562,24447,0),(9563,24448,0),(9564,24450,0),(9565,24451,0),(9566,24452,0),(9567,24453,0),(9568,24454,0),(9569,24455,0),(9570,24456,0),(9571,24457,0),(9572,24458,0),(9573,24459,0),(9574,24461,0),(9575,24463,0),(9576,24464,0),(9577,24465,0),(9578,24466,0),(9579,24481,0),(9580,24495,0),(9581,24512,0),(9582,24544,0),(9583,24545,0),(9584,24546,0),(9585,24547,0),(9586,24548,0),(9587,24549,0),(9588,24550,0),(9589,24552,0),(9590,24553,0),(9591,24554,0),(9592,24555,0),(9593,24556,0),(9594,24557,0),(9595,24561,0),(9596,24562,0),(9597,24563,0),(9598,24564,0),(9599,24565,0),(9600,24566,0),(9601,24572,0),(9602,24575,0),(9603,24576,0),(9604,24577,0),(9605,24578,0),(9606,24580,0),(9607,24582,0),(9608,24583,0),(9609,24584,0),(9610,24585,0),(9611,24586,0),(9612,24587,0),(9613,24588,0),(9614,24589,0),(9615,24590,0),(9616,24591,0),(9617,24592,0),(9618,24593,0),(9619,24594,0),(9620,24595,0),(9621,24596,0),(9622,24597,0),(9623,24598,0),(9624,24599,0),(9625,24600,0),(9626,24601,0),(9627,24602,0),(9628,24603,0),(9629,24604,0),(9630,24605,0),(9631,24606,0),(9632,24607,0),(9633,24608,0),(9634,24609,0),(9635,24610,0),(9636,24611,0),(9637,24612,0),(9638,24613,0),(9639,24614,0),(9640,24615,0),(9641,24616,0),(9642,24617,0),(9643,24618,0),(9644,24619,0),(9645,24620,0),(9646,24621,0),(9647,24622,0),(9648,24623,0),(9649,24624,0),(9650,24625,0),(9651,24626,0),(9652,24627,0),(9653,24628,0),(9654,24629,0),(9655,24630,0),(9656,24631,0),(9657,24632,0),(9658,24633,0),(9659,24634,0),(9660,24635,0),(9661,24636,0),(9662,24637,0),(9663,24638,0),(9664,24639,0),(9665,24640,0),(9666,24641,0),(9667,24642,0),(9668,24643,0),(9669,24644,0),(9670,24645,0),(9671,24646,0),(9672,24647,0),(9673,24648,0),(9674,24649,0),(9675,24650,0),(9676,24651,0),(9677,24652,0),(9678,24653,0),(9679,24654,0),(9680,24655,0),(9681,24656,0),(9682,24657,0),(9683,24658,0),(9684,24659,0),(9685,24660,0),(9686,24661,0),(9687,24662,0),(9688,24663,0),(9689,24664,0),(9690,24665,0),(9691,24666,0),(9692,24667,0),(9693,24668,0),(9694,24669,0),(9695,24670,0),(9696,24671,0),(9697,24672,0),(9698,24673,0),(9699,24674,0),(9700,24675,0),(9701,24676,0),(9702,24677,0),(9703,24678,0),(9704,24679,0),(9705,24680,0),(9706,24681,0),(9707,24682,0),(9708,24683,0),(9709,24684,0),(9710,24685,0),(9711,24686,0),(9712,24687,0),(9713,24688,0),(9714,24689,0),(9715,24690,0),(9716,24691,0),(9717,24692,0),(9718,24693,0),(9719,24694,0),(9720,24695,0),(9721,24696,0),(9722,24697,0),(9723,24698,0),(9724,24699,0),(9725,24700,0),(9726,24701,0),(9727,24702,0),(9728,24703,0),(9729,24704,0),(9730,24705,0),(9731,24706,0),(9732,24707,0),(9733,24708,0),(9734,24709,0),(9735,24710,0),(9736,24711,0),(9737,24712,0),(9738,24713,0),(9739,24714,0),(9740,24715,0),(9741,24716,0),(9742,24717,0),(9743,24718,0),(9744,24719,0),(9745,24720,0),(9746,24721,0),(9747,24722,0),(9748,24723,0),(9749,24724,0),(9750,24725,0),(9751,24726,0),(9752,24727,0),(9753,24728,0),(9754,24729,0),(9755,24730,0),(9756,24731,0),(9757,24732,0),(9758,24733,0),(9759,24734,0),(9760,24735,0),(9761,24736,0),(9762,24737,0),(9763,24738,0),(9764,24739,0),(9765,24740,0),(9766,24741,0),(9767,24742,0),(9768,24743,0),(9769,24744,0),(9770,24745,0),(9771,24746,0),(9772,24747,0),(9773,24748,0),(9774,24749,0),(9775,24750,0),(9776,24751,0),(9777,24752,0),(9778,24753,0),(9779,24754,0),(9780,24755,0),(9781,24756,0),(9782,24757,0),(9783,24758,0),(9784,24759,0),(9785,24760,0),(9786,24761,0),(9787,24762,0),(9788,24763,0),(9789,24764,0),(9790,24765,0),(9791,24766,0),(9792,24767,0),(9793,24768,0),(9794,24769,0),(9795,24770,0),(9796,24771,0),(9797,24772,0),(9798,24773,0),(9799,24774,0),(9800,24775,0),(9801,24776,0),(9802,24777,0),(9803,24778,0),(9804,24779,0),(9805,24780,0),(9806,24781,0),(9807,24782,0),(9808,24783,0),(9809,24784,0),(9810,24785,0),(9811,24786,0),(9812,24787,0),(9813,24788,0),(9814,24789,0),(9815,24790,0),(9816,24791,0),(9817,24792,0),(9818,24793,0),(9819,24794,0),(9820,24795,0),(9821,24796,0),(9822,24797,0),(9823,24798,0),(9824,24799,0),(9825,24800,0),(9826,24801,0),(9827,24802,0),(9828,24803,0),(9829,24804,0),(9830,24805,0),(9831,24806,0),(9832,24807,0),(9833,24808,0),(9834,24809,0),(9835,24810,0),(9836,24811,0),(9837,24812,0),(9838,24813,0),(9839,24814,0),(9840,24815,0),(9841,24816,0),(9842,24817,0),(9843,24818,0),(9844,24819,0),(9845,24820,0),(9846,24821,0),(9847,24822,0),(9848,24823,0),(9849,24824,0),(9850,24825,0),(9851,24826,0),(9852,24827,0),(9853,24828,0),(9854,24829,0),(9855,24830,0),(9856,24831,0),(9857,24832,0),(9858,24833,0),(9859,24834,0),(9860,24835,0),(9861,24836,0),(9862,24837,0),(9863,24838,0),(9864,24839,0),(9865,24840,0),(9866,24841,0),(9867,24842,0),(9868,24843,0),(9869,24844,0),(9870,24845,0),(9871,24846,0),(9872,24847,0),(9873,24848,0),(9874,24849,0),(9875,24850,0),(9876,24851,0),(9877,24852,0),(9878,24853,0),(9879,24854,0),(9880,24855,0),(9881,24856,0),(9882,24857,0),(9883,24858,0),(9884,24859,0),(9885,24860,0),(9886,24861,0),(9887,24862,0),(9888,24863,0),(9889,24864,0),(9890,24865,0),(9891,24866,0),(9892,24867,0),(9893,24868,0),(9894,24869,0),(9895,24870,0),(9896,24871,0),(9897,24872,0),(9898,24873,0),(9899,24874,0),(9900,24875,0),(9901,24876,0),(9902,24877,0),(9903,24878,0),(9904,24879,0),(9905,24880,0),(9906,24881,0),(9907,24882,0),(9908,24883,0),(9909,24884,0),(9910,24885,0),(9911,24886,0),(9912,24887,0),(9913,24888,0),(9914,24889,0),(9915,24890,0),(9916,24891,0),(9917,24892,0),(9918,24893,0),(9919,24894,0),(9920,24895,0),(9921,24896,0),(9922,24897,0),(9923,24898,0),(9924,24899,0),(9925,24900,0),(9926,24901,0),(9927,24902,0),(9928,24903,0),(9929,24904,0),(9930,24905,0),(9931,24906,0),(9932,24907,0),(9933,24908,0),(9934,24909,0),(9935,24910,0),(9936,24911,0),(9937,24912,0),(9938,24913,0),(9939,24914,0),(9940,24915,0),(9941,24916,0),(9942,24917,0),(9943,24918,0),(9944,24919,0),(9945,24920,0),(9946,24921,0),(9947,24922,0),(9948,24923,0),(9949,24924,0),(9950,24925,0),(9951,24926,0),(9952,24927,0),(9953,24928,0),(9954,24929,0),(9955,24930,0),(9956,24931,0),(9957,24932,0),(9958,24933,0),(9959,24934,0),(9960,24935,0),(9961,24936,0),(9962,24937,0),(9963,24938,0),(9964,24939,0),(9965,24940,0),(9966,24941,0),(9967,24942,0),(9968,24943,0),(9969,24944,0),(9970,24945,0),(9971,24946,0),(9972,24947,0),(9973,24948,0),(9974,24949,0),(9975,24950,0),(9976,24951,0),(9977,24952,0),(9978,24953,0),(9979,24954,0),(9980,24955,0),(9981,24956,0),(9982,24957,0),(9983,24958,0),(9984,24959,0),(9985,24960,0),(9986,24961,0),(9987,24962,0),(9988,24963,0),(9989,24964,0),(9990,24965,0),(9991,24966,0),(9992,24967,0),(9993,24968,0),(9994,24969,0),(9995,24970,0),(9996,24971,0),(9997,24972,0),(9998,24973,0),(9999,24974,0),(10000,24975,0),(10001,24976,0),(10002,24977,0),(10003,24978,0),(10004,24979,0),(10005,24980,0),(10006,24981,0),(10007,24982,0),(10008,24983,0),(10009,24984,0),(10010,24985,0),(10011,24986,0),(10012,24987,0),(10013,24988,0),(10014,24989,0),(10015,24990,0),(10016,24991,0),(10017,24992,0),(10018,24993,0),(10019,24994,0),(10020,24995,0),(10021,24996,0),(10022,24997,0),(10023,24998,0),(10024,24999,0),(10025,25000,0),(10026,25001,0),(10027,25002,0),(10028,25003,0),(10029,25004,0),(10030,25005,0),(10031,25006,0),(10032,25007,0),(10033,25008,0),(10034,25009,0),(10035,25010,0),(10036,25011,0),(10037,25012,0),(10038,25013,0),(10039,25014,0),(10040,25015,0),(10041,25016,0),(10042,25017,0),(10043,25018,0),(10044,25019,0),(10045,25020,0),(10046,25021,0),(10047,25022,0),(10048,25023,0),(10049,25024,0),(10050,25025,0),(10051,25026,0),(10052,25027,0),(10053,25028,0),(10054,25029,0),(10055,25030,0),(10056,25031,0),(10057,25032,0),(10058,25033,0),(10059,25034,0),(10060,25035,0),(10061,25036,0),(10062,25037,0),(10063,25038,0),(10064,25039,0),(10065,25040,0),(10066,25041,0),(10067,25042,0),(10068,25043,0),(10069,25072,0),(10070,25073,0),(10071,25074,0),(10072,25075,0),(10073,25076,0),(10074,25077,0),(10075,25078,0),(10076,25079,0),(10077,25080,0),(10078,25081,0),(10079,25082,0),(10080,25083,0),(10081,25084,0),(10082,25085,0),(10083,25086,0),(10084,25087,0),(10085,25088,0),(10086,25089,0),(10087,25090,0),(10088,25091,0),(10089,25092,0),(10090,25093,0),(10091,25094,0),(10092,25095,0),(10093,25096,0),(10094,25097,0),(10095,25098,0),(10096,25099,0),(10097,25100,0),(10098,25101,0),(10099,25102,0),(10100,25103,0),(10101,25104,0),(10102,25105,0),(10103,25106,0),(10104,25107,0),(10105,25108,0),(10106,25109,0),(10107,25110,0),(10108,25111,0),(10109,25112,0),(10110,25113,0),(10111,25114,0),(10112,25115,0),(10113,25116,0),(10114,25117,0),(10115,25118,0),(10116,25119,0),(10117,25120,0),(10118,25121,0),(10119,25122,0),(10120,25123,0),(10121,25124,0),(10122,25125,0),(10123,25126,0),(10124,25127,0),(10125,25128,0),(10126,25129,0),(10127,25130,0),(10128,25131,0),(10129,25132,0),(10130,25133,0),(10131,25134,0),(10132,25135,0),(10133,25136,0),(10134,25137,0),(10135,25138,0),(10136,25139,0),(10137,25140,0),(10138,25141,0),(10139,25142,0),(10140,25143,0),(10141,25144,0),(10142,25145,0),(10143,25146,0),(10144,25147,0),(10145,25148,0),(10146,25149,0),(10147,25150,0),(10148,25151,0),(10149,25152,0),(10150,25153,0),(10151,25154,0),(10152,25155,0),(10153,25156,0),(10154,25157,0),(10155,25158,0),(10156,25159,0),(10157,25160,0),(10158,25161,0),(10159,25162,0),(10160,25163,0),(10161,25164,0),(10162,25165,0),(10163,25166,0),(10164,25167,0),(10165,25168,0),(10166,25169,0),(10167,25170,0),(10168,25171,0),(10169,25172,0),(10170,25173,0),(10171,25174,0),(10172,25175,0),(10173,25176,0),(10174,25177,0),(10175,25178,0),(10176,25179,0),(10177,25180,0),(10178,25181,0),(10179,25182,0),(10180,25183,0),(10181,25184,0),(10182,25185,0),(10183,25186,0),(10184,25187,0),(10185,25188,0),(10186,25189,0),(10187,25190,0),(10188,25191,0),(10189,25192,0),(10190,25193,0),(10191,25194,0),(10192,25195,0),(10193,25196,0),(10194,25197,0),(10195,25198,0),(10196,25199,0),(10197,25200,0),(10198,25201,0),(10199,25202,0),(10200,25203,0),(10201,25204,0),(10202,25205,0),(10203,25206,0),(10204,25207,0),(10205,25208,0),(10206,25209,0),(10207,25210,0),(10208,25211,0),(10209,25212,0),(10210,25213,0),(10211,25214,0),(10212,25215,0),(10213,25216,0),(10214,25217,0),(10215,25218,0),(10216,25219,0),(10217,25220,0),(10218,25221,0),(10219,25222,0),(10220,25223,0),(10221,25224,0),(10222,25225,0),(10223,25226,0),(10224,25227,0),(10225,25228,0),(10226,25229,0),(10227,25230,0),(10228,25231,0),(10229,25232,0),(10230,25233,0),(10231,25234,0),(10232,25235,0),(10233,25236,0),(10234,25237,0),(10235,25238,0),(10236,25239,0),(10237,25240,0),(10238,25241,0),(10239,25242,0),(10240,25243,0),(10241,25244,0),(10242,25245,0),(10243,25246,0),(10244,25247,0),(10245,25248,0),(10246,25249,0),(10247,25250,0),(10248,25251,0),(10249,25252,0),(10250,25253,0),(10251,25254,0),(10252,25255,0),(10253,25256,0),(10254,25257,0),(10255,25258,0),(10256,25259,0),(10257,25260,0),(10258,25261,0),(10259,25262,0),(10260,25263,0),(10261,25264,0),(10262,25265,0),(10263,25266,0),(10264,25267,0),(10265,25268,0),(10266,25269,0),(10267,25270,0),(10268,25271,0),(10269,25272,0),(10270,25273,0),(10271,25274,0),(10272,25275,0),(10273,25276,0),(10274,25277,0),(10275,25278,0),(10276,25279,0),(10277,25280,0),(10278,25281,0),(10279,25282,0),(10280,25283,0),(10281,25284,0),(10282,25285,0),(10283,25286,0),(10284,25287,0),(10285,25288,0),(10286,25289,0),(10287,25290,0),(10288,25291,0),(10289,25292,0),(10290,25293,0),(10291,25294,0),(10292,25295,0),(10293,25296,0),(10294,25297,0),(10295,25298,0),(10296,25299,0),(10297,25300,0),(10298,25301,0),(10299,25302,0),(10300,25303,0),(10301,25304,0),(10302,25305,0),(10303,25306,0),(10304,25307,0),(10305,25308,0),(10306,25309,0),(10307,25310,0),(10308,25311,0),(10309,25312,0),(10310,25313,0),(10311,25314,0),(10312,25315,0),(10313,25316,0),(10314,25317,0),(10315,25318,0),(10316,25319,0),(10317,25320,0),(10318,25321,0),(10319,25322,0),(10320,25323,0),(10321,25324,0),(10322,25325,0),(10323,25326,0),(10324,25327,0),(10325,25328,0),(10326,25329,0),(10327,25330,0),(10328,25331,0),(10329,25332,0),(10330,25333,0),(10331,25334,0),(10332,25335,0),(10333,25336,0),(10334,25337,0),(10335,25338,0),(10336,25339,0),(10337,25340,0),(10338,25341,0),(10339,25342,0),(10340,25343,0),(10341,25344,0),(10342,25345,0),(10343,25346,0),(10344,25347,0),(10345,25348,0),(10346,25349,0),(10347,25350,0),(10348,25351,0),(10349,25352,0),(10350,25353,0),(10351,25354,0),(10352,25355,0),(10353,25356,0),(10354,25357,0),(10355,25358,0),(10356,25359,0),(10357,25360,0),(10358,25361,0),(10359,25362,0),(10360,25363,0),(10361,25364,0),(10362,25365,0),(10363,25366,0),(10364,25367,0),(10365,25368,0),(10366,25369,0),(10367,25370,0),(10368,25371,0),(10369,25372,0),(10370,25373,0),(10371,25374,0),(10372,25375,0),(10373,25376,0),(10374,25377,0),(10375,25378,0),(10376,25379,0),(10377,25380,0),(10378,25381,0),(10379,25382,0),(10380,25383,0),(10381,25384,0),(10382,25385,0),(10383,25386,0),(10384,25387,0),(10385,25388,0),(10386,25389,0),(10387,25390,0),(10388,25391,0),(10389,25392,0),(10390,25393,0),(10391,25394,0),(10392,25395,0),(10393,25396,0),(10394,25397,0),(10395,25398,0),(10396,25399,0),(10397,25400,0),(10398,25401,0),(10399,25402,0),(10400,25403,0),(10401,25404,0),(10402,25405,0),(10403,25406,0),(10404,25407,0),(10405,25464,0),(10406,25478,0),(10407,25479,0),(10408,25480,0),(10410,25482,0),(10411,25483,0),(10412,25486,0),(10413,25489,0),(10414,25492,0),(10415,25494,0),(10416,25495,0),(10417,25496,0),(10418,25501,0),(10419,25502,0),(10420,25503,0),(10421,25504,0),(10422,25506,0),(10423,25507,0),(10424,25508,0),(10425,25510,0),(10426,25511,0),(10427,25512,0),(10428,25513,0),(10429,25514,0),(10430,25515,0),(10431,25516,0),(10432,25518,0),(10433,25519,0),(10434,25520,0),(10435,25522,0),(10436,25523,0),(10437,25524,0),(10438,25525,0),(10439,25530,0),(10440,25534,0),(10441,25536,0),(10442,25537,0),(10443,25538,0),(10444,25540,0),(10445,25543,0),(10446,25544,0),(10447,25545,0),(10448,25546,0),(10449,25547,0),(10450,25549,0),(10451,25551,0),(10452,25553,0),(10453,25556,0),(10454,25557,0),(10455,25558,0),(10456,25559,0),(10457,25560,0),(10458,25561,0),(10459,25565,0),(10460,25566,0),(10461,25567,0),(10462,25568,0),(10463,25569,0),(10464,25570,0),(10465,25571,0),(10466,25572,0),(10467,25573,0),(10468,25574,0),(10469,25575,0),(10470,25576,0),(10471,25577,0),(10472,25578,0),(10473,25579,0),(10474,25580,0),(10475,25581,0),(10476,25582,0),(10477,25583,0),(10478,25584,0),(10479,25585,0),(10480,25587,0),(10481,25588,0),(10482,25589,0),(10483,25591,0),(10484,25592,0),(10485,25593,0),(10486,25594,0),(10487,25595,0),(10488,25597,0),(10489,25598,0),(10490,25599,0),(10491,25600,0),(10492,25601,0),(10493,25602,0),(10494,25603,0),(10495,25605,0),(10496,25608,0),(10497,25609,0),(10498,25610,0),(10499,25611,0),(10500,25612,0),(10501,25613,0),(10502,25614,0),(10503,25615,0),(10504,25616,0),(10505,25617,0),(10506,25618,0),(10507,25621,0),(10508,25622,0),(10509,25623,0),(10510,25624,0),(10511,25625,0),(10512,25626,0),(10513,25627,0),(10514,25629,0),(10515,25630,0),(10516,25631,0),(10517,25632,0),(10518,25636,0),(10519,25637,0),(10520,25639,0),(10521,25640,0),(10522,25646,0),(10523,25654,0),(10524,25655,0),(10525,25656,0),(10526,25657,0),(10527,25659,0),(10528,25660,0),(10529,25661,0),(10530,25662,0),(10531,25663,0),(10532,25668,0),(10533,25669,0),(10534,25670,0),(10535,25671,0),(10536,25673,0),(10537,25674,0),(10538,25675,0),(10539,25676,0),(10540,25680,0),(10541,25681,0),(10542,25682,0),(10543,25683,0),(10544,25685,0),(10545,25686,0),(10546,25687,0),(10547,25688,0),(10548,25689,0),(10549,25690,0),(10550,25691,0),(10551,25692,0),(10552,25693,0),(10553,25694,0),(10554,25695,0),(10555,25696,0),(10556,25697,0),(10557,25698,0),(10558,25701,0),(10559,25702,0),(10560,25710,0),(10561,25711,0),(10562,25712,0),(10563,25715,0),(10564,25716,0),(10565,25717,0),(10566,25718,0),(10567,25758,0),(10568,25759,0),(10569,25760,0),(10570,25761,0),(10571,25762,0),(10572,25763,0),(10573,25764,0),(10574,25772,0),(10575,25773,0),(10576,25774,0),(10577,25777,0),(10578,25778,0),(10579,25780,0),(10580,25781,0),(10581,25782,0),(10582,25783,0),(10583,25788,0),(10584,25789,0),(10585,25790,0),(10586,25791,0),(10587,25792,0),(10588,25793,0),(10589,25794,0),(10590,25795,0),(10591,25796,0),(10592,25797,0),(10593,25799,0),(10594,25800,0),(10595,25805,0),(10596,25806,0),(10597,25808,0),(10598,25810,0),(10599,25816,0),(10600,25818,0),(10601,25819,0),(10602,25820,0),(10603,25821,0),(10604,25822,0),(10605,25823,0),(10606,25825,0),(10607,25827,0),(10608,25828,0),(10609,25830,0),(10610,25831,0),(10611,25832,0),(10612,25833,0),(10613,25834,0),(10614,25835,0),(10615,25836,0),(10616,25838,0),(10617,25839,0),(10618,25854,0),(10619,25855,0),(10620,25856,0),(10621,25857,0),(10622,25858,0),(10623,25859,0),(10624,25860,0),(10625,25861,0),(10626,25871,0),(10627,25872,0),(10628,25873,0),(10629,25874,0),(10630,25875,0),(10631,25876,0),(10632,25877,0),(10633,25878,0),(10634,25879,0),(10635,25915,0),(10636,25916,0),(10637,25917,0),(10638,25918,0),(10639,25920,0),(10640,25922,0),(10641,25923,0),(10642,25924,0),(10643,25925,0),(10644,25927,0),(10645,25929,0),(10646,25930,0),(10647,25931,0),(10648,25932,0),(10649,25933,0),(10650,25934,0),(10651,25935,0),(10652,25939,0),(10653,25941,0),(10654,25942,0),(10655,25943,0),(10656,25944,0),(10657,25945,0),(10658,25946,0),(10659,25947,0),(10660,25948,0),(10661,25949,0),(10662,25950,0),(10663,25951,0),(10664,25952,0),(10665,25953,0),(10666,25955,0),(10667,25956,0),(10668,25957,0),(10669,25958,0),(10670,25959,0),(10671,25960,0),(10672,25961,0),(10673,25964,0),(10674,25965,0),(10675,25966,0),(10676,25967,0),(10677,25968,0),(10678,25969,0),(10679,25970,0),(10680,25971,0),(10681,25972,0),(10682,25973,0),(10683,25974,0),(10684,25975,0),(10685,25976,0),(10686,25977,0),(10687,25978,0),(10688,25979,0),(10689,25980,0),(10690,25981,0),(10691,25982,0),(10692,25983,0),(10693,25984,0),(10694,25985,0),(10695,25986,0),(10696,25987,0),(10697,25997,0),(10698,25998,0),(10699,25999,0),(10700,26000,0),(10701,26001,0),(10702,26003,0),(10703,26004,0),(10704,26005,0),(10705,26006,0),(10706,26007,0),(10707,26008,0),(10708,26009,0),(10709,26010,0),(10710,26011,0),(10711,26012,0),(10712,26013,0),(10713,26014,0),(10714,26015,0),(10715,26016,0),(10716,26017,0),(10717,26018,0),(10718,26019,0),(10719,26020,0),(10720,26021,0),(10721,26022,0),(10722,26023,0),(10723,26024,0),(10724,26025,0),(10725,26026,0),(10726,26027,0),(10727,26028,0),(10728,26029,0),(10729,26030,0),(10730,26031,0),(10731,26032,0),(10732,26033,0),(10733,26034,0),(10734,26035,0),(10735,26036,0),(10736,26037,0),(10737,26038,0),(10738,26039,0),(10739,26040,0),(10740,26041,0),(10741,26049,0),(10742,26050,0),(10743,26051,0),(10744,26052,0),(10745,26053,0),(10746,26054,0),(10747,26056,0),(10748,26057,0),(10749,26058,0),(10750,26059,0),(10751,26060,0),(10752,26061,0),(10753,26062,0),(10754,26063,0),(10755,26064,0),(10756,26065,0),(10757,26066,0),(10758,26067,0),(10759,26068,0),(10760,26069,0),(10761,26070,0),(10762,26071,0),(10763,26072,0),(10764,26073,0),(10765,26074,0),(10766,26075,0),(10767,26076,0),(10768,26077,0),(10769,26078,0),(10770,26079,0),(10771,26080,0),(10772,26081,0),(10773,26082,0),(10774,26083,0),(10775,26084,0),(10776,26085,0),(10777,26086,0),(10778,26087,0),(10779,26088,0),(10780,26089,0),(10781,26090,0),(10782,26091,0),(10783,26092,0),(10784,26093,0),(10785,26094,0),(10786,26095,0),(10787,26096,0),(10788,26097,0),(10789,26098,0),(10790,26099,0),(10791,26100,0),(10792,26101,0),(10793,26102,0),(10794,26103,0),(10795,26104,0),(10796,26105,0),(10797,26106,0),(10798,26107,0),(10799,26108,0),(10800,26109,0),(10801,26110,0),(10802,26111,0),(10803,26112,0),(10804,26113,0),(10805,26114,0),(10806,26115,0),(10807,26116,0),(10808,26117,0),(10809,26118,0),(10810,26119,0),(10811,26120,0),(10812,26121,0),(10813,26122,0),(10814,26123,0),(10815,26124,0),(10816,26125,0),(10817,26126,0),(10818,26127,0),(10819,26128,0),(10820,26129,0),(10821,26130,0),(10822,26131,0),(10823,26132,0),(10824,26133,0),(10825,26134,0),(10826,26135,0),(10827,26136,0),(10828,26137,0),(10829,26138,0),(10830,26139,0),(10831,26140,0),(10832,26141,0),(10833,26142,0),(10834,26143,0),(10835,26144,0),(10836,26145,0),(10837,26146,0),(10838,26147,0),(10839,26148,0),(10840,26149,0),(10841,26150,0),(10842,26151,0),(10843,26152,0),(10844,26153,0),(10845,26154,0),(10846,26155,0),(10847,26156,0),(10848,26157,0),(10849,26158,0),(10850,26159,0),(10851,26160,0),(10852,26161,0),(10853,26162,0),(10854,26163,0),(10855,26164,0),(10856,26165,0),(10857,26166,0),(10858,26167,0),(10859,26168,0),(10860,26169,0),(10861,26170,0),(10862,26171,0),(10863,26172,0),(10864,26173,0),(10865,26174,0),(10866,26175,0),(10867,26176,0),(10868,26177,0),(10869,26178,0),(10870,26179,0),(10871,26180,0),(10872,26181,0),(10873,26182,0),(10874,26183,0),(10875,26184,0),(10876,26185,0),(10877,26186,0),(10878,26187,0),(10879,26188,0),(10880,26189,0),(10881,26190,0),(10882,26191,0),(10883,26192,0),(10884,26193,0),(10885,26194,0),(10886,26195,0),(10887,26196,0),(10888,26197,0),(10889,26198,0),(10890,26199,0),(10891,26200,0),(10892,26201,0),(10893,26202,0),(10894,26203,0),(10895,26204,0),(10896,26205,0),(10897,26206,0),(10898,26207,0),(10899,26208,0),(10900,26209,0),(10901,26210,0),(10902,26211,0),(10903,26212,0),(10904,26213,0),(10905,26214,0),(10906,26215,0),(10907,26216,0),(10908,26217,0),(10909,26218,0),(10910,26219,0),(10911,26220,0),(10912,26221,0),(10913,26222,0),(10914,26223,0),(10915,26224,0),(10916,26225,0),(10917,26226,0),(10918,26227,0),(10919,26228,0),(10920,26229,0),(10921,26230,0),(10922,26231,0),(10923,26232,0),(10924,26233,0),(10925,26234,0),(10926,26235,0),(10927,26236,0),(10928,26237,0),(10929,26238,0),(10930,26239,0),(10931,26240,0),(10932,26241,0),(10933,26242,0),(10934,26243,0),(10935,26244,0),(10936,26245,0),(10937,26246,0),(10938,26247,0),(10939,26248,0),(10940,26249,0),(10941,26250,0),(10942,26251,0),(10943,26252,0),(10944,26253,0),(10945,26254,0),(10946,26255,0),(10947,26256,0),(10948,26257,0),(10949,26258,0),(10950,26259,0),(10951,26260,0),(10952,26261,0),(10953,26262,0),(10954,26263,0),(10955,26264,0),(10956,26265,0),(10957,26266,0),(10958,26267,0),(10959,26268,0),(10960,26269,0),(10961,26270,0),(10962,26271,0),(10963,26272,0),(10964,26273,0),(10965,26274,0),(10966,26275,0),(10967,26276,0),(10968,26277,0),(10969,26278,0),(10970,26279,0),(10971,26280,0),(10972,26281,0),(10973,26282,0),(10974,26283,0),(10975,26284,0),(10976,26285,0),(10977,26286,0),(10978,26287,0),(10979,26288,0),(10980,26289,0),(10981,26290,0),(10982,26291,0),(10983,26292,0),(10984,26293,0),(10985,26294,0),(10986,26295,0),(10987,26296,0),(10988,26297,0),(10989,26298,0),(10990,26299,0),(10991,26300,0),(10992,26301,0),(10993,26302,0),(10994,26303,0),(10995,26304,0),(10996,26305,0),(10997,26306,0),(10998,26307,0),(10999,26308,0),(11000,26309,0),(11001,26310,0),(11002,26311,0),(11003,26312,0),(11004,26313,0),(11005,26314,0),(11006,26315,0),(11007,26316,0),(11008,26317,0),(11009,26318,0),(11010,26319,0),(11011,26320,0),(11012,26321,0),(11013,26322,0),(11014,26323,0),(11015,26324,0),(11016,26325,0),(11017,26326,0),(11018,26327,0),(11019,26328,0),(11020,26329,0),(11021,26330,0),(11022,26331,0),(11023,26332,0),(11024,26333,0),(11025,26334,0),(11026,26335,0),(11027,26336,0),(11028,26337,0),(11029,26338,0),(11030,26339,0),(11031,26340,0),(11032,26341,0),(11033,26342,0),(11034,26343,0),(11035,26344,0),(11036,26345,0),(11037,26346,0),(11038,26347,0),(11039,26348,0),(11040,26349,0),(11041,26350,0),(11042,26351,0),(11043,26352,0),(11044,26353,0),(11045,26354,0),(11046,26355,0),(11047,26356,0),(11048,26357,0),(11049,26358,0),(11050,26359,0),(11051,26360,0),(11052,26361,0),(11053,26362,0),(11054,26363,0),(11055,26364,0),(11056,26365,0),(11057,26366,0),(11058,26367,0),(11059,26368,0),(11060,26369,0),(11061,26370,0),(11062,26371,0),(11063,26372,0),(11064,26373,0),(11065,26374,0),(11066,26375,0),(11067,26376,0),(11068,26377,0),(11069,26378,0),(11070,26379,0),(11071,26380,0),(11072,26381,0),(11073,26382,0),(11074,26383,0),(11075,26384,0),(11076,26385,0),(11077,26386,0),(11078,26387,0),(11079,26388,0),(11080,26389,0),(11081,26390,0),(11082,26391,0),(11083,26392,0),(11084,26393,0),(11085,26394,0),(11086,26395,0),(11087,26396,0),(11088,26397,0),(11089,26398,0),(11090,26399,0),(11091,26400,0),(11092,26401,0),(11093,26402,0),(11094,26403,0),(11095,26404,0),(11096,26405,0),(11097,26406,0),(11098,26407,0),(11099,26408,0),(11100,26409,0),(11101,26410,0),(11102,26411,0),(11103,26412,0),(11104,26413,0),(11105,26414,0),(11106,26415,0),(11107,26416,0),(11108,26417,0),(11109,26418,0),(11110,26419,0),(11111,26420,0),(11112,26421,0),(11113,26422,0),(11114,26423,0),(11115,26424,0),(11116,26425,0),(11117,26426,0),(11118,26427,0),(11119,26428,0),(11120,26429,0),(11121,26430,0),(11122,26431,0),(11123,26432,0),(11124,26433,0),(11125,26434,0),(11126,26435,0),(11127,26436,0),(11128,26437,0),(11129,26438,0),(11130,26439,0),(11131,26440,0),(11132,26441,0),(11133,26442,0),(11134,26443,0),(11135,26444,0),(11136,26445,0),(11137,26446,0),(11138,26447,0),(11139,26448,0),(11140,26449,0),(11141,26450,0),(11142,26451,0),(11143,26452,0),(11144,26453,0),(11145,26454,0),(11146,26455,0),(11147,26456,0),(11148,26457,0),(11149,26458,0),(11150,26459,0),(11151,26460,0),(11152,26461,0),(11153,26462,0),(11154,26463,0),(11155,26464,0),(11156,26465,0),(11157,26466,0),(11158,26467,0),(11159,26468,0),(11160,26469,0),(11161,26470,0),(11162,26471,0),(11163,26472,0),(11164,26473,0),(11165,26474,0),(11166,26475,0),(11167,26476,0),(11168,26477,0),(11169,26478,0),(11170,26479,0),(11171,26480,0),(11172,26481,0),(11173,26482,0),(11174,26483,0),(11175,26484,0),(11176,26485,0),(11177,26486,0),(11178,26487,0),(11179,26488,0),(11180,26489,0),(11181,26490,0),(11182,26491,0),(11183,26492,0),(11184,26493,0),(11185,26494,0),(11186,26495,0),(11187,26496,0),(11188,26497,0),(11189,26498,0),(11190,26499,0),(11191,26500,0),(11192,26501,0),(11193,26502,0),(11194,26503,0),(11195,26504,0),(11196,26505,0),(11197,26506,0),(11198,26507,0),(11199,26508,0),(11200,26509,0),(11201,26510,0),(11202,26511,0),(11203,26512,0),(11204,26513,0),(11205,26514,0),(11206,26515,0),(11207,26516,0),(11208,26517,0),(11209,26546,0),(11210,26547,0),(11211,26548,0),(11212,26549,0),(11213,26550,0),(11214,26551,0),(11215,26552,0),(11216,26553,0),(11217,26554,0),(11218,26555,0),(11219,26556,0),(11220,26557,0),(11221,26558,0),(11222,26559,0),(11223,26560,0),(11224,26561,0),(11225,26562,0),(11226,26563,0),(11227,26564,0),(11228,26565,0),(11229,26566,0),(11230,26567,0),(11231,26568,0),(11232,26569,0),(11233,26570,0),(11234,26571,0),(11235,26572,0),(11236,26573,0),(11237,26574,0),(11238,26575,0),(11239,26576,0),(11240,26577,0),(11241,26578,0),(11242,26579,0),(11243,26580,0),(11244,26581,0),(11245,26582,0),(11246,26583,0),(11247,26584,0),(11248,26585,0),(11249,26586,0),(11250,26587,0),(11251,26588,0),(11252,26589,0),(11253,26590,0),(11254,26591,0),(11255,26592,0),(11256,26593,0),(11257,26594,0),(11258,26595,0),(11259,26596,0),(11260,26597,0),(11261,26598,0),(11262,26599,0),(11263,26600,0),(11264,26601,0),(11265,26602,0),(11266,26603,0),(11267,26604,0),(11268,26605,0),(11269,26606,0),(11270,26607,0),(11271,26608,0),(11272,26609,0),(11273,26610,0),(11274,26611,0),(11275,26612,0),(11276,26613,0),(11277,26614,0),(11278,26615,0),(11279,26616,0),(11280,26617,0),(11281,26618,0),(11282,26619,0),(11283,26620,0),(11284,26621,0),(11285,26622,0),(11286,26623,0),(11287,26624,0),(11288,26625,0),(11289,26626,0),(11290,26627,0),(11291,26628,0),(11292,26629,0),(11293,26630,0),(11294,26631,0),(11295,26632,0),(11296,26633,0),(11297,26634,0),(11298,26635,0),(11299,26636,0),(11300,26637,0),(11301,26638,0),(11302,26639,0),(11303,26640,0),(11304,26641,0),(11305,26642,0),(11306,26643,0),(11307,26644,0),(11308,26645,0),(11309,26646,0),(11310,26647,0),(11311,26648,0),(11312,26649,0),(11313,26650,0),(11314,26651,0),(11315,26652,0),(11316,26653,0),(11317,26654,0),(11318,26655,0),(11319,26656,0),(11320,26657,0),(11321,26658,0),(11322,26659,0),(11323,26660,0),(11324,26661,0),(11325,26662,0),(11326,26663,0),(11327,26664,0),(11328,26665,0),(11329,26666,0),(11330,26667,0),(11331,26668,0),(11332,26669,0),(11333,26670,0),(11334,26671,0),(11335,26672,0),(11336,26673,0),(11337,26674,0),(11338,26675,0),(11339,26676,0),(11340,26677,0),(11341,26678,0),(11342,26679,0),(11343,26680,0),(11344,26681,0),(11345,26682,0),(11346,26683,0),(11347,26684,0),(11348,26685,0),(11349,26686,0),(11350,26687,0),(11351,26688,0),(11352,26689,0),(11353,26690,0),(11354,26691,0),(11355,26692,0),(11356,26693,0),(11357,26694,0),(11358,26695,0),(11359,26696,0),(11360,26697,0),(11361,26698,0),(11362,26699,0),(11363,26700,0),(11364,26701,0),(11365,26702,0),(11366,26703,0),(11367,26704,0),(11368,26705,0),(11369,26706,0),(11370,26707,0),(11371,26708,0),(11372,26709,0),(11373,26710,0),(11374,26711,0),(11375,26712,0),(11376,26713,0),(11377,26714,0),(11378,26715,0),(11379,26716,0),(11380,26717,0),(11381,26718,0),(11382,26719,0),(11383,26720,0),(11384,26721,0),(11385,26722,0),(11386,26723,0),(11387,26724,0),(11388,26725,0),(11389,26726,0),(11390,26727,0),(11391,26728,0),(11392,26729,0),(11393,26730,0),(11394,26731,0),(11395,26732,0),(11396,26733,0),(11397,26734,0),(11398,26735,0),(11399,26736,0),(11400,26737,0),(11401,26738,0),(11402,26739,0),(11403,26740,0),(11404,26741,0),(11405,26742,0),(11406,26743,0),(11407,26744,0),(11408,26745,0),(11409,26746,0),(11410,26747,0),(11411,26748,0),(11412,26749,0),(11413,26750,0),(11414,26751,0),(11415,26752,0),(11416,26753,0),(11417,26754,0),(11418,26755,0),(11419,26756,0),(11420,26757,0),(11421,26758,0),(11422,26759,0),(11423,26760,0),(11424,26761,0),(11425,26762,0),(11426,26763,0),(11427,26764,0),(11428,26765,0),(11429,26766,0),(11430,26767,0),(11431,26768,0),(11432,26769,0),(11433,26770,0),(11434,26771,0),(11435,26772,0),(11436,26773,0),(11437,26774,0),(11438,26775,0),(11439,26776,0),(11440,26777,0),(11441,26778,0),(11442,26779,0),(11443,26780,0),(11444,26781,0),(11445,26782,0),(11446,26783,0),(11447,26784,0),(11448,26785,0),(11449,26786,0),(11450,26787,0),(11451,26788,0),(11452,26789,0),(11453,26790,0),(11454,26791,0),(11455,26792,0),(11456,26793,0),(11457,26794,0),(11458,26795,0),(11459,26796,0),(11460,26797,0),(11461,26798,0),(11462,26799,0),(11463,26800,0),(11464,26801,0),(11465,26802,0),(11466,26803,0),(11467,26804,0),(11468,26805,0),(11469,26806,0),(11470,26807,0),(11471,26808,0),(11472,26809,0),(11473,26810,0),(11474,26811,0),(11475,26812,0),(11476,26813,0),(11477,26814,0),(11478,26815,0),(11479,26816,0),(11480,26817,0),(11481,26818,0),(11482,26819,0),(11483,26820,0),(11484,26821,0),(11485,26822,0),(11486,26823,0),(11487,26824,0),(11488,26825,0),(11489,26826,0),(11490,26827,0),(11491,26828,0),(11492,26829,0),(11493,26830,0),(11494,26831,0),(11495,26832,0),(11496,26833,0),(11497,26834,0),(11498,26835,0),(11499,26836,0),(11500,26837,0),(11501,26838,0),(11502,26839,0),(11503,26840,0),(11504,26841,0),(11505,26842,0),(11506,26843,0),(11507,26844,0),(11508,26845,0),(11509,26846,0),(11510,26847,0),(11511,26848,0),(11512,26849,0),(11513,26850,0),(11514,26851,0),(11515,26852,0),(11516,26853,0),(11517,26854,0),(11518,26855,0),(11519,26856,0),(11520,26857,0),(11521,26858,0),(11522,26859,0),(11523,26860,0),(11524,26861,0),(11525,26862,0),(11526,26863,0),(11527,26864,0),(11528,26865,0),(11529,26866,0),(11530,26867,0),(11531,26868,0),(11532,26869,0),(11533,26870,0),(11534,26871,0),(11535,26872,0),(11536,26873,0),(11537,26874,0),(11538,26875,0),(11539,26876,0),(11540,26877,0),(11541,26878,0),(11542,26879,0),(11543,26880,0),(11544,26881,0),(11545,26882,0),(11546,26883,0),(11547,26884,0),(11548,26885,0),(11549,26886,0),(11550,26887,0),(11551,26888,0),(11552,26889,0),(11553,26890,0),(11554,26891,0),(11555,26892,0),(11556,26893,0),(11557,26894,0),(11558,26895,0),(11559,26896,0),(11560,26897,0),(11561,26898,0),(11562,26899,0),(11563,26900,0),(11564,26901,0),(11565,26902,0),(11566,26903,0),(11567,26904,0),(11568,26905,0),(11569,26906,0),(11570,26907,0),(11571,26908,0),(11572,26909,0),(11573,26910,0),(11574,26911,0),(11575,26912,0),(11576,26913,0),(11577,26914,0),(11578,26915,0),(11579,26916,0),(11580,26917,0),(11581,26918,0),(11582,26919,0),(11583,26920,0),(11584,26921,0),(11585,26922,0),(11586,26923,0),(11587,26924,0),(11588,26925,0),(11589,26926,0),(11590,26927,0),(11591,26928,0),(11592,26929,0),(11593,26930,0),(11594,26931,0),(11595,26932,0),(11596,26933,0),(11597,26934,0),(11598,26935,0),(11599,26936,0),(11600,26937,0),(11601,26938,0),(11602,26939,0),(11603,26940,0),(11604,26941,0),(11605,26942,0),(11606,26943,0),(11607,26944,0),(11608,26945,0),(11609,26946,0),(11610,26947,0),(11611,26948,0),(11612,26949,0),(11613,26950,0),(11614,26951,0),(11615,26952,0),(11616,26953,0),(11617,26954,0),(11618,26955,0),(11619,26956,0),(11620,26957,0),(11621,26958,0),(11622,26959,0),(11623,26960,0),(11624,26961,0),(11625,26962,0),(11626,26963,0),(11627,26964,0),(11628,26965,0),(11629,26966,0),(11630,26967,0),(11631,26968,0),(11632,26969,0),(11633,26970,0),(11634,26971,0),(11635,26972,0),(11636,26973,0),(11637,26974,0),(11638,26975,0),(11639,26976,0),(11640,26977,0),(11641,26978,0),(11642,26979,0),(11643,26980,0),(11644,26981,0),(11645,26982,0),(11646,26983,0),(11647,26984,0),(11648,26985,0),(11649,26986,0),(11650,26987,0),(11651,26988,0),(11652,26989,0),(11653,26990,0),(11654,26991,0),(11655,26992,0),(11656,26993,0),(11657,26994,0),(11658,26995,0),(11659,26996,0),(11660,26997,0),(11661,26998,0),(11662,26999,0),(11663,27000,0),(11664,27001,0),(11665,27002,0),(11666,27003,0),(11667,27004,0),(11668,27005,0),(11669,27006,0),(11670,27007,0),(11671,27008,0),(11672,27009,0),(11673,27010,0),(11674,27011,0),(11675,27012,0),(11676,27013,0),(11677,27014,0),(11678,27015,0),(11679,27016,0),(11680,27017,0),(11681,27018,0),(11682,27019,0),(11683,27020,0),(11684,27021,0),(11685,27022,0),(11686,27023,0),(11687,27024,0),(11688,27025,0),(11689,27026,0),(11690,27027,0),(11691,27028,0),(11692,27029,0),(11693,27030,0),(11694,27031,0),(11695,27032,0),(11696,27033,0),(11697,27034,0),(11698,27035,0),(11699,27036,0),(11700,27037,0),(11701,27038,0),(11702,27039,0),(11703,27040,0),(11704,27041,0),(11705,27042,0),(11706,27043,0),(11707,27044,0),(11708,27045,0),(11709,27046,0),(11710,27047,0),(11711,27048,0),(11712,27049,0),(11713,27050,0),(11714,27051,0),(11715,27052,0),(11716,27053,0),(11717,27054,0),(11718,27055,0),(11719,27056,0),(11720,27057,0),(11721,27058,0),(11722,27059,0),(11723,27060,0),(11724,27061,0),(11725,27062,0),(11726,27063,0),(11727,27064,0),(11728,27065,0),(11729,27066,0),(11730,27067,0),(11731,27068,0),(11732,27069,0),(11733,27070,0),(11734,27071,0),(11735,27072,0),(11736,27073,0),(11737,27074,0),(11738,27075,0),(11739,27076,0),(11740,27077,0),(11741,27078,0),(11742,27079,0),(11743,27080,0),(11744,27081,0),(11745,27082,0),(11746,27083,0),(11747,27084,0),(11748,27085,0),(11749,27086,0),(11750,27087,0),(11751,27088,0),(11752,27089,0),(11753,27090,0),(11754,27091,0),(11755,27092,0),(11756,27093,0),(11757,27094,0),(11758,27095,0),(11759,27096,0),(11760,27097,0),(11761,27098,0),(11762,27099,0),(11763,27100,0),(11764,27101,0),(11765,27102,0),(11766,27103,0),(11767,27104,0),(11768,27105,0),(11769,27106,0),(11770,27107,0),(11771,27108,0),(11772,27109,0),(11773,27110,0),(11774,27111,0),(11775,27112,0),(11776,27113,0),(11777,27114,0),(11778,27115,0),(11779,27116,0),(11780,27117,0),(11781,27118,0),(11782,27119,0),(11783,27120,0),(11784,27121,0),(11785,27122,0),(11786,27123,0),(11787,27124,0),(11788,27125,0),(11789,27126,0),(11790,27127,0),(11791,27128,0),(11792,27129,0),(11793,27130,0),(11794,27131,0),(11795,27132,0),(11796,27133,0),(11797,27134,0),(11798,27135,0),(11799,27136,0),(11800,27137,0),(11801,27138,0),(11802,27139,0),(11803,27140,0),(11804,27141,0),(11805,27142,0),(11806,27143,0),(11807,27144,0),(11808,27145,0),(11809,27146,0),(11810,27147,0),(11811,27148,0),(11812,27149,0),(11813,27150,0),(11814,27151,0),(11815,27152,0),(11816,27153,0),(11817,27154,0),(11818,27155,0),(11819,27156,0),(11820,27157,0),(11821,27158,0),(11822,27159,0),(11823,27160,0),(11824,27161,0),(11825,27190,0),(11826,27191,0),(11827,27192,0),(11828,27193,0),(11829,27194,0),(11830,27195,0),(11831,27196,0),(11832,27197,0),(11833,27198,0),(11834,27199,0),(11835,27200,0),(11836,27201,0),(11837,27202,0),(11838,27203,0),(11839,27232,0),(11840,27233,0),(11841,27234,0),(11842,27235,0),(11843,27236,0),(11844,27237,0),(11845,27238,0),(11846,27239,0),(11847,27240,0),(11848,27241,0),(11849,27242,0),(11850,27243,0),(11851,27244,0),(11852,27245,0),(11853,27274,0),(11854,27275,0),(11855,27276,0),(11856,27277,0),(11857,27278,0),(11858,27279,0),(11859,27280,0),(11860,27281,0),(11861,27282,0),(11862,27283,0),(11863,27284,0),(11864,27285,0),(11865,27286,0),(11866,27287,0),(11867,27389,0),(11868,27390,0),(11869,27398,0),(11870,27399,0),(11871,27400,0),(11872,27401,0),(11873,27402,0),(11874,27403,0),(11875,27404,0),(11876,27405,0),(11877,27406,0),(11878,27407,0),(11879,27408,0),(11880,27409,0),(11881,27410,0),(11882,27411,0),(11883,27412,0),(11884,27414,0),(11885,27415,0),(11886,27417,0),(11887,27418,0),(11888,27420,0),(11889,27423,0),(11890,27424,0),(11891,27426,0),(11892,27427,0),(11893,27428,0),(11894,27430,0),(11895,27431,0),(11896,27433,0),(11897,27434,0),(11898,27447,0),(11899,27448,0),(11900,27449,0),(11901,27450,0),(11902,27451,0),(11903,27452,0),(11904,27454,0),(11905,27455,0),(11906,27456,0),(11907,27457,0),(11908,27458,0),(11909,27459,0),(11910,27461,0),(11911,27462,0),(11912,27463,0),(11913,27465,0),(11914,27466,0),(11915,27467,0),(11916,27468,0),(11917,27469,0),(11918,27470,0),(11919,27471,0),(11920,27472,0),(11921,27473,0),(11922,27474,0),(11923,27475,0),(11924,27476,0),(11925,27477,0),(11926,27478,0),(11927,27483,0),(11928,27485,0),(11929,27486,0),(11930,27487,0),(11931,27488,0),(11932,27489,0),(11933,27490,0),(11934,27492,0),(11935,27493,0),(11936,27494,0),(11937,27496,0),(11938,27497,0),(11939,27505,0),(11940,27506,0),(11941,27507,0),(11942,27508,0),(11943,27509,0),(11944,27510,0),(11945,27512,0),(11946,27514,0),(11947,27515,0),(11948,27516,0),(11949,27517,0),(11950,27519,0),(11951,27520,0),(11952,27521,0),(11953,27522,0),(11954,27524,0),(11955,27525,0),(11956,27526,0),(11957,27527,0),(11958,27528,0),(11959,27530,0),(11960,27531,0),(11961,27533,0),(11962,27534,0),(11963,27535,0),(11964,27536,0),(11965,27537,0),(11966,27538,0),(11967,27539,0),(11968,27540,0),(11969,27541,0),(11970,27542,0),(11971,27543,0),(11972,27545,0),(11973,27547,0),(11974,27548,0),(11975,27549,0),(11976,27550,0),(11977,27552,0),(11978,27631,0),(11979,27637,0),(11980,27638,0),(11981,27639,0),(11982,27640,0),(11983,27641,0),(11984,27643,0),(11985,27644,0),(11986,27645,0),(11987,27646,0),(11988,27647,0),(11989,27648,0),(11990,27649,0),(11991,27650,0),(11992,27652,0),(11993,27653,0),(11994,27654,0),(11995,27672,0),(11996,27673,0),(11997,27701,0),(11998,27702,0),(11999,27703,0),(12000,27704,0),(12001,27705,0),(12002,27706,0),(12003,27707,0),(12004,27708,0),(12005,27709,0),(12006,27710,0),(12007,27711,0),(12008,27712,0),(12009,27713,0),(12010,27714,0),(12011,27715,0),(12012,27716,0),(12013,27717,0),(12014,27718,0),(12015,27719,0),(12016,27720,0),(12017,27721,0),(12018,27722,0),(12019,27723,0),(12020,27724,0),(12021,27725,0),(12022,27726,0),(12023,27727,0),(12024,27728,0),(12025,27730,0),(12026,27731,0),(12027,27732,0),(12028,27737,0),(12029,27738,0),(12030,27739,0),(12031,27741,0),(12032,27742,0),(12033,27743,0),(12034,27745,0),(12035,27746,0),(12036,27747,0),(12037,27748,0),(12038,27749,0),(12039,27750,0),(12040,27751,0),(12041,27752,0),(12042,27753,0),(12043,27754,0),(12044,27755,0),(12045,27756,0),(12046,27757,0),(12047,27759,0),(12048,27760,0),(12049,27763,0),(12050,27764,0),(12051,27765,0),(12052,27767,0),(12053,27768,0),(12054,27769,0),(12055,27771,0),(12056,27772,0),(12057,27773,0),(12058,27775,0),(12059,27776,0),(12060,27778,0),(12061,27781,0),(12062,27783,0),(12063,27787,0),(12064,27788,0),(12065,27789,0),(12066,27790,0),(12067,27791,0),(12068,27793,0),(12069,27794,0),(12070,27795,0),(12071,27796,0),(12072,27797,0),(12073,27798,0),(12074,27799,0),(12075,27800,0),(12076,27801,0),(12077,27802,0),(12078,27803,0),(12079,27804,0),(12080,27806,0),(12081,27813,0),(12082,27814,0),(12083,27816,0),(12084,27817,0),(12085,27818,0),(12086,27821,0),(12087,27823,0),(12088,27824,0),(12089,27825,0),(12090,27826,0),(12091,27827,0),(12092,27829,0),(12093,27831,0),(12094,27835,0),(12095,27836,0),(12096,27837,0),(12097,27838,0),(12098,27839,0),(12099,27840,0),(12100,27842,0),(12101,27843,0),(12102,27844,0),(12103,27845,0),(12104,27846,0),(12105,27847,0),(12106,27848,0),(12107,27849,0),(12108,27850,0),(12109,27851,0),(12110,27852,0),(12111,27862,0),(12112,27865,0),(12113,27866,0),(12114,27867,0),(12115,27868,0),(12116,27870,0),(12117,27872,0),(12118,27873,0),(12119,27874,0),(12120,27875,0),(12121,27876,0),(12122,27877,0),(12123,27878,0),(12124,27879,0),(12125,27880,0),(12126,27881,0),(12127,27882,0),(12128,27883,0),(12129,27884,0),(12130,27885,0),(12131,27887,0),(12132,27888,0),(12133,27889,0),(12134,27890,0),(12135,27892,0),(12136,27893,0),(12137,27897,0),(12138,27898,0),(12139,27899,0),(12140,27901,0),(12141,27902,0),(12142,27903,0),(12143,27905,0),(12144,27906,0),(12145,27907,0),(12146,27908,0),(12147,27909,0),(12148,27910,0),(12149,27911,0),(12150,27912,0),(12151,27913,0),(12152,27914,0),(12153,27915,0),(12154,27916,0),(12155,27918,0),(12156,27919,0),(12157,27923,0),(12158,27928,0),(12159,27929,0),(12160,27930,0),(12161,27931,0),(12162,27936,0),(12163,27937,0),(12164,27938,0),(12165,27939,0),(12166,27942,0),(12167,27946,0),(12168,27948,0),(12169,27950,0),(12170,27951,0),(12171,27952,0),(12172,27953,0),(12173,27954,0),(12174,27955,0),(12175,27956,0),(12176,27957,0),(12177,27960,0),(12178,27961,0),(12179,27962,0),(12180,27963,0),(12181,27964,0),(12182,27965,0),(12183,27966,0),(12184,27967,0),(12185,27968,0),(12186,27969,0),(12187,27970,0),(12188,27973,0),(12189,27974,0),(12190,27975,0),(12191,27977,0),(12192,27980,0),(12193,27981,0),(12194,27985,0),(12195,27986,0),(12196,27987,0),(12197,27988,0),(12198,27993,0),(12199,27994,0),(12200,27995,0),(12201,27997,0),(12202,27998,0),(12203,27999,0),(12204,28000,0),(12205,28001,0),(12206,28002,0),(12207,28003,0),(12208,28004,0),(12209,28007,0),(12210,28008,0),(12211,28009,0),(12212,28010,0),(12213,28011,0),(12214,28012,0),(12215,28013,0),(12216,28014,0),(12217,28015,0),(12218,28016,0),(12219,28017,0),(12220,28020,0),(12221,28021,0),(12222,28022,0),(12223,28023,0),(12224,28026,0),(12225,28028,0),(12226,28029,0),(12227,28030,0),(12228,28031,0),(12229,28032,0),(12230,28033,0),(12231,28037,0),(12232,28045,0),(12233,28050,0),(12234,28051,0),(12235,28052,0),(12236,28053,0),(12237,28054,0),(12238,28055,0),(12239,28056,0),(12240,28057,0),(12241,28060,0),(12242,28061,0),(12243,28062,0),(12244,28063,0),(12245,28067,0),(12246,28069,0),(12247,28070,0),(12248,28074,0),(12249,28075,0),(12250,28087,0),(12251,28115,0),(12252,28124,0),(12253,28125,0),(12254,28126,0),(12255,28127,0),(12256,28128,0),(12257,28129,0),(12258,28130,0),(12259,28133,0),(12260,28136,0),(12261,28137,0),(12262,28138,0),(12263,28139,0),(12264,28140,0),(12265,28141,0),(12266,28142,0),(12267,28143,0),(12268,28144,0),(12269,28145,0),(12270,28146,0),(12271,28147,0),(12272,28148,0),(12273,28149,0),(12274,28150,0),(12275,28151,0),(12276,28152,0),(12277,28153,0),(12278,28154,0),(12279,28155,0),(12280,28156,0),(12281,28157,0),(12282,28158,0),(12283,28159,0),(12284,28160,0),(12285,28161,0),(12286,28162,0),(12287,28163,0),(12288,28164,0),(12289,28165,0),(12290,28166,0),(12291,28167,0),(12292,28169,0),(12293,28170,0),(12294,28171,0),(12295,28172,0),(12296,28173,0),(12297,28174,0),(12298,28175,0),(12299,28176,0),(12300,28177,0),(12301,28178,0),(12302,28179,0),(12303,28180,0),(12304,28181,0),(12305,28182,0),(12306,28183,0),(12307,28184,0),(12308,28185,0),(12309,28186,0),(12310,28187,0),(12311,28188,0),(12312,28189,0),(12313,28191,0),(12314,28192,0),(12315,28193,0),(12316,28194,0),(12317,28195,0),(12318,28196,0),(12319,28197,0),(12320,28198,0),(12321,28199,0),(12322,28200,0),(12323,28201,0),(12324,28202,0),(12325,28203,0),(12326,28204,0),(12327,28205,0),(12328,28206,0),(12329,28207,0),(12330,28208,0),(12331,28210,0),(12332,28212,0),(12333,28213,0),(12334,28214,0),(12335,28215,0),(12336,28216,0),(12337,28218,0),(12338,28219,0),(12339,28220,0),(12340,28221,0),(12341,28222,0),(12342,28224,0),(12343,28225,0),(12344,28226,0),(12345,28228,0),(12346,28229,0),(12347,28230,0),(12348,28231,0),(12349,28232,0),(12350,28249,0),(12351,28250,0),(12352,28251,0),(12353,28252,0),(12354,28253,0),(12355,28255,0),(12356,28256,0),(12357,28257,0),(12358,28258,0),(12359,28260,0),(12360,28262,0),(12361,28263,0),(12362,28264,0),(12363,28266,0),(12364,28267,0),(12365,28268,0),(12366,28269,0),(12367,28275,0),(12368,28278,0),(12369,28285,0),(12370,28286,0),(12371,28293,0),(12372,28294,0),(12373,28295,0),(12374,28297,0),(12375,28298,0),(12376,28299,0),(12377,28300,0),(12378,28301,0),(12379,28302,0),(12380,28304,0),(12381,28305,0),(12382,28306,0),(12383,28307,0),(12384,28308,0),(12385,28309,0),(12386,28310,0),(12387,28311,0),(12388,28312,0),(12389,28313,0),(12390,28314,0),(12391,28315,0),(12392,28316,0),(12393,28317,0),(12394,28318,0),(12395,28319,0),(12396,28320,0),(12397,28322,0),(12398,28324,0),(12399,28325,0),(12400,28328,0),(12401,28331,0),(12402,28332,0),(12403,28333,0),(12404,28334,0),(12405,28335,0),(12406,28337,0),(12407,28338,0),(12408,28339,0),(12409,28340,0),(12410,28341,0),(12411,28342,0),(12412,28344,0),(12413,28345,0),(12414,28346,0),(12415,28347,0),(12416,28348,0),(12417,28349,0),(12418,28350,0),(12419,28354,0),(12420,28358,0),(12421,28365,0),(12422,28366,0),(12423,28367,0),(12424,28371,0),(12425,28373,0),(12426,28374,0),(12427,28375,0),(12428,28377,0),(12429,28378,0),(12430,28379,0),(12431,28380,0),(12432,28381,0),(12433,28383,0),(12434,28384,0),(12435,28385,0),(12436,28386,0),(12437,28387,0),(12438,28390,0),(12439,28391,0),(12440,28392,0),(12441,28393,0),(12442,28396,0),(12443,28397,0),(12444,28398,0),(12445,28400,0),(12446,28401,0),(12447,28402,0),(12448,28403,0),(12449,28404,0),(12450,28405,0),(12451,28406,0),(12452,28408,0),(12453,28409,0),(12454,28410,0),(12455,28411,0),(12456,28412,0),(12457,28413,0),(12458,28414,0),(12459,28415,0),(12460,28416,0),(12461,28422,0),(12462,28423,0),(12463,28424,0),(12464,28425,0),(12465,28426,0),(12466,28427,0),(12467,28428,0),(12468,28429,0),(12469,28430,0),(12470,28431,0),(12471,28432,0),(12472,28433,0),(12473,28434,0),(12474,28435,0),(12475,28436,0),(12476,28437,0),(12477,28438,0),(12478,28439,0),(12479,28440,0),(12480,28441,0),(12481,28442,0),(12482,28443,0),(12483,28444,0),(12484,28445,0),(12485,28446,0),(12486,28447,0),(12487,28448,0),(12488,28449,0),(12489,28450,0),(12490,28451,0),(12491,28453,0),(12492,28454,0),(12493,28456,0),(12494,28476,0),(12495,28477,0),(12496,28483,0),(12497,28484,0),(12498,28485,0),(12499,28487,0),(12500,28488,0),(12501,28489,0),(12502,28491,0),(12503,28492,0),(12504,28493,0),(12505,28494,0),(12506,28495,0),(12507,28496,0),(12508,28497,0),(12509,28498,0),(12510,28502,0),(12511,28503,0),(12512,28504,0),(12513,28505,0),(12514,28506,0),(12515,28507,0),(12516,28508,0),(12517,28511,0),(12518,28512,0),(12519,28514,0),(12520,28515,0),(12521,28517,0),(12522,28518,0),(12523,28519,0),(12524,28520,0),(12525,28521,0),(12526,28522,0),(12527,28524,0),(12528,28525,0),(12529,28529,0),(12530,28531,0),(12531,28532,0),(12532,28533,0),(12533,28534,0),(12534,28535,0),(12535,28536,0),(12536,28537,0),(12537,28538,0),(12538,28539,0),(12539,28540,0),(12540,28541,0),(12541,28542,0),(12542,28543,0),(12543,28544,0),(12544,28545,0),(12545,28546,0),(12546,28559,0),(12547,28560,0),(12548,28561,0),(12549,28565,0),(12550,28566,0),(12551,28567,0),(12552,28569,0),(12553,28570,0),(12554,28572,0),(12555,28573,0),(12556,28574,0),(12557,28575,0),(12558,28576,0),(12559,28577,0),(12560,28578,0),(12561,28581,0),(12562,28582,0),(12563,28583,0),(12564,28584,0),(12565,28585,0),(12566,28586,0),(12567,28587,0),(12568,28588,0),(12569,28589,0),(12570,28591,0),(12571,28593,0),(12572,28594,0),(12573,28597,0),(12574,28599,0),(12575,28600,0),(12576,28601,0),(12577,28602,0),(12578,28603,0),(12579,28604,0),(12580,28605,0),(12581,28606,0),(12582,28608,0),(12583,28610,0),(12584,28611,0),(12585,28612,0),(12586,28613,0),(12587,28614,0),(12588,28615,0),(12589,28616,0),(12590,28617,0),(12591,28618,0),(12592,28619,0),(12593,28620,0),(12594,28621,0),(12595,28622,0),(12596,28623,0),(12597,28624,0),(12598,28625,0),(12599,28626,0),(12600,28627,0),(12601,28628,0),(12602,28629,0),(12603,28630,0),(12604,28631,0),(12605,28633,0),(12606,28638,0),(12607,28639,0),(12608,28640,0),(12609,28641,0),(12610,28642,0),(12611,28643,0),(12612,28644,0),(12613,28645,0),(12614,28646,0),(12615,28647,0),(12616,28648,0),(12617,28650,0),(12618,28652,0),(12619,28653,0),(12620,28654,0),(12621,28655,0),(12622,28656,0),(12623,28657,0),(12624,28658,0),(12625,28659,0),(12626,28660,0),(12627,28662,0),(12628,28663,0),(12629,28666,0),(12630,28669,0),(12631,28670,0),(12632,28671,0),(12633,28672,0),(12634,28673,0),(12635,28678,0),(12636,28679,0),(12637,28680,0),(12638,28681,0),(12639,28683,0),(12640,28684,0),(12641,28685,0),(12642,28686,0),(12643,28687,0),(12644,28688,0),(12645,28689,0),(12646,28690,0),(12647,28691,0),(12648,28692,0),(12649,28693,0),(12650,28694,0),(12651,28695,0),(12652,28696,0),(12653,28697,0),(12654,28698,0),(12655,28699,0),(12656,28700,0),(12657,28701,0),(12658,28702,0),(12659,28703,0),(12660,28704,0),(12661,28705,0),(12662,28706,0),(12663,28707,0),(12664,28708,0),(12665,28709,0),(12666,28710,0),(12667,28711,0),(12668,28712,0),(12669,28713,0),(12670,28714,0),(12671,28715,0),(12672,28716,0),(12673,28717,0),(12674,28718,0),(12675,28719,0),(12676,28720,0),(12677,28721,0),(12678,28722,0),(12679,28723,0),(12680,28724,0),(12681,28726,0),(12682,28728,0),(12683,28729,0),(12684,28732,0),(12685,28733,0),(12686,28734,0),(12687,28735,0),(12688,28736,0),(12689,28737,0),(12690,28738,0),(12691,28739,0),(12692,28740,0),(12693,28741,0),(12694,28742,0),(12695,28743,0),(12696,28744,0),(12697,28746,0),(12698,28747,0),(12699,28748,0),(12700,28749,0),(12701,28750,0),(12702,28751,0),(12703,28752,0),(12704,28754,0),(12705,28755,0),(12706,28756,0),(12707,28758,0),(12708,28759,0),(12709,28760,0),(12710,28761,0),(12711,28764,0),(12712,28765,0),(12713,28766,0),(12714,28767,0),(12715,28768,0),(12716,28770,0),(12717,28771,0),(12718,28772,0),(12719,28773,0),(12720,28774,0),(12721,28775,0),(12722,28776,0),(12723,28777,0),(12724,28778,0),(12725,28779,0),(12726,28780,0),(12727,28781,0),(12728,28782,0),(12729,28783,0),(12730,28788,0),(12731,28794,0),(12732,28795,0),(12733,28796,0),(12734,28797,0),(12735,28799,0),(12736,28800,0),(12737,28801,0),(12738,28802,0),(12739,28803,0),(12740,28804,0),(12741,28805,0),(12742,28806,0),(12743,28807,0),(12744,28808,0),(12745,28809,0),(12746,28810,0),(12747,28811,0),(12748,28812,0),(12749,28813,0),(12750,28814,0),(12751,28815,0),(12752,28817,0),(12753,28818,0),(12754,28819,0),(12755,28820,0),(12756,28821,0),(12757,28824,0),(12758,28825,0),(12759,28826,0),(12760,28827,0),(12761,28828,0),(12762,28831,0),(12763,28832,0),(12764,28833,0),(12765,28834,0),(12766,28835,0),(12767,28836,0),(12768,28837,0),(12769,28838,0),(12770,28839,0),(12771,28840,0),(12772,28841,0),(12773,28842,0),(12774,28843,0),(12775,28844,0),(12776,28845,0),(12777,28846,0),(12778,28847,0),(12779,28848,0),(12780,28849,0),(12781,28850,0),(12782,28851,0),(12783,28852,0),(12784,28853,0),(12785,28854,0),(12786,28855,0),(12787,28856,0),(12788,28857,0),(12789,28858,0),(12790,28859,0),(12791,28860,0),(12792,28861,0),(12793,28862,0),(12794,28863,0),(12795,28864,0),(12796,28865,0),(12797,28866,0),(12798,28867,0),(12799,28868,0),(12800,28869,0),(12801,28870,0),(12802,28871,0),(12803,28872,0),(12804,28873,0),(12805,28874,0),(12806,28875,0),(12807,28905,0),(12808,28906,0),(12809,28914,0),(12810,28916,0),(12811,28917,0),(12812,28918,0),(12813,28919,0),(12814,28920,0),(12815,28921,0),(12816,28922,0),(12817,28923,0),(12818,28924,0),(12819,28925,0),(12820,28926,0),(12821,28928,0),(12822,28929,0),(12823,28930,0),(12824,28931,0),(12825,28933,0),(12826,28935,0),(12827,28937,0),(12828,28938,0),(12829,28939,0),(12830,28940,0),(12831,28941,0),(12832,28942,0),(12833,28943,0),(12834,28944,0),(12835,28945,0),(12836,28946,0),(12837,28947,0),(12838,28948,0),(12839,28949,0),(12840,28950,0),(12841,28951,0),(12842,28952,0),(12843,28953,0),(12844,28954,0),(12845,28955,0),(12846,28956,0),(12847,28957,0),(12848,28959,0),(12849,28960,0),(12850,28963,0),(12851,28964,0),(12852,28965,0),(12853,28966,0),(12854,28967,0),(12855,28968,0),(12856,28972,0),(12857,28973,0),(12858,28974,0),(12859,28975,0),(12860,28976,0),(12861,28977,0),(12862,28978,0),(12863,28979,0),(12864,28980,0),(12865,28981,0),(12866,28982,0),(12867,28983,0),(12868,28984,0),(12869,28985,0),(12870,28986,0),(12871,28987,0),(12872,28988,0),(12873,28989,0),(12874,28990,0),(12875,28991,0),(12876,28992,0),(12877,28993,0),(12878,28994,0),(12879,28995,0),(12880,28996,0),(12881,28997,0),(12882,28998,0),(12883,28999,0),(12884,29000,0),(12885,29001,0),(12886,29002,0),(12887,29003,0),(12888,29004,0),(12889,29005,0),(12890,29006,0),(12891,29007,0),(12892,29008,0),(12893,29009,0),(12894,29010,0),(12895,29011,0),(12896,29012,0),(12897,29013,0),(12898,29014,0),(12899,29015,0),(12900,29016,0),(12901,29017,0),(12902,29019,0),(12903,29020,0),(12904,29021,0),(12905,29022,0),(12906,29023,0),(12907,29028,0),(12908,29029,0),(12909,29030,0),(12910,29031,0),(12911,29032,0),(12912,29033,0),(12913,29034,0),(12914,29035,0),(12915,29036,0),(12916,29037,0),(12917,29038,0),(12918,29039,0),(12919,29040,0),(12920,29042,0),(12921,29043,0),(12922,29044,0),(12923,29045,0),(12924,29046,0),(12925,29047,0),(12926,29048,0),(12927,29049,0),(12928,29050,0),(12929,29053,0),(12930,29054,0),(12931,29055,0),(12932,29056,0),(12933,29057,0),(12934,29058,0),(12935,29059,0),(12936,29060,0),(12937,29061,0),(12938,29062,0),(12939,29063,0),(12940,29064,0),(12941,29065,0),(12942,29066,0),(12943,29067,0),(12944,29068,0),(12945,29069,0),(12946,29070,0),(12947,29071,0),(12948,29072,0),(12949,29073,0),(12950,29074,0),(12951,29075,0),(12952,29076,0),(12953,29077,0),(12954,29078,0),(12955,29079,0),(12956,29080,0),(12957,29081,0),(12958,29082,0),(12959,29083,0),(12960,29084,0),(12961,29085,0),(12962,29086,0),(12963,29087,0),(12964,29088,0),(12965,29089,0),(12966,29090,0),(12967,29091,0),(12968,29092,0),(12969,29093,0),(12970,29094,0),(12971,29095,0),(12972,29096,0),(12973,29097,0),(12974,29098,0),(12975,29099,0),(12976,29100,0),(12977,29107,0),(12978,29108,0),(12979,29109,0),(12980,29114,0),(12981,29115,0),(12982,29116,0),(12983,29117,0),(12984,29121,0),(12985,29122,0),(12986,29124,0),(12987,29125,0),(12988,29127,0),(12989,29129,0),(12990,29130,0),(12991,29131,0),(12992,29133,0),(12993,29134,0),(12994,29135,0),(12995,29136,0),(12996,29137,0),(12997,29138,0),(12998,29139,0),(12999,29140,0),(13000,29141,0),(13001,29142,0),(13002,29147,0),(13003,29148,0),(13004,29149,0),(13005,29150,0),(13006,29151,0),(13007,29152,0),(13008,29153,0),(13009,29155,0),(13010,29156,0),(13011,29165,0),(13012,29166,0),(13013,29167,0),(13014,29170,0),(13015,29171,0),(13016,29174,0),(13017,29175,0),(13018,29176,0),(13019,29180,0),(13020,29182,0),(13021,29183,0),(13022,29184,0),(13023,29185,0),(13024,29200,0),(13025,29201,0),(13026,29202,0),(13027,29203,0),(13028,29204,0),(13029,29210,0),(13030,29211,0),(13031,29212,0),(13032,29237,0),(13033,29238,0),(13034,29239,0),(13035,29240,0),(13036,29241,0),(13037,29242,0),(13038,29243,0),(13039,29244,0),(13040,29245,0),(13041,29246,0),(13042,29247,0),(13043,29248,0),(13044,29249,0),(13045,29250,0),(13046,29251,0),(13047,29252,0),(13048,29253,0),(13049,29254,0),(13050,29255,0),(13051,29257,0),(13052,29258,0),(13053,29259,0),(13054,29261,0),(13055,29262,0),(13056,29263,0),(13057,29264,0),(13058,29265,0),(13059,29266,0),(13060,29267,0),(13061,29268,0),(13062,29269,0),(13063,29270,0),(13064,29271,0),(13065,29272,0),(13066,29273,0),(13067,29274,0),(13068,29275,0),(13069,29310,0),(13070,29312,0),(13071,29313,0),(13072,29314,0),(13073,29315,0),(13074,29316,0),(13075,29317,0),(13076,29318,0),(13077,29319,0),(13078,29325,0),(13079,29326,0),(13080,29327,0),(13081,29328,0),(13082,29329,0),(13083,29330,0),(13084,29332,0),(13085,29337,0),(13086,29339,0),(13087,29340,0),(13088,29341,0),(13089,29342,0),(13090,29343,0),(13091,29344,0),(13092,29345,0),(13093,29346,0),(13094,29348,0),(13095,29350,0),(13096,29351,0),(13097,29353,0),(13098,29354,0),(13099,29355,0),(13100,29356,0),(13101,29357,0),(13102,29359,0),(13103,29360,0),(13104,29362,0),(13105,29369,0),(13106,29371,0),(13107,29372,0),(13108,29375,0),(13109,29377,0),(13110,29378,0),(13111,29380,0),(13112,29382,0),(13113,29385,0),(13114,29391,0),(13115,29399,0),(13116,29400,0),(13117,29403,0),(13118,29404,0),(13119,29405,0),(13120,29406,0),(13121,29407,0),(13122,29408,0),(13123,29409,0),(13124,29410,0),(13125,29413,0),(13126,29414,0),(13127,29415,0),(13128,29416,0),(13129,29417,0),(13130,29418,0),(13131,29419,0),(13132,29420,0),(13133,29421,0),(13134,29422,0),(13135,29423,0),(13136,29424,0),(13137,29430,0),(13138,29431,0),(13139,29432,0),(13140,29433,0),(13141,29435,0),(13142,29436,0),(13143,29437,0),(13144,29438,0),(13145,29439,0),(13146,29440,0),(13147,29441,0),(13148,29442,0),(13149,29444,0),(13150,29446,0),(13151,29455,0),(13152,29456,0),(13153,29457,0),(13154,29458,0),(13155,29462,0),(13156,29463,0),(13157,29479,0),(13158,29484,0),(13159,29489,0),(13160,29490,0),(13161,29491,0),(13162,29492,0),(13163,29493,0),(13164,29494,0),(13165,29495,0),(13166,29496,0),(13167,29497,0),(13168,29498,0),(13169,29499,0),(13170,29500,0),(13171,29502,0),(13172,29503,0),(13173,29504,0),(13174,29505,0),(13175,29506,0),(13176,29507,0),(13177,29508,0),(13178,29509,0),(13179,29510,0),(13180,29511,0),(13181,29512,0),(13182,29514,0),(13183,29515,0),(13184,29516,0),(13185,29517,0),(13186,29518,0),(13187,29519,0),(13188,29520,0),(13189,29521,0),(13190,29522,0),(13191,29523,0),(13192,29524,0),(13193,29525,0),(13194,29526,0),(13195,29527,0),(13196,29537,0),(13197,29538,0),(13198,29541,0),(13199,29542,0),(13200,29543,0),(13201,29544,0),(13202,29583,0),(13203,29584,0),(13204,29594,0),(13205,29595,0),(13206,29596,0),(13207,29597,0),(13208,29598,0),(13209,29599,0),(13210,29600,0),(13211,29601,0),(13212,29602,0),(13213,29603,0),(13214,29604,0),(13215,29605,0),(13216,29606,0),(13217,29607,0),(13218,29608,0),(13219,29609,0),(13220,29610,0),(13221,29611,0),(13222,29612,0),(13223,29613,0),(13224,29614,0),(13225,29615,0),(13226,29616,0),(13227,29617,0),(13228,29619,0),(13229,29620,0),(13230,29621,0),(13231,29622,0),(13232,29623,0),(13233,29626,0),(13234,29627,0),(13235,29628,0),(13236,29629,0),(13237,29630,0),(13238,29631,0),(13239,29632,0),(13240,29633,0),(13241,29634,0),(13242,29635,0),(13243,29636,0),(13244,29637,0),(13245,29638,0),(13246,29639,0),(13247,29640,0),(13248,29641,0),(13249,29642,0),(13250,29643,0),(13251,29644,0),(13252,29645,0),(13253,29646,0),(13254,29647,0),(13255,29648,0),(13256,29649,0),(13257,29650,0),(13258,29651,0),(13259,29652,0),(13260,29653,0),(13261,29654,0),(13262,29655,0),(13263,29656,0),(13264,29657,0),(13265,29658,0),(13266,29659,0),(13267,29660,0),(13268,29661,0),(13269,29662,0),(13270,29663,0),(13271,29665,0),(13272,29666,0),(13273,29667,0),(13274,29668,0),(13275,29670,0),(13276,29671,0),(13277,29676,0),(13278,29678,0),(13279,29679,0),(13280,29680,0),(13281,29681,0),(13282,29683,0),(13283,29685,0),(13284,29686,0),(13285,29687,0),(13286,29688,0),(13287,29690,0),(13288,29692,0),(13289,29694,0),(13290,29695,0),(13291,29696,0),(13292,29697,0),(13293,29705,0),(13294,29706,0),(13295,29707,0),(13296,29708,0),(13297,29709,0),(13298,29710,0),(13299,29711,0),(13300,29712,0),(13301,29715,0),(13302,29716,0),(13303,29748,0),(13304,29771,0),(13305,29772,0),(13306,29773,0),(13307,29774,0),(13308,29777,0),(13309,29779,0),(13310,29780,0),(13311,29781,0),(13312,29782,0),(13313,29783,0),(13314,29784,0),(13315,29785,0),(13316,29786,0),(13317,29787,0),(13318,29788,0),(13319,29789,0),(13320,29791,0),(13321,29792,0),(13322,29804,0),(13323,29806,0),(13324,29807,0),(13325,29808,0),(13326,29809,0),(13327,29810,0),(13328,29811,0),(13329,29812,0),(13330,29813,0),(13331,29816,0),(13332,29819,0),(13333,29820,0),(13334,29821,0),(13335,29823,0),(13336,29824,0),(13337,29825,0),(13338,29826,0),(13339,29827,0),(13340,29828,0),(13341,29829,0),(13342,29830,0),(13343,29831,0),(13344,29832,0),(13345,29833,0),(13346,29834,0),(13347,29835,0),(13348,29836,0),(13349,29855,0),(13350,29865,0),(13351,29875,0),(13352,29876,0),(13353,29878,0),(13354,29879,0),(13355,29880,0),(13356,29881,0),(13357,29882,0),(13358,29883,0),(13359,29884,0),(13360,29885,0),(13361,29888,0),(13362,29890,0),(13363,29891,0),(13364,29892,0),(13365,29893,0),(13366,29894,0),(13367,29895,0),(13368,29896,0),(13369,29897,0),(13370,29898,0),(13371,29899,0),(13372,29900,0),(13373,29907,0),(13374,29908,0),(13375,29909,0),(13376,29910,0),(13377,29911,0),(13378,29913,0),(13379,29914,0),(13380,29915,0),(13381,29916,0),(13382,29917,0),(13383,29918,0),(13384,29919,0),(13385,29921,0),(13386,29923,0),(13387,29924,0),(13388,29925,0),(13389,29926,0),(13390,29927,0),(13391,29928,0),(13392,29929,0),(13393,29930,0),(13394,29931,0),(13395,29932,0),(13396,29933,0),(13397,29934,0),(13398,29935,0),(13399,29936,0),(13400,29937,0),(13401,29938,0),(13402,29939,0),(13403,29940,0),(13404,29941,0),(13405,29942,0),(13406,29943,0),(13407,29944,0),(13408,29945,0),(13409,29946,0),(13410,29947,0),(13411,29948,0),(13412,29949,0),(13413,29950,0),(13414,29951,0),(13415,29954,0),(13416,29955,0),(13417,29959,0),(13418,29962,0),(13419,29964,0),(13420,29965,0),(13421,29966,0),(13422,29967,0),(13423,29968,0),(13424,29969,0),(13425,29970,0),(13426,29971,0),(13427,29972,0),(13428,29973,0),(13429,29974,0),(13430,29975,0),(13431,29976,0),(13432,29977,0),(13433,29978,0),(13434,29979,0),(13435,29980,0),(13436,29981,0),(13437,29982,0),(13438,29983,0),(13439,29984,0),(13440,29985,0),(13441,29986,0),(13442,29987,0),(13443,29988,0),(13444,29989,0),(13445,29990,0),(13446,29991,0),(13447,29992,0),(13448,29993,0),(13449,29994,0),(13450,29995,0),(13451,29996,0),(13452,29998,0),(13453,29999,0),(13454,30000,0),(13455,30001,0),(13456,30002,0),(13457,30003,0),(13458,30004,0),(13459,30005,0),(13460,30009,0),(13461,30010,0),(13462,30011,0),(13463,30012,0),(13464,30013,0),(13465,30014,0),(13466,30016,0),(13467,30019,0),(13468,30020,0),(13469,30021,0),(13470,30024,0),(13471,30025,0),(13472,30026,0),(13473,30027,0),(13474,30029,0),(13475,30030,0),(13476,30031,0),(13477,30032,0),(13478,30033,0),(13479,30034,0),(13480,30035,0),(13481,30036,0),(13482,30037,0),(13483,30038,0),(13484,30039,0),(13485,30040,0),(13486,30041,0),(13487,30042,0),(13488,30043,0),(13489,30044,0),(13490,30045,0),(13491,30046,0),(13492,30047,0),(13493,30048,0),(13494,30049,0),(13495,30050,0),(13496,30053,0),(13497,30054,0),(13498,30055,0),(13499,30056,0),(13500,30057,0),(13501,30058,0),(13502,30060,0),(13503,30062,0),(13504,30064,0),(13505,30065,0),(13506,30066,0),(13507,30067,0),(13508,30068,0),(13509,30069,0),(13510,30070,0),(13511,30071,0),(13512,30072,0),(13513,30073,0),(13514,30074,0),(13515,30075,0),(13516,30076,0),(13517,30077,0),(13518,30078,0),(13519,30079,0),(13520,30080,0),(13521,30081,0),(13522,30082,0),(13523,30084,0),(13524,30085,0),(13525,30086,0),(13526,30087,0),(13527,30088,0),(13528,30089,0),(13529,30090,0),(13530,30091,0),(13531,30092,0),(13532,30093,0),(13533,30095,0),(13534,30096,0),(13535,30097,0),(13536,30098,0),(13537,30100,0),(13538,30101,0),(13539,30102,0),(13540,30103,0),(13541,30104,0),(13542,30105,0),(13543,30106,0),(13544,30107,0),(13545,30108,0),(13546,30111,0),(13547,30112,0),(13548,30113,0),(13549,30114,0),(13550,30115,0),(13551,30116,0),(13552,30117,0),(13553,30118,0),(13554,30119,0),(13555,30120,0),(13556,30121,0),(13557,30122,0),(13558,30123,0),(13559,30124,0),(13560,30125,0),(13561,30126,0),(13562,30127,0),(13563,30128,0),(13564,30129,0),(13565,30130,0),(13566,30131,0),(13567,30132,0),(13568,30133,0),(13569,30134,0),(13570,30135,0),(13571,30136,0),(13572,30137,0),(13573,30138,0),(13574,30139,0),(13575,30140,0),(13576,30141,0),(13577,30142,0),(13578,30143,0),(13579,30144,0),(13580,30145,0),(13581,30146,0),(13582,30147,0),(13583,30148,0),(13584,30149,0),(13585,30150,0),(13586,30151,0),(13587,30152,0),(13588,30153,0),(13589,30154,0),(13590,30159,0),(13591,30160,0),(13592,30161,0),(13593,30162,0),(13594,30163,0),(13595,30164,0),(13596,30165,0),(13597,30166,0),(13598,30167,0),(13599,30168,0),(13600,30169,0),(13601,30170,0),(13602,30171,0),(13603,30172,0),(13604,30173,0),(13605,30176,0),(13606,30178,0),(13607,30179,0),(13608,30180,0),(13609,30181,0),(13610,30182,0),(13611,30185,0),(13612,30186,0),(13613,30187,0),(13614,30188,0),(13615,30189,0),(13616,30190,0),(13617,30192,0),(13618,30194,0),(13619,30196,0),(13620,30200,0),(13621,30201,0),(13622,30204,0),(13623,30205,0),(13624,30206,0),(13625,30207,0),(13626,30208,0),(13627,30209,0),(13628,30210,0),(13629,30211,0),(13630,30212,0),(13631,30213,0),(13632,30214,0),(13633,30215,0),(13634,30216,0),(13635,30217,0),(13636,30218,0),(13637,30219,0),(13638,30220,0),(13639,30221,0),(13640,30222,0),(13641,30223,0),(13642,30224,0),(13643,30225,0),(13644,30226,0),(13645,30227,0),(13646,30228,0),(13647,30229,0),(13648,30230,0),(13649,30231,0),(13650,30232,0),(13651,30233,0),(13652,30234,0),(13653,30235,0),(13654,30252,0),(13655,30253,0),(13656,30254,0),(13657,30255,0),(13658,30256,0),(13659,30257,0),(13660,30258,0),(13661,30261,0),(13662,30262,0),(13663,30263,0),(13664,30264,0),(13665,30265,0),(13666,30266,0),(13667,30267,0),(13668,30268,0),(13669,30269,0),(13670,30270,0),(13671,30271,0),(13672,30272,0),(13673,30273,0),(13674,30274,0),(13675,30275,0),(13676,30277,0),(13677,30278,0),(13678,30279,0),(13679,30284,0),(13680,30285,0),(13681,30286,0),(13682,30287,0),(13683,30288,0),(13684,30289,0),(13685,30290,0),(13686,30291,0),(13687,30294,0),(13688,30295,0),(13689,30296,0),(13690,30297,0),(13691,30298,0),(13692,30299,0),(13693,30310,0),(13694,30311,0),(13695,30312,0),(13696,30313,0),(13697,30314,0),(13698,30316,0),(13699,30317,0),(13700,30318,0),(13701,30319,0),(13702,30328,0),(13703,30329,0),(13704,30330,0),(13705,30331,0),(13706,30332,0),(13707,30333,0),(13708,30334,0),(13709,30335,0),(13710,30336,0),(13711,30337,0),(13712,30338,0),(13713,30341,0),(13714,30342,0),(13715,30352,0),(13716,30362,0),(13717,30363,0),(13718,30364,0),(13719,30367,0),(13720,30368,0),(13721,30369,0),(13722,30370,0),(13723,30371,0),(13724,30372,0),(13725,30373,0),(13726,30374,0),(13727,30375,0),(13728,30376,0),(13729,30379,0),(13730,30380,0),(13731,30381,0),(13732,30382,0),(13733,30383,0),(13734,30384,0),(13735,30385,0),(13736,30386,0),(13737,30387,0),(13738,30388,0),(13739,30389,0),(13740,30390,0),(13741,30391,0),(13742,30392,0),(13743,30393,0),(13744,30394,0),(13745,30395,0),(13746,30396,0),(13747,30397,0),(13748,30398,0),(13749,30399,0),(13750,30400,0),(13751,30401,0),(13752,30402,0),(13753,30403,0),(13754,30405,0),(13755,30406,0),(13756,30407,0),(13757,30408,0),(13758,30409,0),(13759,30410,0),(13760,30411,0),(13761,30412,0),(13762,30414,0),(13763,30418,0),(13764,30423,0),(13765,30424,0),(13766,30439,0),(13767,30440,0),(13768,30441,0),(13769,30445,0),(13770,30452,0),(13771,30455,0),(13772,30456,0),(13773,30459,0),(13774,30460,0),(13775,30461,0),(13776,30463,0),(13777,30464,0),(13778,30465,0),(13779,30482,0),(13780,30484,0),(13781,30485,0),(13782,30486,0),(13783,30487,0),(13784,30488,0),(13785,30489,0),(13786,30490,0),(13787,30491,0),(13788,30497,0),(13789,30498,0),(13790,30502,0),(13791,30504,0),(13792,30505,0),(13793,30514,0),(13794,30515,0),(13795,30516,0),(13796,30517,0),(13797,30518,0),(13798,30519,0),(13799,30520,0),(13800,30521,0),(13801,30522,0),(13802,30523,0),(13803,30528,0),(13804,30531,0),(13805,30532,0),(13806,30533,0),(13807,30534,0),(13808,30535,0),(13809,30536,0),(13810,30538,0),(13811,30541,0),(13812,30543,0),(13813,30557,0),(13814,30568,0),(13815,30569,0),(13816,30570,0),(13817,30576,0),(13818,30577,0),(13819,30578,0),(13820,30580,0),(13821,30597,0),(13822,30599,0),(13823,30611,0),(13824,30612,0),(13825,30624,0),(13826,30625,0),(13827,30636,0),(13828,30641,0),(13829,30642,0),(13830,30643,0),(13831,30644,0),(13832,30647,0),(13833,30648,0),(13834,30660,0),(13835,30661,0),(13836,30662,0),(13837,30668,0),(13838,30669,0),(13839,30670,0),(13840,30671,0),(13841,30673,0),(13842,30674,0),(13843,30675,0),(13844,30676,0),(13845,30677,0),(13846,30678,0),(13847,30680,0),(13848,30681,0),(13849,30682,0),(13850,30683,0),(13851,30684,0),(13852,30685,0),(13853,30686,0),(13854,30687,0),(13855,30697,0),(13856,30698,0),(13857,30699,0),(13858,30702,0),(13859,30705,0),(13860,30707,0),(13861,30708,0),(13862,30709,0),(13863,30714,0),(13864,30715,0),(13865,30718,0),(13866,30719,0),(13867,30721,0),(13868,30722,0),(13869,30723,0),(13870,30724,0),(13871,30725,0),(13872,30727,0),(13873,30728,0),(13874,30729,0),(13875,30730,0),(13876,30731,0),(13877,30732,0),(13878,30733,0),(13879,30734,0),(13880,30735,0),(13881,30737,0),(13882,30739,0),(13883,30740,0),(13884,30741,0),(13885,30749,0),(13886,30750,0),(13887,30751,0),(13888,30752,0),(13889,30753,0),(13890,30754,0),(13891,30755,0),(13892,30757,0),(13893,30758,0),(13894,30759,0),(13895,30760,0),(13896,30761,0),(13897,30762,0),(13898,30763,0),(13899,30764,0),(13900,30765,0),(13901,30766,0),(13902,30767,0),(13903,30768,0),(13904,30769,0),(13905,30770,0),(13906,30771,0),(13907,30772,0),(13908,30773,0),(13909,30774,0),(13910,30775,0),(13911,30776,0),(13912,30777,0),(13913,30778,0),(13914,30779,0),(13915,30780,0),(13916,30781,0),(13917,30784,0),(13918,30787,0),(13919,30788,0),(13920,30789,0),(13921,30790,0),(13922,30795,0),(13923,30801,0),(13924,30802,0),(13925,30830,0),(13926,30831,0),(13927,30832,0),(13928,30835,0),(13929,30836,0),(13930,30837,0),(13931,30838,0),(13932,30839,0),(13933,30847,0),(13934,30848,0),(13935,30855,0),(13936,30856,0),(13937,30857,0),(13938,30859,0),(13939,30861,0),(13940,30862,0),(13941,30863,0),(13942,30864,0),(13943,30865,0),(13944,30866,0),(13945,30868,0),(13946,30869,0),(13947,30870,0),(13948,30871,0),(13949,30872,0),(13950,30873,0),(13951,30874,0),(13952,30878,0),(13953,30879,0),(13954,30880,0),(13955,30881,0),(13956,30882,0),(13957,30883,0),(13958,30884,0),(13959,30885,0),(13960,30886,0),(13961,30887,0),(13962,30888,0),(13963,30889,0),(13964,30891,0),(13965,30892,0),(13966,30893,0),(13967,30894,0),(13968,30895,0),(13969,30896,0),(13970,30897,0),(13971,30898,0),(13972,30899,0),(13973,30900,0),(13974,30901,0),(13975,30902,0),(13976,30903,0),(13977,30904,0),(13978,30905,0),(13979,30906,0),(13980,30907,0),(13981,30908,0),(13982,30909,0),(13983,30910,0),(13984,30911,0),(13985,30912,0),(13986,30913,0),(13987,30914,0),(13988,30915,0),(13989,30916,0),(13990,30917,0),(13991,30918,0),(13992,30919,0),(13993,30920,0),(13994,30921,0),(13995,30922,0),(13996,30923,0),(13997,30924,0),(13998,30925,0),(13999,30926,0),(14000,30927,0),(14001,30928,0),(14002,30929,0),(14003,30930,0),(14004,30931,0),(14005,30932,0),(14006,30933,0),(14007,30934,0),(14008,30935,0),(14009,30936,0),(14010,30937,0),(14011,30938,0),(14012,30939,0),(14013,30940,0),(14014,30941,0),(14015,30942,0),(14016,30943,0),(14017,30944,0),(14018,30945,0),(14019,30946,0),(14020,30947,0),(14021,30948,0),(14022,30949,0),(14023,30950,0),(14024,30951,0),(14025,30952,0),(14026,30953,0),(14027,30954,0),(14028,30955,0),(14029,30956,0),(14030,30957,0),(14031,30958,0),(14032,30959,0),(14033,30960,0),(14034,30961,0),(14035,30962,0),(14036,30963,0),(14037,30964,0),(14038,30965,0),(14039,30966,0),(14040,30967,0),(14041,30968,0),(14042,30969,0),(14043,30970,0),(14044,30971,0),(14045,30972,0),(14046,30974,0),(14047,30975,0),(14048,30976,0),(14049,30977,0),(14050,30978,0),(14051,30979,0),(14052,30980,0),(14053,30982,0),(14054,30983,0),(14055,30984,0),(14056,30985,0),(14057,30986,0),(14058,30987,0),(14059,30988,0),(14060,30989,0),(14061,30990,0),(14062,30991,0),(14063,30992,0),(14064,30993,0),(14065,30994,0),(14066,30995,0),(14067,30996,0),(14068,30997,0),(14069,30998,0),(14070,30999,0),(14071,31000,0),(14072,31001,0),(14073,31002,0),(14074,31003,0),(14075,31004,0),(14076,31005,0),(14077,31006,0),(14078,31007,0),(14079,31008,0),(14080,31009,0),(14081,31010,0),(14082,31011,0),(14083,31012,0),(14084,31013,0),(14085,31014,0),(14086,31015,0),(14087,31016,0),(14088,31017,0),(14089,31018,0),(14090,31019,0),(14091,31020,0),(14092,31021,0),(14093,31022,0),(14094,31023,0),(14095,31024,0),(14096,31026,0),(14097,31027,0),(14098,31028,0),(14099,31029,0),(14100,31030,0),(14101,31032,0),(14102,31034,0),(14103,31035,0),(14104,31036,0),(14105,31037,0),(14106,31038,0),(14107,31039,0),(14108,31040,0),(14109,31041,0),(14110,31042,0),(14111,31043,0),(14112,31044,0),(14113,31045,0),(14114,31046,0),(14115,31047,0),(14116,31048,0),(14117,31049,0),(14118,31050,0),(14119,31051,0),(14120,31052,0),(14121,31053,0),(14122,31054,0),(14123,31055,0),(14124,31056,0),(14125,31057,0),(14126,31058,0),(14127,31059,0),(14128,31060,0),(14129,31061,0),(14130,31062,0),(14131,31063,0),(14132,31064,0),(14133,31065,0),(14134,31066,0),(14135,31067,0),(14136,31068,0),(14137,31069,0),(14138,31070,0),(14139,31071,0),(14140,31072,0),(14141,31073,0),(14142,31081,0),(14143,31082,0),(14144,31083,0),(14145,31104,0),(14146,31105,0),(14147,31106,0),(14148,31107,0),(14149,31109,0),(14150,31110,0),(14151,31111,0),(14152,31112,0),(14153,31114,0),(14154,31115,0),(14155,31125,0),(14156,31126,0),(14157,31127,0),(14158,31131,0),(14159,31133,0),(14160,31134,0),(14161,31136,0),(14162,31137,0),(14163,31138,0),(14164,31139,0),(14165,31140,0),(14166,31142,0),(14167,31143,0),(14168,31145,0),(14169,31148,0),(14170,31149,0),(14171,31150,0),(14172,31151,0),(14173,31152,0),(14174,31153,0),(14175,31155,0),(14176,31156,0),(14177,31157,0),(14178,31158,0),(14179,31159,0),(14180,31160,0),(14181,31161,0),(14182,31162,0),(14183,31163,0),(14184,31164,0),(14185,31165,0),(14186,31166,0),(14187,31168,0),(14188,31170,0),(14189,31172,0),(14190,31173,0),(14191,31174,0),(14192,31175,0),(14193,31176,0),(14194,31177,0),(14195,31179,0),(14196,31180,0),(14197,31181,0),(14198,31182,0),(14199,31183,0),(14200,31184,0),(14201,31185,0),(14202,31186,0),(14203,31187,0),(14204,31188,0),(14205,31189,0),(14206,31190,0),(14207,31191,0),(14208,31192,0),(14209,31193,0),(14210,31195,0),(14211,31197,0),(14212,31198,0),(14213,31199,0),(14214,31200,0),(14215,31201,0),(14216,31202,0),(14217,31204,0),(14218,31205,0),(14219,31206,0),(14220,31207,0),(14221,31208,0),(14222,31209,0),(14223,31210,0),(14224,31211,0),(14225,31212,0),(14226,31213,0),(14227,31214,0),(14228,31215,0),(14229,31216,0),(14230,31217,0),(14231,31218,0),(14232,31219,0),(14233,31220,0),(14234,31221,0),(14235,31222,0),(14236,31223,0),(14237,31224,0),(14238,31225,0),(14239,31226,0),(14240,31227,0),(14241,31228,0),(14242,31229,0),(14243,31230,0),(14244,31231,0),(14245,31232,0),(14246,31233,0),(14247,31234,0),(14248,31235,0),(14249,31236,0),(14250,31237,0),(14251,31240,0),(14252,31242,0),(14253,31243,0),(14254,31244,0),(14255,31246,0),(14256,31247,0),(14257,31248,0),(14258,31249,0),(14259,31250,0),(14260,31253,0),(14261,31254,0),(14262,31255,0),(14263,31256,0),(14264,31257,0),(14265,31259,0),(14266,31263,0),(14267,31264,0),(14268,31265,0),(14269,31266,0),(14270,31267,0),(14271,31268,0),(14272,31269,0),(14273,31270,0),(14274,31272,0),(14275,31273,0),(14276,31274,0),(14277,31276,0),(14278,31279,0),(14279,31280,0),(14280,31281,0),(14281,31282,0),(14282,31283,0),(14283,31284,0),(14284,31285,0),(14285,31286,0),(14286,31287,0),(14287,31288,0),(14288,31289,0),(14289,31291,0),(14290,31292,0),(14291,31293,0),(14292,31294,0),(14293,31295,0),(14294,31296,0),(14295,31297,0),(14296,31298,0),(14297,31299,0),(14298,31301,0),(14299,31302,0),(14300,31303,0),(14301,31304,0),(14302,31305,0),(14303,31306,0),(14304,31308,0),(14305,31309,0),(14306,31311,0),(14307,31312,0),(14308,31313,0),(14309,31314,0),(14310,31315,0),(14311,31318,0),(14312,31320,0),(14313,31322,0),(14314,31323,0),(14315,31325,0),(14316,31327,0),(14317,31328,0),(14318,31329,0),(14319,31330,0),(14320,31331,0),(14321,31332,0),(14322,31333,0),(14323,31334,0),(14324,31335,0),(14325,31336,0),(14326,31340,0),(14327,31341,0),(14328,31342,0),(14329,31343,0),(14330,31348,0),(14331,31352,0),(14332,31353,0),(14333,31364,0),(14334,31366,0),(14335,31367,0),(14336,31368,0),(14337,31369,0),(14338,31370,0),(14339,31371,0),(14340,31375,0),(14341,31376,0),(14342,31377,0),(14343,31378,0),(14344,31379,0),(14345,31396,0),(14346,31397,0),(14347,31400,0),(14348,31404,0),(14349,31405,0),(14350,31406,0),(14351,31407,0),(14352,31409,0),(14353,31410,0),(14354,31411,0),(14355,31412,0),(14356,31413,0),(14357,31414,0),(14358,31415,0),(14359,31416,0),(14360,31417,0),(14361,31418,0),(14362,31419,0),(14363,31420,0),(14364,31421,0),(14365,31422,0),(14366,31423,0),(14367,31424,0),(14368,31425,0),(14369,31426,0),(14370,31427,0),(14371,31428,0),(14372,31429,0),(14373,31430,0),(14374,31431,0),(14375,31432,0),(14376,31433,0),(14377,31434,0),(14378,31435,0),(14379,31436,0),(14380,31438,0),(14381,31439,0),(14382,31440,0),(14383,31441,0),(14384,31442,0),(14385,31443,0),(14386,31444,0),(14387,31445,0),(14388,31446,0),(14389,31447,0),(14390,31448,0),(14391,31452,0),(14392,31453,0),(14393,31454,0),(14394,31455,0),(14395,31456,0),(14396,31457,0),(14397,31458,0),(14398,31459,0),(14399,31460,0),(14400,31461,0),(14401,31462,0),(14402,31464,0),(14403,31465,0),(14404,31466,0),(14405,31467,0),(14406,31468,0),(14407,31470,0),(14408,31471,0),(14409,31472,0),(14410,31473,0),(14411,31474,0),(14412,31475,0),(14413,31476,0),(14414,31477,0),(14415,31478,0),(14416,31479,0),(14417,31480,0),(14418,31481,0),(14419,31482,0),(14420,31483,0),(14421,31484,0),(14422,31485,0),(14423,31486,0),(14424,31487,0),(14425,31488,0),(14426,31490,0),(14427,31491,0),(14428,31492,0),(14429,31493,0),(14430,31494,0),(14431,31497,0),(14432,31499,0),(14433,31508,0),(14434,31509,0),(14435,31510,0),(14436,31511,0),(14437,31512,0),(14438,31513,0),(14439,31514,0),(14440,31515,0),(14441,31516,0),(14442,31519,0),(14443,31520,0),(14444,31521,0),(14445,31531,0),(14446,31532,0),(14447,31533,0),(14448,31534,0),(14449,31537,0),(14450,31538,0),(14451,31539,0),(14452,31540,0),(14453,31541,0),(14454,31542,0),(14455,31543,0),(14456,31544,0),(14457,31545,0),(14458,31546,0),(14459,31547,0),(14460,31548,0),(14461,31549,0),(14462,31551,0),(14463,31552,0),(14464,31553,0),(14465,31554,0),(14466,31555,0),(14467,31556,0),(14468,31557,0),(14469,31558,0),(14470,31559,0),(14471,31560,0),(14472,31561,0),(14473,31562,0),(14474,31563,0),(14475,31564,0),(14476,31565,0),(14477,31566,0),(14478,31567,0),(14479,31568,0),(14480,31569,0),(14481,31570,0),(14482,31571,0),(14483,31572,0),(14484,31573,0),(14485,31574,0),(14486,31575,0),(14487,31576,0),(14488,31577,0),(14489,31578,0),(14490,31579,0),(14491,31580,0),(14492,31581,0),(14493,31582,0),(14494,31583,0),(14495,31584,0),(14496,31585,0),(14497,31586,0),(14498,31587,0),(14499,31588,0),(14500,31589,0),(14501,31590,0),(14502,31591,0),(14503,31592,0),(14504,31593,0),(14505,31594,0),(14506,31595,0),(14507,31596,0),(14508,31597,0),(14509,31598,0),(14510,31599,0),(14511,31600,0),(14512,31601,0),(14513,31603,0),(14514,31604,0),(14515,31605,0),(14516,31608,0),(14517,31609,0),(14518,31611,0),(14519,31612,0),(14520,31613,0),(14521,31614,0),(14522,31616,0),(14523,31618,0),(14524,31619,0),(14525,31620,0),(14526,31621,0),(14527,31622,0),(14528,31623,0),(14529,31624,0),(14530,31625,0),(14531,31626,0),(14532,31627,0),(14533,31628,0),(14534,31629,0),(14535,31630,0),(14536,31631,0),(14537,31632,0),(14538,31633,0),(14539,31634,0),(14540,31635,0),(14541,31636,0),(14542,31637,0),(14543,31638,0),(14544,31639,0),(14545,31640,0),(14546,31641,0),(14547,31642,0),(14548,31643,0),(14549,31644,0),(14550,31646,0),(14551,31647,0),(14552,31648,0),(14553,31649,0),(14554,31650,0),(14555,31654,0),(14556,31657,0),(14557,31658,0),(14558,31659,0),(14559,31660,0),(14560,31661,0),(14561,31669,0),(14562,31683,0),(14563,31684,0),(14564,31685,0),(14565,31686,0),(14566,31687,0),(14567,31688,0),(14568,31689,0),(14569,31690,0),(14570,31699,0),(14571,31700,0),(14572,31701,0),(14573,31703,0),(14574,31711,0),(14575,31712,0),(14576,31713,0),(14577,31714,0),(14578,31715,0),(14579,31717,0),(14580,31718,0),(14581,31719,0),(14582,31720,0),(14583,31723,0),(14584,31724,0),(14585,31725,0),(14586,31731,0),(14587,31732,0),(14588,31733,0),(14589,31734,0),(14590,31735,0),(14591,31737,0),(14592,31743,0),(14593,31745,0),(14594,31756,0),(14595,31758,0),(14596,31759,0),(14597,31761,0),(14598,31762,0),(14599,31764,0),(14600,31765,0),(14601,31766,0),(14602,31768,0),(14603,31770,0),(14604,31773,0),(14605,31774,0),(14606,31775,0),(14607,31776,0),(14608,31777,0),(14609,31778,0),(14610,31779,0),(14611,31780,0),(14612,31781,0),(14613,31782,0),(14614,31783,0),(14615,31784,0),(14616,31785,0),(14617,31786,0),(14618,31787,0),(14619,31788,0),(14620,31789,0),(14621,31792,0),(14622,31793,0),(14623,31794,0),(14624,31796,0),(14625,31797,0),(14626,31798,0),(14627,31801,0),(14628,31802,0),(14629,31803,0),(14630,31804,0),(14631,31805,0),(14632,31806,0),(14633,31816,0),(14634,31817,0),(14635,31819,0),(14636,31821,0),(14637,31823,0),(14638,31824,0),(14639,31935,0),(14640,31936,0),(14641,31937,0),(14642,31938,0),(14643,31939,0),(14644,31942,0),(14645,31949,0),(14646,31958,0),(14647,31959,0),(14648,31960,0),(14649,31961,0),(14650,31962,0),(14651,31963,0),(14652,31964,0),(14653,31965,0),(14654,31966,0),(14655,31967,0),(14656,31968,0),(14657,31969,0),(14658,31971,0),(14659,31972,0),(14660,31973,0),(14661,31974,0),(14662,31975,0),(14663,31976,0),(14664,31977,0),(14665,31978,0),(14666,31979,0),(14667,31980,0),(14668,31981,0),(14669,31982,0),(14670,31983,0),(14671,31984,0),(14672,31985,0),(14673,31986,0),(14674,31987,0),(14675,31988,0),(14676,31989,0),(14677,31990,0),(14678,31991,0),(14679,31992,0),(14680,31993,0),(14681,31995,0),(14682,31996,0),(14683,31997,0),(14684,31998,0),(14685,31999,0),(14686,32000,0),(14687,32001,0),(14688,32002,0),(14689,32003,0),(14690,32004,0),(14691,32005,0),(14692,32006,0),(14693,32007,0),(14694,32008,0),(14695,32009,0),(14696,32010,0),(14697,32011,0),(14698,32012,0),(14699,32013,0),(14700,32014,0),(14701,32015,0),(14702,32016,0),(14703,32017,0),(14704,32018,0),(14705,32019,0),(14706,32020,0),(14707,32021,0),(14708,32022,0),(14709,32023,0),(14710,32024,0),(14711,32025,0),(14712,32026,0),(14713,32027,0),(14714,32028,0),(14715,32029,0),(14716,32030,0),(14717,32031,0),(14718,32032,0),(14719,32033,0),(14720,32034,0),(14721,32035,0),(14722,32036,0),(14723,32037,0),(14724,32038,0),(14725,32039,0),(14726,32040,0),(14727,32041,0),(14728,32042,0),(14729,32043,0),(14730,32044,0),(14731,32045,0),(14732,32046,0),(14733,32047,0),(14734,32048,0),(14735,32049,0),(14736,32050,0),(14737,32051,0),(14738,32052,0),(14739,32053,0),(14740,32054,0),(14741,32055,0),(14742,32056,0),(14743,32057,0),(14744,32058,0),(14745,32059,0),(14746,32060,0),(14747,32065,0),(14748,32066,0),(14749,32072,0),(14750,32073,0),(14751,32076,0),(14752,32077,0),(14753,32078,0),(14754,32080,0),(14755,32082,0),(14756,32083,0),(14757,32084,0),(14758,32085,0),(14759,32086,0),(14760,32087,0),(14761,32088,0),(14762,32089,0),(14763,32090,0),(14764,32091,0),(14765,32093,0),(14766,32094,0),(14767,32095,0),(14768,32096,0),(14769,32097,0),(14770,32098,0),(14771,32099,0),(14772,32100,0),(14773,32101,0),(14774,32102,0),(14775,32103,0),(14776,32104,0),(14777,32105,0),(14778,32106,0),(14779,32107,0),(14780,32108,0),(14781,32109,0),(14782,32110,0),(14783,32111,0),(14784,32112,0),(14785,32113,0),(14786,32114,0),(14787,32115,0),(14788,32116,0),(14789,32117,0),(14790,32118,0),(14791,32119,0),(14792,32120,0),(14793,32121,0),(14794,32122,0),(14795,32123,0),(14796,32124,0),(14797,32125,0),(14798,32126,0),(14799,32127,0),(14800,32128,0),(14801,32129,0),(14802,32130,0),(14803,32131,0),(14804,32132,0),(14805,32133,0),(14806,32134,0),(14807,32135,0),(14808,32136,0),(14809,32137,0),(14810,32138,0),(14811,32139,0),(14812,32140,0),(14813,32141,0),(14814,32142,0),(14815,32143,0),(14816,32144,0),(14817,32145,0),(14818,32146,0),(14819,32147,0),(14820,32148,0),(14821,32149,0),(14822,32150,0),(14823,32151,0),(14824,32152,0),(14825,32153,0),(14826,32154,0),(14827,32155,0),(14828,32156,0),(14829,32157,0),(14830,32158,0),(14831,32159,0),(14832,32160,0),(14833,32161,0),(14834,32162,0),(14835,32163,0),(14836,32164,0),(14837,32165,0),(14838,32166,0),(14839,32167,0),(14840,32168,0),(14841,32169,0),(14842,32170,0),(14843,32171,0),(14844,32172,0),(14845,32173,0),(14846,32174,0),(14847,32175,0),(14848,32176,0),(14849,32177,0),(14850,32178,0),(14851,32179,0),(14852,32180,0),(14853,32181,0),(14854,32182,0),(14855,32183,0),(14856,32184,0),(14857,32185,0),(14858,32186,0),(14859,32187,0),(14860,32188,0),(14861,32189,0),(14862,32190,0),(14863,32191,0),(14864,32192,0),(14865,32232,0),(14866,32234,0),(14867,32235,0),(14868,32236,0),(14869,32237,0),(14870,32239,0),(14871,32240,0),(14872,32241,0),(14873,32242,0),(14874,32243,0),(14875,32245,0),(14876,32246,0),(14877,32248,0),(14878,32250,0),(14879,32251,0),(14880,32252,0),(14881,32253,0),(14882,32254,0),(14883,32255,0),(14884,32256,0),(14885,32258,0),(14886,32259,0),(14887,32262,0),(14888,32263,0),(14889,32264,0),(14890,32265,0),(14891,32267,0),(14892,32268,0),(14893,32269,0),(14894,32270,0),(14895,32271,0),(14896,32272,0),(14897,32273,0),(14898,32275,0),(14899,32276,0),(14900,32278,0),(14901,32279,0),(14902,32280,0),(14903,32322,0),(14904,32323,0),(14905,32324,0),(14906,32325,0),(14907,32326,0),(14908,32327,0),(14909,32328,0),(14910,32329,0),(14911,32331,0),(14912,32332,0),(14913,32333,0),(14914,32334,0),(14915,32336,0),(14916,32337,0),(14917,32338,0),(14918,32339,0),(14919,32340,0),(14920,32341,0),(14921,32342,0),(14922,32343,0),(14923,32344,0),(14924,32345,0),(14925,32346,0),(14926,32347,0),(14927,32348,0),(14928,32350,0),(14929,32351,0),(14930,32352,0),(14931,32353,0),(14932,32354,0),(14933,32360,0),(14934,32361,0),(14935,32363,0),(14936,32365,0),(14937,32366,0),(14938,32367,0),(14939,32369,0),(14940,32371,0),(14941,32373,0),(14942,32374,0),(14943,32375,0),(14944,32376,0),(14945,32377,0),(14946,32378,0),(14947,32384,0),(14948,32389,0),(14949,32390,0),(14950,32391,0),(14951,32392,0),(14952,32393,0),(14953,32394,0),(14954,32395,0),(14955,32396,0),(14956,32397,0),(14957,32398,0),(14958,32399,0),(14959,32400,0),(14960,32401,0),(14961,32402,0),(14962,32403,0),(14963,32404,0),(14964,32407,0),(14965,32414,0),(14966,32415,0),(14967,32416,0),(14968,32417,0),(14969,32418,0),(14970,32419,0),(14971,32420,0),(14972,32421,0),(14973,32422,0),(14974,32425,0),(14975,32445,0),(14976,32448,0),(14977,32450,0),(14978,32451,0),(14979,32452,0),(14980,32460,0),(14981,32461,0),(14982,32463,0),(14983,32466,0),(14984,32471,0),(14985,32472,0),(14986,32473,0),(14987,32474,0),(14988,32475,0),(14989,32476,0),(14990,32477,0),(14991,32478,0),(14992,32479,0),(14993,32480,0),(14994,32482,0),(14995,32484,0),(14996,32494,0),(14997,32495,0),(14998,32499,0),(14999,32500,0),(15000,32504,0),(15001,32507,0),(15002,32510,0),(15003,32512,0),(15004,32513,0),(15005,32515,0),(15006,32516,0),(15007,32517,0),(15008,32518,0),(15009,32519,0),(15010,32520,0),(15011,32521,0),(15012,32522,0),(15013,32524,0),(15014,32525,0),(15015,32529,0),(15016,32530,0),(15017,32532,0),(15018,32533,0),(15019,32536,0),(15020,32537,0),(15021,32538,0),(15022,32539,0),(15023,32540,0),(15024,32541,0),(15025,32562,0),(15026,32565,0),(15027,32568,0),(15028,32570,0),(15029,32571,0),(15030,32573,0),(15031,32574,0),(15032,32575,0),(15033,32577,0),(15034,32579,0),(15035,32580,0),(15036,32581,0),(15037,32582,0),(15038,32583,0),(15039,32584,0),(15040,32585,0),(15041,32586,0),(15042,32587,0),(15043,32590,0),(15044,32592,0),(15045,32593,0),(15046,32594,0),(15047,32603,0),(15048,32604,0),(15049,32605,0),(15050,32606,0),(15051,32607,0),(15052,32608,0),(15053,32609,0),(15054,32610,0),(15055,32611,0),(15056,32612,0),(15057,32613,0),(15058,32614,0),(15059,32615,0),(15060,32632,0),(15061,32633,0),(15062,32644,0),(15063,32645,0),(15064,32647,0),(15065,32648,0),(15066,32650,0),(15067,32651,0),(15068,32652,0),(15069,32653,0),(15070,32655,0),(15071,32656,0),(15072,32659,0),(15073,32660,0),(15074,32661,0),(15075,32662,0),(15076,32663,0),(15077,32665,0),(15078,32699,0),(15079,32729,0),(15080,32730,0),(15081,32731,0),(15082,32740,0),(15083,32743,0),(15084,32756,0),(15085,32760,0),(15086,32761,0),(15087,32769,0),(15088,32776,0),(15089,32778,0),(15090,32780,0),(15091,32781,0),(15092,32785,0),(15093,32786,0),(15094,32787,0),(15095,32788,0),(15096,32789,0),(15097,32790,0),(15098,32791,0),(15099,32792,0),(15100,32793,0),(15101,32794,0),(15102,32795,0),(15103,32796,0),(15104,32797,0),(15105,32798,0),(15106,32799,0),(15107,32800,0),(15108,32801,0),(15109,32802,0),(15110,32803,0),(15111,32804,0),(15112,32805,0),(15113,32806,0),(15114,32807,0),(15115,32808,0),(15116,32809,0),(15117,32810,0),(15118,32811,0),(15119,32812,0),(15120,32813,0),(15121,32814,0),(15122,32816,0),(15123,32817,0),(15124,32818,0),(15125,32819,0),(15126,32820,0),(15127,32821,0),(15128,32824,0),(15129,32826,0),(15130,32827,0),(15131,32828,0),(15132,32829,0),(15133,32830,0),(15134,32831,0),(15135,32832,0),(15136,32837,0),(15137,32838,0),(15138,32841,0),(15139,32854,0),(15140,32856,0),(15141,32865,0),(15142,32866,0),(15143,32867,0),(15144,32868,0),(15145,32869,0),(15146,32870,0),(15147,32871,0),(15148,32872,0),(15149,32874,0),(15150,32875,0),(15151,32876,0),(15152,32877,0),(15153,32878,0),(15154,32879,0),(15155,32882,0),(15156,32883,0),(15157,32884,0),(15158,32885,0),(15159,32886,0),(15160,32887,0),(15161,32889,0),(15162,32890,0),(15163,32891,0),(15164,32892,0),(15165,32893,0),(15166,32894,0),(15167,32912,0),(15168,32914,0),(15169,32915,0),(15170,32917,0),(15171,32918,0),(15172,32919,0),(15173,32920,0),(15174,32922,0),(15175,32923,0),(15176,32924,0),(15177,32925,0),(15178,32926,0),(15179,32927,0),(15180,32928,0),(15181,32929,0),(15182,32930,0),(15183,32931,0),(15184,32932,0),(15185,32933,0),(15186,32934,0),(15187,32935,0),(15188,32936,0),(15189,32937,0),(15190,32938,0),(15191,32939,0),(15192,32940,0),(15193,32943,0),(15194,32944,0),(15195,32945,0),(15196,32946,0),(15197,32949,0),(15198,32950,0),(15199,32951,0),(15200,32953,0),(15201,32961,0),(15202,32962,0),(15203,32963,0),(15204,32964,0),(15205,32970,0),(15206,32973,0),(15207,32974,0),(15208,32975,0),(15209,32976,0),(15210,32977,0),(15211,32978,0),(15212,32979,0),(15213,32980,0),(15214,32981,0),(15215,32982,0),(15216,32983,0),(15217,32984,0),(15218,32985,0),(15219,32986,0),(15220,32987,0),(15221,32988,0),(15222,32989,0),(15223,32990,0),(15224,32991,0),(15225,32992,0),(15226,32993,0),(15227,32994,0),(15228,32995,0),(15229,32996,0),(15230,32997,0),(15231,32998,0),(15232,32999,0),(15233,33002,0),(15234,33005,0),(15235,33006,0),(15236,33012,0),(15237,33014,0),(15238,33016,0),(15239,33017,0),(15240,33018,0),(15241,33019,0),(15242,33020,0),(15243,33021,0),(15244,33022,0),(15245,33027,0),(15246,33040,0),(15247,33047,0),(15248,33049,0),(15249,33073,0),(15250,33074,0),(15251,33075,0),(15252,33080,0),(15253,33089,0),(15254,33094,0),(15255,33105,0),(15256,33116,0),(15257,33118,0),(15258,33122,0),(15259,33125,0),(15260,33161,0),(15261,33162,0),(15262,33168,0),(15263,33169,0),(15264,33170,0),(15265,33171,0),(15266,33172,0),(15267,33173,0),(15268,33177,0),(15269,33178,0),(15270,33180,0),(15271,33181,0),(15272,33191,0),(15273,33192,0),(15274,33203,0),(15275,33204,0),(15276,33206,0),(15277,33207,0),(15278,33210,0),(15279,33211,0),(15280,33212,0),(15281,33213,0),(15282,33214,0),(15283,33215,0),(15284,33216,0),(15285,33220,0),(15286,33222,0),(15287,33227,0),(15288,33228,0),(15289,33229,0),(15290,33230,0),(15291,33231,0),(15292,33232,0),(15293,33233,0),(15294,33235,0),(15295,33237,0),(15296,33239,0),(15297,33240,0),(15298,33241,0),(15299,33242,0),(15300,33243,0),(15301,33244,0),(15302,33245,0),(15303,33247,0),(15304,33248,0),(15305,33249,0),(15306,33250,0),(15307,33251,0),(15308,33252,0),(15309,33253,0),(15310,33255,0),(15311,33256,0),(15312,33257,0),(15313,33258,0),(15314,33259,0),(15315,33260,0),(15316,33261,0),(15317,33266,0),(15318,33267,0),(15319,33268,0),(15320,33269,0),(15321,33270,0),(15322,33271,0),(15323,33272,0),(15324,33273,0),(15325,33274,0),(15326,33275,0),(15327,33276,0),(15328,33279,0),(15329,33280,0),(15330,33283,0),(15331,33285,0),(15332,33286,0),(15333,33287,0),(15334,33291,0),(15335,33292,0),(15336,33294,0),(15337,33295,0),(15338,33298,0),(15339,33299,0),(15340,33300,0),(15341,33301,0),(15342,33303,0),(15343,33304,0),(15344,33309,0),(15345,33313,0),(15346,33317,0),(15347,33318,0),(15348,33319,0),(15349,33320,0),(15350,33322,0),(15351,33324,0),(15352,33325,0),(15353,33326,0),(15354,33327,0),(15355,33328,0),(15356,33329,0),(15357,33331,0),(15358,33332,0),(15359,33333,0),(15360,33334,0),(15361,33338,0),(15362,33350,0),(15363,33354,0),(15364,33356,0),(15365,33357,0),(15366,33358,0),(15367,33359,0),(15368,33360,0),(15369,33361,0),(15370,33362,0),(15371,33363,0),(15372,33364,0),(15373,33365,0),(15374,33366,0),(15375,33367,0),(15376,33368,0),(15377,33369,0),(15378,33370,0),(15379,33371,0),(15380,33372,0),(15381,33373,0),(15382,33374,0),(15383,33375,0),(15384,33376,0),(15385,33377,0),(15386,33378,0),(15387,33379,0),(15388,33380,0),(15389,33381,0),(15390,33382,0),(15391,33383,0),(15392,33384,0),(15393,33385,0),(15394,33386,0),(15395,33388,0),(15396,33389,0),(15397,33390,0),(15398,33391,0),(15399,33392,0),(15400,33393,0),(15401,33394,0),(15402,33395,0),(15403,33396,0),(15404,33397,0),(15405,33398,0),(15406,33399,0),(15407,33400,0),(15408,33401,0),(15409,33402,0),(15410,33403,0),(15411,33404,0),(15412,33405,0),(15413,33406,0),(15414,33407,0),(15415,33408,0),(15416,33409,0),(15417,33410,0),(15418,33412,0),(15419,33413,0),(15420,33414,0),(15421,33415,0),(15422,33416,0),(15423,33417,0),(15424,33419,0),(15425,33421,0),(15426,33422,0),(15427,33423,0),(15428,33424,0),(15429,33425,0),(15430,33426,0),(15431,33427,0),(15432,33428,0),(15433,33429,0),(15434,33430,0),(15435,33431,0),(15436,33432,0),(15437,33433,0),(15438,33434,0),(15439,33435,0),(15440,33436,0),(15441,33437,0),(15442,33438,0),(15443,33439,0),(15444,33440,0),(15445,33446,0),(15446,33453,0),(15447,33463,0),(15448,33464,0),(15449,33465,0),(15450,33467,0),(15451,33468,0),(15452,33469,0),(15453,33471,0),(15454,33473,0),(15455,33474,0),(15456,33475,0),(15457,33476,0),(15458,33478,0),(15459,33479,0),(15460,33480,0),(15461,33481,0),(15462,33482,0),(15463,33483,0),(15464,33484,0),(15465,33489,0),(15466,33490,0),(15467,33491,0),(15468,33492,0),(15469,33493,0),(15470,33494,0),(15471,33495,0),(15472,33501,0),(15473,33512,0),(15474,33513,0),(15475,33514,0),(15476,33515,0),(15477,33516,0),(15478,33517,0),(15479,33518,0),(15480,33519,0),(15481,33520,0),(15482,33521,0),(15483,33522,0),(15484,33523,0),(15485,33524,0),(15486,33525,0),(15487,33526,0),(15488,33527,0),(15489,33528,0),(15490,33529,0),(15491,33530,0),(15492,33531,0),(15493,33532,0),(15494,33533,0),(15495,33534,0),(15496,33535,0),(15497,33536,0),(15498,33537,0),(15499,33538,0),(15500,33539,0),(15501,33540,0),(15502,33542,0),(15503,33543,0),(15504,33544,0),(15505,33552,0),(15506,33557,0),(15507,33559,0),(15508,33566,0),(15509,33577,0),(15510,33578,0),(15511,33579,0),(15512,33580,0),(15513,33582,0),(15514,33583,0),(15515,33584,0),(15516,33585,0),(15517,33586,0),(15518,33587,0),(15519,33588,0),(15520,33589,0),(15521,33590,0),(15522,33591,0),(15523,33592,0),(15524,33593,0),(15525,33594,0),(15526,33595,0),(15527,33596,0),(15528,33597,0),(15529,33598,0),(15530,33604,0),(15531,33608,0),(15532,33609,0),(15533,33640,0),(15534,33661,0),(15535,33662,0),(15536,33663,0),(15537,33664,0),(15538,33665,0),(15539,33666,0),(15540,33667,0),(15541,33668,0),(15542,33669,0),(15543,33670,0),(15544,33671,0),(15545,33672,0),(15546,33673,0),(15547,33674,0),(15548,33675,0),(15549,33676,0),(15550,33677,0),(15551,33678,0),(15552,33679,0),(15553,33680,0),(15554,33681,0),(15555,33682,0),(15556,33683,0),(15557,33684,0),(15558,33685,0),(15559,33686,0),(15560,33687,0),(15561,33688,0),(15562,33689,0),(15563,33690,0),(15564,33691,0),(15565,33692,0),(15566,33693,0),(15567,33694,0),(15568,33695,0),(15569,33696,0),(15570,33697,0),(15571,33698,0),(15572,33699,0),(15573,33700,0),(15574,33701,0),(15575,33702,0),(15576,33703,0),(15577,33704,0),(15578,33705,0),(15579,33706,0),(15580,33707,0),(15581,33708,0),(15582,33709,0),(15583,33710,0),(15584,33711,0),(15585,33712,0),(15586,33713,0),(15587,33714,0),(15588,33715,0),(15589,33716,0),(15590,33717,0),(15591,33718,0),(15592,33719,0),(15593,33720,0),(15594,33721,0),(15595,33722,0),(15596,33723,0),(15597,33724,0),(15598,33725,0),(15599,33726,0),(15600,33727,0),(15601,33728,0),(15602,33729,0),(15603,33730,0),(15604,33731,0),(15605,33732,0),(15606,33733,0),(15607,33734,0),(15608,33735,0),(15609,33736,0),(15610,33737,0),(15611,33738,0),(15612,33739,0),(15613,33740,0),(15614,33741,0),(15615,33742,0),(15616,33743,0),(15617,33744,0),(15618,33745,0),(15619,33746,0),(15620,33747,0),(15621,33748,0),(15622,33749,0),(15623,33750,0),(15624,33751,0),(15625,33752,0),(15626,33753,0),(15627,33754,0),(15628,33755,0),(15629,33756,0),(15630,33757,0),(15631,33758,0),(15632,33759,0),(15633,33760,0),(15634,33761,0),(15635,33762,0),(15636,33763,0),(15637,33764,0),(15638,33765,0),(15639,33766,0),(15640,33767,0),(15641,33768,0),(15642,33769,0),(15643,33770,0),(15644,33771,0),(15645,33772,0),(15646,33773,0),(15647,33789,0),(15648,33790,0),(15649,33791,0),(15650,33793,0),(15651,33795,0),(15652,33798,0),(15653,33801,0),(15654,33803,0),(15655,33805,0),(15656,33808,0),(15657,33810,0),(15658,33811,0),(15659,33812,0),(15660,33813,0),(15661,33820,0),(15662,33862,0),(15663,33863,0),(15664,33864,0),(15665,33868,0),(15666,33876,0),(15667,33877,0),(15668,33878,0),(15669,33879,0),(15670,33880,0),(15671,33881,0),(15672,33882,0),(15673,33883,0),(15674,33884,0),(15675,33885,0),(15676,33886,0),(15677,33887,0),(15678,33888,0),(15679,33889,0),(15680,33890,0),(15681,33891,0),(15682,33892,0),(15683,33893,0),(15684,33894,0),(15685,33895,0),(15686,33896,0),(15687,33897,0),(15688,33898,0),(15689,33899,0),(15690,33900,0),(15691,33901,0),(15692,33902,0),(15693,33903,0),(15694,33904,0),(15695,33905,0),(15696,33906,0),(15697,33907,0),(15698,33908,0),(15699,33909,0),(15700,33910,0),(15701,33911,0),(15702,33912,0),(15703,33913,0),(15704,33914,0),(15705,33915,0),(15706,33916,0),(15707,33917,0),(15708,33963,0),(15709,33964,0),(15710,33965,0),(15711,33966,0),(15712,33967,0),(15713,33968,0),(15714,33969,0),(15715,33970,0),(15716,33971,0),(15717,33972,0),(15718,33973,0),(15719,33974,0),(15720,33975,0),(15721,33979,0),(15722,33980,0),(15723,33981,0),(15724,33982,0),(15725,33983,0),(15726,33984,0),(15727,33990,0),(15728,33991,0),(15729,33992,0),(15730,34008,0),(15731,34009,0),(15732,34010,0),(15733,34011,0),(15734,34012,0),(15735,34014,0),(15736,34015,0),(15737,34016,0),(15738,34025,0),(15739,34030,0),(15740,34033,0),(15741,34034,0),(15742,34045,0),(15743,34058,0),(15744,34059,0),(15745,34066,0),(15746,34079,0),(15747,34080,0),(15748,34082,0),(15749,34085,0),(15750,34086,0),(15751,34087,0),(15752,34098,0),(15753,34107,0),(15754,34138,0),(15755,34139,0),(15756,34140,0),(15757,34144,0),(15758,34145,0),(15759,34146,0),(15760,34147,0),(15761,34148,0),(15762,34149,0),(15763,34158,0),(15764,34159,0),(15765,34164,0),(15766,34165,0),(15767,34167,0),(15768,34168,0),(15769,34169,0),(15770,34170,0),(15771,34176,0),(15772,34179,0),(15773,34180,0),(15774,34181,0),(15775,34182,0),(15776,34183,0),(15777,34185,0),(15778,34186,0),(15779,34187,0),(15780,34188,0),(15781,34190,0),(15782,34192,0),(15783,34193,0),(15784,34194,0),(15785,34195,0),(15786,34196,0),(15787,34197,0),(15788,34198,0),(15789,34199,0),(15790,34202,0),(15791,34203,0),(15792,34205,0),(15793,34206,0),(15794,34208,0),(15795,34209,0),(15796,34210,0),(15797,34211,0),(15798,34212,0),(15799,34214,0),(15800,34215,0),(15801,34216,0),(15802,34217,0),(15803,34219,0),(15804,34228,0),(15805,34229,0),(15806,34231,0),(15807,34232,0),(15808,34233,0),(15809,34234,0),(15810,34240,0),(15811,34241,0),(15812,34242,0),(15813,34243,0),(15814,34244,0),(15815,34245,0),(15816,34247,0),(15817,34263,0),(15818,34264,0),(15819,34265,0),(15820,34266,0),(15821,34267,0),(15822,34268,0),(15823,34269,0),(15824,34270,0),(15825,34271,0),(15826,34272,0),(15827,34273,0),(15828,34274,0),(15829,34275,0),(15830,34276,0),(15831,34277,0),(15832,34278,0),(15833,34279,0),(15834,34280,0),(15835,34281,0),(15836,34282,0),(15837,34283,0),(15838,34284,0),(15839,34285,0),(15840,34286,0),(15841,34287,0),(15842,34288,0),(15843,34289,0),(15844,34290,0),(15845,34291,0),(15846,34292,0),(15847,34293,0),(15848,34294,0),(15849,34295,0),(15850,34296,0),(15851,34297,0),(15852,34298,0),(15853,34299,0),(15854,34300,0),(15855,34301,0),(15856,34302,0),(15857,34303,0),(15858,34304,0),(15859,34305,0),(15860,34306,0),(15861,34307,0),(15862,34308,0),(15863,34309,0),(15864,34310,0),(15865,34311,0),(15866,34312,0),(15867,34313,0),(15868,34314,0),(15869,34315,0),(15870,34316,0),(15871,34317,0),(15872,34318,0),(15873,34320,0),(15874,34321,0),(15875,34322,0),(15876,34323,0),(15877,34324,0),(15878,34325,0),(15879,34326,0),(15880,34327,0),(15881,34328,0),(15882,34329,0),(15883,34331,0),(15884,34332,0),(15885,34333,0),(15886,34334,0),(15887,34335,0),(15888,34336,0),(15889,34337,0),(15890,34339,0),(15891,34340,0),(15892,34341,0),(15893,34342,0),(15894,34343,0),(15895,34344,0),(15896,34345,0),(15897,34346,0),(15898,34347,0),(15899,34348,0),(15900,34349,0),(15901,34350,0),(15902,34351,0),(15903,34352,0),(15904,34353,0),(15905,34354,0),(15906,34355,0),(15907,34356,0),(15908,34357,0),(15909,34364,0),(15910,34365,0),(15911,34366,0),(15912,34367,0),(15913,34369,0),(15914,34370,0),(15915,34371,0),(15916,34372,0),(15917,34373,0),(15918,34374,0),(15919,34375,0),(15920,34376,0),(15921,34377,0),(15922,34378,0),(15923,34379,0),(15924,34380,0),(15925,34381,0),(15926,34382,0),(15927,34383,0),(15928,34384,0),(15929,34385,0),(15930,34386,0),(15931,34388,0),(15932,34389,0),(15933,34390,0),(15934,34391,0),(15935,34392,0),(15936,34393,0),(15937,34394,0),(15938,34395,0),(15939,34396,0),(15940,34397,0),(15941,34398,0),(15942,34399,0),(15943,34400,0),(15944,34401,0),(15945,34402,0),(15946,34403,0),(15947,34404,0),(15948,34405,0),(15949,34406,0),(15950,34407,0),(15951,34408,0),(15952,34409,0),(15953,34415,0),(15954,34416,0),(15955,34417,0),(15956,34418,0),(15957,34419,0),(15958,34421,0),(15959,34422,0),(15960,34431,0),(15961,34432,0),(15962,34433,0),(15963,34434,0),(15964,34435,0),(15965,34436,0),(15966,34437,0),(15967,34438,0),(15968,34439,0),(15969,34441,0),(15970,34442,0),(15971,34443,0),(15972,34444,0),(15973,34445,0),(15974,34446,0),(15975,34447,0),(15976,34448,0),(15977,34449,0),(15978,34450,0),(15979,34451,0),(15980,34452,0),(15981,34453,0),(15982,34454,0),(15983,34455,0),(15984,34456,0),(15985,34457,0),(15986,34458,0),(15987,34459,0),(15988,34460,0),(15989,34461,0),(15990,34462,0),(15991,34463,0),(15992,34484,0),(15993,34485,0),(15994,34486,0),(15995,34487,0),(15996,34488,0),(15997,34505,0),(15998,34506,0),(15999,34507,0),(16000,34508,0),(16001,34509,0),(16002,34510,0),(16003,34511,0),(16004,34512,0),(16005,34513,0),(16006,34514,0),(16007,34515,0),(16008,34516,0),(16009,34517,0),(16010,34520,0),(16011,34521,0),(16012,34522,0),(16013,34523,0),(16014,34524,0),(16015,34525,0),(16016,34526,0),(16017,34527,0),(16018,34528,0),(16019,34529,0),(16020,34530,0),(16021,34531,0),(16022,34532,0),(16023,34534,0),(16024,34536,0),(16025,34540,0),(16026,34541,0),(16027,34542,0),(16028,34543,0),(16029,34545,0),(16030,34546,0),(16031,34547,0),(16032,34549,0),(16033,34552,0),(16034,34553,0),(16035,34554,0),(16036,34555,0),(16037,34556,0),(16038,34557,0),(16039,34558,0),(16040,34559,0),(16041,34560,0),(16042,34561,0),(16043,34562,0),(16044,34563,0),(16045,34564,0),(16046,34565,0),(16047,34566,0),(16048,34567,0),(16049,34568,0),(16050,34569,0),(16051,34570,0),(16052,34571,0),(16053,34572,0),(16054,34573,0),(16055,34574,0),(16056,34575,0),(16057,34581,0),(16058,34582,0),(16059,34586,0),(16060,34588,0),(16061,34589,0),(16062,34590,0),(16063,34591,0),(16064,34596,0),(16065,34601,0),(16066,34602,0),(16067,34603,0),(16068,34604,0),(16069,34605,0),(16070,34606,0),(16071,34607,0),(16072,34608,0),(16073,34609,0),(16074,34610,0),(16075,34611,0),(16076,34612,0),(16077,34613,0),(16078,34614,0),(16079,34615,0),(16080,34616,0),(16081,34622,0),(16082,34637,0),(16083,34638,0),(16084,34639,0),(16085,34640,0),(16086,34648,0),(16087,34649,0),(16088,34650,0),(16089,34651,0),(16090,34652,0),(16091,34653,0),(16092,34655,0),(16093,34656,0),(16094,34659,0),(16095,34661,0),(16096,34662,0),(16097,34665,0),(16098,34666,0),(16099,34667,0),(16100,34668,0),(16101,34670,0),(16102,34671,0),(16103,34672,0),(16104,34673,0),(16105,34674,0),(16106,34675,0),(16107,34676,0),(16108,34681,0),(16109,34682,0),(16110,34683,0),(16111,34685,0),(16112,34693,0),(16113,34694,0),(16114,34696,0),(16115,34697,0),(16116,34698,0),(16117,34699,0),(16118,34700,0),(16119,34701,0),(16120,34702,0),(16121,34703,0),(16122,34705,0),(16123,34707,0),(16124,34708,0),(16125,34716,0),(16126,34717,0),(16127,34718,0),(16128,34771,0),(16129,34782,0),(16130,34783,0),(16131,34784,0),(16132,34788,0),(16133,34789,0),(16134,34790,0),(16135,34791,0),(16136,34792,0),(16137,34793,0),(16138,34794,0),(16139,34795,0),(16140,34796,0),(16141,34797,0),(16142,34799,0),(16143,34807,0),(16144,34808,0),(16145,34809,0),(16146,34810,0),(16147,34816,0),(16148,34817,0),(16149,34818,0),(16150,34819,0),(16151,34820,0),(16152,34821,0),(16153,34827,0),(16154,34828,0),(16155,34829,0),(16156,34847,0),(16157,34859,0),(16158,34873,0),(16159,34874,0),(16160,34875,0),(16161,34876,0),(16162,34877,0),(16163,34878,0),(16164,34879,0),(16165,34880,0),(16166,34881,0),(16167,34882,0),(16168,34883,0),(16169,34884,0),(16170,34885,0),(16171,34886,0),(16172,34891,0),(16173,34892,0),(16174,34893,0),(16175,34894,0),(16176,34895,0),(16177,34896,0),(16178,34898,0),(16179,34899,0),(16180,34900,0),(16181,34901,0),(16182,34902,0),(16183,34903,0),(16184,34904,0),(16185,34905,0),(16186,34906,0),(16187,34910,0),(16188,34911,0),(16189,34912,0),(16190,34914,0),(16191,34916,0),(16192,34917,0),(16193,34918,0),(16194,34919,0),(16195,34921,0),(16196,34922,0),(16197,34923,0),(16198,34924,0),(16199,34925,0),(16200,34926,0),(16201,34927,0),(16202,34928,0),(16203,34929,0),(16204,34930,0),(16205,34931,0),(16206,34932,0),(16207,34933,0),(16208,34934,0),(16209,34935,0),(16210,34936,0),(16211,34937,0),(16212,34938,0),(16213,34939,0),(16214,34940,0),(16215,34941,0),(16216,34942,0),(16217,34943,0),(16218,34944,0),(16219,34945,0),(16220,34946,0),(16221,34947,0),(16222,34949,0),(16223,34950,0),(16224,34951,0),(16225,34952,0),(16226,34965,0),(16227,34966,0),(16228,34985,0),(16229,34986,0),(16230,34987,0),(16231,34988,0),(16232,34989,0),(16233,34990,0),(16234,34991,0),(16235,34992,0),(16236,34993,0),(16237,34994,0),(16238,34995,0),(16239,34996,0),(16240,34997,0),(16241,34998,0),(16242,34999,0),(16243,35000,0),(16244,35001,0),(16245,35002,0),(16246,35003,0),(16247,35004,0),(16248,35005,0),(16249,35006,0),(16250,35007,0),(16251,35008,0),(16252,35009,0),(16253,35010,0),(16254,35011,0),(16255,35012,0),(16256,35013,0),(16257,35014,0),(16258,35015,0),(16259,35016,0),(16260,35017,0),(16261,35018,0),(16262,35022,0),(16263,35023,0),(16264,35024,0),(16265,35025,0),(16266,35026,0),(16267,35027,0),(16268,35028,0),(16269,35029,0),(16270,35030,0),(16271,35031,0),(16272,35032,0),(16273,35033,0),(16274,35034,0),(16275,35035,0),(16276,35036,0),(16277,35037,0),(16278,35038,0),(16279,35042,0),(16280,35043,0),(16281,35044,0),(16282,35045,0),(16283,35046,0),(16284,35047,0),(16285,35048,0),(16286,35049,0),(16287,35050,0),(16288,35051,0),(16289,35052,0),(16290,35053,0),(16291,35054,0),(16292,35055,0),(16293,35056,0),(16294,35057,0),(16295,35058,0),(16296,35059,0),(16297,35060,0),(16298,35061,0),(16299,35062,0),(16300,35063,0),(16301,35064,0),(16302,35065,0),(16303,35066,0),(16304,35067,0),(16305,35068,0),(16306,35069,0),(16307,35070,0),(16308,35071,0),(16309,35072,0),(16310,35073,0),(16311,35074,0),(16312,35075,0),(16313,35076,0),(16314,35077,0),(16315,35078,0),(16316,35079,0),(16317,35080,0),(16318,35081,0),(16319,35082,0),(16320,35083,0),(16321,35084,0),(16322,35085,0),(16323,35086,0),(16324,35087,0),(16325,35088,0),(16326,35089,0),(16327,35090,0),(16328,35091,0),(16329,35092,0),(16330,35093,0),(16331,35094,0),(16332,35095,0),(16333,35096,0),(16334,35097,0),(16335,35098,0),(16336,35099,0),(16337,35100,0),(16338,35101,0),(16339,35102,0),(16340,35103,0),(16341,35107,0),(16342,35108,0),(16343,35109,0),(16344,35110,0),(16345,35111,0),(16346,35112,0),(16347,35113,0),(16348,35114,0),(16349,35115,0),(16350,35117,0),(16351,35136,0),(16352,35137,0),(16353,35138,0),(16354,35139,0),(16355,35140,0),(16356,35141,0),(16357,35142,0),(16358,35143,0),(16359,35144,0),(16360,35145,0),(16361,35146,0),(16362,35147,0),(16363,35148,0),(16364,35149,0),(16365,35150,0),(16366,35151,0),(16367,35152,0),(16368,35153,0),(16369,35154,0),(16370,35155,0),(16371,35156,0),(16372,35157,0),(16373,35158,0),(16374,35159,0),(16375,35160,0),(16376,35161,0),(16377,35162,0),(16378,35163,0),(16379,35164,0),(16380,35165,0),(16381,35166,0),(16382,35167,0),(16383,35168,0),(16384,35169,0),(16385,35170,0),(16386,35171,0),(16387,35172,0),(16388,35173,0),(16389,35174,0),(16390,35175,0),(16391,35176,0),(16392,35177,0),(16393,35178,0),(16394,35179,0),(16395,35180,0),(16396,35181,0),(16397,35182,0),(16398,35183,0),(16399,35184,0),(16400,35185,0),(16401,35220,0),(16402,35221,0),(16403,35233,0),(16404,35235,0),(16405,35236,0),(16406,35279,0),(16407,35280,0),(16408,35312,0),(16409,35321,0),(16410,35324,0),(16411,35328,0),(16412,35329,0),(16413,35330,0),(16414,35331,0),(16415,35332,0),(16416,35333,0),(16417,35334,0),(16418,35335,0),(16419,35336,0),(16420,35337,0),(16421,35338,0),(16422,35339,0),(16423,35340,0),(16424,35341,0),(16425,35342,0),(16426,35343,0),(16427,35344,0),(16428,35345,0),(16429,35346,0),(16430,35347,0),(16431,35356,0),(16432,35357,0),(16433,35358,0),(16434,35359,0),(16435,35360,0),(16436,35361,0),(16437,35362,0),(16438,35363,0),(16439,35364,0),(16440,35365,0),(16441,35366,0),(16442,35367,0),(16443,35368,0),(16444,35369,0),(16445,35370,0),(16446,35371,0),(16447,35372,0),(16448,35373,0),(16449,35374,0),(16450,35375,0),(16451,35376,0),(16452,35377,0),(16453,35378,0),(16454,35379,0),(16455,35380,0),(16456,35381,0),(16457,35382,0),(16458,35383,0),(16459,35384,0),(16460,35385,0),(16461,35386,0),(16462,35387,0),(16463,35388,0),(16464,35389,0),(16465,35390,0),(16466,35391,0),(16467,35392,0),(16468,35393,0),(16469,35394,0),(16470,35395,0),(16471,35402,0),(16472,35403,0),(16473,35404,0),(16474,35405,0),(16475,35406,0),(16476,35407,0),(16477,35408,0),(16478,35409,0),(16479,35410,0),(16480,35411,0),(16481,35412,0),(16482,35413,0),(16483,35414,0),(16484,35415,0),(16485,35416,0),(16486,35463,0),(16487,35464,0),(16488,35465,0),(16489,35466,0),(16490,35467,0),(16491,35468,0),(16492,35469,0),(16493,35470,0),(16494,35471,0),(16495,35472,0),(16496,35473,0),(16497,35474,0),(16498,35475,0),(16499,35476,0),(16500,35477,0),(16501,35478,0),(16502,35494,0),(16503,35495,0),(16504,35496,0),(16505,35497,0),(16506,35510,0),(16507,35514,0),(16508,35561,0),(16509,35570,0),(16510,35571,0),(16511,35572,0),(16512,35573,0),(16513,35574,0),(16514,35575,0),(16515,35576,0),(16516,35577,0),(16517,35578,0),(16518,35579,0),(16519,35580,0),(16520,35581,0),(16521,35583,0),(16522,35584,0),(16523,35585,0),(16524,35587,0),(16525,35588,0),(16526,35590,0),(16527,35591,0),(16528,35592,0),(16529,35593,0),(16530,35594,0),(16531,35595,0),(16532,35596,0),(16533,35598,0),(16534,35599,0),(16535,35600,0),(16536,35601,0),(16537,35602,0),(16538,35603,0),(16539,35604,0),(16540,35605,0),(16541,35606,0),(16542,35607,0),(16543,35608,0),(16544,35609,0),(16545,35611,0),(16546,35612,0),(16547,35613,0),(16548,35614,0),(16549,35615,0),(16550,35616,0),(16551,35617,0),(16552,35618,0),(16553,35619,0),(16554,35620,0),(16555,35630,0),(16556,35632,0),(16557,35633,0),(16558,35634,0),(16559,35635,0),(16560,35636,0),(16561,35637,0),(16562,35638,0),(16563,35639,0),(16564,35640,0),(16565,35641,0),(16566,35642,0),(16567,35643,0),(16568,35644,0),(16569,35645,0),(16570,35646,0),(16571,35647,0),(16572,35649,0),(16573,35650,0),(16574,35651,0),(16575,35652,0),(16576,35653,0),(16577,35654,0),(16578,35655,0),(16579,35656,0),(16580,35657,0),(16581,35658,0),(16582,35659,0),(16583,35660,0),(16584,35662,0),(16585,35663,0),(16586,35664,0),(16587,35665,0),(16588,35670,0),(16589,35672,0),(16590,35673,0),(16591,35674,0),(16592,35675,0),(16593,35676,0),(16594,35677,0),(16595,35678,0),(16596,35679,0),(16597,35681,0),(16598,35682,0),(16599,35684,0),(16600,35712,0),(16601,35714,0),(16602,35719,0),(16603,35724,0),(16604,35727,0),(16605,35732,0),(16606,35735,0),(16607,35740,0),(16608,35741,0),(16609,35742,0),(16610,35743,0),(16611,35757,0),(16612,35779,0),(16613,35781,0),(16614,35804,0),(16615,35805,0),(16616,35807,0),(16617,35808,0),(16618,35809,0),(16619,35810,0),(16620,35811,0),(16621,35812,0),(16622,35814,0),(16623,35815,0),(16624,35816,0),(16625,35817,0),(16626,35818,0),(16627,35820,0),(16628,35821,0),(16629,35822,0),(16630,35823,0),(16631,35824,0),(16632,35826,0),(16633,35827,0),(16634,35829,0),(16635,35830,0),(16636,35832,0),(16637,35833,0),(16638,35834,0),(16639,35835,0),(16640,35841,0),(16641,35842,0),(16642,35843,0),(16643,35844,0),(16644,35845,0),(16645,35846,0),(16646,35848,0),(16647,35849,0),(16648,35851,0),(16649,35852,0),(16650,35856,0),(16651,35857,0),(16652,35858,0),(16653,35859,0),(16654,35860,0),(16655,35861,0),(16656,35862,0),(16657,35863,0),(16658,35864,0),(16659,35865,0),(16660,35866,0),(16661,35868,0),(16662,35869,0),(16663,35870,0),(16664,35871,0),(16665,35872,0),(16666,35873,0),(16667,35875,0),(16668,35876,0),(16669,35877,0),(16670,35878,0),(16671,35879,0),(16672,35880,0),(16673,35882,0),(16674,35883,0),(16675,35884,0),(16676,35885,0),(16677,35887,0),(16678,35888,0),(16679,35889,0),(16680,35890,0),(16681,35891,0),(16682,35892,0),(16683,35893,0),(16684,35894,0),(16685,35895,0),(16686,35896,0),(16687,35897,0),(16688,35898,0),(16689,35899,0),(16690,35900,0),(16691,35901,0),(16692,35902,0),(16693,35903,0),(16694,35905,0),(16695,35909,0),(16696,35910,0),(16697,35912,0),(16698,35913,0),(16699,35914,0),(16700,35915,0),(16701,35916,0),(16702,35917,0),(16703,35918,0),(16704,35919,0),(16705,35920,0),(16706,35921,0),(16707,35923,0),(16708,35924,0),(16709,35926,0),(16710,35927,0),(16711,35928,0),(16712,35929,0),(16713,35930,0),(16714,35931,0),(16715,35933,0),(16716,35934,0),(16717,35938,0),(16718,35939,0),(16719,35942,0),(16720,35955,0),(16721,35956,0),(16722,35957,0),(16723,35958,0),(16724,35959,0),(16725,35960,0),(16726,35961,0),(16727,35962,0),(16728,35963,0),(16729,35964,0),(16730,35965,0),(16731,35966,0),(16732,35967,0),(16733,35968,0),(16734,35969,0),(16735,35970,0),(16736,35971,0),(16737,35972,0),(16738,35973,0),(16739,35974,0),(16740,35975,0),(16741,35976,0),(16742,35977,0),(16743,35978,0),(16744,35979,0),(16745,35980,0),(16746,35981,0),(16747,35982,0),(16748,35983,0),(16749,35984,0),(16750,35985,0),(16751,35986,0),(16752,35987,0),(16753,35988,0),(16754,35989,0),(16755,35990,0),(16756,35991,0),(16757,35992,0),(16758,35993,0),(16759,35994,0),(16760,35995,0),(16761,35996,0),(16762,35997,0),(16763,35998,0),(16764,35999,0),(16765,36000,0),(16766,36001,0),(16767,36002,0),(16768,36003,0),(16769,36004,0),(16770,36005,0),(16771,36006,0),(16772,36007,0),(16773,36008,0),(16774,36009,0),(16775,36010,0),(16776,36011,0),(16777,36012,0),(16778,36013,0),(16779,36014,0),(16780,36015,0),(16781,36016,0),(16782,36017,0),(16783,36018,0),(16784,36019,0),(16785,36020,0),(16786,36021,0),(16787,36022,0),(16788,36023,0),(16789,36024,0),(16790,36025,0),(16791,36026,0),(16792,36027,0),(16793,36028,0),(16794,36029,0),(16795,36030,0),(16796,36031,0),(16797,36032,0),(16798,36033,0),(16799,36034,0),(16800,36035,0),(16801,36036,0),(16802,36037,0),(16803,36038,0),(16804,36039,0),(16805,36040,0),(16806,36041,0),(16807,36042,0),(16808,36043,0),(16809,36044,0),(16810,36045,0),(16811,36046,0),(16812,36047,0),(16813,36048,0),(16814,36049,0),(16815,36050,0),(16816,36051,0),(16817,36052,0),(16818,36053,0),(16819,36054,0),(16820,36055,0),(16821,36056,0),(16822,36057,0),(16823,36058,0),(16824,36059,0),(16825,36060,0),(16826,36061,0),(16827,36062,0),(16828,36063,0),(16829,36064,0),(16830,36065,0),(16831,36066,0),(16832,36067,0),(16833,36068,0),(16834,36069,0),(16835,36070,0),(16836,36071,0),(16837,36072,0),(16838,36073,0),(16839,36074,0),(16840,36075,0),(16841,36076,0),(16842,36077,0),(16843,36078,0),(16844,36079,0),(16845,36080,0),(16846,36081,0),(16847,36082,0),(16848,36083,0),(16849,36084,0),(16850,36085,0),(16851,36086,0),(16852,36087,0),(16853,36088,0),(16854,36089,0),(16855,36090,0),(16856,36091,0),(16857,36092,0),(16858,36093,0),(16859,36094,0),(16860,36095,0),(16861,36096,0),(16862,36097,0),(16863,36098,0),(16864,36099,0),(16865,36100,0),(16866,36101,0),(16867,36102,0),(16868,36103,0),(16869,36104,0),(16870,36105,0),(16871,36106,0),(16872,36107,0),(16873,36108,0),(16874,36109,0),(16875,36110,0),(16876,36111,0),(16877,36112,0),(16878,36113,0),(16879,36114,0),(16880,36115,0),(16881,36116,0),(16882,36117,0),(16883,36118,0),(16884,36119,0),(16885,36120,0),(16886,36121,0),(16887,36122,0),(16888,36123,0),(16889,36124,0),(16890,36125,0),(16891,36126,0),(16892,36127,0),(16893,36128,0),(16894,36129,0),(16895,36130,0),(16896,36131,0),(16897,36132,0),(16898,36133,0),(16899,36134,0),(16900,36135,0),(16901,36136,0),(16902,36137,0),(16903,36138,0),(16904,36139,0),(16905,36140,0),(16906,36141,0),(16907,36142,0),(16908,36143,0),(16909,36144,0),(16910,36145,0),(16911,36146,0),(16912,36147,0),(16913,36148,0),(16914,36149,0),(16915,36150,0),(16916,36151,0),(16917,36152,0),(16918,36153,0),(16919,36154,0),(16920,36155,0),(16921,36156,0),(16922,36157,0),(16923,36158,0),(16924,36159,0),(16925,36160,0),(16926,36161,0),(16927,36162,0),(16928,36163,0),(16929,36164,0),(16930,36165,0),(16931,36166,0),(16932,36167,0),(16933,36168,0),(16934,36169,0),(16935,36170,0),(16936,36171,0),(16937,36172,0),(16938,36173,0),(16939,36174,0),(16940,36175,0),(16941,36176,0),(16942,36177,0),(16943,36178,0),(16944,36179,0),(16945,36180,0),(16946,36181,0),(16947,36182,0),(16948,36183,0),(16949,36184,0),(16950,36185,0),(16951,36186,0),(16952,36187,0),(16953,36188,0),(16954,36189,0),(16955,36190,0),(16956,36191,0),(16957,36192,0),(16958,36193,0),(16959,36194,0),(16960,36195,0),(16961,36196,0),(16962,36197,0),(16963,36198,0),(16964,36199,0),(16965,36200,0),(16966,36201,0),(16967,36202,0),(16968,36203,0),(16969,36204,0),(16970,36205,0),(16971,36206,0),(16972,36207,0),(16973,36208,0),(16974,36209,0),(16975,36210,0),(16976,36211,0),(16977,36212,0),(16978,36213,0),(16979,36214,0),(16980,36215,0),(16981,36216,0),(16982,36217,0),(16983,36218,0),(16984,36219,0),(16985,36220,0),(16986,36221,0),(16987,36222,0),(16988,36223,0),(16989,36224,0),(16990,36225,0),(16991,36226,0),(16992,36227,0),(16993,36228,0),(16994,36229,0),(16995,36230,0),(16996,36231,0),(16997,36232,0),(16998,36233,0),(16999,36234,0),(17000,36235,0),(17001,36236,0),(17002,36237,0),(17003,36238,0),(17004,36239,0),(17005,36240,0),(17006,36241,0),(17007,36242,0),(17008,36243,0),(17009,36244,0),(17010,36245,0),(17011,36246,0),(17012,36247,0),(17013,36248,0),(17014,36249,0),(17015,36250,0),(17016,36251,0),(17017,36252,0),(17018,36253,0),(17019,36254,0),(17020,36255,0),(17021,36256,0),(17022,36257,0),(17023,36258,0),(17024,36259,0),(17025,36260,0),(17026,36261,0),(17027,36262,0),(17028,36263,0),(17029,36264,0),(17030,36265,0),(17031,36266,0),(17032,36267,0),(17033,36268,0),(17034,36269,0),(17035,36270,0),(17036,36271,0),(17037,36272,0),(17038,36273,0),(17039,36274,0),(17040,36275,0),(17041,36276,0),(17042,36277,0),(17043,36278,0),(17044,36279,0),(17045,36280,0),(17046,36281,0),(17047,36282,0),(17048,36283,0),(17049,36284,0),(17050,36285,0),(17051,36286,0),(17052,36287,0),(17053,36288,0),(17054,36289,0),(17055,36290,0),(17056,36291,0),(17057,36292,0),(17058,36293,0),(17059,36294,0),(17060,36295,0),(17061,36296,0),(17062,36297,0),(17063,36298,0),(17064,36299,0),(17065,36300,0),(17066,36301,0),(17067,36302,0),(17068,36303,0),(17069,36304,0),(17070,36305,0),(17071,36306,0),(17072,36307,0),(17073,36308,0),(17074,36309,0),(17075,36310,0),(17076,36311,0),(17077,36312,0),(17078,36313,0),(17079,36314,0),(17080,36315,0),(17081,36316,0),(17082,36317,0),(17083,36318,0),(17084,36319,0),(17085,36320,0),(17086,36321,0),(17087,36322,0),(17088,36323,0),(17089,36324,0),(17090,36325,0),(17091,36326,0),(17092,36327,0),(17093,36328,0),(17094,36329,0),(17095,36330,0),(17096,36331,0),(17097,36332,0),(17098,36333,0),(17099,36334,0),(17100,36335,0),(17101,36336,0),(17102,36337,0),(17103,36338,0),(17104,36339,0),(17105,36340,0),(17106,36341,0),(17107,36342,0),(17108,36343,0),(17109,36344,0),(17110,36345,0),(17111,36346,0),(17112,36347,0),(17113,36348,0),(17114,36349,0),(17115,36350,0),(17116,36351,0),(17117,36352,0),(17118,36353,0),(17119,36354,0),(17120,36355,0),(17121,36356,0),(17122,36357,0),(17123,36358,0),(17124,36359,0),(17125,36360,0),(17126,36361,0),(17127,36362,0),(17128,36363,0),(17129,36364,0),(17130,36365,0),(17131,36366,0),(17132,36367,0),(17133,36368,0),(17134,36369,0),(17135,36370,0),(17136,36371,0),(17137,36372,0),(17138,36373,0),(17139,36374,0),(17140,36375,0),(17141,36376,0),(17142,36377,0),(17143,36378,0),(17144,36379,0),(17145,36380,0),(17146,36381,0),(17147,36382,0),(17148,36383,0),(17149,36384,0),(17150,36385,0),(17151,36386,0),(17152,36387,0),(17153,36388,0),(17154,36389,0),(17155,36390,0),(17156,36391,0),(17157,36392,0),(17158,36393,0),(17159,36394,0),(17160,36395,0),(17161,36396,0),(17162,36397,0),(17163,36398,0),(17164,36399,0),(17165,36400,0),(17166,36401,0),(17167,36402,0),(17168,36403,0),(17169,36404,0),(17170,36405,0),(17171,36406,0),(17172,36407,0),(17173,36408,0),(17174,36409,0),(17175,36410,0),(17176,36411,0),(17177,36412,0),(17178,36413,0),(17179,36414,0),(17180,36415,0),(17181,36416,0),(17182,36445,0),(17183,36446,0),(17184,36447,0),(17185,36448,0),(17186,36449,0),(17187,36450,0),(17188,36451,0),(17189,36452,0),(17190,36453,0),(17191,36454,0),(17192,36455,0),(17193,36456,0),(17194,36457,0),(17195,36458,0),(17196,36459,0),(17197,36460,0),(17198,36461,0),(17199,36462,0),(17200,36463,0),(17201,36464,0),(17202,36465,0),(17203,36466,0),(17204,36467,0),(17205,36468,0),(17206,36469,0),(17207,36470,0),(17208,36471,0),(17209,36472,0),(17210,36473,0),(17211,36474,0),(17212,36475,0),(17213,36476,0),(17214,36477,0),(17215,36478,0),(17216,36479,0),(17217,36480,0),(17218,36481,0),(17219,36482,0),(17220,36483,0),(17221,36484,0),(17222,36485,0),(17223,36486,0),(17224,36487,0),(17225,36488,0),(17226,36489,0),(17227,36490,0),(17228,36491,0),(17229,36492,0),(17230,36493,0),(17231,36494,0),(17232,36495,0),(17233,36496,0),(17234,36497,0),(17235,36498,0),(17236,36499,0),(17237,36500,0),(17238,36501,0),(17239,36502,0),(17240,36503,0),(17241,36504,0),(17242,36505,0),(17243,36506,0),(17244,36507,0),(17245,36508,0),(17246,36509,0),(17247,36510,0),(17248,36511,0),(17249,36512,0),(17250,36513,0),(17251,36514,0),(17252,36515,0),(17253,36516,0),(17254,36517,0),(17255,36518,0),(17256,36519,0),(17257,36520,0),(17258,36521,0),(17259,36522,0),(17260,36523,0),(17261,36524,0),(17262,36525,0),(17263,36526,0),(17264,36527,0),(17265,36528,0),(17266,36529,0),(17267,36530,0),(17268,36531,0),(17269,36532,0),(17270,36533,0),(17271,36534,0),(17272,36535,0),(17273,36536,0),(17274,36537,0),(17275,36538,0),(17276,36539,0),(17277,36540,0),(17278,36541,0),(17279,36542,0),(17280,36543,0),(17281,36544,0),(17282,36545,0),(17283,36546,0),(17284,36547,0),(17285,36548,0),(17286,36549,0),(17287,36550,0),(17288,36551,0),(17289,36552,0),(17290,36553,0),(17291,36554,0),(17292,36555,0),(17293,36556,0),(17294,36557,0),(17295,36558,0),(17296,36559,0),(17297,36560,0),(17298,36561,0),(17299,36562,0),(17300,36563,0),(17301,36564,0),(17302,36565,0),(17303,36566,0),(17304,36567,0),(17305,36568,0),(17306,36569,0),(17307,36570,0),(17308,36571,0),(17309,36572,0),(17310,36573,0),(17311,36574,0),(17312,36575,0),(17313,36576,0),(17314,36577,0),(17315,36578,0),(17316,36579,0),(17317,36580,0),(17318,36581,0),(17319,36582,0),(17320,36583,0),(17321,36584,0),(17322,36585,0),(17323,36586,0),(17324,36587,0),(17325,36588,0),(17326,36589,0),(17327,36590,0),(17328,36591,0),(17329,36592,0),(17330,36593,0),(17331,36594,0),(17332,36595,0),(17333,36596,0),(17334,36597,0),(17335,36598,0),(17336,36599,0),(17337,36600,0),(17338,36601,0),(17339,36602,0),(17340,36603,0),(17341,36604,0),(17342,36605,0),(17343,36606,0),(17344,36607,0),(17345,36608,0),(17346,36609,0),(17347,36610,0),(17348,36611,0),(17349,36612,0),(17350,36613,0),(17351,36614,0),(17352,36615,0),(17353,36616,0),(17354,36617,0),(17355,36618,0),(17356,36619,0),(17357,36620,0),(17358,36621,0),(17359,36622,0),(17360,36623,0),(17361,36624,0),(17362,36625,0),(17363,36626,0),(17364,36627,0),(17365,36628,0),(17366,36629,0),(17367,36630,0),(17368,36631,0),(17369,36632,0),(17370,36633,0),(17371,36634,0),(17372,36635,0),(17373,36636,0),(17374,36637,0),(17375,36638,0),(17376,36639,0),(17377,36640,0),(17378,36641,0),(17379,36642,0),(17380,36643,0),(17381,36644,0),(17382,36645,0),(17383,36646,0),(17384,36647,0),(17385,36648,0),(17386,36649,0),(17387,36650,0),(17388,36651,0),(17389,36652,0),(17390,36653,0),(17391,36654,0),(17392,36655,0),(17393,36656,0),(17394,36657,0),(17395,36658,0),(17396,36659,0),(17397,36660,0),(17398,36661,0),(17399,36662,0),(17400,36663,0),(17401,36664,0),(17402,36665,0),(17403,36666,0),(17404,36667,0),(17405,36668,0),(17406,36669,0),(17407,36670,0),(17408,36671,0),(17409,36672,0),(17410,36673,0),(17411,36674,0),(17412,36675,0),(17413,36676,0),(17414,36677,0),(17415,36678,0),(17416,36679,0),(17417,36680,0),(17418,36681,0),(17419,36682,0),(17420,36683,0),(17421,36684,0),(17422,36685,0),(17423,36686,0),(17424,36687,0),(17425,36688,0),(17426,36689,0),(17427,36690,0),(17428,36691,0),(17429,36692,0),(17430,36693,0),(17431,36694,0),(17432,36695,0),(17433,36696,0),(17434,36697,0),(17435,36698,0),(17436,36699,0),(17437,36700,0),(17438,36701,0),(17439,36702,0),(17440,36703,0),(17441,36704,0),(17442,36705,0),(17443,36706,0),(17444,36707,0),(17445,36708,0),(17446,36709,0),(17447,36710,0),(17448,36711,0),(17449,36712,0),(17450,36713,0),(17451,36714,0),(17452,36715,0),(17453,36716,0),(17454,36717,0),(17455,36718,0),(17456,36719,0),(17457,36720,0),(17458,36721,0),(17459,36722,0),(17460,36723,0),(17461,36724,0),(17462,36737,0),(17463,36749,0),(17464,36750,0),(17465,36755,0),(17466,36761,0),(17467,36762,0),(17468,36778,0),(17469,36790,0),(17470,36791,0),(17471,36792,0),(17472,36866,0),(17473,36867,0),(17474,36869,0),(17475,36878,0),(17476,36879,0),(17477,36880,0),(17478,36881,0),(17479,36882,0),(17480,36883,0),(17481,36884,0),(17482,36885,0),(17483,36886,0),(17484,36887,0),(17485,36888,0),(17486,36937,0),(17487,36938,0),(17488,36939,0),(17489,36941,0),(17490,36942,0),(17491,36944,0),(17492,36945,0),(17493,36946,0),(17494,36947,0),(17495,36948,0),(17496,36949,0),(17497,36950,0),(17498,36951,0),(17499,36952,0),(17500,36953,0),(17501,36954,0),(17502,36962,0),(17503,36969,0),(17504,36971,0),(17505,36973,0),(17506,36974,0),(17507,36975,0),(17508,36976,0),(17509,36977,0),(17510,36978,0),(17511,36980,0),(17512,36981,0),(17513,36982,0),(17514,36983,0),(17515,36984,0),(17516,36985,0),(17517,36986,0),(17518,36989,0),(17519,36990,0),(17520,36991,0),(17521,36992,0),(17522,36994,0),(17523,36995,0),(17524,36996,0),(17525,36997,0),(17526,36998,0),(17527,36999,0),(17528,37000,0),(17529,37001,0),(17530,37002,0),(17531,37004,0),(17532,37005,0),(17533,37007,0),(17534,37008,0),(17535,37009,0),(17536,37014,0),(17537,37015,0),(17538,37016,0),(17539,37017,0),(17540,37018,0),(17541,37019,0),(17542,37021,0),(17543,37022,0),(17544,37023,0),(17545,37024,0),(17546,37025,0),(17547,37026,0),(17548,37028,0),(17549,37029,0),(17550,37030,0),(17551,37031,0),(17552,37032,0),(17553,37033,0),(17554,37034,0),(17555,37036,0),(17556,37037,0),(17557,37038,0),(17558,37039,0),(17559,37040,0),(17560,37041,0),(17561,37042,0),(17562,37043,0),(17563,37044,0),(17564,37046,0),(17565,37047,0),(17566,37048,0),(17567,37049,0),(17568,37050,0),(17569,37051,0),(17570,37052,0),(17571,37054,0),(17572,37055,0),(17573,37056,0),(17574,37057,0),(17575,37059,0),(17576,37060,0),(17577,37061,0),(17578,37062,0),(17579,37065,0),(17580,37066,0),(17581,37067,0),(17582,37068,0),(17583,37069,0),(17584,37070,0),(17585,37072,0),(17586,37073,0),(17587,37074,0),(17588,37075,0),(17589,37076,0),(17590,37077,0),(17591,37078,0),(17592,37080,0),(17593,37081,0),(17594,37082,0),(17595,37083,0),(17596,37084,0),(17597,37086,0),(17598,37088,0),(17599,37095,0),(17600,37099,0),(17601,37105,0),(17602,37106,0),(17603,37107,0),(17604,37108,0),(17605,37109,0),(17606,37110,0),(17607,37112,0),(17608,37113,0),(17609,37114,0),(17610,37115,0),(17611,37116,0),(17612,37117,0),(17613,37119,0),(17614,37120,0),(17615,37122,0),(17616,37123,0),(17617,37126,0),(17618,37130,0),(17619,37134,0),(17620,37135,0),(17621,37138,0),(17622,37139,0),(17623,37144,0),(17624,37146,0),(17625,37149,0),(17626,37150,0),(17627,37152,0),(17628,37153,0),(17629,37155,0),(17630,37162,0),(17631,37165,0),(17632,37167,0),(17633,37169,0),(17634,37170,0),(17635,37171,0),(17636,37172,0),(17637,37174,0),(17638,37175,0),(17639,37176,0),(17640,37177,0),(17641,37178,0),(17642,37179,0),(17643,37180,0),(17644,37181,0),(17645,37182,0),(17646,37183,0),(17647,37184,0),(17648,37188,0),(17649,37189,0),(17650,37190,0),(17651,37191,0),(17652,37193,0),(17653,37194,0),(17654,37196,0),(17655,37197,0),(17656,37203,0),(17657,37204,0),(17658,37205,0),(17659,37206,0),(17660,37207,0),(17661,37208,0),(17662,37209,0),(17663,37210,0),(17664,37211,0),(17665,37212,0),(17666,37213,0),(17667,37214,0),(17668,37215,0),(17669,37216,0),(17670,37217,0),(17671,37218,0),(17672,37219,0),(17673,37221,0),(17674,37222,0),(17675,37223,0),(17676,37224,0),(17677,37225,0),(17678,37226,0),(17679,37227,0),(17680,37228,0),(17681,37230,0),(17682,37234,0),(17683,37235,0),(17684,37236,0),(17685,37237,0),(17686,37238,0),(17687,37239,0),(17688,37240,0),(17689,37241,0),(17690,37242,0),(17691,37243,0),(17692,37244,0),(17693,37245,0),(17694,37249,0),(17695,37255,0),(17696,37256,0),(17697,37258,0),(17698,37260,0),(17699,37261,0),(17700,37262,0),(17701,37263,0),(17702,37266,0),(17703,37270,0),(17704,37271,0),(17705,37272,0),(17706,37273,0),(17707,37274,0),(17708,37275,0),(17709,37276,0),(17710,37277,0),(17711,37278,0),(17712,37279,0),(17713,37280,0),(17714,37281,0),(17715,37282,0),(17716,37283,0),(17717,37284,0),(17718,37285,0),(17719,37286,0),(17720,37288,0),(17721,37289,0),(17722,37291,0),(17723,37292,0),(17724,37293,0),(17725,37294,0),(17726,37295,0),(17727,37296,0),(17728,37308,0),(17729,37309,0),(17730,37310,0),(17731,37315,0),(17732,37316,0),(17733,37317,0),(17734,37318,0),(17735,37319,0),(17736,37320,0),(17737,37321,0),(17738,37322,0),(17739,37323,0),(17740,37324,0),(17741,37325,0),(17742,37351,0),(17743,37352,0),(17744,37353,0),(17745,37354,0),(17746,37355,0),(17747,37356,0),(17748,37357,0),(17749,37360,0),(17750,37361,0),(17751,37362,0),(17752,37363,0),(17753,37364,0),(17754,37365,0),(17755,37366,0),(17756,37367,0),(17757,37368,0),(17758,37369,0),(17759,37370,0),(17760,37373,0),(17761,37374,0),(17762,37375,0),(17763,37376,0),(17764,37377,0),(17765,37378,0),(17766,37379,0),(17767,37380,0),(17768,37382,0),(17769,37383,0),(17770,37384,0),(17771,37385,0),(17772,37386,0),(17773,37387,0),(17774,37388,0),(17775,37389,0),(17776,37391,0),(17777,37392,0),(17778,37393,0),(17779,37394,0),(17780,37395,0),(17781,37396,0),(17782,37398,0),(17783,37399,0),(17784,37400,0),(17785,37401,0),(17786,37402,0),(17787,37403,0),(17788,37404,0),(17789,37405,0),(17790,37406,0),(17791,37407,0),(17792,37408,0),(17793,37409,0),(17794,37410,0),(17795,37414,0),(17796,37415,0),(17797,37417,0),(17798,37418,0),(17799,37419,0),(17800,37420,0),(17801,37421,0),(17802,37422,0),(17803,37423,0),(17804,37424,0),(17805,37425,0),(17806,37426,0),(17807,37427,0),(17808,37428,0),(17809,37429,0),(17810,37433,0),(17811,37434,0),(17812,37435,0),(17813,37436,0),(17814,37437,0),(17815,37439,0),(17816,37440,0),(17817,37441,0),(17818,37442,0),(17819,37443,0),(17820,37444,0),(17821,37446,0),(17822,37447,0),(17823,37448,0),(17824,37450,0),(17825,37451,0),(17826,37453,0),(17827,37454,0),(17828,37455,0),(17829,37456,0),(17830,37457,0),(17831,37458,0),(17832,37461,0),(17833,37462,0),(17834,37463,0),(17835,37466,0),(17836,37468,0),(17837,37469,0),(17838,37470,0),(17839,37471,0),(17840,37472,0),(17841,37473,0),(17842,37474,0),(17843,37475,0),(17844,37476,0),(17845,37477,0),(17846,37478,0),(17847,37479,0),(17848,37480,0),(17849,37481,0),(17850,37482,0),(17851,37483,0),(17852,37484,0),(17853,37485,0),(17854,37486,0),(17855,37487,0),(17856,37505,0),(17857,37506,0),(17858,37507,0),(17859,37508,0),(17860,37509,0),(17861,37510,0),(17862,37511,0),(17863,37512,0),(17864,37513,0),(17865,37514,0),(17866,37515,0),(17867,37516,0),(17868,37517,0),(17869,37518,0),(17870,37519,0),(17871,37520,0),(17872,37521,0),(17873,37522,0),(17874,37534,0),(17875,37535,0),(17876,37536,0),(17877,37537,0),(17878,37547,0),(17879,37564,0),(17880,37566,0),(17881,37579,0),(17882,37587,0),(17883,37590,0),(17884,37592,0),(17885,37593,0),(17886,37594,0),(17887,37596,0),(17888,37597,0),(17889,37608,0),(17890,37609,0),(17891,37610,0),(17892,37611,0),(17893,37612,0),(17894,37613,0),(17895,37614,0),(17896,37615,0),(17897,37616,0),(17898,37617,0),(17899,37618,0),(17900,37619,0),(17901,37620,0),(17902,37622,0),(17903,37623,0),(17904,37625,0),(17905,37626,0),(17906,37627,0),(17907,37628,0),(17908,37629,0),(17909,37630,0),(17910,37631,0),(17911,37632,0),(17912,37633,0),(17913,37634,0),(17914,37635,0),(17915,37636,0),(17916,37637,0),(17917,37639,0),(17918,37640,0),(17919,37641,0),(17920,37643,0),(17921,37644,0),(17922,37645,0),(17923,37647,0),(17924,37648,0),(17925,37649,0),(17926,37650,0),(17927,37652,0),(17928,37653,0),(17929,37654,0),(17930,37655,0),(17931,37656,0),(17932,37658,0),(17933,37659,0),(17934,37666,0),(17935,37667,0),(17936,37668,0),(17937,37669,0),(17938,37670,0),(17939,37671,0),(17940,37672,0),(17941,37673,0),(17942,37675,0),(17943,37678,0),(17944,37679,0),(17945,37680,0),(17946,37681,0),(17947,37682,0),(17948,37684,0),(17949,37686,0),(17950,37687,0),(17951,37688,0),(17952,37690,0),(17953,37691,0),(17954,37692,0),(17955,37693,0),(17956,37695,0),(17957,37696,0),(17958,37697,0),(17959,37698,0),(17960,37699,0),(17961,37708,0),(17962,37712,0),(17963,37714,0),(17964,37715,0),(17965,37717,0),(17966,37718,0),(17967,37721,0),(17968,37722,0),(17969,37724,0),(17970,37725,0),(17971,37726,0),(17972,37728,0),(17973,37729,0),(17974,37730,0),(17975,37731,0),(17976,37733,0),(17977,37735,0),(17978,37739,0),(17979,37740,0),(17980,37743,0),(17981,37744,0),(17982,37745,0),(17983,37746,0),(17984,37747,0),(17985,37749,0),(17986,37752,0),(17987,37753,0),(17988,37754,0),(17989,37755,0),(17990,37756,0),(17991,37757,0),(17992,37759,0),(17993,37760,0),(17994,37761,0),(17995,37762,0),(17996,37763,0),(17997,37764,0),(17998,37765,0),(17999,37766,0),(18000,37767,0),(18001,37768,0),(18002,37769,0),(18003,37770,0),(18004,37771,0),(18005,37772,0),(18006,37773,0),(18007,37774,0),(18008,37775,0),(18009,37776,0),(18010,37777,0),(18011,37778,0),(18012,37779,0),(18013,37780,0),(18014,37781,0),(18015,37782,0),(18016,37783,0),(18017,37785,0),(18018,37786,0),(18019,37787,0),(18020,37788,0),(18021,37789,0),(18022,37790,0),(18023,37791,0),(18024,37792,0),(18025,37793,0),(18026,37795,0),(18027,37796,0),(18028,37797,0),(18029,37798,0),(18030,37799,0),(18031,37800,0),(18032,37801,0),(18033,37802,0),(18034,37803,0),(18035,37804,0),(18036,37805,0),(18037,37806,0),(18038,37807,0),(18039,37808,0),(18040,37809,0),(18041,37810,0),(18042,37811,0),(18043,37812,0),(18044,37813,0),(18045,37814,0),(18046,37817,0),(18047,37818,0),(18048,37824,0),(18049,37825,0),(18050,37826,0),(18051,37832,0),(18052,37840,0),(18053,37841,0),(18054,37842,0),(18055,37843,0),(18056,37845,0),(18057,37846,0),(18058,37847,0),(18059,37848,0),(18060,37849,0),(18061,37850,0),(18062,37851,0),(18063,37852,0),(18064,37853,0),(18065,37854,0),(18066,37855,0),(18067,37856,0),(18068,37857,0),(18069,37858,0),(18070,37862,0),(18071,37867,0),(18072,37868,0),(18073,37870,0),(18074,37871,0),(18075,37874,0),(18076,37875,0),(18077,37876,0),(18078,37883,0),(18079,37884,0),(18080,37886,0),(18081,37889,0),(18082,37890,0),(18083,37891,0),(18084,37892,0),(18085,37893,0),(18086,37894,0),(18087,37895,0),(18088,37896,0),(18089,37897,0),(18090,37914,0),(18091,37916,0),(18092,37917,0),(18093,37919,0),(18094,37924,0),(18095,37936,0),(18096,37937,0),(18097,37938,0),(18098,37940,0),(18099,37941,0),(18100,37942,0),(18101,37943,0),(18102,37944,0),(18103,37945,0),(18104,37946,0),(18105,37947,0),(18106,37948,0),(18107,37949,0),(18108,37950,0),(18109,37951,0),(18110,37953,0),(18111,37954,0),(18112,37955,0),(18113,37956,0),(18114,37957,0),(18115,37958,0),(18116,37959,0),(18117,37961,0),(18118,37962,0),(18119,37963,0),(18120,37964,0),(18121,37965,0),(18122,37966,0),(18123,37968,0),(18124,37969,0),(18125,37970,0),(18126,37971,0),(18127,37972,0),(18128,37973,0),(18129,37974,0),(18130,37975,0),(18131,37977,0),(18132,37978,0),(18133,37979,0),(18134,37980,0),(18135,37981,0),(18136,37983,0),(18137,37984,0),(18138,37985,0),(18139,37986,0),(18140,37987,0),(18141,37988,0),(18142,37989,0),(18143,37990,0),(18144,37991,0),(18145,37993,0),(18146,37994,0),(18147,37995,0),(18148,37996,0),(18149,37998,0),(18150,37999,0),(18151,38000,0),(18152,38001,0),(18153,38002,0),(18154,38003,0),(18155,38004,0),(18156,38005,0),(18157,38006,0),(18158,38007,0),(18159,38008,0),(18160,38010,0),(18161,38011,0),(18162,38012,0),(18163,38013,0),(18164,38014,0),(18165,38015,0),(18166,38016,0),(18167,38017,0),(18168,38018,0),(18169,38019,0),(18170,38020,0),(18171,38021,0),(18172,38022,0),(18173,38023,0),(18174,38024,0),(18175,38025,0),(18176,38026,0),(18177,38027,0),(18178,38029,0),(18179,38030,0),(18180,38031,0),(18181,38033,0),(18182,38034,0),(18183,38035,0),(18184,38037,0),(18185,38038,0),(18186,38039,0),(18187,38040,0),(18188,38041,0),(18189,38043,0),(18190,38044,0),(18191,38045,0),(18192,38046,0),(18193,38047,0),(18194,38048,0),(18195,38049,0),(18196,38051,0),(18197,38052,0),(18198,38053,0),(18199,38054,0),(18200,38055,0),(18201,38056,0),(18202,38057,0),(18203,38058,0),(18204,38060,0),(18205,38061,0),(18206,38062,0),(18207,38063,0),(18208,38064,0),(18209,38065,0),(18210,38066,0),(18211,38084,0),(18212,38085,0),(18213,38086,0),(18214,38087,0),(18215,38088,0),(18216,38089,0),(18217,38092,0),(18218,38093,0),(18219,38094,0),(18220,38095,0),(18221,38096,0),(18222,38097,0),(18223,38099,0),(18224,38100,0),(18225,38101,0),(18226,38102,0),(18227,38103,0),(18228,38104,0),(18229,38105,0),(18230,38106,0),(18231,38107,0),(18232,38108,0),(18233,38109,0),(18234,38110,0),(18235,38111,0),(18236,38112,0),(18237,38113,0),(18238,38114,0),(18239,38115,0),(18240,38116,0),(18241,38117,0),(18242,38118,0),(18243,38119,0),(18244,38120,0),(18245,38121,0),(18246,38122,0),(18247,38123,0),(18248,38124,0),(18249,38125,0),(18250,38126,0),(18251,38127,0),(18252,38128,0),(18253,38129,0),(18254,38130,0),(18255,38131,0),(18256,38132,0),(18257,38133,0),(18258,38134,0),(18259,38135,0),(18260,38136,0),(18261,38137,0),(18262,38138,0),(18263,38139,0),(18264,38140,0),(18265,38141,0),(18266,38142,0),(18267,38143,0),(18268,38146,0),(18269,38148,0),(18270,38150,0),(18271,38151,0),(18272,38152,0),(18273,38153,0),(18274,38154,0),(18275,38155,0),(18276,38156,0),(18277,38157,0),(18278,38158,0),(18279,38159,0),(18280,38160,0),(18281,38161,0),(18282,38162,0),(18283,38163,0),(18284,38166,0),(18285,38167,0),(18286,38168,0),(18287,38169,0),(18288,38170,0),(18289,38171,0),(18290,38172,0),(18291,38173,0),(18292,38174,0),(18293,38175,0),(18294,38176,0),(18295,38177,0),(18296,38178,0),(18297,38179,0),(18298,38180,0),(18299,38181,0),(18300,38182,0),(18301,38183,0),(18302,38184,0),(18303,38185,0),(18304,38187,0),(18305,38188,0),(18306,38189,0),(18307,38190,0),(18308,38191,0),(18309,38192,0),(18310,38193,0),(18311,38194,0),(18312,38195,0),(18313,38196,0),(18314,38197,0),(18315,38198,0),(18316,38199,0),(18317,38200,0),(18318,38201,0),(18319,38202,0),(18320,38203,0),(18321,38204,0),(18322,38205,0),(18323,38206,0),(18324,38207,0),(18325,38208,0),(18326,38209,0),(18327,38210,0),(18328,38211,0),(18329,38214,0),(18330,38215,0),(18331,38216,0),(18332,38217,0),(18333,38221,0),(18334,38222,0),(18335,38223,0),(18336,38224,0),(18337,38235,0),(18338,38237,0),(18339,38238,0),(18340,38239,0),(18341,38240,0),(18342,38241,0),(18343,38242,0),(18344,38243,0),(18345,38244,0),(18346,38245,0),(18347,38246,0),(18348,38247,0),(18349,38248,0),(18350,38249,0),(18351,38254,0),(18352,38255,0),(18353,38256,0),(18354,38262,0),(18355,38268,0),(18356,38276,0),(18357,38277,0),(18358,38278,0),(18359,38282,0),(18360,38285,0),(18361,38286,0),(18362,38293,0),(18363,38296,0),(18364,38297,0),(18365,38298,0),(18366,38304,0),(18367,38309,0),(18368,38310,0),(18369,38311,0),(18370,38312,0),(18371,38313,0),(18372,38314,0),(18373,38315,0),(18374,38316,0),(18375,38318,0),(18376,38322,0),(18377,38353,0),(18378,38354,0),(18379,38355,0),(18380,38356,0),(18381,38357,0),(18382,38387,0),(18383,38388,0),(18384,38389,0),(18385,38390,0),(18386,38391,0),(18387,38392,0),(18388,38394,0),(18389,38395,0),(18390,38400,0),(18391,38401,0),(18392,38402,0),(18393,38403,0),(18394,38404,0),(18395,38405,0),(18396,38406,0),(18397,38407,0),(18398,38408,0),(18399,38409,0),(18400,38410,0),(18401,38411,0),(18402,38412,0),(18403,38413,0),(18404,38414,0),(18405,38415,0),(18406,38416,0),(18407,38417,0),(18408,38418,0),(18409,38419,0),(18410,38420,0),(18411,38421,0),(18412,38422,0),(18413,38424,0),(18414,38433,0),(18415,38434,0),(18416,38435,0),(18417,38436,0),(18418,38437,0),(18419,38438,0),(18420,38439,0),(18421,38440,0),(18422,38441,0),(18423,38442,0),(18424,38443,0),(18425,38444,0),(18426,38445,0),(18427,38448,0),(18428,38452,0),(18429,38453,0),(18430,38454,0),(18431,38455,0),(18432,38456,0),(18433,38457,0),(18434,38458,0),(18435,38459,0),(18436,38460,0),(18437,38461,0),(18438,38462,0),(18439,38463,0),(18440,38464,0),(18441,38465,0),(18442,38468,0),(18443,38469,0),(18444,38470,0),(18445,38471,0),(18446,38472,0),(18447,38480,0),(18448,38481,0),(18449,38482,0),(18450,38487,0),(18451,38488,0),(18452,38490,0),(18453,38491,0),(18454,38492,0),(18455,38493,0),(18456,38494,0),(18457,38495,0),(18458,38496,0),(18459,38497,0),(18460,38506,0),(18461,38507,0),(18462,38508,0),(18463,38509,0),(18464,38511,0),(18465,38513,0),(18466,38524,0),(18467,38525,0),(18468,38527,0),(18469,38528,0),(18470,38529,0),(18471,38530,0),(18472,38531,0),(18473,38532,0),(18474,38533,0),(18475,38534,0),(18476,38535,0),(18477,38536,0),(18478,38537,0),(18479,38540,0),(18480,38541,0),(18481,38542,0),(18482,38543,0),(18483,38554,0),(18484,38579,0),(18485,38580,0),(18486,38590,0),(18487,38591,0),(18488,38592,0),(18489,38602,0),(18490,38603,0),(18491,38604,0),(18492,38609,0),(18493,38614,0),(18494,38615,0),(18495,38616,0),(18496,38618,0),(18497,38632,0),(18498,38633,0),(18499,38635,0),(18500,38645,0),(18501,38646,0),(18502,38647,0),(18503,38648,0),(18504,38649,0),(18505,38650,0),(18506,38651,0),(18507,38652,0),(18508,38661,0),(18509,38663,0),(18510,38664,0),(18511,38665,0),(18512,38666,0),(18513,38667,0),(18514,38668,0),(18515,38669,0),(18516,38670,0),(18517,38691,0),(18518,38692,0),(18519,38693,0),(18520,38694,0),(18521,38707,0),(18522,38710,0),(18523,38711,0),(18524,38712,0),(18525,38713,0),(18526,38714,0),(18527,38715,0),(18528,38716,0),(18529,38717,0),(18530,38718,0),(18531,38719,0),(18532,38720,0),(18533,38721,0),(18534,38722,0),(18535,38723,0),(18536,38726,0),(18537,38727,0),(18538,38728,0),(18539,38729,0),(18540,38730,0),(18541,38732,0),(18542,38733,0),(18543,38734,0),(18544,38735,0),(18545,38736,0),(18546,38737,0),(18547,38738,0),(18548,38739,0),(18549,38740,0),(18550,38741,0),(18551,38742,0),(18552,38755,0),(18553,38756,0),(18554,38757,0),(18555,38758,0),(18556,38759,0),(18557,39007,0),(18558,39008,0),(18559,39009,0),(18560,39010,0),(18561,39011,0),(18562,39012,0),(18563,39013,0),(18564,39015,0),(18565,39016,0),(18566,39017,0),(18567,39018,0),(18568,39019,0),(18569,39020,0),(18570,39021,0),(18571,39022,0),(18572,39023,0),(18573,39024,0),(18574,39025,0),(18575,39026,0),(18576,39027,0),(18577,39028,0),(18578,39029,0),(18579,39030,0),(18580,39031,0),(18581,39032,0),(18582,39033,0),(18583,39034,0),(18584,39035,0),(18585,39036,0),(18586,39037,0),(18587,39038,0),(18588,39039,0),(18589,39040,0),(18590,39042,0),(18591,39043,0),(18592,39044,0),(18593,39045,0),(18594,39046,0),(18595,39047,0),(18596,39048,0),(18597,39049,0),(18598,39050,0),(18599,39051,0),(18600,39052,0),(18601,39053,0),(18602,39054,0),(18603,39055,0),(18604,39056,0),(18605,39057,0),(18606,39058,0),(18607,39059,0),(18608,39060,0),(18609,39062,0),(18610,39064,0),(18611,39065,0),(18612,39066,0),(18613,39067,0),(18614,39068,0),(18615,39069,0),(18616,39070,0),(18617,39071,0),(18618,39072,0),(18619,39073,0),(18620,39074,0),(18621,39075,0),(18622,39076,0),(18623,39077,0),(18624,39078,0),(18625,39079,0),(18626,39080,0),(18627,39081,0),(18628,39082,0),(18629,39083,0),(18630,39084,0),(18631,39085,0),(18632,39086,0),(18633,39087,0),(18634,39088,0),(18635,39089,0),(18636,39090,0),(18637,39091,0),(18638,39092,0),(18639,39093,0),(18640,39094,0),(18641,39095,0),(18642,39096,0),(18643,39097,0),(18644,39098,0),(18645,39099,0),(18646,39100,0),(18647,39101,0),(18648,39102,0),(18649,39103,0),(18650,39104,0),(18651,39105,0),(18652,39106,0),(18653,39107,0),(18654,39108,0),(18655,39109,0),(18656,39110,0),(18657,39111,0),(18658,39112,0),(18659,39113,0),(18660,39114,0),(18661,39115,0),(18662,39116,0),(18663,39117,0),(18664,39118,0),(18665,39119,0),(18666,39120,0),(18667,39121,0),(18668,39122,0),(18669,39123,0),(18670,39124,0),(18671,39125,0),(18672,39126,0),(18673,39127,0),(18674,39128,0),(18675,39129,0),(18676,39130,0),(18677,39131,0),(18678,39132,0),(18679,39133,0),(18680,39134,0),(18681,39135,0),(18682,39136,0),(18683,39137,0),(18684,39138,0),(18685,39139,0),(18686,39140,0),(18687,39142,0),(18688,39143,0),(18689,39144,0),(18690,39145,0),(18691,39147,0),(18692,39155,0),(18693,39168,0),(18694,39169,0),(18695,39170,0),(18696,39171,0),(18697,39172,0),(18698,39173,0),(18699,39174,0),(18700,39175,0),(18701,39176,0),(18702,39177,0),(18703,39178,0),(18704,39179,0),(18705,39180,0),(18706,39181,0),(18707,39182,0),(18708,39183,0),(18709,39188,0),(18710,39189,0),(18711,39190,0),(18712,39191,0),(18713,39192,0),(18714,39194,0),(18715,39195,0),(18716,39196,0),(18717,39197,0),(18718,39198,0),(18719,39199,0),(18720,39200,0),(18721,39202,0),(18722,39205,0),(18723,39215,0),(18724,39216,0),(18725,39217,0),(18726,39221,0),(18727,39224,0),(18728,39225,0),(18729,39226,0),(18730,39228,0),(18731,39230,0),(18732,39233,0),(18733,39234,0),(18734,39235,0),(18735,39236,0),(18736,39237,0),(18737,39239,0),(18738,39240,0),(18739,39241,0),(18740,39242,0),(18741,39243,0),(18742,39245,0),(18743,39247,0),(18744,39248,0),(18745,39249,0),(18746,39251,0),(18747,39252,0),(18748,39254,0),(18749,39255,0),(18750,39256,0),(18751,39258,0),(18752,39259,0),(18753,39260,0),(18754,39261,0),(18755,39262,0),(18756,39263,0),(18757,39267,0),(18758,39270,0),(18759,39271,0),(18760,39272,0),(18761,39273,0),(18762,39274,0),(18763,39275,0),(18764,39276,0),(18765,39278,0),(18766,39279,0),(18767,39280,0),(18768,39281,0),(18769,39283,0),(18770,39284,0),(18771,39285,0),(18772,39287,0),(18773,39288,0),(18774,39289,0),(18775,39290,0),(18776,39291,0),(18777,39293,0),(18778,39294,0),(18779,39295,0),(18780,39296,0),(18781,39297,0),(18782,39298,0),(18783,39299,0),(18784,39306,0),(18785,39307,0),(18786,39308,0),(18787,39309,0),(18788,39310,0),(18789,39311,0),(18790,39312,0),(18791,39320,0),(18792,39322,0),(18793,39323,0),(18794,39325,0),(18795,39330,0),(18796,39331,0),(18797,39332,0),(18798,39333,0),(18799,39335,0),(18800,39336,0),(18801,39337,0),(18802,39344,0),(18803,39345,0),(18804,39346,0),(18805,39347,0),(18806,39348,0),(18807,39359,0),(18808,39363,0),(18809,39364,0),(18810,39365,0),(18811,39366,0),(18812,39367,0),(18813,39368,0),(18814,39369,0),(18815,39370,0),(18816,39371,0),(18817,39372,0),(18818,39373,0),(18819,39374,0),(18820,39375,0),(18821,39376,0),(18822,39377,0),(18823,39378,0),(18824,39379,0),(18825,39380,0),(18826,39381,0),(18827,39382,0),(18828,39383,0),(18829,39384,0),(18830,39385,0),(18831,39386,0),(18832,39387,0),(18833,39390,0),(18834,39391,0),(18835,39393,0),(18836,39394,0),(18837,39395,0),(18838,39396,0),(18839,39397,0),(18840,39398,0),(18841,39399,0),(18842,39400,0),(18843,39402,0),(18844,39403,0),(18845,39404,0),(18846,39405,0),(18847,39406,0),(18848,39408,0),(18849,39409,0),(18850,39410,0),(18851,39411,0),(18852,39412,0),(18853,39413,0),(18854,39414,0),(18855,39415,0),(18856,39416,0),(18857,39417,0),(18858,39419,0),(18859,39420,0),(18860,39422,0),(18861,39423,0),(18862,39424,0),(18863,39425,0),(18864,39426,0),(18865,39427,0),(18866,39428,0),(18867,39429,0),(18868,39430,0),(18869,39431,0),(18870,39432,0),(18871,39433,0),(18872,39435,0),(18873,39436,0),(18874,39437,0),(18875,39438,0),(18876,39439,0),(18877,39440,0),(18878,39441,0),(18879,39442,0),(18880,39443,0),(18881,39444,0),(18882,39445,0),(18883,39446,0),(18884,39447,0),(18885,39448,0),(18886,39449,0),(18887,39450,0),(18888,39451,0),(18889,39452,0),(18890,39453,0),(18891,39454,0),(18892,39455,0),(18893,39456,0),(18894,39457,0),(18895,39458,0),(18896,39459,0),(18897,39460,0),(18898,39461,0),(18899,39462,0),(18900,39463,0),(18901,39464,0),(18902,39465,0),(18903,39466,0),(18904,39467,0),(18905,39468,0),(18906,39471,0),(18907,39473,0),(18908,39478,0),(18909,39479,0),(18910,39486,0),(18911,39487,0),(18912,39488,0),(18913,39490,0),(18914,39491,0),(18915,39492,0),(18916,39493,0),(18917,39494,0),(18918,39495,0),(18919,39496,0),(18920,39497,0),(18921,39498,0),(18922,39499,0),(18923,39500,0),(18924,39503,0),(18925,39507,0),(18926,39508,0),(18927,39509,0),(18928,39514,0),(18929,39515,0),(18930,39517,0),(18931,39518,0),(18932,39519,0),(18933,39521,0),(18934,39522,0),(18935,39523,0),(18936,39528,0),(18937,39529,0),(18938,39530,0),(18939,39531,0),(18940,39534,0),(18941,39535,0),(18942,39536,0),(18943,39538,0),(18944,39539,0),(18945,39542,0),(18946,39543,0),(18947,39544,0),(18948,39545,0),(18949,39546,0),(18950,39547,0),(18951,39548,0),(18952,39553,0),(18953,39554,0),(18954,39555,0),(18955,39556,0),(18956,39557,0),(18957,39558,0),(18958,39560,0),(18959,39561,0),(18960,39564,0),(18961,39565,0),(18962,39578,0),(18963,39579,0),(18964,39580,0),(18965,39581,0),(18966,39582,0),(18967,39583,0),(18968,39588,0),(18969,39589,0),(18970,39590,0),(18971,39591,0),(18972,39592,0),(18973,39593,0),(18974,39594,0),(18975,39595,0),(18976,39596,0),(18977,39597,0),(18978,39600,0),(18979,39601,0),(18980,39602,0),(18981,39603,0),(18982,39604,0),(18983,39605,0),(18984,39606,0),(18985,39607,0),(18986,39608,0),(18987,39609,0),(18988,39610,0),(18989,39611,0),(18990,39612,0),(18991,39613,0),(18992,39617,0),(18993,39618,0),(18994,39619,0),(18995,39620,0),(18996,39621,0),(18997,39622,0),(18998,39623,0),(18999,39624,0),(19000,39625,0),(19001,39626,0),(19002,39627,0),(19003,39628,0),(19004,39629,0),(19005,39630,0),(19006,39631,0),(19007,39632,0),(19008,39633,0),(19009,39634,0),(19010,39635,0),(19011,39636,0),(19012,39637,0),(19013,39638,0),(19014,39639,0),(19015,39640,0),(19016,39641,0),(19017,39642,0),(19018,39657,0),(19019,39658,0),(19020,39659,0),(19021,39660,0),(19022,39661,0),(19023,39662,0),(19024,39663,0),(19025,39672,0),(19026,39673,0),(19027,39674,0),(19028,39675,0),(19029,39676,0),(19030,39677,0),(19031,39678,0),(19032,39679,0),(19033,39680,0),(19034,39688,0),(19035,39699,0),(19036,39701,0),(19037,39702,0),(19038,39703,0),(19039,39704,0),(19040,39705,0),(19041,39706,0),(19042,39707,0),(19043,39708,0),(19044,39709,0),(19045,39710,0),(19046,39711,0),(19047,39712,0),(19048,39714,0),(19049,39716,0),(19050,39717,0),(19051,39718,0),(19052,39719,0),(19053,39720,0),(19054,39721,0),(19055,39722,0),(19056,39723,0),(19057,39724,0),(19058,39725,0),(19059,39726,0),(19060,39727,0),(19061,39729,0),(19062,39730,0),(19063,39731,0),(19064,39732,0),(19065,39733,0),(19066,39734,0),(19067,39735,0),(19068,39741,0),(19069,39742,0),(19070,39743,0),(19071,39744,0),(19072,39745,0),(19073,39746,0),(19074,39749,0),(19075,39750,0),(19076,39751,0),(19077,39752,0),(19078,39753,0),(19079,39754,0),(19080,39756,0),(19081,39758,0),(19082,39759,0),(19083,39760,0),(19084,39761,0),(19085,39762,0),(19086,39763,0),(19087,39764,0),(19088,39765,0),(19089,39766,0),(19090,39767,0),(19091,39768,0),(19092,39769,0),(19093,39770,0),(19094,39771,0),(19095,39772,0),(19096,39773,0),(19097,39775,0),(19098,39776,0),(19099,39778,0),(19100,39779,0),(19101,39780,0),(19102,39781,0),(19103,39782,0),(19104,39783,0),(19105,39784,0),(19106,39785,0),(19107,39787,0),(19108,39788,0),(19109,39789,0),(19110,39790,0),(19111,39791,0),(19112,39794,0),(19113,39795,0),(19114,39796,0),(19115,39797,0),(19116,39799,0),(19117,39800,0),(19118,39801,0),(19119,39802,0),(19120,39803,0),(19121,39804,0),(19122,39805,0),(19123,39806,0),(19124,39807,0),(19125,39808,0),(19126,39809,0),(19127,39810,0),(19128,39812,0),(19129,39813,0),(19130,39814,0),(19131,39815,0),(19132,39816,0),(19133,39817,0),(19134,39818,0),(19135,39820,0),(19136,39822,0),(19137,39823,0),(19138,39824,0),(19139,39825,0),(19140,39826,0),(19141,39827,0),(19142,39828,0),(19143,39829,0),(19144,39830,0),(19145,39832,0),(19146,39833,0),(19147,39834,0),(19148,39835,0),(19149,39836,0),(19150,39837,0),(19151,39838,0),(19152,39839,0),(19153,39841,0),(19154,39842,0),(19155,39843,0),(19156,39844,0),(19157,39845,0),(19158,39846,0),(19159,39847,0),(19160,39849,0),(19161,39850,0),(19162,39851,0),(19163,39852,0),(19164,39853,0),(19165,39854,0),(19166,39855,0),(19167,39856,0),(19168,39857,0),(19169,39858,0),(19170,39859,0),(19171,39860,0),(19172,39861,0),(19173,39862,0),(19174,39863,0),(19175,39864,0),(19176,39865,0),(19177,39866,0),(19178,39867,0),(19179,39868,0),(19180,39869,0),(19181,39870,0),(19182,39871,0),(19183,39872,0),(19184,39873,0),(19185,39874,0),(19186,39875,0),(19187,39876,0),(19188,39877,0),(19189,39879,0),(19190,39880,0),(19191,39881,0),(19192,39882,0),(19193,39884,0),(19194,39885,0),(19195,39886,0),(19196,39887,0),(19197,39888,0),(19198,39890,0),(19199,39891,0),(19200,39892,0),(19201,39893,0),(19202,39894,0),(19203,39895,0),(19204,39897,0),(19205,39921,0),(19206,39922,0),(19207,39923,0),(19208,39924,0),(19209,39925,0),(19210,39926,0),(19211,39928,0),(19212,39929,0),(19213,39930,0),(19214,39931,0),(19215,39987,0),(19216,39995,0),(19217,40004,0),(19218,40005,0),(19219,40006,0),(19220,40018,0),(19221,40019,0),(19222,40020,0),(19223,40021,0),(19224,40060,0),(19225,40061,0),(19226,40062,0),(19227,40063,0),(19228,40183,0),(19229,40184,0),(19230,40185,0),(19231,40186,0),(19232,40187,0),(19233,40188,0),(19234,40189,0),(19235,40190,0),(19236,40192,0),(19237,40193,0),(19238,40194,0),(19239,40196,0),(19240,40197,0),(19241,40198,0),(19242,40200,0),(19243,40201,0),(19244,40203,0),(19245,40204,0),(19246,40205,0),(19247,40206,0),(19248,40208,0),(19249,40209,0),(19250,40210,0),(19251,40218,0),(19252,40219,0),(19253,40220,0),(19254,40221,0),(19255,40222,0),(19256,40223,0),(19257,40224,0),(19258,40225,0),(19259,40226,0),(19260,40227,0),(19261,40228,0),(19262,40229,0),(19263,40230,0),(19264,40231,0),(19265,40233,0),(19266,40234,0),(19267,40235,0),(19268,40236,0),(19269,40237,0),(19270,40238,0),(19271,40239,0),(19272,40240,0),(19273,40241,0),(19274,40242,0),(19275,40243,0),(19276,40244,0),(19277,40245,0),(19278,40246,0),(19279,40247,0),(19280,40249,0),(19281,40250,0),(19282,40251,0),(19283,40252,0),(19284,40253,0),(19285,40254,0),(19286,40259,0),(19287,40260,0),(19288,40261,0),(19289,40262,0),(19290,40263,0),(19291,40264,0),(19292,40265,0),(19293,40266,0),(19294,40269,0),(19295,40270,0),(19296,40271,0),(19297,40272,0),(19298,40273,0),(19299,40274,0),(19300,40275,0),(19301,40276,0),(19302,40277,0),(19303,40278,0),(19304,40279,0),(19305,40280,0),(19306,40281,0),(19307,40282,0),(19308,40283,0),(19309,40284,0),(19310,40285,0),(19311,40286,0),(19312,40287,0),(19313,40288,0),(19314,40289,0),(19315,40290,0),(19316,40291,0),(19317,40292,0),(19318,40293,0),(19319,40294,0),(19320,40295,0),(19321,40296,0),(19322,40297,0),(19323,40298,0),(19324,40299,0),(19325,40300,0),(19326,40301,0),(19327,40302,0),(19328,40303,0),(19329,40304,0),(19330,40305,0),(19331,40306,0),(19332,40307,0),(19333,40309,0),(19334,40310,0),(19335,40311,0),(19336,40312,0),(19337,40313,0),(19338,40314,0),(19339,40315,0),(19340,40316,0),(19341,40317,0),(19342,40318,0),(19343,40319,0),(19344,40320,0),(19345,40323,0),(19346,40324,0),(19347,40325,0),(19348,40326,0),(19349,40327,0),(19350,40328,0),(19351,40329,0),(19352,40330,0),(19353,40331,0),(19354,40332,0),(19355,40333,0),(19356,40334,0),(19357,40335,0),(19358,40336,0),(19359,40338,0),(19360,40339,0),(19361,40340,0),(19362,40341,0),(19363,40343,0),(19364,40344,0),(19365,40345,0),(19366,40346,0),(19367,40347,0),(19368,40348,0),(19369,40349,0),(19370,40350,0),(19371,40351,0),(19372,40352,0),(19373,40353,0),(19374,40362,0),(19375,40363,0),(19376,40365,0),(19377,40366,0),(19378,40367,0),(19379,40368,0),(19380,40376,0),(19381,40377,0),(19382,40379,0),(19383,40380,0),(19384,40381,0),(19385,40383,0),(19386,40384,0),(19387,40385,0),(19388,40386,0),(19389,40388,0),(19390,40389,0),(19391,40395,0),(19392,40396,0),(19393,40398,0),(19394,40400,0),(19395,40401,0),(19396,40402,0),(19397,40403,0),(19398,40405,0),(19399,40406,0),(19400,40407,0),(19401,40408,0),(19402,40409,0),(19403,40410,0),(19404,40414,0),(19405,40415,0),(19406,40416,0),(19407,40417,0),(19408,40418,0),(19409,40419,0),(19410,40420,0),(19411,40421,0),(19412,40422,0),(19413,40423,0),(19414,40424,0),(19415,40428,0),(19416,40429,0),(19417,40434,0),(19418,40435,0),(19419,40436,0),(19420,40437,0),(19421,40438,0),(19422,40439,0),(19423,40440,0),(19424,40441,0),(19425,40442,0),(19426,40443,0),(19427,40444,0),(19428,40445,0),(19429,40446,0),(19430,40447,0),(19431,40448,0),(19432,40449,0),(19433,40450,0),(19434,40451,0),(19435,40452,0),(19436,40453,0),(19437,40454,0),(19438,40455,0),(19439,40456,0),(19440,40457,0),(19441,40458,0),(19442,40459,0),(19443,40460,0),(19444,40461,0),(19445,40462,0),(19446,40463,0),(19447,40464,0),(19448,40465,0),(19449,40466,0),(19450,40467,0),(19451,40468,0),(19452,40469,0),(19453,40470,0),(19454,40471,0),(19455,40472,0),(19456,40473,0),(19457,40475,0),(19458,40479,0),(19459,40480,0),(19460,40481,0),(19461,40485,0),(19462,40487,0),(19463,40488,0),(19464,40489,0),(19465,40490,0),(19466,40491,0),(19467,40493,0),(19468,40494,0),(19469,40495,0),(19470,40496,0),(19471,40497,0),(19472,40499,0),(19473,40500,0),(19474,40501,0),(19475,40502,0),(19476,40503,0),(19477,40504,0),(19478,40505,0),(19479,40506,0),(19480,40507,0),(19481,40508,0),(19482,40509,0),(19483,40510,0),(19484,40511,0),(19485,40512,0),(19486,40513,0),(19487,40514,0),(19488,40515,0),(19489,40516,0),(19490,40517,0),(19491,40518,0),(19492,40519,0),(19493,40520,0),(19494,40521,0),(19495,40522,0),(19496,40523,0),(19497,40524,0),(19498,40525,0),(19499,40526,0),(19500,40527,0),(19501,40528,0),(19502,40529,0),(19503,40530,0),(19504,40534,0),(19505,40535,0),(19506,40537,0),(19507,40539,0),(19508,40540,0),(19509,40541,0),(19510,40542,0),(19511,40543,0),(19512,40544,0),(19513,40545,0),(19514,40546,0),(19515,40547,0),(19516,40548,0),(19517,40549,0),(19518,40550,0),(19519,40552,0),(19520,40553,0),(19521,40554,0),(19522,40555,0),(19523,40556,0),(19524,40557,0),(19525,40558,0),(19526,40559,0),(19527,40560,0),(19528,40561,0),(19529,40562,0),(19530,40563,0),(19531,40564,0),(19532,40565,0),(19533,40566,0),(19534,40567,0),(19535,40568,0),(19536,40569,0),(19537,40570,0),(19538,40571,0),(19539,40572,0),(19540,40573,0),(19541,40574,0),(19542,40575,0),(19543,40576,0),(19544,40577,0),(19545,40578,0),(19546,40579,0),(19547,40580,0),(19548,40581,0),(19549,40583,0),(19550,40584,0),(19551,40588,0),(19552,40589,0),(19553,40590,0),(19554,40591,0),(19555,40592,0),(19556,40594,0),(19557,40595,0),(19558,40596,0),(19559,40597,0),(19560,40598,0),(19561,40602,0),(19562,40605,0),(19563,40606,0),(19564,40607,0),(19565,40608,0),(19566,40609,0),(19567,40643,0),(19568,40644,0),(19569,40646,0),(19570,40647,0),(19571,40648,0),(19572,40649,0),(19573,40650,0),(19574,40651,0),(19575,40654,0),(19576,40655,0),(19577,40656,0),(19578,40657,0),(19579,40658,0),(19580,40659,0),(19581,40660,0),(19582,40661,0),(19583,40662,0),(19584,40663,0),(19585,40664,0),(19586,40665,0),(19587,40668,0),(19588,40669,0),(19589,40670,0),(19590,40671,0),(19591,40672,0),(19592,40673,0),(19593,40674,0),(19594,40675,0),(19595,40688,0),(19596,40689,0),(19597,40691,0),(19598,40692,0),(19599,40693,0),(19600,40694,0),(19601,40695,0),(19602,40696,0),(19603,40697,0),(19604,40698,0),(19605,40699,0),(19606,40700,0),(19607,40701,0),(19608,40702,0),(19609,40703,0),(19610,40704,0),(19611,40716,0),(19612,40721,0),(19613,40722,0),(19614,40723,0),(19615,40724,0),(19616,40729,0),(19617,40733,0),(19618,40734,0),(19619,40735,0),(19620,40736,0),(19621,40737,0),(19622,40738,0),(19623,40739,0),(19624,40740,0),(19625,40741,0),(19626,40742,0),(19627,40743,0),(19628,40745,0),(19629,40746,0),(19630,40747,0),(19631,40748,0),(19632,40749,0),(19633,40750,0),(19634,40751,0),(19635,40755,0),(19636,40756,0),(19637,40757,0),(19638,40758,0),(19639,40759,0),(19640,40760,0),(19641,40761,0),(19642,40762,0),(19643,40763,0),(19644,40764,0),(19645,40765,0),(19646,40766,0),(19647,40770,0),(19648,40778,0),(19649,40779,0),(19650,40780,0),(19651,40781,0),(19652,40782,0),(19653,40783,0),(19654,40784,0),(19655,40785,0),(19656,40786,0),(19657,40787,0),(19658,40788,0),(19659,40789,0),(19660,40790,0),(19661,40791,0),(19662,40792,0),(19663,40797,0),(19664,40798,0),(19665,40799,0),(19666,40801,0),(19667,40802,0),(19668,40803,0),(19669,40804,0),(19670,40805,0),(19671,40806,0),(19672,40807,0),(19673,40808,0),(19674,40809,0),(19675,40810,0),(19676,40811,0),(19677,40812,0),(19678,40816,0),(19679,40817,0),(19680,40818,0),(19681,40819,0),(19682,40820,0),(19683,40821,0),(19684,40823,0),(19685,40824,0),(19686,40825,0),(19687,40826,0),(19688,40827,0),(19689,40828,0),(19690,40829,0),(19691,40830,0),(19692,40831,0),(19693,40836,0),(19694,40837,0),(19695,40838,0),(19696,40840,0),(19697,40841,0),(19698,40842,0),(19699,40844,0),(19700,40845,0),(19701,40846,0),(19702,40847,0),(19703,40848,0),(19704,40849,0),(19705,40850,0),(19706,40851,0),(19707,40852,0),(19708,40856,0),(19709,40857,0),(19710,40858,0),(19711,40859,0),(19712,40860,0),(19713,40861,0),(19714,40862,0),(19715,40863,0),(19716,40864,0),(19717,40866,0),(19718,40868,0),(19719,40869,0),(19720,40870,0),(19721,40871,0),(19722,40872,0),(19723,40877,0),(19724,40878,0),(19725,40879,0),(19726,40880,0),(19727,40881,0),(19728,40882,0),(19729,40883,0),(19730,40884,0),(19731,40887,0),(19732,40888,0),(19733,40889,0),(19734,40890,0),(19735,40894,0),(19736,40898,0),(19737,40904,0),(19738,40905,0),(19739,40907,0),(19740,40910,0),(19741,40918,0),(19742,40925,0),(19743,40926,0),(19744,40927,0),(19745,40928,0),(19746,40930,0),(19747,40931,0),(19748,40932,0),(19749,40933,0),(19750,40934,0),(19751,40936,0),(19752,40937,0),(19753,40938,0),(19754,40939,0),(19755,40940,0),(19756,40942,0),(19757,40943,0),(19758,40949,0),(19759,40950,0),(19760,40951,0),(19761,40952,0),(19762,40953,0),(19763,40954,0),(19764,40955,0),(19765,40956,0),(19766,40957,0),(19767,40958,0),(19768,40959,0),(19769,40960,0),(19770,40961,0),(19771,40962,0),(19772,40963,0),(19773,40964,0),(19774,40966,0),(19775,40967,0),(19776,40968,0),(19777,40972,0),(19778,40973,0),(19779,40974,0),(19780,40975,0),(19781,40976,0),(19782,40977,0),(19783,40978,0),(19784,40979,0),(19785,40982,0),(19786,40983,0),(19787,40984,0),(19788,40986,0),(19789,40987,0),(19790,40988,0),(19791,40989,0),(19792,40990,0),(19793,40991,0),(19794,40992,0),(19795,40993,0),(19796,40994,0),(19797,40995,0),(19798,40998,0),(19799,40999,0),(19800,41000,0),(19801,41001,0),(19802,41002,0),(19803,41004,0),(19804,41005,0),(19805,41006,0),(19806,41007,0),(19807,41008,0),(19808,41010,0),(19809,41011,0),(19810,41012,0),(19811,41013,0),(19812,41014,0),(19813,41016,0),(19814,41017,0),(19815,41018,0),(19816,41019,0),(19817,41020,0),(19818,41022,0),(19819,41023,0),(19820,41024,0),(19821,41025,0),(19822,41026,0),(19823,41027,0),(19824,41028,0),(19825,41030,0),(19826,41031,0),(19827,41032,0),(19828,41033,0),(19829,41034,0),(19830,41036,0),(19831,41037,0),(19832,41038,0),(19833,41039,0),(19834,41041,0),(19835,41042,0),(19836,41043,0),(19837,41044,0),(19838,41045,0),(19839,41047,0),(19840,41048,0),(19841,41049,0),(19842,41050,0),(19843,41051,0),(19844,41052,0),(19845,41054,0),(19846,41055,0),(19847,41056,0),(19848,41059,0),(19849,41060,0),(19850,41061,0),(19851,41063,0),(19852,41064,0),(19853,41065,0),(19854,41066,0),(19855,41068,0),(19856,41069,0),(19857,41070,0),(19858,41071,0),(19859,41073,0),(19860,41074,0),(19861,41075,0),(19862,41076,0),(19863,41078,0),(19864,41079,0),(19865,41080,0),(19866,41081,0),(19867,41082,0),(19868,41084,0),(19869,41085,0),(19870,41086,0),(19871,41087,0),(19872,41088,0),(19873,41090,0),(19874,41112,0),(19875,41113,0),(19876,41114,0),(19877,41116,0),(19878,41117,0),(19879,41126,0),(19880,41127,0),(19881,41128,0),(19882,41129,0),(19883,41134,0),(19884,41135,0),(19885,41136,0),(19886,41137,0),(19887,41138,0),(19888,41140,0),(19889,41141,0),(19890,41142,0),(19891,41143,0),(19892,41144,0),(19893,41148,0),(19894,41149,0),(19895,41150,0),(19896,41151,0),(19897,41152,0),(19898,41154,0),(19899,41155,0),(19900,41156,0),(19901,41157,0),(19902,41158,0),(19903,41160,0),(19904,41162,0),(19905,41164,0),(19906,41165,0),(19907,41168,0),(19908,41175,0),(19909,41176,0),(19910,41177,0),(19911,41180,0),(19912,41181,0),(19913,41182,0),(19914,41183,0),(19915,41184,0),(19916,41185,0),(19917,41186,0),(19918,41187,0),(19919,41188,0),(19920,41189,0),(19921,41190,0),(19922,41198,0),(19923,41199,0),(19924,41200,0),(19925,41202,0),(19926,41203,0),(19927,41204,0),(19928,41205,0),(19929,41206,0),(19930,41208,0),(19931,41209,0),(19932,41210,0),(19933,41211,0),(19934,41212,0),(19935,41214,0),(19936,41215,0),(19937,41216,0),(19938,41217,0),(19939,41218,0),(19940,41223,0),(19941,41224,0),(19942,41225,0),(19943,41226,0),(19944,41228,0),(19945,41229,0),(19946,41230,0),(19947,41231,0),(19948,41233,0),(19949,41234,0),(19950,41235,0),(19951,41236,0),(19952,41238,0),(19953,41239,0),(19954,41240,0),(19955,41241,0),(19956,41242,0),(19957,41243,0),(19958,41244,0),(19959,41245,0),(19960,41248,0),(19961,41249,0),(19962,41250,0),(19963,41251,0),(19964,41252,0),(19965,41253,0),(19966,41254,0),(19967,41255,0),(19968,41256,0),(19969,41257,0),(19970,41259,0),(19971,41261,0),(19972,41263,0),(19973,41264,0),(19974,41268,0),(19975,41269,0),(19976,41270,0),(19977,41271,0),(19978,41272,0),(19979,41273,0),(19980,41274,0),(19981,41275,0),(19982,41276,0),(19983,41278,0),(19984,41279,0),(19985,41280,0),(19986,41281,0),(19987,41282,0),(19988,41284,0),(19989,41286,0),(19990,41287,0),(19991,41288,0),(19992,41290,0),(19993,41291,0),(19994,41292,0),(19995,41293,0),(19996,41294,0),(19997,41296,0),(19998,41297,0),(19999,41298,0),(20000,41299,0),(20001,41301,0),(20002,41302,0),(20003,41303,0),(20004,41304,0),(20005,41305,0),(20006,41308,0),(20007,41309,0),(20008,41310,0),(20009,41311,0),(20010,41313,0),(20011,41314,0),(20012,41315,0),(20013,41316,0),(20014,41317,0),(20015,41319,0),(20016,41320,0),(20017,41321,0),(20018,41322,0),(20019,41324,0),(20020,41325,0),(20021,41326,0),(20022,41327,0),(20023,41328,0),(20024,41330,0),(20025,41331,0),(20026,41332,0),(20027,41342,0),(20028,41343,0),(20029,41344,0),(20030,41345,0),(20031,41346,0),(20032,41347,0),(20033,41348,0),(20034,41349,0),(20035,41350,0),(20036,41351,0),(20037,41352,0),(20038,41353,0),(20039,41354,0),(20040,41355,0),(20041,41356,0),(20042,41357,0),(20043,41358,0),(20044,41360,0),(20045,41364,0),(20046,41365,0),(20047,41370,0),(20048,41371,0),(20049,41383,0),(20050,41384,0),(20051,41386,0),(20052,41387,0),(20053,41388,0),(20054,41391,0),(20055,41392,0),(20056,41394,0),(20057,41512,0),(20058,41513,0),(20059,41515,0),(20060,41516,0),(20061,41519,0),(20062,41520,0),(20063,41521,0),(20064,41522,0),(20065,41523,0),(20066,41525,0),(20067,41528,0),(20068,41543,0),(20069,41544,0),(20070,41545,0),(20071,41546,0),(20072,41548,0),(20073,41549,0),(20074,41550,0),(20075,41551,0),(20076,41553,0),(20077,41554,0),(20078,41555,0),(20079,41583,0),(20080,41584,0),(20081,41586,0),(20082,41591,0),(20083,41592,0),(20084,41607,0),(20085,41608,0),(20086,41609,0),(20087,41610,0),(20088,41613,0),(20089,41616,0),(20090,41617,0),(20091,41618,0),(20092,41620,0),(20093,41621,0),(20094,41622,0),(20095,41624,0),(20096,41625,0),(20097,41626,0),(20098,41628,0),(20099,41629,0),(20100,41630,0),(20101,41631,0),(20102,41633,0),(20103,41634,0),(20104,41635,0),(20105,41636,0),(20106,41638,0),(20107,41639,0),(20108,41640,0),(20109,41641,0),(20110,41643,0),(20111,41644,0),(20112,41645,0),(20113,41646,0),(20114,41647,0),(20115,41648,0),(20116,41649,0),(20117,41650,0),(20118,41651,0),(20119,41653,0),(20120,41654,0),(20121,41655,0),(20122,41656,0),(20123,41658,0),(20124,41659,0),(20125,41660,0),(20126,41661,0),(20127,41662,0),(20128,41664,0),(20129,41665,0),(20130,41666,0),(20131,41667,0),(20132,41668,0),(20133,41670,0),(20134,41671,0),(20135,41672,0),(20136,41673,0),(20137,41675,0),(20138,41676,0),(20139,41677,0),(20140,41678,0),(20141,41679,0),(20142,41681,0),(20143,41682,0),(20144,41683,0),(20145,41684,0),(20146,41691,0),(20147,41695,0),(20148,41712,0),(20149,41713,0),(20150,41714,0),(20151,41715,0),(20152,41716,0),(20153,41746,0),(20154,41752,0),(20155,41754,0),(20156,41755,0),(20157,41757,0),(20158,41758,0),(20159,41759,0),(20160,41760,0),(20161,41761,0),(20162,41762,0),(20163,41763,0),(20164,41764,0),(20165,41765,0),(20166,41766,0),(20167,41767,0),(20168,41768,0),(20169,41770,0),(20170,41771,0),(20171,41772,0),(20172,41773,0),(20173,41774,0),(20174,41815,0),(20175,41816,0),(20176,41821,0),(20177,41822,0),(20178,41823,0),(20179,41824,0),(20180,41825,0),(20181,41826,0),(20182,41827,0),(20183,41828,0),(20184,41829,0),(20185,41830,0),(20186,41831,0),(20187,41832,0),(20188,41833,0),(20189,41835,0),(20190,41836,0),(20191,41837,0),(20192,41839,0),(20193,41840,0),(20194,41841,0),(20195,41844,0),(20196,41845,0),(20197,41846,0),(20198,41847,0),(20199,41848,0),(20200,41849,0),(20201,41850,0),(20202,41851,0),(20203,41852,0),(20204,41853,0),(20205,41854,0),(20206,41855,0),(20207,41857,0),(20208,41858,0),(20209,41859,0),(20210,41860,0),(20211,41862,0),(20212,41863,0),(20213,41864,0),(20214,41865,0),(20215,41867,0),(20216,41868,0),(20217,41869,0),(20218,41870,0),(20219,41872,0),(20220,41873,0),(20221,41874,0),(20222,41875,0),(20223,41877,0),(20224,41878,0),(20225,41879,0),(20226,41880,0),(20227,41881,0),(20228,41882,0),(20229,41884,0),(20230,41885,0),(20231,41886,0),(20232,41889,0),(20233,41890,0),(20234,41891,0),(20235,41892,0),(20236,41893,0),(20237,41894,0),(20238,41896,0),(20239,41897,0),(20240,41898,0),(20241,41899,0),(20242,41901,0),(20243,41902,0),(20244,41903,0),(20245,41904,0),(20246,41905,0),(20247,41907,0),(20248,41908,0),(20249,41909,0),(20250,41910,0),(20251,41912,0),(20252,41913,0),(20253,41914,0),(20254,41915,0),(20255,41916,0),(20256,41918,0),(20257,41919,0),(20258,41920,0),(20259,41921,0),(20260,41922,0),(20261,41924,0),(20262,41925,0),(20263,41926,0),(20264,41927,0),(20265,41928,0),(20266,41930,0),(20267,41931,0),(20268,41932,0),(20269,41933,0),(20270,41934,0),(20271,41935,0),(20272,41937,0),(20273,41938,0),(20274,41939,0),(20275,41940,0),(20276,41941,0),(20277,41943,0),(20278,41944,0),(20279,41945,0),(20280,41946,0),(20281,41947,0),(20282,41949,0),(20283,41950,0),(20284,41951,0),(20285,41953,0),(20286,41954,0),(20287,41956,0),(20288,41957,0),(20289,41958,0),(20290,41959,0),(20291,41960,0),(20292,41962,0),(20293,41963,0),(20294,41964,0),(20295,41965,0),(20296,41966,0),(20297,41968,0),(20298,41969,0),(20299,41970,0),(20300,41971,0),(20301,41972,0),(20302,41974,0),(20303,41975,0),(20304,41977,0),(20305,41978,0),(20306,41979,0),(20307,41980,0),(20308,41981,0),(20309,41982,0),(20310,41983,0),(20311,41984,0),(20312,41985,0),(20313,41986,0),(20314,41987,0),(20315,41990,0),(20316,41991,0),(20317,41992,0),(20318,41993,0),(20319,41994,0),(20320,41996,0),(20321,41997,0),(20322,41998,0),(20323,41999,0),(20324,42001,0),(20325,42002,0),(20326,42003,0),(20327,42004,0),(20328,42005,0),(20329,42006,0),(20330,42008,0),(20331,42009,0),(20332,42010,0),(20333,42011,0),(20334,42012,0),(20335,42014,0),(20336,42015,0),(20337,42016,0),(20338,42017,0),(20339,42018,0),(20340,42055,0),(20341,42056,0),(20342,42057,0),(20343,42058,0),(20344,42059,0),(20345,42060,0),(20346,42061,0),(20347,42062,0),(20348,42063,0),(20349,42064,0),(20350,42065,0),(20351,42066,0),(20352,42067,0),(20353,42068,0),(20354,42069,0),(20355,42070,0),(20356,42071,0),(20357,42072,0),(20358,42073,0),(20359,42074,0),(20360,42075,0),(20361,42076,0),(20362,42077,0),(20363,42078,0),(20364,42079,0),(20365,42080,0),(20366,42081,0),(20367,42082,0),(20368,42084,0),(20369,42088,0),(20370,42092,0),(20371,42093,0),(20372,42094,0),(20373,42095,0),(20374,42096,0),(20375,42097,0),(20376,42098,0),(20377,42099,0),(20378,42100,0),(20379,42101,0),(20380,42102,0),(20381,42103,0),(20382,42111,0),(20383,42113,0),(20384,42139,0),(20385,42140,0),(20386,42161,0),(20387,42165,0),(20388,42166,0),(20389,42167,0),(20390,42168,0),(20391,42169,0),(20392,42206,0),(20393,42207,0),(20394,42208,0),(20395,42209,0),(20396,42210,0),(20397,42212,0),(20398,42213,0),(20399,42214,0),(20400,42215,0),(20401,42216,0),(20402,42217,0),(20403,42218,0),(20404,42219,0),(20405,42220,0),(20406,42221,0),(20407,42222,0),(20408,42223,0),(20409,42224,0),(20410,42226,0),(20411,42227,0),(20412,42228,0),(20413,42229,0),(20414,42231,0),(20415,42232,0),(20416,42233,0),(20417,42234,0),(20418,42236,0),(20419,42237,0),(20420,42238,0),(20421,42239,0),(20422,42240,0),(20423,42241,0),(20424,42242,0),(20425,42243,0),(20426,42244,0),(20427,42247,0),(20428,42248,0),(20429,42249,0),(20430,42250,0),(20431,42254,0),(20432,42255,0),(20433,42256,0),(20434,42257,0),(20435,42259,0),(20436,42260,0),(20437,42261,0),(20438,42262,0),(20439,42264,0),(20440,42265,0),(20441,42266,0),(20442,42267,0),(20443,42269,0),(20444,42270,0),(20445,42271,0),(20446,42272,0),(20447,42274,0),(20448,42275,0),(20449,42276,0),(20450,42277,0),(20451,42279,0),(20452,42280,0),(20453,42281,0),(20454,42282,0),(20455,42284,0),(20456,42285,0),(20457,42286,0),(20458,42287,0),(20459,42289,0),(20460,42290,0),(20461,42291,0),(20462,42292,0),(20463,42294,0),(20464,42295,0),(20465,42296,0),(20466,42297,0),(20467,42316,0),(20468,42317,0),(20469,42318,0),(20470,42319,0),(20471,42321,0),(20472,42322,0),(20473,42323,0),(20474,42324,0),(20475,42326,0),(20476,42327,0),(20477,42328,0),(20478,42329,0),(20479,42331,0),(20480,42332,0),(20481,42333,0),(20482,42334,0),(20483,42343,0),(20484,42344,0),(20485,42345,0),(20486,42346,0),(20487,42347,0),(20488,42348,0),(20489,42351,0),(20490,42352,0),(20491,42353,0),(20492,42354,0),(20493,42356,0),(20494,42359,0),(20495,42360,0),(20496,42361,0),(20497,42362,0),(20498,42363,0),(20499,42364,0),(20500,42365,0),(20501,42366,0),(20502,42368,0),(20503,42369,0),(20504,42370,0),(20505,42371,0),(20506,42372,0),(20507,42373,0),(20508,42374,0),(20509,42375,0),(20510,42376,0),(20511,42377,0),(20512,42378,0),(20513,42379,0),(20514,42380,0),(20515,42382,0),(20516,42383,0),(20517,42384,0),(20518,42385,0),(20519,42386,0),(20520,42388,0),(20521,42389,0),(20522,42390,0),(20523,42391,0),(20524,42392,0),(20525,42426,0),(20526,42427,0),(20527,42435,0),(20528,42443,0),(20529,42444,0),(20530,42445,0),(20531,42446,0),(20532,42447,0),(20533,42448,0),(20534,42449,0),(20535,42450,0),(20536,42451,0),(20537,42477,0),(20538,42478,0),(20539,42483,0),(20540,42484,0),(20541,42485,0),(20542,42486,0),(20543,42487,0),(20544,42489,0),(20545,42490,0),(20546,42491,0),(20547,42492,0),(20548,42494,0),(20549,42495,0),(20550,42496,0),(20551,42498,0),(20552,42501,0),(20553,42502,0),(20554,42503,0),(20555,42504,0),(20556,42506,0),(20557,42507,0),(20558,42508,0),(20559,42509,0),(20560,42511,0),(20561,42512,0),(20562,42513,0),(20563,42514,0),(20564,42515,0),(20565,42517,0),(20566,42518,0),(20567,42519,0),(20568,42520,0),(20569,42521,0),(20570,42523,0),(20571,42524,0),(20572,42525,0),(20573,42526,0),(20574,42527,0),(20575,42529,0),(20576,42530,0),(20577,42531,0),(20578,42532,0),(20579,42533,0),(20580,42535,0),(20581,42536,0),(20582,42537,0),(20583,42538,0),(20584,42539,0),(20585,42543,0),(20586,42544,0),(20587,42547,0),(20588,42549,0),(20589,42550,0),(20590,42551,0),(20591,42552,0),(20592,42553,0),(20593,42554,0),(20594,42555,0),(20595,42556,0),(20596,42557,0),(20597,42558,0),(20598,42559,0),(20599,42560,0),(20600,42561,0),(20601,42563,0),(20602,42564,0),(20603,42565,0),(20604,42566,0),(20605,42568,0),(20606,42569,0),(20607,42570,0),(20608,42571,0),(20609,42572,0),(20610,42625,0),(20611,42626,0),(20612,42627,0),(20613,42628,0),(20614,42629,0),(20615,42630,0),(20616,42631,0),(20617,42632,0),(20618,42633,0),(20619,42634,0),(20620,42635,0),(20621,42636,0),(20622,42637,0),(20623,42638,0),(20624,42639,0),(20625,42654,0),(20626,42655,0),(20627,42656,0),(20628,42657,0),(20629,42658,0),(20630,42659,0),(20631,42660,0),(20632,42661,0),(20633,42662,0),(20634,42663,0),(20635,42664,0),(20636,42665,0),(20637,42666,0),(20638,42667,0),(20639,42668,0),(20640,42669,0),(20641,42670,0),(20642,42671,0),(20643,42672,0),(20644,42673,0),(20645,42674,0),(20646,42675,0),(20647,42676,0),(20648,42677,0),(20649,42678,0),(20650,42680,0),(20651,42681,0),(20652,42682,0),(20653,42683,0),(20654,42684,0),(20655,42685,0),(20656,42686,0),(20657,42687,0),(20658,42688,0),(20659,42689,0),(20660,42690,0),(20661,42691,0),(20662,42692,0),(20663,42693,0),(20664,42694,0),(20665,42695,0),(20666,42696,0),(20667,42697,0),(20668,42698,0),(20669,42699,0),(20670,42703,0),(20671,42704,0),(20672,42705,0),(20673,42706,0),(20674,42707,0),(20675,42708,0),(20676,42709,0),(20677,42710,0),(20678,42711,0),(20679,42712,0),(20680,42713,0),(20681,42714,0),(20682,42715,0),(20683,42716,0),(20684,42717,0),(20685,42718,0),(20686,42719,0),(20687,42720,0),(20688,42721,0),(20689,42722,0),(20690,42723,0),(20691,42724,0),(20692,42725,0),(20693,42726,0),(20694,42727,0),(20695,42728,0),(20696,42729,0),(20697,42730,0),(20698,42731,0),(20699,42755,0),(20700,42756,0),(20701,42757,0),(20702,42758,0),(20703,42759,0),(20704,42760,0),(20705,42761,0),(20706,42762,0),(20707,42763,0),(20708,42764,0),(20709,42765,0),(20710,42766,0),(20711,42767,0),(20712,42768,0),(20713,42773,0),(20714,42775,0),(20715,42776,0),(20716,42785,0),(20717,42786,0),(20718,42787,0),(20719,42788,0),(20720,42789,0),(20721,42790,0),(20722,42792,0),(20723,42794,0),(20724,42795,0),(20725,42796,0),(20726,42798,0),(20727,42799,0),(20728,42800,0),(20729,42801,0),(20730,42802,0),(20731,42803,0),(20732,42804,0),(20733,42805,0),(20734,42806,0),(20735,42807,0),(20736,42809,0),(20737,42810,0),(20738,42811,0),(20739,42813,0),(20740,42814,0),(20741,42815,0),(20742,42816,0),(20743,42817,0),(20744,42818,0),(20745,42819,0),(20746,42820,0),(20747,42821,0),(20748,42822,0),(20749,42823,0),(20750,42824,0),(20751,42825,0),(20752,42826,0),(20753,42827,0),(20754,42828,0),(20755,42829,0),(20756,42830,0),(20757,42831,0),(20758,42832,0),(20759,42833,0),(20760,42834,0),(20761,42835,0),(20762,42836,0),(20763,42841,0),(20764,42842,0),(20765,42843,0),(20766,42844,0),(20767,42846,0),(20768,42847,0),(20769,42848,0),(20770,42849,0),(20771,42850,0),(20772,42857,0),(20773,42858,0),(20774,42859,0),(20775,42860,0),(20776,42861,0),(20777,42862,0),(20778,42863,0),(20779,42865,0),(20780,42866,0),(20781,42867,0),(20782,42868,0),(20783,42869,0),(20784,42870,0),(20785,42871,0),(20786,42872,0),(20787,42873,0),(20788,42874,0),(20789,42875,0),(20790,42876,0),(20791,42877,0),(20792,42878,0),(20793,42879,0),(20794,42880,0),(20795,42881,0),(20796,42882,0),(20797,42883,0),(20798,42884,0),(20799,42885,0),(20800,42886,0),(20801,42887,0),(20802,42888,0),(20803,42889,0),(20804,42890,0),(20805,42891,0),(20806,42892,0),(20807,42893,0),(20808,42895,0),(20809,42896,0),(20810,42919,0),(20811,42920,0),(20812,42921,0),(20813,42923,0),(20814,42924,0),(20815,42925,0),(20816,42932,0),(20817,42933,0),(20818,42934,0),(20819,42935,0),(20820,42936,0),(20821,42937,0),(20822,42938,0),(20823,42939,0),(20824,42940,0),(20825,42941,0),(20826,42943,0),(20827,42944,0),(20828,42945,0),(20829,42946,0),(20830,42947,0),(20831,42948,0),(20832,42949,0),(20833,42950,0),(20834,42951,0),(20835,42952,0),(20836,42984,0),(20837,42985,0),(20838,43008,0),(20839,43014,0),(20840,43068,0),(20841,43069,0),(20842,43070,0),(20843,43071,0),(20844,43072,0),(20845,43073,0),(20846,43074,0),(20847,43075,0),(20848,43076,0),(20849,43077,0),(20850,43078,0),(20851,43079,0),(20852,43080,0),(20853,43081,0),(20854,43082,0),(20855,43083,0),(20856,43085,0),(20857,43091,0),(20858,43092,0),(20859,43093,0),(20860,43110,0),(20861,43111,0),(20862,43112,0),(20863,43113,0),(20864,43114,0),(20865,43129,0),(20866,43130,0),(20867,43131,0),(20868,43132,0),(20869,43133,0),(20870,43152,0),(20871,43154,0),(20872,43155,0),(20873,43156,0),(20874,43157,0),(20875,43160,0),(20876,43161,0),(20877,43162,0),(20878,43163,0),(20879,43164,0),(20880,43165,0),(20881,43167,0),(20882,43168,0),(20883,43171,0),(20884,43172,0),(20885,43173,0),(20886,43174,0),(20887,43175,0),(20888,43176,0),(20889,43181,0),(20890,43182,0),(20891,43183,0),(20892,43184,0),(20893,43185,0),(20894,43186,0),(20895,43187,0),(20896,43188,0),(20897,43193,0),(20898,43194,0),(20899,43195,0),(20900,43196,0),(20901,43197,0),(20902,43198,0),(20903,43199,0),(20904,43200,0),(20905,43201,0),(20906,43202,0),(20907,43203,0),(20908,43204,0),(20909,43205,0),(20910,43207,0),(20911,43208,0),(20912,43209,0),(20913,43210,0),(20914,43211,0),(20915,43212,0),(20916,43213,0),(20917,43216,0),(20918,43219,0),(20919,43220,0),(20920,43221,0),(20921,43222,0),(20922,43223,0),(20923,43224,0),(20924,43226,0),(20925,43227,0),(20926,43255,0),(20927,43256,0),(20928,43257,0),(20929,43258,0),(20930,43260,0),(20931,43261,0),(20932,43262,0),(20933,43263,0),(20934,43264,0),(20935,43265,0),(20936,43266,0),(20937,43267,0),(20938,43271,0),(20939,43273,0),(20940,43278,0),(20941,43279,0),(20942,43280,0),(20943,43281,0),(20944,43283,0),(20945,43284,0),(20946,43286,0),(20947,43287,0),(20948,43292,0),(20949,43293,0),(20950,43294,0),(20951,43295,0),(20952,43296,0),(20953,43300,0),(20954,43301,0),(20955,43305,0),(20956,43310,0),(20957,43311,0),(20958,43312,0),(20959,43313,0),(20960,43327,0),(20961,43348,0),(20962,43349,0),(20963,43353,0),(20964,43363,0),(20965,43375,0),(20966,43387,0),(20967,43401,0),(20968,43402,0),(20969,43403,0),(20970,43405,0),(20971,43406,0),(20972,43407,0),(20973,43409,0),(20974,43410,0),(20975,43433,0),(20976,43434,0),(20977,43435,0),(20978,43436,0),(20979,43437,0),(20980,43438,0),(20981,43439,0),(20982,43442,0),(20983,43443,0),(20984,43444,0),(20985,43445,0),(20986,43446,0),(20987,43447,0),(20988,43448,0),(20989,43449,0),(20990,43450,0),(20991,43451,0),(20992,43452,0),(20993,43453,0),(20994,43454,0),(20995,43455,0),(20996,43456,0),(20997,43457,0),(20998,43458,0),(20999,43459,0),(21000,43460,0),(21001,43461,0),(21002,43469,0),(21003,43474,0),(21004,43475,0),(21005,43476,0),(21006,43477,0),(21007,43479,0),(21008,43481,0),(21009,43484,0),(21010,43486,0),(21011,43487,0),(21012,43495,0),(21013,43500,0),(21014,43502,0),(21015,43515,0),(21016,43525,0),(21017,43532,0),(21018,43565,0),(21019,43566,0),(21020,43578,0),(21021,43579,0),(21022,43580,0),(21023,43581,0),(21024,43583,0),(21025,43584,0),(21026,43585,0),(21027,43586,0),(21028,43587,0),(21029,43588,0),(21030,43590,0),(21031,43591,0),(21032,43592,0),(21033,43593,0),(21034,43594,0),(21035,43595,0),(21036,43596,0),(21037,43598,0),(21038,43600,0),(21039,43601,0),(21040,43611,0),(21041,43612,0),(21042,43613,0),(21043,43617,0),(21044,43618,0),(21045,43619,0),(21046,43623,0),(21047,43625,0),(21048,43651,0),(21049,43654,0),(21050,43655,0),(21051,43656,0),(21052,43657,0),(21053,43659,0),(21054,43660,0),(21055,43661,0),(21056,43663,0),(21057,43664,0),(21058,43666,0),(21059,43667,0),(21060,43692,0),(21061,43700,0),(21062,43727,0),(21063,43728,0),(21064,43729,0),(21065,43730,0),(21066,43731,0),(21067,43732,0),(21068,43733,0),(21069,43734,0),(21070,43735,0),(21071,43736,0),(21072,43737,0),(21073,43738,0),(21074,43739,0),(21075,43740,0),(21076,43741,0),(21077,43742,0),(21078,43743,0),(21079,43744,0),(21080,43745,0),(21081,43746,0),(21082,43747,0),(21083,43748,0),(21084,43749,0),(21085,43750,0),(21086,43751,0),(21087,43752,0),(21088,43753,0),(21089,43754,0),(21090,43755,0),(21091,43756,0),(21092,43757,0),(21093,43758,0),(21094,43759,0),(21095,43760,0),(21096,43761,0),(21097,43762,0),(21098,43763,0),(21099,43764,0),(21100,43765,0),(21101,43766,0),(21102,43767,0),(21103,43768,0),(21104,43769,0),(21105,43770,0),(21106,43771,0),(21107,43772,0),(21108,43773,0),(21109,43774,0),(21110,43775,0),(21111,43776,0),(21112,43777,0),(21113,43778,0),(21114,43779,0),(21115,43780,0),(21116,43781,0),(21117,43782,0),(21118,43783,0),(21119,43784,0),(21120,43785,0),(21121,43786,0),(21122,43787,0),(21123,43788,0),(21124,43789,0),(21125,43790,0),(21126,43791,0),(21127,43792,0),(21128,43793,0),(21129,43794,0),(21130,43795,0),(21131,43796,0),(21132,43797,0),(21133,43798,0),(21134,43799,0),(21135,43800,0),(21136,43801,0),(21137,43802,0),(21138,43803,0),(21139,43804,0),(21140,43805,0),(21141,43806,0),(21142,43807,0),(21143,43808,0),(21144,43809,0),(21145,43810,0),(21146,43811,0),(21147,43812,0),(21148,43813,0),(21149,43814,0),(21150,43815,0),(21151,43816,0),(21152,43817,0),(21153,43818,0),(21154,43819,0),(21155,43820,0),(21156,43822,0),(21157,43828,0),(21158,43830,0),(21159,43831,0),(21160,43832,0),(21161,43833,0),(21162,43834,0),(21163,43835,0),(21164,43839,0),(21165,43840,0),(21166,43841,0),(21167,43842,0),(21168,43843,0),(21169,43844,0),(21170,43845,0),(21171,43846,0),(21172,43847,0),(21173,43848,0),(21174,43855,0),(21175,43856,0),(21176,43857,0),(21177,43858,0),(21178,43859,0),(21179,43860,0),(21180,43861,0),(21181,43862,0),(21182,43863,0),(21183,43864,0),(21184,43865,0),(21185,43866,0),(21186,43870,0),(21187,43871,0),(21188,43872,0),(21189,43873,0),(21190,43875,0),(21191,43878,0),(21192,43879,0),(21193,43880,0),(21194,43881,0),(21195,43882,0),(21196,43883,0),(21197,43885,0),(21198,43886,0),(21199,43887,0),(21200,43888,0),(21201,43889,0),(21202,43890,0),(21203,43891,0),(21204,43892,0),(21205,43893,0),(21206,43894,0),(21207,43895,0),(21208,43896,0),(21209,43897,0),(21210,43898,0),(21211,43899,0),(21212,43900,0),(21213,43901,0),(21214,43902,0),(21215,43904,0),(21216,43905,0),(21217,43906,0),(21218,43907,0),(21219,43908,0),(21220,43909,0),(21221,43910,0),(21222,43911,0),(21223,43912,0),(21224,43913,0),(21225,43914,0),(21226,43915,0),(21227,43916,0),(21228,43917,0),(21229,43918,0),(21230,43919,0),(21231,43920,0),(21232,43921,0),(21233,43922,0),(21234,43923,0),(21235,43924,0),(21236,43925,0),(21237,43927,0),(21238,43928,0),(21239,43929,0),(21240,43930,0),(21241,43931,0),(21242,43932,0),(21243,43933,0),(21244,43934,0),(21245,43935,0),(21246,43936,0),(21247,43937,0),(21248,43938,0),(21249,43939,0),(21250,43940,0),(21251,43941,0),(21252,43942,0),(21253,43943,0),(21254,43944,0),(21255,43945,0),(21256,43946,0),(21257,43947,0),(21258,43948,0),(21259,43967,0),(21260,43969,0),(21261,43970,0),(21262,43971,0),(21263,43972,0),(21264,43973,0),(21265,43974,0),(21266,43975,0),(21267,43976,0),(21268,43977,0),(21269,43978,0),(21270,43979,0),(21271,43980,0),(21272,43981,0),(21273,43982,0),(21274,43985,0),(21275,43988,0),(21276,43989,0),(21277,43990,0),(21278,43991,0),(21279,43994,0),(21280,43995,0),(21281,43996,0),(21282,43998,0),(21283,44000,0),(21284,44002,0),(21285,44003,0),(21286,44004,0),(21287,44005,0),(21288,44006,0),(21289,44007,0),(21290,44008,0),(21291,44011,0),(21292,44016,0),(21293,44018,0),(21294,44019,0),(21295,44020,0),(21296,44021,0),(21297,44022,0),(21298,44023,0),(21299,44024,0),(21300,44025,0),(21301,44026,0),(21302,44027,0),(21303,44028,0),(21304,44029,0),(21305,44030,0),(21306,44031,0),(21307,44032,0),(21308,44036,0),(21309,44037,0),(21310,44038,0),(21311,44040,0),(21312,44041,0),(21313,44042,0),(21314,44043,0),(21315,44044,0),(21316,44045,0),(21317,44046,0),(21318,44050,0),(21319,44051,0),(21320,44052,0),(21321,44053,0),(21322,44054,0),(21323,44055,0),(21324,44056,0),(21325,44057,0),(21326,44058,0),(21327,44059,0),(21328,44060,0),(21329,44061,0),(21330,44062,0),(21331,44090,0),(21332,44091,0),(21333,44092,0),(21334,44093,0),(21335,44094,0),(21336,44095,0),(21337,44096,0),(21338,44099,0),(21339,44100,0),(21340,44101,0),(21341,44102,0),(21342,44103,0),(21343,44104,0),(21344,44105,0),(21345,44106,0),(21346,44107,0),(21347,44108,0),(21348,44109,0),(21349,44110,0),(21350,44111,0),(21351,44112,0),(21352,44116,0),(21353,44117,0),(21354,44118,0),(21355,44120,0),(21356,44121,0),(21357,44122,0),(21358,44123,0),(21359,44162,0),(21360,44166,0),(21361,44167,0),(21362,44169,0),(21363,44170,0),(21364,44171,0),(21365,44172,0),(21366,44173,0),(21367,44174,0),(21368,44176,0),(21369,44179,0),(21370,44180,0),(21371,44181,0),(21372,44182,0),(21373,44183,0),(21374,44187,0),(21375,44188,0),(21376,44189,0),(21377,44190,0),(21378,44191,0),(21379,44192,0),(21380,44193,0),(21381,44194,0),(21382,44195,0),(21383,44196,0),(21384,44197,0),(21385,44198,0),(21386,44199,0),(21387,44200,0),(21388,44201,0),(21389,44202,0),(21390,44203,0),(21391,44204,0),(21392,44205,0),(21393,44210,0),(21394,44211,0),(21395,44214,0),(21396,44216,0),(21397,44217,0),(21398,44218,0),(21399,44219,0),(21400,44227,0),(21401,44232,0),(21402,44233,0),(21403,44236,0),(21404,44237,0),(21405,44238,0),(21406,44239,0),(21407,44240,0),(21408,44241,0),(21409,44242,0),(21410,44243,0),(21411,44244,0),(21412,44245,0),(21413,44247,0),(21414,44248,0),(21415,44249,0),(21416,44250,0),(21417,44252,0),(21418,44256,0),(21419,44257,0),(21420,44258,0),(21421,44295,0),(21422,44296,0),(21423,44297,0),(21424,44302,0),(21425,44303,0),(21426,44305,0),(21427,44306,0),(21428,44309,0),(21429,44310,0),(21430,44311,0),(21431,44312,0),(21432,44313,0),(21433,44333,0),(21434,44338,0),(21435,44339,0),(21436,44340,0),(21437,44341,0),(21438,44342,0),(21439,44343,0),(21440,44344,0),(21441,44345,0),(21442,44346,0),(21443,44347,0),(21444,44348,0),(21445,44349,0),(21446,44350,0),(21447,44351,0),(21448,44352,0),(21449,44353,0),(21450,44354,0),(21451,44355,0),(21452,44356,0),(21453,44357,0),(21454,44358,0),(21455,44359,0),(21456,44360,0),(21457,44361,0),(21458,44362,0),(21459,44363,0),(21460,44364,0),(21461,44365,0),(21462,44366,0),(21463,44367,0),(21464,44368,0),(21465,44369,0),(21466,44370,0),(21467,44371,0),(21468,44372,0),(21469,44373,0),(21470,44378,0),(21471,44379,0),(21472,44380,0),(21473,44381,0),(21474,44382,0),(21475,44383,0),(21476,44384,0),(21477,44385,0),(21478,44393,0),(21479,44394,0),(21480,44395,0),(21481,44396,0),(21482,44397,0),(21483,44398,0),(21484,44399,0),(21485,44404,0),(21486,44405,0),(21487,44406,0),(21488,44407,0),(21489,44408,0),(21490,44409,0),(21491,44410,0),(21492,44411,0),(21493,44412,0),(21494,44415,0),(21495,44416,0),(21496,44417,0),(21497,44418,0),(21498,44419,0),(21499,44420,0),(21500,44421,0),(21501,44422,0),(21502,44423,0),(21503,44424,0),(21504,44429,0),(21505,44431,0),(21506,44436,0),(21507,44437,0),(21508,44438,0),(21509,44439,0),(21510,44440,0),(21511,44441,0),(21512,44442,0),(21513,44443,0),(21514,44444,0),(21515,44445,0),(21516,44454,0),(21517,44504,0),(21518,44505,0),(21519,44583,0),(21520,44590,0),(21521,44591,0),(21522,44592,0),(21523,44593,0),(21524,44594,0),(21525,44595,0),(21526,44596,0),(21527,44603,0),(21528,44604,0),(21529,44635,0),(21530,44636,0),(21531,44637,0),(21532,44638,0),(21533,44639,0),(21534,44640,0),(21535,44641,0),(21536,44642,0),(21537,44643,0),(21538,44644,0),(21539,44645,0),(21540,44647,0),(21541,44648,0),(21542,44649,0),(21543,44652,0),(21544,44654,0),(21545,44655,0),(21546,44656,0),(21547,44666,0),(21548,44667,0),(21549,44668,0),(21550,44669,0),(21551,44670,0),(21552,44671,0),(21553,44672,0),(21554,44673,0),(21555,44674,0),(21556,44675,0),(21557,44676,0),(21558,44677,0),(21559,44678,0),(21560,44679,0),(21561,44685,0),(21562,44686,0),(21563,44687,0),(21564,44691,0),(21565,44692,0),(21566,44693,0),(21567,44694,0),(21568,44695,0),(21569,44696,0),(21570,44697,0),(21571,44703,0),(21572,44705,0),(21573,44706,0),(21574,44708,0),(21575,44715,0),(21576,44726,0),(21577,44727,0),(21578,44730,0),(21579,44731,0),(21580,44732,0),(21581,44733,0),(21582,44734,0),(21583,44735,0),(21584,44736,0),(21585,44737,0),(21586,44740,0),(21587,44741,0),(21588,44742,0),(21589,44743,0),(21590,44745,0),(21591,44746,0),(21592,44747,0),(21593,44748,0),(21594,44785,0),(21595,44788,0),(21596,44800,0),(21597,44802,0),(21598,44803,0),(21599,44821,0),(21600,44845,0),(21601,44846,0),(21602,44847,0),(21603,44848,0),(21604,44891,0),(21605,44892,0),(21606,44893,0),(21607,44894,0),(21608,44895,0),(21609,44896,0),(21610,44897,0),(21611,44898,0),(21612,44899,0),(21613,44900,0),(21614,44901,0),(21615,44902,0),(21616,44903,0),(21617,44904,0),(21618,44905,0),(21619,44906,0),(21620,44907,0),(21621,44908,0),(21622,44909,0),(21623,44910,0),(21624,44924,0),(21625,44930,0),(21626,44931,0),(21627,44949,0),(21628,44952,0),(21629,45037,0),(21630,45041,0),(21631,45044,0),(21632,45048,0),(21633,45052,0),(21634,45053,0),(21635,45055,0),(21636,45061,0),(21637,45067,0),(21638,45073,0),(21639,45074,0),(21640,45075,0),(21641,45076,0),(21642,45077,0),(21643,45078,0),(21644,45081,0),(21645,45085,0),(21646,45086,0),(21647,45107,0),(21648,45108,0),(21649,45109,0),(21650,45110,0),(21651,45111,0),(21652,45115,0),(21653,45117,0),(21654,45118,0),(21655,45119,0),(21656,45120,0),(21657,45123,0),(21658,45124,0),(21659,45128,0),(21660,45129,0),(21661,45130,0),(21662,45132,0),(21663,45134,0),(21664,45135,0),(21665,45136,0),(21666,45137,0),(21667,45138,0),(21668,45139,0),(21669,45140,0),(21670,45141,0),(21671,45142,0),(21672,45143,0),(21673,45146,0),(21674,45147,0),(21675,45149,0),(21676,45150,0),(21677,45151,0),(21678,45156,0),(21679,45159,0),(21680,45160,0),(21681,45161,0),(21682,45162,0),(21683,45163,0),(21684,45164,0),(21685,45165,0),(21686,45166,0),(21687,45167,0),(21688,45170,0),(21689,45171,0),(21690,45172,0),(21691,45173,0),(21692,45174,0),(21693,45175,0),(21694,45176,0),(21695,45177,0),(21696,45178,0),(21697,45179,0),(21698,45181,0),(21699,45182,0),(21700,45183,0),(21701,45184,0),(21702,45185,0),(21703,45186,0),(21704,45187,0),(21705,45203,0),(21706,45204,0),(21707,45205,0),(21708,45208,0),(21709,45209,0),(21710,45210,0),(21711,45211,0),(21712,45212,0),(21713,45214,0),(21714,45215,0),(21715,45216,0),(21716,45217,0),(21717,45218,0),(21718,45220,0),(21719,45221,0),(21720,45222,0),(21721,45224,0),(21722,45225,0),(21723,45226,0),(21724,45227,0),(21725,45228,0),(21726,45232,0),(21727,45233,0),(21728,45234,0),(21729,45237,0),(21730,45238,0),(21731,45239,0),(21732,45240,0),(21733,45241,0),(21734,45242,0),(21735,45244,0),(21736,45245,0),(21737,45246,0),(21738,45248,0),(21739,45249,0),(21740,45251,0),(21741,45252,0),(21742,45253,0),(21743,45256,0),(21744,45257,0),(21745,45258,0),(21746,45259,0),(21747,45260,0),(21748,45261,0),(21749,45264,0),(21750,45265,0),(21751,45266,0),(21752,45267,0),(21753,45268,0),(21754,45269,0),(21755,45271,0),(21756,45272,0),(21757,45273,0),(21758,45274,0),(21759,45275,0),(21760,45280,0),(21761,45282,0),(21762,45283,0),(21763,45284,0),(21764,45287,0),(21765,45288,0),(21766,45289,0),(21767,45291,0),(21768,45293,0),(21769,45294,0),(21770,45295,0),(21771,45296,0),(21772,45298,0),(21773,45299,0),(21774,45300,0),(21775,45301,0),(21776,45302,0),(21777,45304,0),(21778,45305,0),(21779,45306,0),(21780,45307,0),(21781,45309,0),(21782,45310,0),(21783,45311,0),(21784,45312,0),(21785,45314,0),(21786,45315,0),(21787,45316,0),(21788,45317,0),(21789,45318,0),(21790,45319,0),(21791,45320,0),(21792,45321,0),(21793,45322,0),(21794,45324,0),(21795,45325,0),(21796,45327,0),(21797,45329,0),(21798,45330,0),(21799,45331,0),(21800,45332,0),(21801,45333,0),(21802,45334,0),(21803,45335,0),(21804,45336,0),(21805,45337,0),(21806,45338,0),(21807,45339,0),(21808,45340,0),(21809,45341,0),(21810,45342,0),(21811,45343,0),(21812,45344,0),(21813,45345,0),(21814,45346,0),(21815,45347,0),(21816,45348,0),(21817,45349,0),(21818,45350,0),(21819,45351,0),(21820,45352,0),(21821,45353,0),(21822,45354,0),(21823,45355,0),(21824,45356,0),(21825,45357,0),(21826,45358,0),(21827,45359,0),(21828,45360,0),(21829,45361,0),(21830,45362,0),(21831,45363,0),(21832,45364,0),(21833,45365,0),(21834,45367,0),(21835,45368,0),(21836,45369,0),(21837,45370,0),(21838,45371,0),(21839,45372,0),(21840,45373,0),(21841,45374,0),(21842,45375,0),(21843,45376,0),(21844,45377,0),(21845,45378,0),(21846,45379,0),(21847,45380,0),(21848,45381,0),(21849,45382,0),(21850,45383,0),(21851,45384,0),(21852,45385,0),(21853,45386,0),(21854,45387,0),(21855,45388,0),(21856,45389,0),(21857,45390,0),(21858,45391,0),(21859,45392,0),(21860,45393,0),(21861,45394,0),(21862,45395,0),(21863,45396,0),(21864,45397,0),(21865,45398,0),(21866,45399,0),(21867,45400,0),(21868,45401,0),(21869,45402,0),(21870,45403,0),(21871,45404,0),(21872,45405,0),(21873,45406,0),(21874,45408,0),(21875,45409,0),(21876,45410,0),(21877,45411,0),(21878,45412,0),(21879,45413,0),(21880,45414,0),(21881,45415,0),(21882,45416,0),(21883,45417,0),(21884,45419,0),(21885,45420,0),(21886,45421,0),(21887,45422,0),(21888,45423,0),(21889,45424,0),(21890,45425,0),(21891,45426,0),(21892,45427,0),(21893,45428,0),(21894,45429,0),(21895,45430,0),(21896,45431,0),(21897,45432,0),(21898,45433,0),(21899,45434,0),(21900,45435,0),(21901,45437,0),(21902,45439,0),(21903,45440,0),(21904,45441,0),(21905,45442,0),(21906,45444,0),(21907,45445,0),(21908,45446,0),(21909,45448,0),(21910,45449,0),(21911,45450,0),(21912,45452,0),(21913,45453,0),(21914,45454,0),(21915,45455,0),(21916,45457,0),(21917,45458,0),(21918,45460,0),(21919,45461,0),(21920,45462,0),(21921,45463,0),(21922,45464,0),(21923,45467,0),(21924,45468,0),(21925,45470,0),(21926,45472,0),(21927,45473,0),(21928,45474,0),(21929,45475,0),(21930,45479,0),(21931,45481,0),(21932,45482,0),(21933,45483,0),(21934,45484,0),(21935,45486,0),(21936,45487,0),(21937,45488,0),(21938,45489,0),(21939,45491,0),(21940,45492,0),(21941,45493,0),(21942,45494,0),(21943,45496,0),(21944,45497,0),(21945,45498,0),(21946,45499,0),(21947,45501,0),(21948,45502,0),(21949,45504,0),(21950,45505,0),(21951,45508,0),(21952,45511,0),(21953,45512,0),(21954,45513,0),(21955,45514,0),(21956,45516,0),(21957,45519,0),(21958,45520,0),(21959,45521,0),(21960,45523,0),(21961,45524,0),(21962,45527,0),(21963,45528,0),(21964,45529,0),(21965,45531,0),(21966,45532,0),(21967,45533,0),(21968,45536,0),(21969,45537,0),(21970,45541,0),(21971,45542,0),(21972,45543,0),(21973,45544,0),(21974,45547,0),(21975,45548,0),(21976,45549,0),(21977,45550,0),(21978,45551,0),(21979,45552,0),(21980,45553,0),(21981,45554,0),(21982,45555,0),(21983,45556,0),(21984,45557,0),(21985,45558,0),(21986,45559,0),(21987,45560,0),(21988,45561,0),(21989,45562,0),(21990,45563,0),(21991,45564,0),(21992,45565,0),(21993,45566,0),(21994,45567,0),(21995,45570,0),(21996,45574,0),(21997,45575,0),(21998,45577,0),(21999,45578,0),(22000,45579,0),(22001,45580,0),(22002,45581,0),(22003,45582,0),(22004,45583,0),(22005,45584,0),(22006,45585,0),(22007,45587,0),(22008,45588,0),(22009,45594,0),(22010,45599,0),(22011,45605,0),(22012,45607,0),(22013,45610,0),(22014,45611,0),(22015,45612,0),(22016,45613,0),(22017,45615,0),(22018,45616,0),(22019,45617,0),(22020,45618,0),(22021,45619,0),(22022,45620,0),(22023,45626,0),(22024,45629,0),(22025,45630,0),(22026,45663,0),(22027,45664,0),(22028,45665,0),(22029,45666,0),(22030,45667,0),(22031,45668,0),(22032,45669,0),(22033,45670,0),(22034,45671,0),(22035,45672,0),(22036,45673,0),(22037,45674,0),(22038,45676,0),(22039,45677,0),(22040,45679,0),(22041,45680,0),(22042,45682,0),(22043,45685,0),(22044,45686,0),(22045,45687,0),(22046,45692,0),(22047,45694,0),(22048,45695,0),(22049,45697,0),(22050,45698,0),(22051,45700,0),(22052,45701,0),(22053,45704,0),(22054,45707,0),(22055,45708,0),(22056,45709,0),(22057,45711,0),(22058,45712,0),(22059,45713,0),(22060,45726,0),(22061,45727,0),(22062,45765,0),(22063,45810,0),(22064,45811,0),(22065,45824,0),(22066,45825,0),(22067,45826,0),(22068,45827,0),(22069,45828,0),(22070,45829,0),(22071,45830,0),(22072,45831,0),(22073,45832,0),(22074,45833,0),(22075,45834,0),(22076,45835,0),(22077,45836,0),(22078,45837,0),(22079,45838,0),(22080,45839,0),(22081,45840,0),(22082,45841,0),(22083,45842,0),(22084,45843,0),(22085,45844,0),(22086,45845,0),(22087,45846,0),(22088,45847,0),(22089,45848,0),(22090,45849,0),(22091,45856,0),(22092,45858,0),(22093,45860,0),(22094,45861,0),(22095,45864,0),(22096,45865,0),(22097,45867,0),(22098,45868,0),(22099,45869,0),(22100,45870,0),(22101,45872,0),(22102,45873,0),(22103,45876,0),(22104,45877,0),(22105,45884,0),(22106,45886,0),(22107,45887,0),(22108,45888,0),(22109,45892,0),(22110,45893,0),(22111,45894,0),(22112,45895,0),(22113,45899,0),(22114,45900,0),(22115,45918,0),(22116,45925,0),(22117,45926,0),(22118,45927,0),(22119,45928,0),(22120,45930,0),(22121,45934,0),(22122,45935,0),(22123,45936,0),(22124,45937,0),(22125,45938,0),(22126,45939,0),(22127,45940,0),(22128,45941,0),(22129,45943,0),(22130,45947,0),(22131,45948,0),(22132,45949,0),(22133,45950,0),(22134,45951,0),(22135,45952,0),(22136,45953,0),(22137,45954,0),(22138,45955,0),(22139,45956,0),(22140,45957,0),(22141,45958,0),(22142,45959,0),(22143,45960,0),(22144,45961,0),(22145,45962,0),(22146,45963,0),(22147,45964,0),(22148,45965,0),(22149,45966,0),(22150,45967,0),(22151,45968,0),(22152,45969,0),(22153,45970,0),(22154,45971,0),(22155,45972,0),(22156,45973,0),(22157,45974,0),(22158,45975,0),(22159,45976,0),(22160,45982,0),(22161,45983,0),(22162,45985,0),(22163,45988,0),(22164,45989,0),(22165,45990,0),(22166,45991,0),(22167,45992,0),(22168,45993,0),(22169,45996,0),(22170,45997,0),(22171,45998,0),(22172,46009,0),(22173,46011,0),(22174,46012,0),(22175,46013,0),(22176,46014,0),(22177,46016,0),(22178,46017,0),(22179,46018,0),(22180,46019,0),(22181,46020,0),(22182,46024,0),(22183,46025,0),(22184,46028,0),(22185,46030,0),(22186,46031,0),(22187,46032,0),(22188,46033,0),(22189,46034,0),(22190,46035,0),(22191,46036,0),(22192,46037,0),(22193,46039,0),(22194,46041,0),(22195,46042,0),(22196,46043,0),(22197,46044,0),(22198,46045,0),(22199,46049,0),(22200,46050,0),(22201,46057,0),(22202,46058,0),(22203,46059,0),(22204,46060,0),(22205,46061,0),(22206,46062,0),(22207,46063,0),(22208,46064,0),(22209,46065,0),(22210,46066,0),(22211,46067,0),(22212,46068,0),(22213,46069,0),(22214,46070,0),(22215,46071,0),(22216,46072,0),(22217,46073,0),(22218,46074,0),(22219,46075,0),(22220,46076,0),(22221,46077,0),(22222,46078,0),(22223,46079,0),(22224,46080,0),(22225,46089,0),(22226,46090,0),(22227,46092,0),(22228,46093,0),(22229,46095,0),(22230,46097,0),(22231,46103,0),(22232,46104,0),(22233,46105,0),(22234,46106,0),(22235,46107,0),(22236,46111,0),(22237,46112,0),(22238,46113,0),(22239,46115,0),(22240,46116,0),(22241,46117,0),(22242,46118,0),(22243,46119,0),(22244,46120,0),(22245,46121,0),(22246,46122,0),(22247,46123,0),(22248,46124,0),(22249,46125,0),(22250,46126,0),(22251,46127,0),(22252,46129,0),(22253,46130,0),(22254,46131,0),(22255,46132,0),(22256,46133,0),(22257,46134,0),(22258,46135,0),(22259,46136,0),(22260,46137,0),(22261,46139,0),(22262,46140,0),(22263,46141,0),(22264,46142,0),(22265,46143,0),(22266,46144,0),(22267,46145,0),(22268,46146,0),(22269,46148,0),(22270,46149,0),(22271,46150,0),(22272,46151,0),(22273,46152,0),(22274,46153,0),(22275,46154,0),(22276,46155,0),(22277,46156,0),(22278,46157,0),(22279,46158,0),(22280,46159,0),(22281,46160,0),(22282,46161,0),(22283,46162,0),(22284,46163,0),(22285,46164,0),(22286,46165,0),(22287,46166,0),(22288,46167,0),(22289,46168,0),(22290,46169,0),(22291,46170,0),(22292,46172,0),(22293,46173,0),(22294,46174,0),(22295,46175,0),(22296,46176,0),(22297,46177,0),(22298,46178,0),(22299,46179,0),(22300,46180,0),(22301,46181,0),(22302,46182,0),(22303,46183,0),(22304,46184,0),(22305,46185,0),(22306,46186,0),(22307,46187,0),(22308,46188,0),(22309,46189,0),(22310,46190,0),(22311,46191,0),(22312,46192,0),(22313,46193,0),(22314,46194,0),(22315,46195,0),(22316,46196,0),(22317,46197,0),(22318,46198,0),(22319,46199,0),(22320,46200,0),(22321,46201,0),(22322,46202,0),(22323,46203,0),(22324,46204,0),(22325,46205,0),(22326,46206,0),(22327,46207,0),(22328,46208,0),(22329,46209,0),(22330,46210,0),(22331,46211,0),(22332,46212,0),(22333,46213,0),(22334,46214,0),(22335,46215,0),(22336,46216,0),(22337,46217,0),(22338,46218,0),(22339,46219,0),(22340,46220,0),(22341,46221,0),(22342,46222,0),(22343,46223,0),(22344,46224,0),(22345,46225,0),(22346,46226,0),(22347,46227,0),(22348,46228,0),(22349,46230,0),(22350,46231,0),(22351,46232,0),(22352,46233,0),(22353,46234,0),(22354,46235,0),(22355,46236,0),(22356,46237,0),(22357,46238,0),(22358,46239,0),(22359,46240,0),(22360,46241,0),(22361,46242,0),(22362,46243,0),(22363,46244,0),(22364,46245,0),(22365,46246,0),(22366,46247,0),(22367,46248,0),(22368,46249,0),(22369,46250,0),(22370,46251,0),(22371,46252,0),(22372,46253,0),(22373,46254,0),(22374,46255,0),(22375,46256,0),(22376,46257,0),(22377,46258,0),(22378,46259,0),(22379,46260,0),(22380,46261,0),(22381,46262,0),(22382,46263,0),(22383,46264,0),(22384,46265,0),(22385,46266,0),(22386,46267,0),(22387,46268,0),(22388,46269,0),(22389,46270,0),(22390,46271,0),(22391,46272,0),(22392,46273,0),(22393,46274,0),(22394,46275,0),(22395,46276,0),(22396,46277,0),(22397,46278,0),(22398,46279,0),(22399,46280,0),(22400,46281,0),(22401,46282,0),(22402,46283,0),(22403,46284,0),(22404,46285,0),(22405,46286,0),(22406,46287,0),(22407,46288,0),(22408,46289,0),(22409,46290,0),(22410,46291,0),(22411,46292,0),(22412,46293,0),(22413,46294,0),(22414,46295,0),(22415,46296,0),(22416,46297,0),(22417,46298,0),(22418,46299,0),(22419,46300,0),(22420,46301,0),(22421,46302,0),(22422,46303,0),(22423,46304,0),(22424,46305,0),(22425,46306,0),(22426,46307,0),(22427,46309,0),(22428,46313,0),(22429,46320,0),(22430,46321,0),(22431,46326,0),(22432,46327,0),(22433,46328,0),(22434,46329,0),(22435,46330,0),(22436,46331,0),(22437,46332,0),(22438,46333,0),(22439,46334,0),(22440,46335,0),(22441,46337,0),(22442,46338,0),(22443,46339,0),(22444,46340,0),(22445,46341,0),(22446,46342,0),(22447,46344,0),(22448,46345,0),(22449,46346,0),(22450,46347,0),(22451,46349,0),(22452,46350,0),(22453,46351,0),(22454,46371,0),(22455,46383,0),(22456,46393,0),(22457,46394,0),(22458,46723,0),(22459,46733,0),(22460,46735,0),(22461,46736,0),(22462,46737,0),(22463,46738,0),(22464,46800,0),(22465,46817,0),(22466,46818,0),(22467,46824,0),(22468,46837,0),(22469,46841,0),(22470,46854,0),(22471,46860,0),(22472,46861,0),(22473,46874,0),(22474,46957,0),(22475,46958,0),(22476,46960,0),(22477,46961,0),(22478,46962,0),(22479,46963,0),(22480,46964,0),(22481,46965,0),(22482,46967,0),(22483,46968,0),(22484,46969,0),(22485,46970,0),(22486,46971,0),(22487,46972,0),(22488,46973,0),(22489,46974,0),(22490,46975,0),(22491,46976,0),(22492,46977,0),(22493,46979,0),(22494,46980,0),(22495,46981,0),(22496,46982,0),(22497,46983,0),(22498,46984,0),(22499,46985,0),(22500,46986,0),(22501,46987,0),(22502,46988,0),(22503,46989,0),(22504,46990,0),(22505,46991,0),(22506,46992,0),(22507,46993,0),(22508,46994,0),(22509,46995,0),(22510,46996,0),(22511,46997,0),(22512,46998,0),(22513,46999,0),(22514,47000,0),(22515,47001,0),(22516,47002,0),(22517,47003,0),(22518,47004,0),(22519,47005,0),(22520,47013,0),(22521,47014,0),(22522,47031,0),(22523,47032,0),(22524,47034,0),(22525,47042,0),(22526,47051,0),(22527,47052,0),(22528,47053,0),(22529,47055,0),(22530,47056,0),(22531,47057,0),(22532,47058,0),(22533,47061,0),(22534,47062,0),(22535,47063,0),(22536,47064,0),(22537,47066,0),(22538,47067,0),(22539,47068,0),(22540,47069,0),(22541,47071,0),(22542,47072,0),(22543,47073,0),(22544,47074,0),(22545,47076,0),(22546,47077,0),(22547,47078,0),(22548,47079,0),(22549,47081,0),(22550,47082,0),(22551,47083,0),(22552,47084,0),(22553,47085,0),(22554,47086,0),(22555,47087,0),(22556,47089,0),(22557,47090,0),(22558,47091,0),(22559,47092,0),(22560,47093,0),(22561,47094,0),(22562,47095,0),(22563,47096,0),(22564,47097,0),(22565,47098,0),(22566,47099,0),(22567,47102,0),(22568,47103,0),(22569,47104,0),(22570,47106,0),(22571,47107,0),(22572,47108,0),(22573,47109,0),(22574,47111,0),(22575,47112,0),(22576,47113,0),(22577,47114,0),(22578,47121,0),(22579,47126,0),(22580,47129,0),(22581,47130,0),(22582,47132,0),(22583,47138,0),(22584,47140,0),(22585,47141,0),(22586,47142,0),(22587,47143,0),(22588,47145,0),(22589,47146,0),(22590,47147,0),(22591,47148,0),(22592,47150,0),(22593,47151,0),(22594,47152,0),(22595,47153,0),(22596,47154,0),(22597,47155,0),(22598,47156,0),(22599,47163,0),(22600,47164,0),(22601,47165,0),(22602,47166,0),(22603,47169,0),(22604,47170,0),(22605,47171,0),(22606,47172,0),(22607,47173,0),(22608,47174,0),(22609,47175,0),(22610,47176,0),(22611,47177,0),(22612,47178,0),(22613,47181,0),(22614,47183,0),(22615,47184,0),(22616,47185,0),(22617,47186,0),(22618,47187,0),(22619,47189,0),(22620,47190,0),(22621,47191,0),(22622,47192,0),(22623,47193,0),(22624,47194,0),(22625,47195,0),(22626,47197,0),(22627,47199,0),(22628,47201,0),(22629,47202,0),(22630,47203,0),(22631,47204,0),(22632,47205,0),(22633,47206,0),(22634,47207,0),(22635,47208,0),(22636,47209,0),(22637,47210,0),(22638,47211,0),(22639,47212,0),(22640,47217,0),(22641,47218,0),(22642,47220,0),(22643,47221,0),(22644,47225,0),(22645,47226,0),(22646,47227,0),(22647,47228,0),(22648,47229,0),(22649,47230,0),(22650,47231,0),(22651,47232,0),(22652,47233,0),(22653,47234,0),(22654,47235,0),(22655,47236,0),(22656,47238,0),(22657,47239,0),(22658,47240,0),(22659,47244,0),(22660,47245,0),(22661,47248,0),(22662,47249,0),(22663,47250,0),(22664,47251,0),(22665,47253,0),(22666,47254,0),(22667,47255,0),(22668,47256,0),(22669,47257,0),(22670,47258,0),(22671,47259,0),(22672,47260,0),(22673,47261,0),(22674,47262,0),(22675,47263,0),(22676,47264,0),(22677,47265,0),(22678,47266,0),(22679,47267,0),(22680,47268,0),(22681,47269,0),(22682,47270,0),(22683,47273,0),(22684,47274,0),(22685,47275,0),(22686,47276,0),(22687,47277,0),(22688,47279,0),(22689,47280,0),(22690,47281,0),(22691,47283,0),(22692,47284,0),(22693,47285,0),(22694,47286,0),(22695,47287,0),(22696,47288,0),(22697,47289,0),(22698,47291,0),(22699,47292,0),(22700,47293,0),(22701,47294,0),(22702,47295,0),(22703,47296,0),(22704,47298,0),(22705,47299,0),(22706,47300,0),(22707,47301,0),(22708,47302,0),(22709,47304,0),(22710,47306,0),(22711,47308,0),(22712,47309,0),(22713,47310,0),(22714,47311,0),(22715,47312,0),(22716,47313,0),(22717,47314,0),(22718,47317,0),(22719,47318,0),(22720,47319,0),(22721,47320,0),(22722,47321,0),(22723,47322,0),(22724,47323,0),(22725,47324,0),(22726,47325,0),(22727,47326,0),(22728,47328,0),(22729,47329,0),(22730,47330,0),(22731,47412,0),(22732,47414,0),(22733,47415,0),(22734,47416,0),(22735,47417,0),(22736,47418,0),(22737,47419,0),(22738,47420,0),(22739,47421,0),(22740,47422,0),(22741,47423,0),(22742,47424,0),(22743,47425,0),(22744,47426,0),(22745,47427,0),(22746,47428,0),(22747,47429,0),(22748,47430,0),(22749,47431,0),(22750,47434,0),(22751,47435,0),(22752,47436,0),(22753,47437,0),(22754,47438,0),(22755,47440,0),(22756,47441,0),(22757,47442,0),(22758,47444,0),(22759,47445,0),(22760,47446,0),(22761,47447,0),(22762,47448,0),(22763,47449,0),(22764,47450,0),(22765,47452,0),(22766,47453,0),(22767,47454,0),(22768,47455,0),(22769,47456,0),(22770,47457,0),(22771,47459,0),(22772,47460,0),(22773,47461,0),(22774,47462,0),(22775,47463,0),(22776,47465,0),(22777,47467,0),(22778,47469,0),(22779,47470,0),(22780,47471,0),(22781,47472,0),(22782,47473,0),(22783,47474,0),(22784,47475,0),(22785,47478,0),(22786,47479,0),(22787,47480,0),(22788,47481,0),(22789,47482,0),(22790,47483,0),(22791,47484,0),(22792,47485,0),(22793,47486,0),(22794,47487,0),(22795,47490,0),(22796,47491,0),(22797,47492,0),(22798,47493,0),(22799,47495,0),(22800,47496,0),(22801,47497,0),(22802,47498,0),(22803,47500,0),(22804,47501,0),(22805,47502,0),(22806,47503,0),(22807,47504,0),(22808,47505,0),(22809,47506,0),(22810,47508,0),(22811,47509,0),(22812,47510,0),(22813,47511,0),(22814,47513,0),(22815,47514,0),(22816,47515,0),(22817,47516,0),(22818,47517,0),(22819,47518,0),(22820,47519,0),(22821,47520,0),(22822,47521,0),(22823,47522,0),(22824,47523,0),(22825,47524,0),(22826,47525,0),(22827,47526,0),(22828,47527,0),(22829,47528,0),(22830,47529,0),(22831,47542,0),(22832,47543,0),(22833,47544,0),(22834,47545,0),(22835,47546,0),(22836,47547,0),(22837,47548,0),(22838,47549,0),(22839,47550,0),(22840,47551,0),(22841,47552,0),(22842,47553,0),(22843,47554,0),(22844,47560,0),(22845,47561,0),(22846,47563,0),(22847,47564,0),(22848,47565,0),(22849,47567,0),(22850,47568,0),(22851,47569,0),(22852,47570,0),(22853,47571,0),(22854,47572,0),(22855,47573,0),(22856,47574,0),(22857,47575,0),(22858,47576,0),(22859,47577,0),(22860,47579,0),(22861,47580,0),(22862,47581,0),(22863,47582,0),(22864,47583,0),(22865,47584,0),(22866,47585,0),(22867,47586,0),(22868,47587,0),(22869,47588,0),(22870,47589,0),(22871,47590,0),(22872,47591,0),(22873,47592,0),(22874,47593,0),(22875,47594,0),(22876,47595,0),(22877,47596,0),(22878,47597,0),(22879,47598,0),(22880,47599,0),(22881,47600,0),(22882,47601,0),(22883,47602,0),(22884,47603,0),(22885,47604,0),(22886,47605,0),(22887,47606,0),(22888,47608,0),(22889,47609,0),(22890,47610,0),(22891,47611,0),(22892,47612,0),(22893,47613,0),(22894,47614,0),(22895,47615,0),(22896,47616,0),(22897,47617,0),(22898,47620,0),(22899,47621,0),(22900,47658,0),(22901,47659,0),(22902,47660,0),(22903,47663,0),(22904,47669,0),(22905,47674,0),(22906,47675,0),(22907,47676,0),(22908,47677,0),(22909,47678,0),(22910,47680,0),(22911,47681,0),(22912,47682,0),(22913,47683,0),(22914,47684,0),(22915,47685,0),(22916,47686,0),(22917,47687,0),(22918,47688,0),(22919,47689,0),(22920,47690,0),(22921,47691,0),(22922,47692,0),(22923,47693,0),(22924,47694,0),(22925,47695,0),(22926,47696,0),(22927,47697,0),(22928,47698,0),(22929,47699,0),(22930,47701,0),(22931,47702,0),(22932,47704,0),(22933,47705,0),(22934,47706,0),(22935,47707,0),(22936,47708,0),(22937,47709,0),(22938,47710,0),(22939,47711,0),(22940,47712,0),(22941,47713,0),(22942,47714,0),(22943,47715,0),(22944,47716,0),(22945,47717,0),(22946,47718,0),(22947,47719,0),(22948,47720,0),(22949,47721,0),(22950,47723,0),(22951,47724,0),(22952,47736,0),(22953,47737,0),(22954,47738,0),(22955,47739,0),(22956,47740,0),(22957,47741,0),(22958,47742,0),(22959,47743,0),(22960,47744,0),(22961,47745,0),(22962,47746,0),(22963,47748,0),(22964,47749,0),(22965,47750,0),(22966,47751,0),(22967,47752,0),(22968,47753,0),(22969,47754,0),(22970,47755,0),(22971,47756,0),(22972,47757,0),(22973,47758,0),(22974,47759,0),(22975,47760,0),(22976,47761,0),(22977,47762,0),(22978,47763,0),(22979,47764,0),(22980,47765,0),(22981,47766,0),(22982,47767,0),(22983,47768,0),(22984,47769,0),(22985,47770,0),(22986,47771,0),(22987,47772,0),(22988,47773,0),(22989,47774,0),(22990,47775,0),(22991,47776,0),(22992,47777,0),(22993,47778,0),(22994,47779,0),(22995,47780,0),(22996,47781,0),(22997,47782,0),(22998,47783,0),(22999,47784,0),(23000,47785,0),(23001,47786,0),(23002,47787,0),(23003,47788,0),(23004,47789,0),(23005,47790,0),(23006,47791,0),(23007,47792,0),(23008,47793,0),(23009,47794,0),(23010,47795,0),(23011,47796,0),(23012,47797,0),(23013,47798,0),(23014,47799,0),(23015,47800,0),(23016,47801,0),(23017,47802,0),(23018,47803,0),(23019,47804,0),(23020,47805,0),(23021,47806,0),(23022,47807,0),(23023,47808,0),(23024,47809,0),(23025,47810,0),(23026,47811,0),(23027,47812,0),(23028,47813,0),(23029,47814,0),(23030,47815,0),(23031,47816,0),(23032,47829,0),(23033,47830,0),(23034,47832,0),(23035,47834,0),(23036,47835,0),(23037,47836,0),(23038,47837,0),(23039,47838,0),(23040,47844,0),(23041,47846,0),(23042,47850,0),(23043,47851,0),(23044,47852,0),(23045,47853,0),(23046,47855,0),(23047,47856,0),(23048,47857,0),(23049,47858,0),(23050,47859,0),(23051,47860,0),(23052,47861,0),(23053,47863,0),(23054,47865,0),(23055,47866,0),(23056,47867,0),(23057,47869,0),(23058,47870,0),(23059,47871,0),(23060,47873,0),(23061,47874,0),(23062,47875,0),(23063,47876,0),(23064,47877,0),(23065,47878,0),(23066,47883,0),(23067,47884,0),(23068,47885,0),(23069,47886,0),(23070,47887,0),(23071,47889,0),(23072,47891,0),(23073,47892,0),(23074,47893,0),(23075,47894,0),(23076,47895,0),(23077,47896,0),(23078,47897,0),(23079,47898,0),(23080,47899,0),(23081,47900,0),(23082,47901,0),(23083,47902,0),(23084,47903,0),(23085,47904,0),(23086,47905,0),(23087,47906,0),(23088,47907,0),(23089,47908,0),(23090,47909,0),(23091,47910,0),(23092,47911,0),(23093,47913,0),(23094,47914,0),(23095,47916,0),(23096,47917,0),(23097,47918,0),(23098,47919,0),(23099,47921,0),(23100,47922,0),(23101,47923,0),(23102,47924,0),(23103,47925,0),(23104,47926,0),(23105,47927,0),(23106,47929,0),(23107,47931,0),(23108,47932,0),(23109,47933,0),(23110,47935,0),(23111,47936,0),(23112,47937,0),(23113,47938,0),(23114,47940,0),(23115,47941,0),(23116,47942,0),(23117,47943,0),(23118,47944,0),(23119,47945,0),(23120,47950,0),(23121,47951,0),(23122,47952,0),(23123,47953,0),(23124,47954,0),(23125,47956,0),(23126,47958,0),(23127,47959,0),(23128,47960,0),(23129,47961,0),(23130,47962,0),(23131,47963,0),(23132,47964,0),(23133,47965,0),(23134,47966,0),(23135,47967,0),(23136,47968,0),(23137,47969,0),(23138,47970,0),(23139,47971,0),(23140,47972,0),(23141,47973,0),(23142,47974,0),(23143,47975,0),(23144,47976,0),(23145,47977,0),(23146,47978,0),(23147,47979,0),(23148,47980,0),(23149,47981,0),(23150,47982,0),(23151,47983,0),(23152,47984,0),(23153,47985,0),(23154,47986,0),(23155,47987,0),(23156,47989,0),(23157,47990,0),(23158,47991,0),(23159,47992,0),(23160,47994,0),(23161,47995,0),(23162,47996,0),(23163,47997,0),(23164,47998,0),(23165,47999,0),(23166,48000,0),(23167,48002,0),(23168,48004,0),(23169,48005,0),(23170,48006,0),(23171,48008,0),(23172,48009,0),(23173,48010,0),(23174,48012,0),(23175,48013,0),(23176,48014,0),(23177,48015,0),(23178,48016,0),(23179,48017,0),(23180,48022,0),(23181,48023,0),(23182,48024,0),(23183,48025,0),(23184,48026,0),(23185,48028,0),(23186,48029,0),(23187,48031,0),(23188,48032,0),(23189,48033,0),(23190,48034,0),(23191,48035,0),(23192,48036,0),(23193,48037,0),(23194,48038,0),(23195,48039,0),(23196,48040,0),(23197,48041,0),(23198,48042,0),(23199,48043,0),(23200,48044,0),(23201,48045,0),(23202,48046,0),(23203,48047,0),(23204,48048,0),(23205,48049,0),(23206,48050,0),(23207,48051,0),(23208,48052,0),(23209,48053,0),(23210,48054,0),(23211,48055,0),(23212,48056,0),(23213,48057,0),(23214,48058,0),(23215,48059,0),(23216,48060,0),(23217,48061,0),(23218,48062,0),(23219,48063,0),(23220,48064,0),(23221,48065,0),(23222,48066,0),(23223,48067,0),(23224,48068,0),(23225,48069,0),(23226,48070,0),(23227,48071,0),(23228,48072,0),(23229,48073,0),(23230,48074,0),(23231,48075,0),(23232,48076,0),(23233,48077,0),(23234,48078,0),(23235,48079,0),(23236,48080,0),(23237,48081,0),(23238,48082,0),(23239,48083,0),(23240,48084,0),(23241,48085,0),(23242,48086,0),(23243,48087,0),(23244,48088,0),(23245,48089,0),(23246,48090,0),(23247,48091,0),(23248,48092,0),(23249,48093,0),(23250,48094,0),(23251,48095,0),(23252,48096,0),(23253,48097,0),(23254,48098,0),(23255,48099,0),(23256,48100,0),(23257,48101,0),(23258,48102,0),(23259,48129,0),(23260,48130,0),(23261,48131,0),(23262,48132,0),(23263,48133,0),(23264,48134,0),(23265,48135,0),(23266,48136,0),(23267,48137,0),(23268,48138,0),(23269,48139,0),(23270,48140,0),(23271,48141,0),(23272,48142,0),(23273,48143,0),(23274,48144,0),(23275,48145,0),(23276,48146,0),(23277,48147,0),(23278,48148,0),(23279,48149,0),(23280,48150,0),(23281,48151,0),(23282,48152,0),(23283,48153,0),(23284,48154,0),(23285,48155,0),(23286,48156,0),(23287,48157,0),(23288,48158,0),(23289,48159,0),(23290,48160,0),(23291,48161,0),(23292,48162,0),(23293,48163,0),(23294,48164,0),(23295,48165,0),(23296,48166,0),(23297,48167,0),(23298,48168,0),(23299,48169,0),(23300,48170,0),(23301,48171,0),(23302,48172,0),(23303,48173,0),(23304,48174,0),(23305,48175,0),(23306,48176,0),(23307,48177,0),(23308,48178,0),(23309,48179,0),(23310,48180,0),(23311,48181,0),(23312,48182,0),(23313,48183,0),(23314,48184,0),(23315,48185,0),(23316,48186,0),(23317,48187,0),(23318,48188,0),(23319,48189,0),(23320,48190,0),(23321,48191,0),(23322,48192,0),(23323,48193,0),(23324,48194,0),(23325,48195,0),(23326,48196,0),(23327,48197,0),(23328,48198,0),(23329,48199,0),(23330,48200,0),(23331,48201,0),(23332,48202,0),(23333,48203,0),(23334,48204,0),(23335,48205,0),(23336,48206,0),(23337,48207,0),(23338,48208,0),(23339,48209,0),(23340,48210,0),(23341,48211,0),(23342,48212,0),(23343,48213,0),(23344,48214,0),(23345,48215,0),(23346,48216,0),(23347,48217,0),(23348,48218,0),(23349,48219,0),(23350,48220,0),(23351,48221,0),(23352,48222,0),(23353,48223,0),(23354,48224,0),(23355,48225,0),(23356,48226,0),(23357,48227,0),(23358,48228,0),(23359,48229,0),(23360,48230,0),(23361,48231,0),(23362,48232,0),(23363,48233,0),(23364,48234,0),(23365,48235,0),(23366,48236,0),(23367,48237,0),(23368,48238,0),(23369,48239,0),(23370,48240,0),(23371,48241,0),(23372,48242,0),(23373,48243,0),(23374,48244,0),(23375,48245,0),(23376,48246,0),(23377,48247,0),(23378,48250,0),(23379,48251,0),(23380,48252,0),(23381,48253,0),(23382,48254,0),(23383,48255,0),(23384,48256,0),(23385,48257,0),(23386,48258,0),(23387,48259,0),(23388,48260,0),(23389,48261,0),(23390,48262,0),(23391,48263,0),(23392,48264,0),(23393,48265,0),(23394,48266,0),(23395,48267,0),(23396,48268,0),(23397,48269,0),(23398,48270,0),(23399,48271,0),(23400,48272,0),(23401,48273,0),(23402,48274,0),(23403,48275,0),(23404,48276,0),(23405,48277,0),(23406,48278,0),(23407,48279,0),(23408,48280,0),(23409,48281,0),(23410,48282,0),(23411,48283,0),(23412,48284,0),(23413,48285,0),(23414,48286,0),(23415,48287,0),(23416,48288,0),(23417,48289,0),(23418,48290,0),(23419,48291,0),(23420,48292,0),(23421,48293,0),(23422,48294,0),(23423,48295,0),(23424,48296,0),(23425,48297,0),(23426,48298,0),(23427,48299,0),(23428,48300,0),(23429,48301,0),(23430,48302,0),(23431,48303,0),(23432,48304,0),(23433,48305,0),(23434,48306,0),(23435,48307,0),(23436,48308,0),(23437,48309,0),(23438,48310,0),(23439,48312,0),(23440,48313,0),(23441,48314,0),(23442,48315,0),(23443,48316,0),(23444,48317,0),(23445,48318,0),(23446,48319,0),(23447,48320,0),(23448,48321,0),(23449,48322,0),(23450,48323,0),(23451,48324,0),(23452,48325,0),(23453,48326,0),(23454,48327,0),(23455,48328,0),(23456,48329,0),(23457,48330,0),(23458,48331,0),(23459,48332,0),(23460,48333,0),(23461,48334,0),(23462,48335,0),(23463,48336,0),(23464,48337,0),(23465,48338,0),(23466,48339,0),(23467,48340,0),(23468,48341,0),(23469,48342,0),(23470,48343,0),(23471,48344,0),(23472,48345,0),(23473,48346,0),(23474,48347,0),(23475,48348,0),(23476,48349,0),(23477,48350,0),(23478,48351,0),(23479,48352,0),(23480,48353,0),(23481,48354,0),(23482,48355,0),(23483,48356,0),(23484,48357,0),(23485,48358,0),(23486,48359,0),(23487,48360,0),(23488,48361,0),(23489,48362,0),(23490,48363,0),(23491,48364,0),(23492,48365,0),(23493,48366,0),(23494,48367,0),(23495,48368,0),(23496,48369,0),(23497,48370,0),(23498,48371,0),(23499,48372,0),(23500,48373,0),(23501,48374,0),(23502,48375,0),(23503,48376,0),(23504,48377,0),(23505,48378,0),(23506,48379,0),(23507,48380,0),(23508,48381,0),(23509,48382,0),(23510,48383,0),(23511,48384,0),(23512,48385,0),(23513,48386,0),(23514,48387,0),(23515,48388,0),(23516,48389,0),(23517,48390,0),(23518,48391,0),(23519,48392,0),(23520,48393,0),(23521,48394,0),(23522,48395,0),(23523,48396,0),(23524,48397,0),(23525,48398,0),(23526,48399,0),(23527,48400,0),(23528,48402,0),(23529,48404,0),(23530,48406,0),(23531,48408,0),(23532,48410,0),(23533,48412,0),(23534,48414,0),(23535,48420,0),(23536,48422,0),(23537,48424,0),(23538,48426,0),(23539,48428,0),(23540,48429,0),(23541,48430,0),(23542,48432,0),(23543,48433,0),(23544,48435,0),(23545,48436,0),(23546,48438,0),(23547,48440,0),(23548,48442,0),(23549,48444,0),(23550,48445,0),(23551,48446,0),(23552,48447,0),(23553,48448,0),(23554,48449,0),(23555,48450,0),(23556,48451,0),(23557,48452,0),(23558,48453,0),(23559,48454,0),(23560,48455,0),(23561,48456,0),(23562,48457,0),(23563,48458,0),(23564,48459,0),(23565,48460,0),(23566,48461,0),(23567,48462,0),(23568,48463,0),(23569,48464,0),(23570,48465,0),(23571,48466,0),(23572,48467,0),(23573,48468,0),(23574,48469,0),(23575,48470,0),(23576,48472,0),(23577,48474,0),(23578,48476,0),(23579,48478,0),(23580,48480,0),(23581,48481,0),(23582,48482,0),(23583,48483,0),(23584,48484,0),(23585,48485,0),(23586,48486,0),(23587,48487,0),(23588,48488,0),(23589,48489,0),(23590,48490,0),(23591,48491,0),(23592,48492,0),(23593,48493,0),(23594,48494,0),(23595,48495,0),(23596,48496,0),(23597,48497,0),(23598,48498,0),(23599,48499,0),(23600,48500,0),(23601,48501,0),(23602,48502,0),(23603,48503,0),(23604,48504,0),(23605,48505,0),(23606,48507,0),(23607,48509,0),(23608,48511,0),(23609,48513,0),(23610,48515,0),(23611,48517,0),(23612,48519,0),(23613,48521,0),(23614,48523,0),(23615,48529,0),(23616,48531,0),(23617,48533,0),(23618,48535,0),(23619,48537,0),(23620,48538,0),(23621,48539,0),(23622,48540,0),(23623,48541,0),(23624,48542,0),(23625,48543,0),(23626,48544,0),(23627,48545,0),(23628,48546,0),(23629,48547,0),(23630,48548,0),(23631,48549,0),(23632,48550,0),(23633,48551,0),(23634,48552,0),(23635,48553,0),(23636,48554,0),(23637,48555,0),(23638,48556,0),(23639,48557,0),(23640,48558,0),(23641,48559,0),(23642,48560,0),(23643,48561,0),(23644,48562,0),(23645,48564,0),(23646,48566,0),(23647,48568,0),(23648,48572,0),(23649,48574,0),(23650,48575,0),(23651,48576,0),(23652,48577,0),(23653,48578,0),(23654,48579,0),(23655,48580,0),(23656,48581,0),(23657,48582,0),(23658,48583,0),(23659,48584,0),(23660,48585,0),(23661,48586,0),(23662,48587,0),(23663,48588,0),(23664,48589,0),(23665,48590,0),(23666,48591,0),(23667,48592,0),(23668,48593,0),(23669,48594,0),(23670,48595,0),(23671,48596,0),(23672,48597,0),(23673,48598,0),(23674,48599,0),(23675,48602,0),(23676,48603,0),(23677,48604,0),(23678,48605,0),(23679,48606,0),(23680,48607,0),(23681,48608,0),(23682,48609,0),(23683,48610,0),(23684,48611,0),(23685,48612,0),(23686,48613,0),(23687,48614,0),(23688,48615,0),(23689,48616,0),(23690,48617,0),(23691,48618,0),(23692,48619,0),(23693,48620,0),(23694,48621,0),(23695,48622,0),(23696,48623,0),(23697,48624,0),(23698,48625,0),(23699,48626,0),(23700,48627,0),(23701,48628,0),(23702,48629,0),(23703,48630,0),(23704,48631,0),(23705,48632,0),(23706,48633,0),(23707,48634,0),(23708,48635,0),(23709,48636,0),(23710,48637,0),(23711,48638,0),(23712,48639,0),(23713,48640,0),(23714,48641,0),(23715,48642,0),(23716,48643,0),(23717,48644,0),(23718,48645,0),(23719,48646,0),(23720,48647,0),(23721,48648,0),(23722,48649,0),(23723,48650,0),(23724,48651,0),(23725,48652,0),(23726,48653,0),(23727,48654,0),(23728,48655,0),(23729,48656,0),(23730,48657,0),(23731,48658,0),(23732,48659,0),(23733,48660,0),(23734,48661,0),(23735,48663,0),(23736,48666,0),(23737,48667,0),(23738,48668,0),(23739,48669,0),(23740,48670,0),(23741,48671,0),(23742,48672,0),(23743,48673,0),(23744,48674,0),(23745,48675,0),(23746,48677,0),(23747,48683,0),(23748,48685,0),(23749,48687,0),(23750,48689,0),(23751,48691,0),(23752,48693,0),(23753,48695,0),(23754,48697,0),(23755,48699,0),(23756,48701,0),(23757,48703,0),(23758,48705,0),(23759,48708,0),(23760,48709,0),(23761,48710,0),(23762,48711,0),(23763,48712,0),(23764,48713,0),(23765,48714,0),(23766,48716,0),(23767,48718,0),(23768,48725,0),(23769,48726,0),(23770,48727,0),(23771,48728,0),(23772,48729,0),(23773,48730,0),(23774,48731,0),(23775,48732,0),(23776,48733,0),(23777,48734,0),(23778,48735,0),(23779,48736,0),(23780,48737,0),(23781,48738,0),(23782,48739,0),(23783,48740,0),(23784,48741,0),(23785,48742,0),(23786,48743,0),(23787,48744,0),(23788,48745,0),(23789,48746,0),(23790,48747,0),(23791,48748,0),(23792,48749,0),(23793,48750,0),(23794,48751,0),(23795,48752,0),(23796,48753,0),(23797,48754,0),(23798,48755,0),(23799,48756,0),(23800,48757,0),(23801,48758,0),(23802,48759,0),(23803,48760,0),(23804,48761,0),(23805,48762,0),(23806,48763,0),(23807,48764,0),(23808,48769,0),(23809,48770,0),(23810,48771,0),(23811,48772,0),(23812,48773,0),(23813,48774,0),(23814,48775,0),(23815,48776,0),(23816,48777,0),(23817,48778,0),(23818,48781,0),(23819,48782,0),(23820,48783,0),(23821,48784,0),(23822,48785,0),(23823,48786,0),(23824,48787,0),(23825,48788,0),(23826,48789,0),(23827,48790,0),(23828,48794,0),(23829,48795,0),(23830,48796,0),(23831,48797,0),(23832,48798,0),(23833,48799,0),(23834,48800,0),(23835,48801,0),(23836,48802,0),(23837,48803,0),(23838,48804,0),(23839,48805,0),(23840,48806,0),(23841,48807,0),(23842,48808,0),(23843,48809,0),(23844,48810,0),(23845,48811,0),(23846,48812,0),(23847,48813,0),(23848,48814,0),(23849,48815,0),(23850,48816,0),(23851,48817,0),(23852,48818,0),(23853,48819,0),(23854,48820,0),(23855,48821,0),(23856,48822,0),(23857,48823,0),(23858,48824,0),(23859,48825,0),(23860,48826,0),(23861,48827,0),(23862,48828,0),(23863,48829,0),(23864,48830,0),(23865,48831,0),(23866,48832,0),(23867,48833,0),(23868,48836,0),(23869,48837,0),(23870,48838,0),(23871,48839,0),(23872,48840,0),(23873,48841,0),(23874,48842,0),(23875,48843,0),(23876,48844,0),(23877,48845,0),(23878,48846,0),(23879,48847,0),(23880,48848,0),(23881,48849,0),(23882,48850,0),(23883,48851,0),(23884,48852,0),(23885,48853,0),(23886,48854,0),(23887,48855,0),(23888,48860,0),(23889,48861,0),(23890,48862,0),(23891,48863,0),(23892,48864,0),(23893,48865,0),(23894,48866,0),(23895,48867,0),(23896,48868,0),(23897,48869,0),(23898,48870,0),(23899,48871,0),(23900,48872,0),(23901,48873,0),(23902,48874,0),(23903,48875,0),(23904,48876,0),(23905,48877,0),(23906,48878,0),(23907,48879,0),(23908,48880,0),(23909,48881,0),(23910,48882,0),(23911,48883,0),(23912,48884,0),(23913,48885,0),(23914,48886,0),(23915,48887,0),(23916,48888,0),(23917,48889,0),(23918,48890,0),(23919,48891,0),(23920,48892,0),(23921,48893,0),(23922,48894,0),(23923,48895,0),(23924,48896,0),(23925,48897,0),(23926,48898,0),(23927,48899,0),(23928,48900,0),(23929,48901,0),(23930,48902,0),(23931,48903,0),(23932,48904,0),(23933,48905,0),(23934,48906,0),(23935,48907,0),(23936,48908,0),(23937,48909,0),(23938,48910,0),(23939,48911,0),(23940,48912,0),(23941,48913,0),(23942,48914,0),(23943,48915,0),(23944,48916,0),(23945,48917,0),(23946,48918,0),(23947,48919,0),(23948,48922,0),(23949,48923,0),(23950,48924,0),(23951,48925,0),(23952,48926,0),(23953,48927,0),(23954,48928,0),(23955,48929,0),(23956,48930,0),(23957,48931,0),(23958,48945,0),(23959,48947,0),(23960,48949,0),(23961,48974,0),(23962,48975,0),(23963,48976,0),(23964,48977,0),(23965,48978,0),(23966,48979,0),(23967,48980,0),(23968,48981,0),(23969,48982,0),(23970,48983,0),(23971,48987,0),(23972,48988,0),(23973,48990,0),(23974,48991,0),(23975,48992,0),(23976,48993,0),(23977,48994,0),(23978,48997,0),(23979,48998,0),(23980,49016,0),(23981,49018,0),(23982,49020,0),(23983,49022,0),(23984,49024,0),(23985,49048,0),(23986,49052,0),(23987,49054,0),(23988,49070,0),(23989,49072,0),(23990,49086,0),(23991,49114,0),(23992,49120,0),(23993,49126,0),(23994,49128,0),(23995,49142,0),(23996,49148,0),(23997,49152,0),(23998,49154,0),(23999,49156,0),(24000,49158,0),(24001,49160,0),(24002,49179,0),(24003,49181,0),(24004,49183,0),(24005,49185,0),(24006,49187,0),(24007,49189,0),(24008,49191,0),(24009,49198,0),(24010,49201,0),(24011,49206,0),(24012,49227,0),(24013,49231,0),(24014,49232,0),(24015,49233,0),(24016,49234,0),(24017,49235,0),(24018,49236,0),(24019,49237,0),(24020,49238,0),(24021,49241,0),(24022,49242,0),(24023,49243,0),(24024,49244,0),(24025,49245,0),(24026,49246,0),(24027,49247,0),(24028,49248,0),(24029,49249,0),(24030,49250,0),(24031,49251,0),(24032,49252,0),(24033,49255,0),(24034,49256,0),(24035,49257,0),(24036,49258,0),(24037,49259,0),(24038,49260,0),(24039,49261,0),(24040,49262,0),(24041,49263,0),(24042,49264,0),(24043,49265,0),(24044,49266,0),(24045,49267,0),(24046,49268,0),(24047,49269,0),(24048,49270,0),(24049,49271,0),(24050,49272,0),(24051,49273,0),(24052,49274,0),(24053,49275,0),(24054,49276,0),(24055,49278,0),(24056,49291,0),(24057,49292,0),(24058,49293,0),(24059,49296,0),(24060,49297,0),(24061,49298,0),(24062,49299,0),(24063,49301,0),(24064,49302,0),(24065,49303,0),(24066,49304,0),(24067,49305,0),(24068,49307,0),(24069,49308,0),(24070,49311,0),(24071,49315,0),(24072,49316,0),(24073,49317,0),(24074,49318,0),(24075,49319,0),(24076,49320,0),(24077,49321,0),(24078,49322,0),(24079,49323,0),(24080,49324,0),(24081,49325,0),(24082,49326,0),(24083,49327,0),(24084,49328,0),(24085,49329,0),(24086,49330,0),(24087,49331,0),(24088,49332,0),(24089,49333,0),(24090,49340,0),(24091,49341,0),(24092,49342,0),(24093,49344,0),(24094,49345,0),(24095,49346,0),(24096,49353,0),(24097,49357,0),(24098,49358,0),(24099,49363,0),(24100,49371,0),(24101,49378,0),(24102,49379,0),(24103,49380,0),(24104,49381,0),(24105,49382,0),(24106,49383,0),(24107,49384,0),(24108,49385,0),(24109,49386,0),(24110,49387,0),(24111,49388,0),(24112,49389,0),(24113,49390,0),(24114,49391,0),(24115,49392,0),(24116,49393,0),(24117,49394,0),(24118,49395,0),(24119,49396,0),(24120,49399,0),(24121,49400,0),(24122,49401,0),(24123,49402,0),(24124,49403,0),(24125,49404,0),(24126,49405,0),(24127,49406,0),(24128,49407,0),(24129,49408,0),(24130,49409,0),(24131,49410,0),(24132,49411,0),(24133,49412,0),(24134,49413,0),(24135,49414,0),(24136,49415,0),(24137,49416,0),(24138,49417,0),(24139,49418,0),(24140,49419,0),(24141,49420,0),(24142,49421,0),(24143,49422,0),(24144,49423,0),(24145,49427,0),(24146,49428,0),(24147,49429,0),(24148,49430,0),(24149,49431,0),(24150,49432,0),(24151,49433,0),(24152,49434,0),(24153,49435,0),(24154,49437,0),(24155,49438,0),(24156,49439,0),(24157,49440,0),(24158,49441,0),(24159,49442,0),(24160,49443,0),(24161,49444,0),(24162,49445,0),(24163,49446,0),(24164,49447,0),(24165,49448,0),(24166,49449,0),(24167,49450,0),(24168,49451,0),(24169,49452,0),(24170,49453,0),(24171,49454,0),(24172,49455,0),(24173,49456,0),(24174,49457,0),(24175,49458,0),(24176,49462,0),(24177,49465,0),(24178,49466,0),(24179,49467,0),(24180,49468,0),(24181,49469,0),(24182,49470,0),(24183,49471,0),(24184,49472,0),(24185,49473,0),(24186,49474,0),(24187,49475,0),(24188,49476,0),(24189,49477,0),(24190,49478,0),(24191,49479,0),(24192,49480,0),(24193,49481,0),(24194,49482,0),(24195,49483,0),(24196,49484,0),(24197,49490,0),(24198,49491,0),(24199,49493,0),(24200,49494,0),(24201,49495,0),(24202,49496,0),(24203,49497,0),(24204,49498,0),(24205,49499,0),(24206,49500,0),(24207,49501,0),(24208,49502,0),(24209,49503,0),(24210,49504,0),(24211,49505,0),(24212,49506,0),(24213,49507,0),(24214,49508,0),(24215,49509,0),(24216,49510,0),(24217,49511,0),(24218,49512,0),(24219,49513,0),(24220,49514,0),(24221,49515,0),(24222,49516,0),(24223,49517,0),(24224,49518,0),(24225,49519,0),(24226,49520,0),(24227,49521,0),(24228,49522,0),(24229,49523,0),(24230,49524,0),(24231,49526,0),(24232,49527,0),(24233,49528,0),(24234,49529,0),(24235,49530,0),(24236,49531,0),(24237,49534,0),(24238,49541,0),(24239,49542,0),(24240,49543,0),(24241,49544,0),(24242,49545,0),(24243,49546,0),(24244,49548,0),(24245,49549,0),(24246,49550,0),(24247,49551,0),(24248,49552,0),(24249,49553,0),(24250,49554,0),(24251,49555,0),(24252,49556,0),(24253,49557,0),(24254,49558,0),(24255,49559,0),(24256,49560,0),(24257,49561,0),(24258,49562,0),(24259,49563,0),(24260,49564,0),(24261,49565,0),(24262,49566,0),(24263,49567,0),(24264,49568,0),(24265,49569,0),(24266,49570,0),(24267,49571,0),(24268,49572,0),(24269,49573,0),(24270,49574,0),(24271,49575,0),(24272,49576,0),(24273,49577,0),(24274,49578,0),(24275,49579,0),(24276,49580,0),(24277,49581,0),(24278,49582,0),(24279,49583,0),(24280,49584,0),(24281,49585,0),(24282,49586,0),(24283,49587,0),(24284,49588,0),(24285,49589,0),(24286,49590,0),(24287,49591,0),(24288,49592,0),(24289,49593,0),(24290,49594,0),(24291,49595,0),(24292,49598,0),(24293,49604,0),(24294,49605,0),(24295,49606,0),(24296,49607,0),(24297,49608,0),(24298,49609,0),(24299,49615,0),(24300,49616,0),(24301,49617,0),(24302,49618,0),(24303,49623,0),(24304,49637,0),(24305,49638,0),(24306,49645,0),(24307,49653,0),(24308,49654,0),(24309,49656,0),(24310,49657,0),(24312,49671,0),(24313,49672,0),(24314,49673,0),(24315,49681,0),(24316,49682,0),(24317,49684,0),(24318,49687,0),(24319,49689,0),(24320,49691,0),(24321,49694,0),(24322,49706,0),(24323,49708,0),(24324,49709,0),(24325,49711,0),(24326,49712,0),(24327,49713,0),(24328,49714,0),(24329,49715,0),(24330,49716,0),(24331,49717,0),(24332,49719,0),(24333,49720,0),(24334,49721,0),(24335,49722,0),(24336,49724,0),(24337,49725,0),(24338,49726,0),(24339,49727,0),(24340,49728,0),(24341,49729,0),(24342,49730,0),(24343,49731,0),(24344,49732,0),(24345,49733,0),(24346,49734,0),(24347,49735,0),(24348,49736,0),(24349,49737,0),(24350,49738,0),(24351,49761,0),(24352,49762,0),(24353,49763,0),(24354,49764,0),(24355,49767,0),(24356,49770,0),(24357,49773,0),(24358,49774,0),(24359,49775,0),(24360,49777,0),(24361,49778,0),(24362,49781,0),(24363,49783,0),(24364,49784,0),(24365,49785,0),(24366,49786,0),(24367,49787,0),(24368,49788,0),(24369,49789,0),(24370,49790,0),(24371,49791,0),(24372,49792,0),(24373,49793,0),(24374,49794,0),(24375,49795,0),(24376,49796,0),(24377,49797,0),(24378,49798,0),(24379,49801,0),(24380,49802,0),(24381,49804,0),(24382,49805,0),(24383,49806,0),(24384,49807,0),(24385,49808,0),(24386,49809,0),(24387,49810,0),(24388,49811,0),(24389,49813,0),(24390,49814,0),(24391,49816,0),(24392,49817,0),(24393,49819,0),(24394,49820,0),(24395,49821,0),(24396,49822,0),(24397,49823,0),(24398,49824,0),(24399,49825,0),(24400,49826,0),(24401,49827,0),(24402,49828,0),(24403,49829,0),(24404,49830,0),(24405,49831,0),(24406,49832,0),(24407,49833,0),(24408,49834,0),(24409,49835,0),(24410,49836,0),(24411,49837,0),(24412,49838,0),(24413,49839,0),(24414,49840,0),(24415,49841,0),(24416,49842,0),(24417,49843,0),(24418,49844,0),(24419,49845,0),(24420,49846,0),(24421,49847,0),(24422,49848,0),(24423,49849,0),(24424,49851,0),(24425,49852,0),(24426,49853,0),(24427,49854,0),(24428,49855,0),(24429,49864,0),(24430,49873,0),(24431,49886,0),(24432,49888,0),(24433,49890,0),(24434,49891,0),(24435,49892,0),(24436,49893,0),(24437,49894,0),(24438,49895,0),(24439,49896,0),(24440,49897,0),(24441,49898,0),(24442,49899,0),(24443,49900,0),(24444,49901,0),(24445,49902,0),(24446,49903,0),(24447,49904,0),(24448,49905,0),(24449,49906,0),(24450,49907,0),(24451,49916,0),(24452,49919,0),(24453,49930,0),(24454,49931,0),(24455,49933,0),(24456,49935,0),(24457,49950,0),(24458,49951,0),(24459,49952,0),(24460,49960,0),(24461,49964,0),(24462,49968,0),(24463,49976,0),(24464,49978,0),(24465,49979,0),(24466,49980,0),(24467,49981,0),(24468,49982,0),(24469,49983,0),(24470,49984,0),(24471,49986,0),(24472,49987,0),(24473,49988,0),(24474,49991,0),(24475,49992,0),(24476,49993,0),(24477,49994,0),(24478,49995,0),(24479,49996,0),(24480,49997,0),(24481,49998,0),(24482,50000,0),(24483,50001,0),(24484,50002,0),(24485,50003,0),(24486,50006,0),(24487,50009,0),(24488,50010,0),(24489,50011,0),(24490,50012,0),(24491,50014,0),(24492,50015,0),(24493,50016,0),(24494,50019,0),(24495,50020,0),(24496,50021,0),(24497,50022,0),(24498,50024,0),(24499,50026,0),(24500,50027,0),(24501,50028,0),(24502,50030,0),(24503,50032,0),(24504,50033,0),(24505,50034,0),(24506,50035,0),(24507,50036,0),(24508,50037,0),(24509,50038,0),(24510,50039,0),(24511,50040,0),(24512,50041,0),(24513,50042,0),(24514,50043,0),(24515,50046,0),(24516,50047,0),(24517,50048,0),(24518,50049,0),(24519,50050,0),(24520,50051,0),(24521,50052,0),(24522,50055,0),(24523,50056,0),(24524,50057,0),(24525,50059,0),(24526,50060,0),(24527,50062,0),(24528,50063,0),(24529,50064,0),(24530,50065,0),(24531,50067,0),(24532,50068,0),(24533,50069,0),(24534,50070,0),(24535,50071,0),(24536,50072,0),(24537,50073,0),(24538,50074,0),(24539,50075,0),(24540,50078,0),(24541,50079,0),(24542,50080,0),(24543,50081,0),(24544,50082,0),(24545,50087,0),(24546,50088,0),(24547,50089,0),(24548,50090,0),(24549,50094,0),(24550,50095,0),(24551,50096,0),(24552,50097,0),(24553,50098,0),(24554,50105,0),(24555,50106,0),(24556,50107,0),(24557,50108,0),(24558,50109,0),(24559,50113,0),(24560,50114,0),(24561,50115,0),(24562,50116,0),(24563,50117,0),(24564,50118,0),(24565,50126,0),(24566,50127,0),(24567,50129,0),(24568,50135,0),(24569,50136,0),(24570,50137,0),(24571,50138,0),(24572,50139,0),(24573,50140,0),(24574,50141,0),(24575,50142,0),(24576,50143,0),(24577,50144,0),(24578,50145,0),(24579,50146,0),(24580,50147,0),(24581,50148,0),(24582,50149,0),(24583,50150,0),(24584,50152,0),(24585,50153,0),(24586,50154,0),(24587,50155,0),(24588,50156,0),(24589,50157,0),(24590,50158,0),(24591,50159,0),(24592,50169,0),(24593,50171,0),(24594,50172,0),(24595,50173,0),(24596,50175,0),(24597,50176,0),(24598,50177,0),(24599,50178,0),(24600,50179,0),(24601,50181,0),(24602,50183,0),(24603,50184,0),(24604,50187,0),(24605,50188,0),(24606,50190,0),(24607,50191,0),(24608,50192,0),(24609,50193,0),(24610,50194,0),(24611,50197,0),(24612,50199,0),(24613,50202,0),(24614,50203,0),(24615,50204,0),(24616,50205,0),(24617,50206,0),(24618,50207,0),(24619,50208,0),(24620,50209,0),(24621,50210,0),(24622,50212,0),(24623,50213,0),(24624,50214,0),(24625,50215,0),(24626,50216,0),(24627,50217,0),(24628,50221,0),(24629,50224,0),(24630,50225,0),(24631,50227,0),(24632,50229,0),(24633,50230,0),(24634,50233,0),(24635,50234,0),(24636,50240,0),(24637,50241,0),(24638,50242,0),(24639,50243,0),(24640,50244,0),(24641,50248,0),(24642,50249,0),(24643,50251,0),(24644,50252,0),(24645,50256,0),(24646,50257,0),(24647,50262,0),(24648,50263,0),(24649,50264,0),(24650,50265,0),(24651,50266,0),(24652,50267,0),(24653,50268,0),(24654,50269,0),(24655,50270,0),(24656,50272,0),(24657,50273,0),(24658,50275,0),(24659,50276,0),(24660,50277,0),(24661,50278,0),(24662,50279,0),(24663,50283,0),(24664,50284,0),(24665,50285,0),(24666,50286,0),(24667,50287,0),(24668,50290,0),(24669,50291,0),(24670,50292,0),(24671,50293,0),(24672,50294,0),(24673,50295,0),(24674,50296,0),(24675,50297,0),(24676,50298,0),(24677,50299,0),(24678,50300,0),(24679,50302,0),(24680,50303,0),(24681,50304,0),(24682,50305,0),(24683,50308,0),(24684,50309,0),(24685,50311,0),(24686,50312,0),(24687,50314,0),(24688,50315,0),(24689,50318,0),(24690,50319,0),(24691,50324,0),(24692,50325,0),(24693,50326,0),(24694,50327,0),(24695,50328,0),(24696,50329,0),(24697,50330,0),(24698,50331,0),(24699,50332,0),(24700,50333,0),(24701,50391,0),(24702,50392,0),(24703,50393,0),(24704,50394,0),(24705,50396,0),(24706,50411,0),(24707,50412,0),(24708,50413,0),(24709,50415,0),(24710,50416,0),(24711,50417,0),(24712,50418,0),(24713,50419,0),(24714,50423,0),(24715,50425,0),(24716,50426,0),(24717,50427,0),(24718,50428,0),(24719,50429,0),(24720,50431,0),(24721,50433,0),(24722,50434,0),(24723,50436,0),(24724,50442,0),(24725,50444,0),(24726,50449,0),(24727,50450,0),(24728,50451,0),(24729,50466,0),(24730,50467,0),(24731,50468,0),(24732,50469,0),(24733,50470,0),(24734,50472,0),(24735,50474,0),(24736,50603,0),(24737,50605,0),(24738,50606,0),(24739,50607,0),(24740,50608,0),(24741,50611,0),(24742,50612,0),(24743,50613,0),(24744,50615,0),(24745,50616,0),(24746,50617,0),(24747,50619,0),(24748,50620,0),(24749,50621,0),(24750,50623,0),(24751,50624,0),(24752,50625,0),(24753,50626,0),(24754,50628,0),(24755,50629,0),(24756,50630,0),(24757,50631,0),(24758,50632,0),(24759,50635,0),(24760,50638,0),(24761,50639,0),(24762,50640,0),(24763,50641,0),(24764,50643,0),(24765,50645,0),(24766,50646,0),(24767,50648,0),(24768,50649,0),(24769,50650,0),(24770,50651,0),(24771,50652,0),(24772,50653,0),(24773,50654,0),(24774,50655,0),(24775,50656,0),(24776,50659,0),(24777,50660,0),(24778,50661,0),(24779,50663,0),(24780,50665,0),(24781,50667,0),(24782,50668,0),(24783,50670,0),(24784,50671,0),(24785,50672,0),(24786,50673,0),(24787,50674,0),(24788,50675,0),(24789,50676,0),(24790,50677,0),(24791,50679,0),(24792,50680,0),(24793,50681,0),(24794,50684,0),(24795,50685,0),(24796,50686,0),(24797,50687,0),(24798,50688,0),(24799,50689,0),(24800,50690,0),(24801,50691,0),(24802,50692,0),(24803,50694,0),(24804,50695,0),(24805,50696,0),(24806,50697,0),(24807,50698,0),(24808,50699,0),(24809,50701,0),(24810,50702,0),(24811,50703,0),(24812,50704,0),(24813,50705,0),(24814,50707,0),(24815,50708,0),(24816,50709,0),(24817,50710,0),(24818,50711,0),(24819,50712,0),(24820,50713,0),(24821,50715,0),(24822,50716,0),(24823,50717,0),(24824,50718,0),(24825,50719,0),(24826,50721,0),(24827,50722,0),(24828,50723,0),(24829,50725,0),(24830,50727,0),(24831,50729,0),(24832,50730,0),(24833,50731,0),(24834,50732,0),(24835,50733,0),(24836,50734,0),(24837,50735,0),(24838,50736,0),(24839,50737,0),(24840,50738,0),(24841,50741,0),(24842,50752,0),(24843,50753,0),(24844,50757,0),(24845,50758,0),(24846,50759,0),(24847,50760,0),(24848,50761,0),(24849,50762,0),(24850,50764,0),(24851,50765,0),(24852,50766,0),(24853,50767,0),(24854,50768,0),(24855,50769,0),(24856,50771,0),(24857,50772,0),(24858,50773,0),(24859,50774,0),(24860,50775,0),(24861,50776,0),(24862,50777,0),(24863,50778,0),(24864,50779,0),(24865,50780,0),(24866,50781,0),(24867,50782,0),(24868,50783,0),(24869,50784,0),(24870,50785,0),(24871,50786,0),(24872,50787,0),(24873,50788,0),(24874,50789,0),(24875,50791,0),(24876,50792,0),(24877,50793,0),(24878,50794,0),(24879,50795,0),(24880,50796,0),(24881,50797,0),(24882,50798,0),(24883,50799,0),(24884,50800,0),(24885,50801,0),(24886,50802,0),(24887,50804,0),(24888,50805,0),(24889,50806,0),(24890,50807,0),(24891,50808,0),(24892,50810,0),(24893,50811,0),(24894,50812,0),(24895,50814,0),(24896,50815,0),(24897,50817,0),(24898,50819,0),(24899,50820,0),(24900,50821,0),(24901,50822,0),(24902,50823,0),(24903,50824,0),(24904,50825,0),(24905,50826,0),(24906,50827,0),(24907,50828,0),(24908,50830,0),(24909,50831,0),(24910,50832,0),(24911,50833,0),(24912,50834,0),(24913,50835,0),(24914,50836,0),(24915,50837,0),(24916,50838,0),(24917,50839,0),(24918,50840,0),(24919,50841,0),(24920,50842,0),(24921,50843,0),(24922,50844,0),(24923,50845,0),(24924,50846,0),(24925,50847,0),(24926,50848,0),(24927,50849,0),(24928,50850,0),(24929,50853,0),(24930,50854,0),(24931,50855,0),(24932,50856,0),(24933,50857,0),(24934,50858,0),(24935,50859,0),(24936,50860,0),(24937,50861,0),(24938,50862,0),(24939,50863,0),(24940,50864,0),(24941,50865,0),(24942,50866,0),(24943,50867,0),(24944,50868,0),(24945,50869,0),(24946,50965,0),(24947,50966,0),(24948,50967,0),(24949,50968,0),(24950,50969,0),(24951,50970,0),(24952,50971,0),(24953,50972,0),(24954,50973,0),(24955,50974,0),(24956,50975,0),(24957,50976,0),(24958,50977,0),(24959,50978,0),(24960,50979,0),(24961,50980,0),(24962,50981,0),(24963,50982,0),(24964,50983,0),(24965,50984,0),(24966,50985,0),(24967,50987,0),(24968,50988,0),(24969,50989,0),(24970,50990,0),(24971,50991,0),(24972,50992,0),(24973,50993,0),(24974,50994,0),(24975,50995,0),(24976,50996,0),(24977,50997,0),(24978,50998,0),(24979,50999,0),(24980,51000,0),(24981,51002,0),(24982,51003,0),(24983,51004,0),(24984,51005,0),(24985,51006,0),(24986,51007,0),(24987,51009,0),(24988,51010,0),(24989,51011,0),(24990,51013,0),(24991,51014,0),(24992,51015,0),(24993,51017,0),(24994,51018,0),(24995,51019,0),(24996,51020,0),(24997,51021,0),(24998,51022,0),(24999,51023,0),(25000,51025,0),(25001,51028,0),(25002,51029,0),(25003,51125,0),(25004,51126,0),(25005,51127,0),(25006,51128,0),(25007,51129,0),(25008,51130,0),(25009,51131,0),(25010,51132,0),(25011,51133,0),(25012,51134,0),(25013,51135,0),(25014,51136,0),(25015,51137,0),(25016,51138,0),(25017,51139,0),(25018,51140,0),(25019,51141,0),(25020,51142,0),(25021,51143,0),(25022,51144,0),(25023,51145,0),(25024,51146,0),(25025,51147,0),(25026,51148,0),(25027,51149,0),(25028,51150,0),(25029,51151,0),(25030,51152,0),(25031,51153,0),(25032,51154,0),(25033,51155,0),(25034,51156,0),(25035,51157,0),(25036,51158,0),(25037,51159,0),(25038,51160,0),(25039,51161,0),(25040,51162,0),(25041,51163,0),(25042,51164,0),(25043,51165,0),(25044,51166,0),(25045,51167,0),(25046,51168,0),(25047,51169,0),(25048,51170,0),(25049,51171,0),(25050,51172,0),(25051,51173,0),(25052,51174,0),(25053,51175,0),(25054,51176,0),(25055,51177,0),(25056,51178,0),(25057,51179,0),(25058,51180,0),(25059,51181,0),(25060,51182,0),(25061,51183,0),(25062,51184,0),(25063,51185,0),(25064,51186,0),(25065,51187,0),(25066,51188,0),(25067,51189,0),(25068,51190,0),(25069,51191,0),(25070,51192,0),(25071,51193,0),(25072,51194,0),(25073,51195,0),(25074,51196,0),(25075,51197,0),(25076,51198,0),(25077,51199,0),(25078,51200,0),(25079,51201,0),(25080,51202,0),(25081,51203,0),(25082,51204,0),(25083,51205,0),(25084,51206,0),(25085,51207,0),(25086,51208,0),(25087,51209,0),(25088,51210,0),(25089,51211,0),(25090,51212,0),(25091,51213,0),(25092,51214,0),(25093,51215,0),(25094,51216,0),(25095,51217,0),(25096,51218,0),(25097,51219,0),(25098,51220,0),(25099,51221,0),(25100,51222,0),(25101,51223,0),(25102,51224,0),(25103,51225,0),(25104,51226,0),(25105,51227,0),(25106,51228,0),(25107,51229,0),(25108,51230,0),(25109,51231,0),(25110,51232,0),(25111,51233,0),(25112,51234,0),(25113,51235,0),(25114,51236,0),(25115,51237,0),(25116,51238,0),(25117,51239,0),(25118,51240,0),(25119,51241,0),(25120,51242,0),(25121,51243,0),(25122,51244,0),(25123,51245,0),(25124,51246,0),(25125,51247,0),(25126,51248,0),(25127,51249,0),(25128,51250,0),(25129,51251,0),(25130,51252,0),(25131,51253,0),(25132,51254,0),(25133,51255,0),(25134,51256,0),(25135,51257,0),(25136,51258,0),(25137,51259,0),(25138,51260,0),(25139,51261,0),(25140,51262,0),(25141,51263,0),(25142,51264,0),(25143,51265,0),(25144,51266,0),(25145,51267,0),(25146,51268,0),(25147,51269,0),(25148,51270,0),(25149,51271,0),(25150,51272,0),(25151,51273,0),(25152,51274,0),(25153,51275,0),(25154,51276,0),(25155,51277,0),(25156,51278,0),(25157,51279,0),(25158,51280,0),(25159,51281,0),(25160,51282,0),(25161,51283,0),(25162,51284,0),(25163,51285,0),(25164,51286,0),(25165,51287,0),(25166,51288,0),(25167,51289,0),(25168,51290,0),(25169,51291,0),(25170,51292,0),(25171,51293,0),(25172,51294,0),(25173,51295,0),(25174,51296,0),(25175,51297,0),(25176,51298,0),(25177,51299,0),(25178,51300,0),(25179,51301,0),(25180,51302,0),(25181,51303,0),(25182,51304,0),(25183,51305,0),(25184,51306,0),(25185,51307,0),(25186,51308,0),(25187,51309,0),(25188,51310,0),(25189,51311,0),(25190,51312,0),(25191,51313,0),(25192,51314,0),(25193,51322,0),(25194,51323,0),(25195,51324,0),(25196,51325,0),(25197,51326,0),(25198,51327,0),(25199,51328,0),(25200,51329,0),(25201,51330,0),(25202,51332,0),(25203,51334,0),(25204,51337,0),(25205,51338,0),(25206,51339,0),(25207,51340,0),(25208,51341,0),(25209,51342,0),(25210,51343,0),(25211,51344,0),(25212,51345,0),(25213,51346,0),(25214,51348,0),(25215,51350,0),(25216,51351,0),(25217,51352,0),(25218,51354,0),(25219,51356,0),(25220,51359,0),(25221,51360,0),(25222,51361,0),(25223,51362,0),(25224,51363,0),(25225,51364,0),(25226,51365,0),(25227,51366,0),(25228,51367,0),(25229,51368,0),(25230,51369,0),(25231,51370,0),(25232,51371,0),(25233,51372,0),(25234,51373,0),(25235,51374,0),(25236,51375,0),(25237,51376,0),(25238,51379,0),(25239,51380,0),(25240,51382,0),(25241,51383,0),(25242,51384,0),(25243,51385,0),(25244,51386,0),(25245,51388,0),(25246,51389,0),(25247,51390,0),(25248,51391,0),(25249,51392,0),(25250,51393,0),(25251,51394,0),(25252,51395,0),(25253,51396,0),(25254,51397,0),(25255,51398,0),(25256,51399,0),(25257,51400,0),(25258,51401,0),(25259,51402,0),(25260,51403,0),(25261,51404,0),(25262,51405,0),(25263,51406,0),(25264,51407,0),(25265,51408,0),(25266,51409,0),(25267,51410,0),(25268,51411,0),(25269,51412,0),(25270,51413,0),(25271,51414,0),(25272,51415,0),(25273,51416,0),(25274,51418,0),(25275,51419,0),(25276,51420,0),(25277,51421,0),(25278,51422,0),(25279,51424,0),(25280,51425,0),(25281,51426,0),(25282,51427,0),(25283,51428,0),(25284,51430,0),(25285,51431,0),(25286,51432,0),(25287,51433,0),(25288,51434,0),(25289,51435,0),(25290,51436,0),(25291,51438,0),(25292,51439,0),(25293,51440,0),(25294,51441,0),(25295,51442,0),(25296,51443,0),(25297,51444,0),(25298,51445,0),(25299,51446,0),(25300,51447,0),(25301,51448,0),(25302,51449,0),(25303,51450,0),(25304,51451,0),(25305,51452,0),(25306,51453,0),(25307,51454,0),(25308,51455,0),(25309,51456,0),(25310,51457,0),(25311,51458,0),(25312,51459,0),(25313,51460,0),(25314,51461,0),(25315,51462,0),(25316,51463,0),(25317,51464,0),(25318,51465,0),(25319,51466,0),(25320,51467,0),(25321,51468,0),(25322,51469,0),(25323,51470,0),(25324,51471,0),(25325,51473,0),(25326,51474,0),(25327,51475,0),(25328,51476,0),(25329,51477,0),(25330,51479,0),(25331,51480,0),(25332,51481,0),(25333,51482,0),(25334,51483,0),(25335,51484,0),(25336,51485,0),(25337,51486,0),(25338,51487,0),(25339,51488,0),(25340,51489,0),(25341,51490,0),(25342,51491,0),(25343,51492,0),(25344,51493,0),(25345,51494,0),(25346,51495,0),(25347,51496,0),(25348,51497,0),(25349,51498,0),(25350,51499,0),(25351,51500,0),(25352,51502,0),(25353,51503,0),(25354,51504,0),(25355,51505,0),(25356,51506,0),(25357,51508,0),(25358,51509,0),(25359,51510,0),(25360,51511,0),(25361,51512,0),(25362,51514,0),(25363,51515,0),(25364,51516,0),(25365,51517,0),(25366,51518,0),(25367,51519,0),(25368,51520,0),(25369,51521,0),(25370,51522,0),(25371,51523,0),(25372,51524,0),(25373,51525,0),(25374,51526,0),(25375,51527,0),(25376,51528,0),(25377,51529,0),(25378,51530,0),(25379,51531,0),(25380,51532,0),(25381,51533,0),(25382,51534,0),(25383,51535,0),(25384,51536,0),(25385,51537,0),(25386,51538,0),(25387,51539,0),(25388,51540,0),(25389,51541,0),(25390,51542,0),(25391,51543,0),(25392,51544,0),(25393,51545,0),(25394,51550,0),(25395,51551,0),(25396,51552,0),(25397,51553,0),(25398,51554,0),(25399,51555,0),(25400,51556,0),(25401,51561,0),(25402,51562,0),(25403,51563,0),(25404,51564,0),(25405,51565,0),(25406,51566,0),(25407,51570,0),(25408,51571,0),(25409,51572,0),(25410,51573,0),(25411,51574,0),(25412,51575,0),(25413,51576,0),(25414,51577,0),(25415,51578,0),(25416,51579,0),(25417,51580,0),(25418,51581,0),(25419,51582,0),(25420,51583,0),(25421,51584,0),(25422,51585,0),(25423,51586,0),(25424,51682,0),(25425,51683,0),(25426,51684,0),(25427,51685,0),(25428,51686,0),(25429,51687,0),(25430,51688,0),(25431,51689,0),(25432,51690,0),(25433,51691,0),(25434,51692,0),(25435,51693,0),(25436,51694,0),(25437,51695,0),(25438,51696,0),(25439,51697,0),(25440,51698,0),(25441,51699,0),(25442,51700,0),(25443,51701,0),(25444,51702,0),(25445,51703,0),(25446,51704,0),(25447,51705,0),(25448,51706,0),(25449,51707,0),(25450,51708,0),(25451,51709,0),(25452,51710,0),(25453,51711,0),(25454,51712,0),(25455,51713,0),(25456,51714,0),(25457,51715,0),(25458,51716,0),(25459,51717,0),(25460,51718,0),(25461,51719,0),(25462,51720,0),(25463,51721,0),(25464,51722,0),(25465,51723,0),(25466,51724,0),(25467,51725,0),(25468,51726,0),(25469,51727,0),(25470,51728,0),(25471,51729,0),(25472,51730,0),(25473,51731,0),(25474,51732,0),(25475,51733,0),(25476,51734,0),(25477,51735,0),(25478,51736,0),(25479,51737,0),(25480,51738,0),(25481,51739,0),(25482,51740,0),(25483,51741,0),(25484,51742,0),(25485,51743,0),(25486,51744,0),(25487,51745,0),(25488,51746,0),(25489,51747,0),(25490,51748,0),(25491,51749,0),(25492,51750,0),(25493,51751,0),(25494,51752,0),(25495,51753,0),(25496,51754,0),(25497,51755,0),(25498,51756,0),(25499,51757,0),(25500,51758,0),(25501,51759,0),(25502,51760,0),(25503,51761,0),(25504,51762,0),(25505,51763,0),(25506,51764,0),(25507,51765,0),(25508,51766,0),(25509,51767,0),(25510,51768,0),(25511,51769,0),(25512,51770,0),(25513,51771,0),(25514,51772,0),(25515,51773,0),(25516,51774,0),(25517,51775,0),(25518,51776,0),(25519,51777,0),(25520,51782,0),(25521,51783,0),(25522,51784,0),(25523,51785,0),(25524,51786,0),(25525,51787,0),(25526,51788,0),(25527,51789,0),(25528,51790,0),(25529,51791,0),(25530,51792,0),(25531,51795,0),(25532,51796,0),(25533,51797,0),(25534,51798,0),(25535,51799,0),(25536,51800,0),(25537,51801,0),(25538,51802,0),(25539,51803,0),(25540,51811,0),(25541,51812,0),(25542,51813,0),(25543,51814,0),(25544,51815,0),(25545,51816,0),(25546,51817,0),(25547,51818,0),(25548,51819,0),(25549,51820,0),(25550,51821,0),(25551,51823,0),(25552,51824,0),(25553,51825,0),(25554,51826,0),(25555,51827,0),(25556,51828,0),(25557,51829,0),(25558,51830,0),(25559,51831,0),(25560,51832,0),(25561,51833,0),(25562,51834,0),(25563,51835,0),(25564,51836,0),(25565,51837,0),(25566,51838,0),(25567,51839,0),(25568,51840,0),(25569,51841,0),(25570,51844,0),(25571,51845,0),(25572,51846,0),(25573,51847,0),(25574,51848,0),(25575,51850,0),(25576,51851,0),(25577,51852,0),(25578,51853,0),(25579,51854,0),(25580,51856,0),(25581,51857,0),(25582,51858,0),(25583,51859,0),(25584,51860,0),(25585,51861,0),(25586,51862,0),(25587,51864,0),(25588,51865,0),(25589,51866,0),(25590,51868,0),(25591,51869,0),(25592,51870,0),(25593,51872,0),(25594,51873,0),(25595,51874,0),(25596,51875,0),(25597,51876,0),(25598,51877,0),(25599,51879,0),(25600,51880,0),(25601,51881,0),(25602,51882,0),(25603,51883,0),(25604,51885,0),(25605,51886,0),(25606,51887,0),(25607,51888,0),(25608,51889,0),(25609,51891,0),(25610,51892,0),(25611,51893,0),(25612,51895,0),(25613,51896,0),(25614,51897,0),(25615,51898,0),(25616,51899,0),(25617,51901,0),(25618,51902,0),(25619,51903,0),(25620,51904,0),(25621,51905,0),(25622,51906,0),(25623,51907,0),(25624,51908,0),(25625,51909,0),(25626,51910,0),(25627,51911,0),(25628,51912,0),(25629,51914,0),(25630,51915,0),(25631,51916,0),(25632,51917,0),(25633,51918,0),(25634,51919,0),(25635,51920,0),(25636,51921,0),(25637,51922,0),(25638,51923,0),(25639,51924,0),(25640,51925,0),(25641,51926,0),(25642,51927,0),(25643,51928,0),(25644,51929,0),(25645,51930,0),(25646,51931,0),(25647,51932,0),(25648,51933,0),(25649,51935,0),(25650,51936,0),(25651,51937,0),(25652,51938,0),(25653,51939,0),(25654,51940,0),(25655,51941,0),(25656,51942,0),(25657,51943,0),(25658,51944,0),(25659,51945,0),(25660,51946,0),(25661,51947,0),(25662,51949,0),(25663,51958,0),(25664,51959,0),(25665,51960,0),(25666,51961,0),(25667,51962,0),(25668,51963,0),(25669,51964,0),(25670,51965,0),(25671,51966,0),(25672,51967,0),(25673,51968,0),(25674,51969,0),(25675,51970,0),(25676,51971,0),(25677,51972,0),(25678,51973,0),(25679,51974,0),(25680,51975,0),(25681,51976,0),(25682,51977,0),(25683,51978,0),(25684,51979,0),(25685,51980,0),(25686,51981,0),(25687,51982,0),(25688,51983,0),(25689,51984,0),(25690,51985,0),(25691,51986,0),(25692,51987,0),(25693,51988,0),(25694,51989,0),(25695,51990,0),(25696,51993,0),(25697,51994,0),(25698,51997,0),(25699,51998,0),(25700,52007,0),(25701,52008,0),(25702,52009,0),(25703,52010,0),(25704,52011,0),(25705,52012,0),(25706,52015,0),(25707,52016,0),(25708,52019,0),(25709,52020,0),(25710,52021,0),(25711,52034,0),(25712,52037,0),(25713,52042,0),(25714,52052,0),(25715,52053,0),(25716,52054,0),(25717,52057,0),(25718,52058,0),(25719,52060,0),(25720,52062,0),(25721,52063,0),(25722,52071,0),(25723,52252,0),(25724,52278,0),(25725,52343,0),(25726,52355,0),(25727,52358,0),(25728,52359,0),(25729,52485,0),(25730,52486,0),(25731,52487,0),(25732,52488,0),(25733,52489,0),(25734,52492,0),(25735,52493,0),(25736,52508,0),(25737,52509,0),(25738,52517,0),(25739,52518,0),(25740,52519,0),(25741,52520,0),(25742,52521,0),(25743,52523,0),(25744,52524,0),(25745,52525,0),(25746,52526,0),(25747,52527,0),(25748,52528,0),(25749,52529,0),(25750,52532,0),(25751,52533,0),(25752,52534,0),(25753,52535,0),(25754,52538,0),(25755,52539,0),(25756,52540,0),(25757,52542,0),(25758,52543,0),(25759,52544,0),(25760,52545,0),(25761,52546,0),(25762,52547,0),(25763,52548,0),(25764,52549,0),(25765,52550,0),(25766,52551,0),(25767,52552,0),(25768,52553,0),(25769,52554,0),(25770,52556,0),(25771,52557,0),(25772,52579,0),(25773,52583,0),(25774,52584,0),(25775,52586,0),(25776,52587,0),(25777,52588,0),(25778,52590,0),(25779,52591,0),(25780,52592,0),(25781,52593,0),(25782,52594,0),(25783,52595,0),(25784,52596,0),(25785,52597,0),(25786,52598,0),(25787,52599,0),(25788,52600,0),(25789,52602,0),(25790,52603,0),(25791,52605,0),(25792,52606,0),(25793,52607,0),(25794,52608,0),(25795,52609,0),(25796,52610,0),(25797,52612,0),(25798,52613,0),(25799,52614,0),(25800,52615,0),(25801,52616,0),(25802,52617,0),(25803,52618,0),(25804,52619,0),(25805,52620,0),(25806,52621,0),(25807,52622,0),(25808,52623,0),(25809,52624,0),(25810,52626,0),(25811,52627,0),(25812,52628,0),(25813,52629,0),(25814,52630,0),(25815,52631,0),(25816,52632,0),(25817,52633,0),(25818,52634,0),(25819,52636,0),(25820,52637,0),(25821,52640,0),(25822,52641,0),(25823,52643,0),(25824,52644,0),(25825,52645,0),(25826,52646,0),(25827,52647,0),(25828,52650,0),(25829,52651,0),(25830,52652,0),(25831,52653,0),(25832,52654,0),(25833,52655,0),(25834,52656,0),(25835,52657,0),(25836,52659,0),(25837,52660,0),(25838,52662,0),(25839,52663,0),(25840,52664,0),(25841,52675,0),(25842,52678,0),(25843,52679,0),(25844,52680,0),(25845,52681,0),(25846,52686,0),(25847,52688,0),(25848,52689,0),(25849,52690,0),(25850,52691,0),(25851,52692,0),(25852,52694,0),(25853,52695,0),(25854,52696,0),(25855,52697,0),(25856,52699,0),(25857,52700,0),(25858,52702,0),(25859,52703,0),(25860,52704,0),(25861,52705,0),(25862,52711,0),(25863,52716,0),(25864,52729,0),(25865,52837,0),(25866,52838,0),(25867,52840,0),(25868,52842,0),(25869,52869,0),(25870,52870,0),(25871,52872,0),(25872,52873,0),(25873,52874,0),(25874,52875,0),(25875,52876,0),(25876,52877,0),(25877,52878,0),(25878,52879,0),(25879,52880,0),(25880,52882,0),(25881,52883,0),(25882,52884,0),(25883,52885,0),(25884,52886,0),(25885,52887,0),(25886,52889,0),(25887,52898,0),(25888,52899,0),(25889,52900,0),(25890,52901,0),(25891,52902,0),(25892,52903,0),(25893,52904,0),(25894,52905,0),(25895,52906,0),(25896,52907,0),(25897,52908,0),(25898,52909,0),(25899,52910,0),(25900,52911,0),(25901,52912,0),(25902,52913,0),(25903,52914,0),(25904,52915,0),(25905,52916,0),(25906,52917,0),(25907,52918,0),(25908,52919,0),(25909,52920,0),(25910,52921,0),(25911,52922,0),(25912,52923,0),(25913,52927,0),(25914,52928,0),(25915,52929,0),(25916,52930,0),(25917,52931,0),(25918,52932,0),(25919,52933,0),(25920,52934,0),(25921,52935,0),(25922,52936,0),(25923,52937,0),(25924,52938,0),(25925,52939,0),(25926,52940,0),(25927,52941,0),(25928,52942,0),(25929,52943,0),(25930,52944,0),(25931,52945,0),(25932,52946,0),(25933,52947,0),(25934,52948,0),(25935,52949,0),(25936,52950,0),(25937,52951,0),(25938,52952,0),(25939,52953,0),(25940,52954,0),(25941,52955,0),(25942,52956,0),(25943,52957,0),(25944,52958,0),(25945,52959,0),(25946,52960,0),(25947,52961,0),(25948,52962,0),(25949,52963,0),(25950,52964,0),(25951,52965,0),(25952,52966,0),(25953,52967,0),(25954,52968,0),(25955,52969,0),(25956,52970,0),(25957,52971,0),(25958,52972,0),(25959,52990,0),(25960,52991,0),(25961,52992,0),(25962,52993,0),(25963,52994,0),(25964,52995,0),(25965,52996,0),(25966,52997,0),(25967,52998,0),(25968,52999,0),(25969,53000,0),(25970,53001,0),(25971,53002,0),(25972,53003,0),(25973,53004,0),(25974,53005,0),(25975,53006,0),(25976,53007,0),(25977,53008,0),(25978,53011,0),(25979,53012,0),(25980,53013,0),(25981,53014,0),(25982,53015,0),(25983,53016,0),(25984,53017,0),(25985,53018,0),(25986,53019,0),(25987,53020,0),(25988,53021,0),(25989,53022,0),(25990,53023,0),(25991,53024,0),(25992,53025,0),(25993,53026,0),(25994,53027,0),(25995,53028,0),(25996,53029,0),(25997,53030,0),(25998,53031,0),(25999,53032,0),(26000,53033,0),(26001,53034,0),(26002,53040,0),(26003,53041,0),(26004,53042,0),(26005,53043,0),(26006,53044,0),(26007,53045,0),(26008,53046,0),(26009,53047,0),(26010,53048,0),(26011,53055,0),(26012,53056,0),(26013,53096,0),(26014,53097,0),(26015,53098,0),(26016,53100,0),(26017,53108,0),(26018,53109,0),(26019,53111,0),(26020,53112,0),(26021,53113,0),(26022,53114,0),(26023,53115,0),(26024,53117,0),(26025,53118,0),(26026,53119,0),(26027,53121,0),(26028,53125,0),(26029,53126,0),(26030,53127,0),(26031,53129,0),(26032,53134,0),(26033,53155,0),(26034,53157,0),(26035,53158,0),(26036,53159,0),(26037,53160,0),(26038,53226,0),(26039,53227,0),(26040,53228,0),(26041,53229,0),(26042,53231,0),(26043,53232,0),(26044,53233,0),(26045,53234,0),(26046,53235,0),(26047,53236,0),(26048,53237,0),(26049,53238,0),(26050,53239,0),(26051,53240,0),(26052,53241,0),(26053,53242,0),(26054,53243,0),(26055,53244,0),(26056,53246,0),(26057,53247,0),(26058,53248,0),(26059,53249,0),(26060,53251,0),(26061,53252,0),(26062,53253,0),(26063,53254,0),(26064,53255,0),(26065,53256,0),(26066,53257,0),(26067,53258,0),(26068,53259,0),(26069,53260,0),(26070,53263,0),(26071,53264,0),(26072,53265,0),(26073,53266,0),(26074,53268,0),(26075,53270,0),(26076,53271,0),(26077,53273,0),(26078,53274,0),(26079,53275,0),(26080,53276,0),(26081,53277,0),(26082,53278,0),(26083,53279,0),(26084,53280,0),(26085,53281,0),(26086,53282,0),(26087,53283,0),(26088,53284,0),(26089,53285,0),(26090,53286,0),(26091,53287,0),(26092,53288,0),(26093,53289,0),(26094,53290,0),(26095,53291,0),(26096,53292,0),(26097,53294,0),(26098,53295,0),(26099,53297,0),(26100,53298,0),(26101,53299,0),(26102,53300,0),(26103,53301,0),(26104,53302,0),(26105,53303,0),(26106,53304,0),(26107,53305,0),(26108,53306,0),(26109,53307,0),(26110,53308,0),(26111,53354,0),(26112,53355,0),(26113,53356,0),(26114,53357,0),(26115,53358,0),(26116,53359,0),(26117,53360,0),(26118,53361,0),(26119,53362,0),(26120,53363,0),(26121,53364,0),(26122,53365,0),(26123,53366,0),(26124,53367,0),(26125,53368,0),(26126,53369,0),(26127,53370,0),(26128,53371,0),(26129,53372,0),(26130,53373,0),(26131,53374,0),(26132,53375,0),(26133,53376,0),(26134,53377,0),(26135,53378,0),(26136,53379,0),(26137,53380,0),(26138,53381,0),(26139,53382,0),(26140,53383,0),(26141,53384,0),(26142,53385,0),(26143,53386,0),(26144,53387,0),(26145,53388,0),(26146,53389,0),(26147,53390,0),(26148,53391,0),(26149,53392,0),(26150,53393,0),(26151,53394,0),(26152,53395,0),(26153,53396,0),(26154,53397,0),(26155,53398,0),(26156,53399,0),(26157,53400,0),(26158,53401,0),(26159,53402,0),(26160,53403,0),(26161,53404,0),(26162,53405,0),(26163,53406,0),(26164,53407,0),(26165,53409,0),(26166,53410,0),(26167,53411,0),(26168,53412,0),(26169,53413,0),(26170,53414,0),(26171,53415,0),(26172,53416,0),(26173,53417,0),(26174,53418,0),(26175,53419,0),(26176,53420,0),(26177,53421,0),(26178,53422,0),(26179,53423,0),(26180,53425,0),(26181,53426,0),(26182,53427,0),(26183,53428,0),(26184,53429,0),(26185,53430,0),(26186,53431,0),(26187,53432,0),(26188,53433,0),(26189,53434,0),(26190,53435,0),(26191,53436,0),(26192,53437,0),(26193,53438,0),(26194,53439,0),(26195,53440,0),(26196,53441,0),(26197,53442,0),(26198,53443,0),(26199,53445,0),(26200,53446,0),(26201,53447,0),(26202,53448,0),(26203,53449,0),(26204,53450,0),(26205,53451,0),(26206,53452,0),(26207,53453,0),(26208,53486,0),(26209,53487,0),(26210,53488,0),(26211,53489,0),(26212,53491,0),(26213,53493,0),(26214,53494,0),(26215,53496,0),(26216,53497,0),(26217,53498,0),(26218,53500,0),(26219,53504,0),(26220,53505,0),(26221,53506,0),(26222,53507,0),(26223,53508,0),(26224,53557,0),(26225,53559,0),(26226,53560,0),(26227,53561,0),(26228,53562,0),(26229,53563,0),(26230,53564,0),(26231,53565,0),(26232,53566,0),(26233,53567,0),(26234,53568,0),(26235,53569,0),(26236,53570,0),(26237,53571,0),(26238,53572,0),(26239,53573,0),(26240,53574,0),(26241,53575,0),(26242,53576,0),(26243,53577,0),(26244,53578,0),(26245,53579,0),(26246,53580,0),(26247,53581,0),(26248,53582,0),(26249,53583,0),(26250,53584,0),(26251,53585,0),(26252,53586,0),(26253,53587,0),(26254,53588,0),(26255,53589,0),(26256,53590,0),(26257,53591,0),(26258,53592,0),(26259,53593,0),(26260,53595,0),(26261,53596,0),(26262,53598,0),(26263,53599,0),(26264,53600,0),(26265,53601,0),(26266,53602,0),(26267,53611,0),(26268,53612,0),(26269,53613,0),(26270,53614,0),(26271,53615,0),(26272,53616,0),(26273,53617,0),(26274,53618,0),(26275,53644,0),(26276,53645,0),(26277,53646,0),(26278,53647,0),(26279,53649,0),(26280,53651,0),(26281,53652,0),(26282,53653,0),(26283,53654,0),(26284,53655,0),(26285,53657,0),(26286,53659,0),(26287,53686,0),(26288,53687,0),(26289,53688,0),(26290,53689,0),(26291,53691,0),(26292,53692,0),(26293,53694,0),(26294,53740,0),(26295,53741,0),(26296,53742,0),(26297,53743,0),(26298,53744,0),(26299,53745,0),(26300,53746,0),(26301,53747,0),(26302,53748,0),(26303,53785,0),(26304,53786,0),(26305,53787,0),(26306,53788,0),(26307,53789,0),(26308,53790,0),(26309,53791,0),(26310,53792,0),(26311,53793,0),(26312,53811,0),(26313,53812,0),(26314,53813,0),(26315,53814,0),(26316,53815,0),(26317,53816,0),(26318,53817,0),(26319,53818,0),(26320,53835,0),(26321,53852,0),(26322,53869,0),(26323,53879,0),(26324,53880,0),(26325,53881,0),(26326,53882,0),(26327,53883,0),(26328,53884,0),(26329,53885,0),(26330,53886,0),(26331,53887,0),(26332,53888,0),(26333,53889,0),(26334,53890,0),(26335,53891,0),(26336,53924,0),(26337,53933,0),(26338,53934,0),(26339,53935,0),(26340,53936,0),(26341,53937,0),(26342,53938,0),(26343,53955,0),(26344,53956,0),(26345,53957,0),(26346,53958,0),(26347,53959,0),(26348,53960,0),(26349,53961,0),(26350,53962,0),(26351,53963,0),(26352,53988,0),(26353,53989,0),(26354,53990,0),(26355,53991,0),(26356,53992,0),(26357,53993,0),(26358,53994,0),(26359,53995,0),(26360,54028,0),(26361,54029,0),(26362,54030,0),(26363,54031,0),(26364,54032,0),(26365,54033,0),(26366,54034,0),(26367,54035,0),(26368,54070,0),(26369,54071,0),(26370,54072,0),(26371,54073,0),(26372,54074,0),(26373,54075,0),(26374,54076,0),(26375,54077,0),(26376,54102,0),(26377,54103,0),(26378,54104,0),(26379,54105,0),(26380,54106,0),(26381,54107,0),(26382,54108,0),(26383,54109,0),(26384,54283,0),(26385,54284,0),(26386,54285,0),(26387,54286,0),(26388,54287,0),(26389,54288,0),(26390,54289,0),(26391,54290,0),(26392,54292,0),(26393,54293,0),(26394,54294,0),(26395,54295,0),(26396,54296,0),(26397,54297,0),(26398,54298,0),(26399,54299,0),(26400,54300,0),(26401,54301,0),(26402,54302,0),(26403,54303,0),(26404,54304,0),(26405,54305,0),(26406,54306,0),(26407,54307,0),(26408,54308,0),(26409,54309,0),(26410,54311,0),(26411,54312,0),(26412,54314,0),(26413,54315,0),(26414,54317,0),(26415,54318,0),(26416,54319,0),(26417,54320,0),(26418,54321,0),(26419,54322,0),(26420,54324,0),(26421,54325,0),(26422,54326,0),(26423,54327,0),(26424,54328,0),(26425,54329,0),(26426,54330,0),(26427,54331,0),(26428,54332,0),(26429,54333,0),(26430,54335,0),(26431,54336,0),(26432,54337,0),(26433,54338,0),(26434,54339,0),(26435,54340,0),(26436,54341,0),(26437,54428,0),(26438,54429,0),(26439,54430,0),(26440,54431,0),(26441,54432,0),(26442,54433,0),(26443,54434,0),(26444,54435,0),(26445,54441,0),(26446,54451,0),(26447,54471,0),(26448,54472,0),(26449,54473,0),(26450,54474,0),(26451,54475,0),(26452,54476,0),(26453,54477,0),(26454,54478,0),(26455,54479,0),(26456,54480,0),(26457,54481,0),(26458,54482,0),(26459,54483,0),(26460,54484,0),(26461,54485,0),(26462,54486,0),(26463,54487,0),(26464,54488,0),(26465,54489,0),(26466,54490,0),(26467,54491,0),(26468,54492,0),(26469,54493,0),(26470,54494,0),(26471,54495,0),(26472,54496,0),(26473,54497,0),(26474,54498,0),(26475,54499,0),(26476,54500,0),(26477,54501,0),(26478,54502,0),(26479,54503,0),(26480,54504,0),(26481,54505,0),(26482,54506,0),(26483,54507,0),(26484,54508,0),(26485,54509,0),(26486,54510,0),(26487,54511,0),(26488,54512,0),(26489,54513,0),(26490,54514,0),(26491,54515,0),(26492,54538,0),(26493,54539,0),(26494,54540,0),(26495,54541,0),(26496,54542,0),(26497,54543,0),(26498,54544,0),(26499,54548,0),(26500,54549,0),(26501,54550,0),(26502,54551,0),(26503,54552,0),(26504,54553,0),(26505,54554,0),(26506,54555,0),(26507,54556,0),(26508,54558,0),(26509,54559,0),(26510,54560,0),(26511,54561,0),(26512,54562,0),(26513,54564,0),(26514,54565,0),(26515,54566,0),(26516,54577,0),(26517,54578,0),(26518,54579,0),(26519,54580,0),(26520,54582,0),(26521,54583,0),(26522,54584,0),(26523,54586,0),(26524,54587,0),(26525,54592,0),(26526,54612,0),(26527,54617,0),(26528,54649,0),(26529,54650,0),(26530,54652,0),(26531,54655,0),(26532,54658,0),(26533,54662,0),(26534,54665,0),(26535,54666,0),(26536,54667,0),(26537,54668,0),(26538,54669,0),(26539,54670,0),(26540,54671,0),(26541,54673,0),(26542,54674,0),(26543,54675,0),(26544,54676,0),(26545,54677,0),(26546,54680,0),(26547,54681,0),(26548,54682,0),(26549,54683,0),(26550,54684,0),(26551,54685,0),(26552,54686,0),(26553,54687,0),(26554,54689,0),(26555,54691,0),(26556,54692,0),(26557,54693,0),(26558,54694,0),(26559,54695,0),(26560,54696,0),(26561,54697,0),(26562,54698,0),(26563,54699,0),(26564,54700,0),(26565,54701,0),(26566,54702,0),(26567,54703,0),(26568,54704,0),(26569,54705,0),(26570,54706,0),(26571,54707,0),(26572,54708,0),(26573,54709,0),(26574,54710,0),(26575,54711,0),(26576,54712,0),(26577,54713,0),(26578,54714,0),(26579,54715,0),(26580,54716,0),(26581,54717,0),(26582,54719,0),(26583,54720,0),(26584,54721,0),(26585,54722,0),(26586,54723,0),(26587,54724,0),(26588,54725,0),(26589,54726,0),(26590,54727,0),(26591,54728,0),(26592,54731,0),(26593,54735,0),(26594,54737,0),(26595,54741,0),(26596,54742,0),(26597,54743,0),(26598,54748,0),(26599,54749,0),(26600,54751,0),(26601,54754,0),(26602,54755,0),(26603,54757,0),(26604,54759,0),(26605,54760,0),(26606,54761,0),(26607,54762,0),(26608,54763,0),(26609,54764,0),(26610,54765,0),(26611,54766,0),(26612,54767,0),(26613,54768,0),(26614,54769,0),(26615,54770,0),(26616,54772,0),(26617,54773,0),(26618,54774,0),(26619,54775,0),(26620,54776,0),(26621,54777,0),(26622,54778,0),(26623,54779,0),(26624,54780,0),(26625,54781,0),(26626,54782,0),(26627,54783,0),(26628,54784,0),(26629,54789,0),(26630,54790,0),(26631,54791,0),(26632,54792,0),(26633,54793,0),(26634,54794,0),(26635,54795,0),(26636,54796,0),(26637,54801,0),(26638,54802,0),(26639,54803,0),(26640,54804,0),(26641,54805,0),(26642,54806,0),(26643,54815,0),(26644,54816,0),(26645,54820,0),(26646,54823,0),(26647,54824,0),(26648,54825,0),(26649,54826,0),(26650,54827,0),(26651,54848,0),(26652,54850,0),(26653,54852,0),(26654,54853,0),(26655,54854,0),(26656,54858,0),(26657,54859,0),(26658,54867,0),(26659,54868,0),(26660,54869,0),(26661,54870,0),(26662,54871,0),(26663,54872,0),(26664,54873,0),(26665,54874,0),(26666,54876,0),(26667,54877,0),(26668,54878,0),(26669,54879,0),(26670,54880,0),(26671,54881,0),(26672,54882,0),(26673,54885,0),(26674,54886,0),(26675,54887,0),(26676,54888,0),(26677,54889,0),(26678,54891,0),(26679,54892,0),(26680,54893,0),(26681,54894,0),(26682,54896,0),(26683,54897,0),(26684,54898,0),(26685,54899,0),(26686,54900,0),(26687,54901,0),(26688,54902,0),(26689,54903,0),(26690,54904,0),(26691,54909,0),(26692,54910,0),(26693,54911,0),(26694,54912,0),(26695,54913,0),(26696,54914,0),(26697,54915,0),(26698,54916,0),(26699,54917,0),(26700,54918,0),(26701,54919,0),(26702,54920,0),(26703,54921,0),(26704,54922,0),(26705,54923,0),(26706,54924,0),(26707,54925,0),(26708,54926,0),(26709,54927,0),(26710,54928,0),(26711,54929,0),(26712,54930,0),(26713,54931,0),(26714,54932,0),(26715,54933,0),(26716,54934,0),(26717,54935,0),(26718,54936,0),(26719,54937,0),(26720,54938,0),(26721,54939,0),(26722,54940,0),(26723,54941,0),(26724,54942,0),(26725,54943,0),(26726,54944,0),(26727,54945,0),(26728,54946,0),(26729,54947,0),(26730,54948,0),(26731,54950,0),(26732,54965,0),(26733,54966,0),(26734,54967,0),(26735,54968,0),(26736,54969,0),(26737,54970,0),(26738,54971,0),(26739,54972,0),(26740,54975,0),(26741,54976,0),(26742,54977,0),(26743,54978,0),(26744,54979,0),(26745,54980,0),(26746,54981,0),(26747,54982,0),(26748,54983,0),(26749,54984,0),(26750,54985,0),(26751,54986,0),(26752,54987,0),(26753,54988,0),(26754,54989,0),(26755,54990,0),(26756,54991,0),(26757,54992,0),(26758,54993,0),(26759,54994,0),(26760,54995,0),(26761,54996,0),(26762,54997,0),(26763,54998,0),(26764,54999,0),(26765,55000,0),(26766,55001,0),(26767,55002,0),(26768,55003,0),(26769,55004,0),(26770,55005,0),(26771,55006,0),(26772,55007,0),(26773,55008,0),(26774,55009,0),(26775,55010,0),(26776,55011,0),(26777,55012,0),(26778,55013,0),(26779,55014,0),(26780,55015,0),(26781,55016,0),(26782,55017,0),(26783,55018,0),(26784,55019,0),(26785,55020,0),(26786,55021,0),(26787,55022,0),(26788,55023,0),(26789,55024,0),(26790,55025,0),(26791,55026,0),(26792,55027,0),(26793,55028,0),(26794,55029,0),(26795,55030,0),(26796,55031,0),(26797,55032,0),(26798,55033,0),(26799,55034,0),(26800,55035,0),(26801,55036,0),(26802,55037,0),(26803,55038,0),(26804,55039,0),(26805,55040,0),(26806,55041,0),(26807,55042,0),(26808,55043,0),(26809,55044,0),(26810,55045,0),(26811,55046,0),(26812,55047,0),(26813,55048,0),(26814,55051,0),(26815,55052,0),(26816,55058,0),(26817,55059,0),(26818,55060,0),(26819,55061,0),(26820,55062,0),(26821,55063,0),(26822,55064,0),(26823,55065,0),(26824,55066,0),(26825,55067,0),(26826,55068,0),(26827,55069,0),(26828,55070,0),(26829,55071,0),(26830,55072,0),(26831,55073,0),(26832,55074,0),(26833,55075,0),(26834,55076,0),(26835,55077,0),(26836,55078,0),(26837,55079,0),(26838,55080,0),(26839,55081,0),(26840,55082,0),(26841,55083,0),(26842,55084,0),(26843,55085,0),(26844,55086,0),(26845,55124,0),(26846,55126,0),(26847,55127,0),(26848,55128,0),(26849,55129,0),(26850,55131,0),(26851,55132,0),(26852,55133,0),(26853,55134,0),(26854,55146,0),(26855,55147,0),(26856,55150,0),(26857,55154,0),(26858,55155,0),(26859,55156,0),(26860,55157,0),(26861,55159,0),(26862,55168,0),(26863,55169,0),(26864,55170,0),(26865,55192,0),(26866,55193,0),(26867,55194,0),(26868,55195,0),(26869,55198,0),(26870,55202,0),(26871,55203,0),(26872,55204,0),(26873,55205,0),(26874,55206,0),(26875,55207,0),(26876,55224,0),(26877,55225,0),(26878,55228,0),(26879,55229,0),(26880,55235,0),(26881,55246,0),(26882,55249,0),(26883,55252,0),(26884,55253,0),(26885,55254,0),(26886,55255,0),(26887,55259,0),(26888,55260,0),(26889,55263,0),(26890,55264,0),(26891,55267,0),(26892,55268,0),(26893,55269,0),(26894,55270,0),(26895,55272,0),(26896,55273,0),(26897,55274,0),(26898,55275,0),(26899,55277,0),(26900,55278,0),(26901,55279,0),(26902,55281,0),(26903,55282,0),(26904,55283,0),(26905,55284,0),(26906,55285,0),(26907,55286,0),(26908,55287,0),(26909,55288,0),(26910,55289,0),(26911,55290,0),(26912,55291,0),(26913,55292,0),(26914,55293,0),(26915,55294,0),(26916,55295,0),(26917,55296,0),(26918,55297,0),(26919,55298,0),(26920,55299,0),(26921,55300,0),(26922,55301,0),(26923,55302,0),(26924,55303,0),(26925,55304,0),(26926,55305,0),(26927,55306,0),(26928,55307,0),(26929,55308,0),(26930,55309,0),(26931,55310,0),(26932,55311,0),(26933,55312,0),(26934,55313,0),(26935,55314,0),(26936,55315,0),(26937,55316,0),(26938,55317,0),(26939,55318,0),(26940,55319,0),(26941,55320,0),(26942,55321,0),(26943,55322,0),(26944,55323,0),(26945,55324,0),(26946,55325,0),(26947,55326,0),(26948,55327,0),(26949,55328,0),(26950,55329,0),(26951,55330,0),(26952,55331,0),(26953,55332,0),(26954,55333,0),(26955,55334,0),(26956,55335,0),(26957,55336,0),(26958,55337,0),(26959,55338,0),(26960,55339,0),(26961,55340,0),(26962,55341,0),(26963,55342,0),(26964,55343,0),(26965,55344,0),(26966,55345,0),(26967,55346,0),(26968,55347,0),(26969,55348,0),(26970,55349,0),(26971,55350,0),(26972,55351,0),(26973,55352,0),(26974,55353,0),(26975,55354,0),(26976,55355,0),(26977,55356,0),(26978,55357,0),(26979,55358,0),(26980,55359,0),(26981,55360,0),(26982,55361,0),(26983,55362,0),(26984,55363,0),(26985,55364,0),(26986,55365,0),(26987,55366,0),(26988,55367,0),(26989,55368,0),(26990,55369,0),(26991,55370,0),(26992,55371,0),(26993,55372,0),(26994,55373,0),(26995,55374,0),(26996,55375,0),(26997,55376,0),(26998,55377,0),(26999,55378,0),(27000,55379,0),(27001,55380,0),(27002,55381,0),(27003,55382,0),(27004,55383,0),(27005,55384,0),(27006,55385,0),(27007,55386,0),(27008,55387,0),(27009,55388,0),(27010,55389,0),(27011,55390,0),(27012,55391,0),(27013,55392,0),(27014,55393,0),(27015,55394,0),(27016,55395,0),(27017,55396,0),(27018,55397,0),(27019,55407,0),(27020,55408,0),(27021,55409,0),(27022,55410,0),(27023,55411,0),(27024,55412,0),(27025,55413,0),(27026,55414,0),(27027,55415,0),(27028,55425,0),(27029,55426,0),(27030,55427,0),(27031,55428,0),(27032,55429,0),(27033,55430,0),(27034,55431,0),(27035,55432,0),(27036,55433,0),(27037,55434,0),(27038,55435,0),(27039,55436,0),(27040,55437,0),(27041,55438,0),(27042,55439,0),(27043,55440,0),(27044,55441,0),(27045,55442,0),(27046,55443,0),(27047,55444,0),(27048,55445,0),(27049,55446,0),(27050,55447,0),(27051,55448,0),(27052,55449,0),(27053,55450,0),(27054,55451,0),(27055,55452,0),(27056,55453,0),(27057,55454,0),(27058,55455,0),(27059,55456,0),(27060,55457,0),(27061,55458,0),(27062,55459,0),(27063,55460,0),(27064,55461,0),(27065,55462,0),(27066,55463,0),(27067,55464,0),(27068,55465,0),(27069,55466,0),(27070,55467,0),(27071,55468,0),(27072,55469,0),(27073,55470,0),(27074,55471,0),(27075,55472,0),(27076,55473,0),(27077,55474,0),(27078,55475,0),(27079,55476,0),(27080,55477,0),(27081,55478,0),(27082,55479,0),(27083,55480,0),(27084,55481,0),(27085,55482,0),(27086,55483,0),(27087,55484,0),(27088,55485,0),(27089,55486,0),(27090,55487,0),(27091,55488,0),(27092,55489,0),(27093,55490,0),(27094,55491,0),(27095,55492,0),(27096,55493,0),(27097,55494,0),(27098,55495,0),(27099,55496,0),(27100,55497,0),(27101,55498,0),(27102,55499,0),(27103,55500,0),(27104,55501,0),(27105,55502,0),(27106,55503,0),(27107,55504,0),(27108,55505,0),(27109,55506,0),(27110,55507,0),(27111,55508,0),(27112,55509,0),(27113,55510,0),(27114,55511,0),(27115,55512,0),(27116,55513,0),(27117,55514,0),(27118,55515,0),(27119,55516,0),(27120,55517,0),(27121,55518,0),(27122,55519,0),(27123,55520,0),(27124,55521,0),(27125,55522,0),(27126,55523,0),(27127,55524,0),(27128,55525,0),(27129,55526,0),(27130,55527,0),(27131,55528,0),(27132,55529,0),(27133,55530,0),(27134,55531,0),(27135,55532,0),(27136,55533,0),(27137,55534,0),(27138,55535,0),(27139,55536,0),(27140,55537,0),(27141,55538,0),(27142,55539,0),(27143,55540,0),(27144,55541,0),(27145,55542,0),(27146,55543,0),(27147,55544,0),(27148,55545,0),(27149,55546,0),(27150,55547,0),(27151,55548,0),(27152,55549,0),(27153,55550,0),(27154,55551,0),(27155,55552,0),(27156,55553,0),(27157,55554,0),(27158,55555,0),(27159,55556,0),(27160,55557,0),(27161,55558,0),(27162,55559,0),(27163,55560,0),(27164,55561,0),(27165,55562,0),(27166,55563,0),(27167,55564,0),(27168,55565,0),(27169,55566,0),(27170,55567,0),(27171,55568,0),(27172,55569,0),(27173,55570,0),(27174,55571,0),(27175,55572,0),(27176,55573,0),(27177,55574,0),(27178,55575,0),(27179,55576,0),(27180,55577,0),(27181,55578,0),(27182,55579,0),(27183,55580,0),(27184,55581,0),(27185,55582,0),(27186,55583,0),(27187,55584,0),(27188,55585,0),(27189,55586,0),(27190,55587,0),(27191,55588,0),(27192,55589,0),(27193,55590,0),(27194,55591,0),(27195,55592,0),(27196,55593,0),(27197,55594,0),(27198,55595,0),(27199,55596,0),(27200,55597,0),(27201,55598,0),(27202,55599,0),(27203,55600,0),(27204,55601,0),(27205,55602,0),(27206,55603,0),(27207,55604,0),(27208,55605,0),(27209,55606,0),(27210,55607,0),(27211,55608,0),(27212,55609,0),(27213,55610,0),(27214,55611,0),(27215,55612,0),(27216,55613,0),(27217,55614,0),(27218,55615,0),(27219,55616,0),(27220,55617,0),(27221,55618,0),(27222,55619,0),(27223,55620,0),(27224,55621,0),(27225,55622,0),(27226,55623,0),(27227,55624,0),(27228,55625,0),(27229,55626,0),(27230,55627,0),(27231,55628,0),(27232,55629,0),(27233,55630,0),(27234,55631,0),(27235,55632,0),(27236,55633,0),(27237,55634,0),(27238,55635,0),(27239,55636,0),(27240,55637,0),(27241,55638,0),(27242,55639,0),(27243,55640,0),(27244,55641,0),(27245,55642,0),(27246,55643,0),(27247,55644,0),(27248,55645,0),(27249,55646,0),(27250,55647,0),(27251,55648,0),(27252,55649,0),(27253,55650,0),(27254,55651,0),(27255,55652,0),(27256,55653,0),(27257,55654,0),(27258,55655,0),(27259,55656,0),(27260,55657,0),(27261,55658,0),(27262,55659,0),(27263,55660,0),(27264,55661,0),(27265,55662,0),(27266,55663,0),(27267,55664,0),(27268,55665,0),(27269,55666,0),(27270,55667,0),(27271,55668,0),(27272,55669,0),(27273,55670,0),(27274,55671,0),(27275,55672,0),(27276,55673,0),(27277,55674,0),(27278,55675,0),(27279,55676,0),(27280,55677,0),(27281,55678,0),(27282,55679,0),(27283,55680,0),(27284,55681,0),(27285,55682,0),(27286,55683,0),(27287,55684,0),(27288,55685,0),(27289,55686,0),(27290,55687,0),(27291,55688,0),(27292,55689,0),(27293,55690,0),(27294,55691,0),(27295,55692,0),(27296,55693,0),(27297,55694,0),(27298,55695,0),(27299,55696,0),(27300,55697,0),(27301,55698,0),(27302,55699,0),(27303,55700,0),(27304,55701,0),(27305,55702,0),(27306,55703,0),(27307,55704,0),(27308,55705,0),(27309,55706,0),(27310,55707,0),(27311,55708,0),(27312,55709,0),(27313,55710,0),(27314,55711,0),(27315,55712,0),(27316,55713,0),(27317,55714,0),(27318,55715,0),(27319,55716,0),(27320,55717,0),(27321,55718,0),(27322,55719,0),(27323,55720,0),(27324,55721,0),(27325,55722,0),(27326,55723,0),(27327,55724,0),(27328,55725,0),(27329,55726,0),(27330,55727,0),(27331,55728,0),(27332,55729,0),(27333,55730,0),(27334,55731,0),(27335,55732,0),(27336,55733,0),(27337,55734,0),(27338,55735,0),(27339,55736,0),(27340,55737,0),(27341,55738,0),(27342,55739,0),(27343,55740,0),(27344,55741,0),(27345,55742,0),(27346,55743,0),(27347,55744,0),(27348,55745,0),(27349,55746,0),(27350,55747,0),(27351,55748,0),(27352,55749,0),(27353,55750,0),(27354,55751,0),(27355,55752,0),(27356,55753,0),(27357,55754,0),(27358,55755,0),(27359,55756,0),(27360,55757,0),(27361,55758,0),(27362,55759,0),(27363,55760,0),(27364,55761,0),(27365,55762,0),(27366,55763,0),(27367,55764,0),(27368,55765,0),(27369,55766,0),(27370,55767,0),(27371,55768,0),(27372,55769,0),(27373,55770,0),(27374,55771,0),(27375,55772,0),(27376,55773,0),(27377,55774,0),(27378,55775,0),(27379,55777,0),(27380,55778,0),(27381,55779,0),(27382,55780,0),(27383,55782,0),(27384,55784,0),(27385,55785,0),(27386,55786,0),(27387,55788,0),(27388,55789,0),(27389,55790,0),(27390,55792,0),(27391,55793,0),(27392,55796,0),(27393,55797,0),(27394,55798,0),(27395,55801,0),(27396,55802,0),(27397,55803,0),(27398,55811,0),(27399,55812,0),(27400,55813,0),(27401,55815,0),(27402,55817,0),(27403,55818,0),(27404,55820,0),(27405,55822,0),(27406,55823,0),(27407,55824,0),(27408,55825,0),(27409,55830,0),(27410,55831,0),(27411,55832,0),(27412,55834,0),(27413,55835,0),(27414,55838,0),(27415,55841,0),(27416,55842,0),(27417,55844,0),(27418,55846,0),(27419,55847,0),(27420,55848,0),(27421,55849,0),(27422,55850,0),(27423,55853,0),(27424,55855,0),(27425,55856,0),(27426,55857,0),(27427,55858,0),(27428,55860,0),(27429,55861,0),(27430,55862,0),(27431,55865,0),(27432,55866,0),(27433,55867,0),(27434,55870,0),(27435,55871,0),(27436,55872,0),(27437,55875,0),(27438,55876,0),(27439,55877,0),(27440,55878,0),(27441,55880,0),(27442,55882,0),(27443,55885,0),(27444,55886,0),(27445,55887,0),(27446,55890,0),(27447,55891,0),(27448,55892,0),(27449,55893,0),(27450,55894,0),(27451,55895,0),(27452,55896,0),(27453,55897,0),(27454,55898,0),(27455,55899,0),(27456,55900,0),(27457,55901,0),(27458,55902,0),(27459,55903,0),(27460,55904,0),(27461,55905,0),(27462,55906,0),(27463,55907,0),(27464,55908,0),(27465,55909,0),(27466,55910,0),(27467,55911,0),(27468,55912,0),(27469,55913,0),(27470,55914,0),(27471,55915,0),(27472,55916,0),(27473,55917,0),(27474,55918,0),(27475,55919,0),(27476,55920,0),(27477,55921,0),(27478,55922,0),(27479,55923,0),(27480,55926,0),(27481,55929,0),(27482,55930,0),(27483,55931,0),(27484,55932,0),(27485,55933,0),(27486,55934,0),(27487,55935,0),(27488,55936,0),(27489,55937,0),(27490,55938,0),(27491,55939,0),(27492,55940,0),(27493,55941,0),(27494,55942,0),(27495,55943,0),(27496,55944,0),(27497,55945,0),(27498,55946,0),(27499,55947,0),(27500,55948,0),(27501,55949,0),(27502,55950,0),(27503,55952,0),(27504,55953,0),(27505,55956,0),(27506,55957,0),(27507,55959,0),(27508,55960,0),(27509,55961,0),(27510,55962,0),(27511,55963,0),(27512,55990,0),(27513,55992,0),(27514,55993,0),(27515,55997,0),(27516,55998,0),(27517,56001,0),(27518,56004,0),(27519,56015,0),(27520,56022,0),(27521,56023,0),(27522,56038,0),(27523,56043,0),(27524,56044,0),(27525,56050,0),(27526,56062,0),(27527,56063,0),(27528,56064,0),(27529,56065,0),(27530,56066,0),(27531,56067,0),(27532,56068,0),(27533,56070,0),(27534,56071,0),(27535,56072,0),(27536,56073,0),(27537,56074,0),(27538,56075,0),(27539,56076,0),(27540,56077,0),(27541,56078,0),(27542,56079,0),(27543,56084,0),(27544,56086,0),(27545,56090,0),(27546,56092,0),(27547,56093,0),(27548,56094,0),(27549,56096,0),(27550,56097,0),(27551,56098,0),(27552,56099,0),(27553,56101,0),(27554,56103,0),(27555,56104,0),(27556,56105,0),(27557,56107,0),(27558,56108,0),(27559,56109,0),(27560,56112,0),(27561,56113,0),(27562,56116,0),(27563,56117,0),(27564,56118,0),(27565,56119,0),(27566,56122,0),(27567,56123,0),(27568,56124,0),(27569,56125,0),(27570,56126,0),(27571,56127,0),(27572,56128,0),(27573,56130,0),(27574,56131,0),(27575,56133,0),(27576,56135,0),(27577,56137,0),(27578,56141,0),(27579,56142,0),(27580,56143,0),(27581,56144,0),(27582,56145,0),(27583,56152,0),(27584,56153,0),(27585,56154,0),(27586,56155,0),(27587,56157,0),(27588,56166,0),(27589,56170,0),(27590,56171,0),(27591,56172,0),(27592,56173,0),(27593,56174,0),(27594,56175,0),(27595,56179,0),(27596,56191,0),(27597,56192,0),(27598,56193,0),(27599,56199,0),(27600,56208,0),(27601,56209,0),(27602,56210,0),(27603,56211,0),(27604,56212,0),(27605,56213,0),(27606,56214,0),(27607,56215,0),(27608,56218,0),(27609,56219,0),(27610,56228,0),(27611,56229,0),(27612,56230,0),(27613,56231,0),(27614,56232,0),(27615,56233,0),(27616,56246,0),(27617,56257,0),(27618,56258,0),(27619,56259,0),(27620,56260,0),(27621,56265,0),(27622,56266,0),(27623,56267,0),(27624,56268,0),(27625,56269,0),(27626,56271,0),(27627,56272,0),(27628,56273,0),(27629,56274,0),(27630,56275,0),(27631,56277,0),(27632,56278,0),(27633,56281,0),(27634,56283,0),(27635,56284,0),(27636,56286,0),(27637,56289,0),(27638,56291,0),(27639,56294,0),(27640,56296,0),(27641,56297,0),(27642,56298,0),(27643,56301,0),(27644,56302,0),(27645,56303,0),(27646,56304,0),(27647,56305,0),(27648,56306,0),(27649,56308,0),(27650,56309,0),(27651,56311,0),(27652,56312,0),(27653,56313,0),(27654,56314,0),(27655,56315,0),(27656,56317,0),(27657,56318,0),(27658,56321,0),(27659,56322,0),(27660,56323,0),(27661,56324,0),(27662,56325,0),(27663,56326,0),(27664,56329,0),(27665,56330,0),(27666,56331,0),(27667,56334,0),(27668,56335,0),(27669,56336,0),(27670,56340,0),(27671,56341,0),(27672,56342,0),(27673,56343,0),(27674,56344,0),(27675,56346,0),(27676,56348,0),(27677,56349,0),(27678,56352,0),(27679,56353,0),(27680,56354,0),(27681,56355,0),(27682,56356,0),(27683,56357,0),(27684,56358,0),(27685,56359,0),(27686,56361,0),(27687,56363,0),(27688,56364,0),(27689,56366,0),(27690,56367,0),(27691,56368,0),(27692,56369,0),(27693,56371,0),(27694,56374,0),(27695,56375,0),(27696,56376,0),(27697,56378,0),(27698,56379,0),(27699,56381,0),(27700,56382,0),(27701,56383,0),(27702,56384,0),(27703,56386,0),(27704,56387,0),(27705,56389,0),(27706,56390,0),(27707,56392,0),(27708,56395,0),(27709,56396,0),(27710,56397,0),(27711,56399,0),(27712,56401,0),(27713,56402,0),(27714,56403,0),(27715,56405,0),(27716,56408,0),(27717,56409,0),(27718,56410,0),(27719,56413,0),(27720,56416,0),(27721,56417,0),(27722,56419,0),(27723,56420,0),(27724,56423,0),(27725,56424,0),(27726,56425,0),(27727,56426,0),(27728,56428,0),(27729,56429,0),(27730,56430,0),(27731,56433,0),(27732,56434,0),(27733,56435,0),(27734,56436,0),(27735,56438,0),(27736,56441,0),(27737,56442,0),(27738,56443,0),(27739,56446,0),(27740,56447,0),(27741,56448,0),(27742,56450,0),(27743,56451,0),(27744,56452,0),(27745,56453,0),(27746,56454,0),(27747,56455,0),(27748,56456,0),(27749,56459,0),(27750,56460,0),(27751,56461,0),(27752,56464,0),(27753,56466,0),(27754,56467,0),(27755,56468,0),(27756,56475,0),(27757,56480,0),(27758,56481,0),(27759,56482,0),(27760,56483,0),(27761,56484,0),(27762,56485,0),(27763,56486,0),(27764,56487,0),(27765,56488,0),(27766,56489,0),(27767,56490,0),(27768,56491,0),(27769,56492,0),(27770,56493,0),(27771,56494,0),(27772,56495,0),(27773,56496,0),(27774,56497,0),(27775,56498,0),(27776,56499,0),(27777,56500,0),(27778,56501,0),(27779,56504,0),(27780,56505,0),(27781,56506,0),(27782,56507,0),(27783,56508,0),(27784,56509,0),(27785,56510,0),(27786,56511,0),(27787,56512,0),(27788,56513,0),(27789,56514,0),(27790,56515,0),(27791,56518,0),(27792,56519,0),(27793,56520,0),(27794,56521,0),(27795,56522,0),(27796,56523,0),(27797,56524,0),(27798,56525,0),(27799,56526,0),(27800,56527,0),(27801,56528,0),(27802,56529,0),(27803,56530,0),(27804,56531,0),(27805,56532,0),(27806,56533,0),(27807,56534,0),(27808,56535,0),(27809,56536,0),(27810,56537,0),(27811,56538,0),(27812,56539,0),(27813,56540,0),(27814,56541,0),(27815,56542,0),(27816,56543,0),(27817,56544,0),(27818,56545,0),(27819,56546,0),(27820,56547,0),(27821,56548,0),(27822,56549,0),(27823,56552,0),(27824,56553,0),(27825,56554,0),(27826,56555,0),(27827,56556,0),(27828,56557,0),(27829,56558,0),(27830,56559,0),(27831,56561,0),(27832,56562,0),(27833,56563,0),(27834,56564,0),(27835,56565,0),(27836,56566,0),(27837,56567,0),(27838,56578,0),(27839,56623,0),(27840,56624,0),(27841,56625,0),(27842,56626,0),(27843,56627,0),(27844,56628,0),(27845,56629,0),(27846,56630,0),(27847,56631,0),(27848,56632,0),(27849,56633,0),(27850,56634,0),(27851,56635,0),(27852,56636,0),(27853,56637,0),(27854,56638,0),(27855,56639,0),(27856,56640,0),(27857,56641,0),(27858,56642,0),(27859,56643,0),(27860,56644,0),(27861,56645,0),(27862,56646,0),(27863,56647,0),(27864,56648,0),(27865,56649,0),(27866,56650,0),(27867,56651,0),(27868,56652,0),(27869,56653,0),(27870,56654,0),(27871,56655,0),(27872,56656,0),(27873,56657,0),(27874,56658,0),(27875,56660,0),(27876,56661,0),(27877,56662,0),(27878,56663,0),(27879,56664,0),(27880,56665,0),(27881,56666,0),(27882,56667,0),(27883,56668,0),(27884,56669,0),(27885,56670,0),(27886,56671,0),(27887,56672,0),(27888,56673,0),(27889,56674,0),(27890,56675,0),(27891,56676,0),(27892,56677,0),(27893,56678,0),(27894,56679,0),(27895,56680,0),(27896,56681,0),(27897,56683,0),(27898,56684,0),(27899,56685,0),(27900,56686,0),(27901,56687,0),(27902,56688,0),(27903,56689,0),(27904,56690,0),(27905,56691,0),(27906,56692,0),(27907,56694,0),(27908,56695,0),(27909,56696,0),(27910,56697,0),(27911,56698,0),(27912,56699,0),(27913,56701,0),(27914,56702,0),(27915,56704,0),(27916,56705,0),(27917,56706,0),(27918,56708,0),(27919,56710,0),(27920,56711,0),(27921,56712,0),(27922,56713,0),(27923,56715,0),(27924,56716,0),(27925,56717,0),(27926,56718,0),(27927,56719,0),(27928,56720,0),(27929,56721,0),(27930,56722,0),(27931,56723,0),(27932,56724,0),(27933,56725,0),(27934,56726,0),(27935,56727,0),(27936,56728,0),(27937,56729,0),(27938,56793,0),(27939,56807,0),(27940,56817,0),(27941,56836,0),(27942,56838,0),(27943,56839,0),(27944,56840,0),(27945,56841,0),(27946,56842,0),(27947,56843,0),(27948,56844,0),(27949,56845,0),(27950,56846,0),(27951,56848,0),(27952,56852,0),(27953,56853,0),(27954,56854,0),(27955,56856,0),(27956,56857,0),(27957,56858,0),(27958,56859,0),(27959,56860,0),(27960,56861,0),(27961,56862,0),(27962,56863,0),(27963,56864,0),(27964,56865,0),(27965,56866,0),(27966,56867,0),(27967,56868,0),(27968,56869,0),(27969,56870,0),(27970,56871,0),(27971,56872,0),(27972,56873,0),(27973,56874,0),(27974,56875,0),(27975,56876,0),(27976,56877,0),(27977,56878,0),(27978,56879,0),(27979,56880,0),(27980,56881,0),(27981,56882,0),(27982,56883,0),(27983,56884,0),(27984,56885,0),(27985,56887,0),(27986,56888,0),(27987,56889,0),(27988,56893,0),(27989,56896,0),(27990,56897,0),(27991,56898,0),(27992,56899,0),(27993,56900,0),(27994,56901,0),(27995,56902,0),(27996,56903,0),(27997,56904,0),(27998,56905,0),(27999,56906,0),(28000,56907,0),(28001,56908,0),(28002,56910,0),(28003,56911,0),(28004,56912,0),(28005,56913,0),(28006,57005,0),(28007,57006,0),(28008,57007,0),(28009,57008,0),(28010,57009,0),(28011,57010,0),(28012,57011,0),(28013,57012,0),(28014,57013,0),(28015,57014,0),(28016,57015,0),(28017,57016,0),(28018,57017,0),(28019,57018,0),(28020,57019,0),(28021,57020,0),(28022,57021,0),(28023,57022,0),(28024,57023,0),(28025,57024,0),(28026,57025,0),(28027,57026,0),(28028,57027,0),(28029,57028,0),(28030,57029,0),(28031,57030,0),(28032,57031,0),(28033,57032,0),(28034,57033,0),(28035,57034,0),(28036,57035,0),(28037,57036,0),(28038,57037,0),(28039,57038,0),(28040,57039,0),(28041,57072,0),(28042,57073,0),(28043,57074,0),(28044,57075,0),(28045,57076,0),(28046,57077,0),(28047,57078,0),(28048,57079,0),(28049,57080,0),(28050,57081,0),(28051,57082,0),(28052,57083,0),(28053,57084,0),(28054,57085,0),(28055,57086,0),(28056,57087,0),(28057,57088,0),(28058,57089,0),(28059,57090,0),(28060,57091,0),(28061,57092,0),(28062,57093,0),(28063,57094,0),(28064,57095,0),(28065,57097,0),(28066,57098,0),(28067,57100,0),(28068,57101,0),(28069,57110,0),(28070,57111,0),(28071,57112,0),(28072,57113,0),(28073,57114,0),(28074,57115,0),(28075,57116,0),(28076,57120,0),(28077,57125,0),(28078,57126,0),(28079,57127,0),(28080,57128,0),(28081,57129,0),(28082,57130,0),(28083,57139,0),(28084,57143,0),(28085,57144,0),(28086,57145,0),(28087,57146,0),(28088,57147,0),(28089,57148,0),(28090,57149,0),(28091,57150,0),(28092,57151,0),(28093,57152,0),(28094,57153,0),(28095,57154,0),(28096,57155,0),(28097,57156,0),(28098,57157,0),(28099,57158,0),(28100,57159,0),(28101,57160,0),(28102,57161,0),(28103,57162,0),(28104,57163,0),(28105,57164,0),(28106,57165,0),(28107,57166,0),(28108,57167,0),(28109,57168,0),(28110,57169,0),(28111,57170,0),(28112,57171,0),(28113,57173,0),(28114,57174,0),(28115,57176,0),(28116,57186,0),(28117,57187,0),(28118,57188,0),(28119,57189,0),(28120,57195,0),(28121,57198,0),(28122,57199,0),(28123,57200,0),(28124,57201,0),(28125,57202,0),(28126,57203,0),(28127,57204,0),(28128,57205,0),(28129,57206,0),(28130,57207,0),(28131,57208,0),(28132,57209,0),(28133,57210,0),(28134,57211,0),(28135,57212,0),(28136,57213,0),(28137,57214,0),(28138,57215,0),(28139,57216,0),(28140,57217,0),(28141,57218,0),(28142,57219,0),(28143,57220,0),(28144,57221,0),(28145,57222,0),(28146,57223,0),(28147,57224,0),(28148,57225,0),(28149,57226,0),(28150,57227,0),(28151,57228,0),(28152,57229,0),(28153,57230,0),(28154,57231,0),(28155,57232,0),(28156,57233,0),(28157,57234,0),(28158,57235,0),(28159,57236,0),(28160,57237,0),(28161,57238,0),(28162,57239,0),(28163,57240,0),(28164,57241,0),(28165,57242,0),(28166,57243,0),(28167,57244,0),(28168,57248,0),(28169,57252,0),(28170,57253,0),(28171,57254,0),(28172,57255,0),(28173,57256,0),(28174,57257,0),(28175,57258,0),(28176,57260,0),(28177,57261,0),(28178,57262,0),(28179,57263,0),(28180,57264,0),(28181,57265,0),(28182,57266,0),(28183,57267,0),(28184,57268,0),(28185,57269,0),(28186,57270,0),(28187,57271,0),(28188,57272,0),(28189,57273,0),(28190,57274,0),(28191,57277,0),(28192,57278,0),(28193,57279,0),(28194,57280,0),(28195,57281,0),(28196,57282,0),(28197,57283,0),(28198,57284,0),(28199,57285,0),(28200,57286,0),(28201,57287,0),(28202,57288,0),(28203,57289,0),(28204,57290,0),(28205,57291,0),(28206,57292,0),(28207,57293,0),(28208,57294,0),(28209,57295,0),(28210,57296,0),(28211,57298,0),(28212,57300,0),(28213,57301,0),(28214,57302,0),(28215,57303,0),(28216,57304,0),(28217,57305,0),(28218,57306,0),(28219,57307,0),(28220,57308,0),(28221,57309,0),(28222,57310,0),(28223,57311,0),(28224,57312,0),(28225,57313,0),(28226,57314,0),(28227,57315,0),(28228,57317,0),(28229,57318,0),(28230,57319,0),(28231,57320,0),(28232,57321,0),(28233,57323,0),(28234,57324,0),(28235,57326,0),(28236,57327,0),(28237,57328,0),(28238,57329,0),(28239,57330,0),(28240,57332,0),(28241,57333,0),(28242,57336,0),(28243,57337,0),(28244,57339,0),(28245,57340,0),(28246,57341,0),(28247,57342,0),(28248,57343,0),(28249,57344,0),(28250,57345,0),(28251,57347,0),(28252,57348,0),(28253,57349,0),(28254,57350,0),(28255,57351,0),(28256,57352,0),(28257,57354,0),(28258,57355,0),(28259,57356,0),(28260,57357,0),(28261,57358,0),(28262,57359,0),(28263,57360,0),(28264,57361,0),(28265,57362,0),(28266,57363,0),(28267,57364,0),(28268,57365,0),(28269,57366,0),(28270,57367,0),(28271,57368,0),(28272,57369,0),(28273,57370,0),(28274,57371,0),(28275,57372,0),(28276,57373,0),(28277,57375,0),(28278,57376,0),(28279,57378,0),(28280,57379,0),(28281,57380,0),(28282,57381,0),(28283,57382,0),(28284,57384,0),(28285,57385,0),(28286,57386,0),(28287,57387,0),(28288,57388,0),(28289,57389,0),(28290,57390,0),(28291,57391,0),(28292,57392,0),(28293,57393,0),(28294,57394,0),(28295,57395,0),(28296,57396,0),(28297,57397,0),(28298,57398,0),(28299,57399,0),(28300,57400,0),(28301,57401,0),(28302,57402,0),(28303,57403,0),(28304,57404,0),(28305,57405,0),(28306,57406,0),(28307,57407,0),(28308,57410,0),(28309,57411,0),(28310,57413,0),(28311,57414,0),(28312,57415,0),(28313,57416,0),(28314,57417,0),(28315,57418,0),(28316,57419,0),(28317,57420,0),(28318,57422,0),(28319,57423,0),(28320,57425,0),(28321,57426,0),(28322,57427,0),(28323,57428,0),(28324,57429,0),(28325,57430,0),(28326,57431,0),(28327,57432,0),(28328,57433,0),(28329,57435,0),(28330,57436,0),(28331,57437,0),(28332,57438,0),(28333,57439,0),(28334,57440,0),(28335,57441,0),(28336,57443,0),(28337,57444,0),(28338,57445,0),(28339,57446,0),(28340,57447,0),(28341,57448,0),(28342,57449,0),(28343,57451,0),(28344,57452,0),(28345,57453,0),(28346,57454,0),(28347,57455,0),(28348,57456,0),(28349,57457,0),(28350,57459,0),(28351,57460,0),(28352,57461,0),(28353,57462,0),(28354,57463,0),(28355,57464,0),(28356,57466,0),(28357,57467,0),(28358,57468,0),(28359,57469,0),(28360,57470,0),(28361,57471,0),(28362,57472,0),(28363,57473,0),(28364,57474,0),(28365,57475,0),(28366,57476,0),(28367,57478,0),(28368,57479,0),(28369,57481,0),(28370,57482,0),(28371,57484,0),(28372,57485,0),(28373,57486,0),(28374,57487,0),(28375,57488,0),(28376,57490,0),(28377,57491,0),(28378,57492,0),(28379,57493,0),(28380,57494,0),(28381,57495,0),(28382,57496,0),(28383,57497,0),(28384,57498,0),(28385,57499,0),(28386,57501,0),(28387,57502,0),(28388,57503,0),(28389,57504,0),(28390,57505,0),(28391,57506,0),(28392,57507,0),(28393,57508,0),(28394,57510,0),(28395,57511,0),(28396,57512,0),(28397,57513,0),(28398,57514,0),(28399,57515,0),(28400,57516,0),(28401,57517,0),(28402,57520,0),(28403,57521,0),(28404,57522,0),(28405,57523,0),(28406,57524,0),(28407,57525,0),(28408,57526,0),(28409,57527,0),(28410,57528,0),(28411,57529,0),(28412,57530,0),(28413,57531,0),(28414,57532,0),(28415,57533,0),(28416,57534,0),(28417,57535,0),(28418,57536,0),(28419,57537,0),(28420,57538,0),(28421,57539,0),(28422,57541,0),(28423,57545,0),(28424,57546,0),(28425,57547,0),(28426,57548,0),(28427,57550,0),(28428,57551,0),(28429,57552,0),(28430,57553,0),(28431,57554,0),(28432,57555,0),(28433,57556,0),(28434,57557,0),(28435,57558,0),(28436,57559,0),(28437,57560,0),(28438,57561,0),(28439,57562,0),(28440,57563,0),(28441,57566,0),(28442,57567,0),(28443,57568,0),(28444,57569,0),(28445,57570,0),(28446,57571,0),(28447,57572,0),(28448,57574,0),(28449,57575,0),(28450,57576,0),(28451,57577,0),(28452,57578,0),(28453,57579,0),(28454,57580,0),(28455,57581,0),(28456,57582,0),(28457,57583,0),(28458,57584,0),(28459,57585,0),(28460,57682,0),(28461,57683,0),(28462,57684,0),(28463,57685,0),(28464,57686,0),(28465,57687,0),(28466,57688,0),(28467,57689,0),(28468,57690,0),(28469,57691,0),(28470,57692,0),(28471,57693,0),(28472,57694,0),(28473,57695,0),(28474,57696,0),(28475,57697,0),(28476,57698,0),(28477,57699,0),(28478,57700,0),(28479,57701,0),(28480,57702,0),(28481,57703,0),(28482,57704,0),(28483,57705,0),(28484,57706,0),(28485,57707,0),(28486,57762,0),(28487,57763,0),(28488,57767,0),(28489,57768,0),(28490,57769,0),(28491,57770,0),(28492,57771,0),(28493,57772,0),(28494,57773,0),(28495,57774,0),(28496,57775,0),(28497,57776,0),(28498,57777,0),(28499,57778,0),(28500,57779,0),(28501,57780,0),(28502,57781,0),(28503,57782,0),(28504,57783,0),(28505,57784,0),(28506,57785,0),(28507,57794,0),(28508,57795,0),(28509,57796,0),(28510,57797,0),(28511,57798,0),(28512,57799,0),(28513,57800,0),(28514,57801,0),(28515,57802,0),(28516,57803,0),(28517,57804,0),(28518,57805,0),(28519,57806,0),(28520,57807,0),(28521,57808,0),(28522,57809,0),(28523,57810,0),(28524,57811,0),(28525,57812,0),(28526,57813,0),(28527,57814,0),(28528,57815,0),(28529,57816,0),(28530,57817,0),(28531,57818,0),(28532,57819,0),(28533,57820,0),(28534,57821,0),(28535,57822,0),(28536,57823,0),(28537,57824,0),(28538,57825,0),(28539,57826,0),(28540,57828,0),(28541,57829,0),(28542,57830,0),(28543,57831,0),(28544,57832,0),(28545,57833,0),(28546,57834,0),(28547,57835,0),(28548,57836,0),(28549,57837,0),(28550,57838,0),(28551,57839,0),(28552,57840,0),(28553,57842,0),(28554,57843,0),(28555,57844,0),(28556,57845,0),(28557,57846,0),(28558,57847,0),(28559,57848,0),(28560,57849,0),(28561,57850,0),(28562,57851,0),(28563,57852,0),(28564,57853,0),(28565,57854,0),(28566,57855,0),(28567,57856,0),(28568,57857,0),(28569,57858,0),(28570,57860,0),(28571,57861,0),(28572,57862,0),(28573,57863,0),(28574,57864,0),(28575,57865,0),(28576,57866,0),(28577,57867,0),(28578,57868,0),(28579,57869,0),(28580,57870,0),(28581,57871,0),(28582,57872,0),(28583,57873,0),(28584,57874,0),(28585,57875,0),(28586,57884,0),(28587,57885,0),(28588,57886,0),(28589,57888,0),(28590,57889,0),(28591,57891,0),(28592,57892,0),(28593,57894,0),(28594,57895,0),(28595,57896,0),(28596,57898,0),(28597,57899,0),(28598,57901,0),(28599,57902,0),(28600,57903,0),(28601,57904,0),(28602,57905,0),(28603,57906,0),(28604,57907,0),(28605,57909,0),(28606,57910,0),(28607,57913,0),(28608,57914,0),(28609,57915,0),(28610,57916,0),(28611,57917,0),(28612,57918,0),(28613,57919,0),(28614,57921,0),(28615,57922,0),(28616,57923,0),(28617,57924,0),(28618,57925,0),(28619,57926,0),(28620,57927,0),(28621,57928,0),(28622,57929,0),(28623,57936,0),(28624,57937,0),(28625,57938,0),(28626,57939,0),(28627,57940,0),(28628,57941,0),(28629,57942,0),(28630,57943,0),(28631,57944,0),(28632,57945,0),(28633,57946,0),(28634,57947,0),(28635,57948,0),(28636,57949,0),(28637,57950,0),(28638,57951,0),(28639,57952,0),(28640,57953,0),(28641,57955,0),(28642,57956,0),(28643,57957,0),(28644,57958,0),(28645,57959,0),(28646,57960,0),(28647,57961,0),(28648,57962,0),(28649,57963,0),(28650,57964,0),(28651,57965,0),(28652,57966,0),(28653,57967,0),(28654,57968,0),(28655,57969,0),(28656,57970,0),(28657,57971,0),(28658,57972,0),(28659,57973,0),(28660,57974,0),(28661,57975,0),(28662,57976,0),(28663,57977,0),(28664,57978,0),(28665,57979,0),(28666,57980,0),(28667,57981,0),(28668,57982,0),(28669,57983,0),(28670,57984,0),(28671,57985,0),(28672,57986,0),(28673,57999,0),(28674,58000,0),(28675,58001,0),(28676,58002,0),(28677,58003,0),(28678,58004,0),(28679,58005,0),(28680,58006,0),(28681,58007,0),(28682,58008,0),(28683,58009,0),(28684,58010,0),(28685,58011,0),(28686,58012,0),(28687,58013,0),(28688,58014,0),(28689,58015,0),(28690,58016,0),(28691,58017,0),(28692,58018,0),(28693,58019,0),(28694,58020,0),(28695,58021,0),(28696,58022,0),(28697,58023,0),(28698,58024,0),(28699,58025,0),(28700,58026,0),(28701,58027,0),(28702,58028,0),(28703,58029,0),(28704,58030,0),(28705,58031,0),(28706,58032,0),(28707,58033,0),(28708,58034,0),(28709,58035,0),(28710,58036,0),(28711,58037,0),(28712,58038,0),(28713,58039,0),(28714,58040,0),(28715,58041,0),(28716,58042,0),(28717,58043,0),(28718,58044,0),(28719,58045,0),(28720,58046,0),(28721,58047,0),(28722,58048,0),(28723,58049,0),(28724,58050,0),(28725,58051,0),(28726,58052,0),(28727,58053,0),(28728,58054,0),(28729,58055,0),(28730,58056,0),(28731,58057,0),(28732,58058,0),(28733,58059,0),(28734,58060,0),(28735,58061,0),(28736,58062,0),(28737,58063,0),(28738,58064,0),(28739,58065,0),(28740,58066,0),(28741,58067,0),(28742,58068,0),(28743,58069,0),(28744,58070,0),(28745,58071,0),(28746,58072,0),(28747,58073,0),(28748,58074,0),(28749,58075,0),(28750,58076,0),(28751,58077,0),(28752,58078,0),(28753,58079,0),(28754,58096,0),(28755,58097,0),(28756,58098,0),(28757,58099,0),(28758,58100,0),(28759,58101,0),(28760,58102,0),(28761,58103,0),(28762,58104,0),(28763,58105,0),(28764,58106,0),(28765,58107,0),(28766,58108,0),(28767,58109,0),(28768,58110,0),(28769,58119,0),(28770,58121,0),(28771,58122,0),(28772,58123,0),(28773,58124,0),(28774,58125,0),(28775,58126,0),(28776,58127,0),(28777,58128,0),(28778,58129,0),(28779,58130,0),(28780,58131,0),(28781,58132,0),(28782,58133,0),(28783,58134,0),(28784,58135,0),(28785,58136,0),(28786,58137,0),(28787,58138,0),(28788,58139,0),(28789,58140,0),(28790,58150,0),(28791,58151,0),(28792,58152,0),(28793,58153,0),(28794,58154,0),(28795,58155,0),(28796,58157,0),(28797,58158,0),(28798,58159,0),(28799,58160,0),(28800,58161,0),(28801,58162,0),(28802,58163,0),(28803,58164,0),(28804,58172,0),(28805,58173,0),(28806,58174,0),(28807,58175,0),(28808,58176,0),(28809,58190,0),(28810,58191,0),(28811,58192,0),(28812,58193,0),(28813,58194,0),(28814,58195,0),(28815,58196,0),(28816,58197,0),(28817,58198,0),(28818,58199,0),(28819,58208,0),(28820,58216,0),(28821,58217,0),(28822,58231,0),(28823,58232,0),(28824,58233,0),(28825,58234,0),(28826,58235,0),(28827,58237,0),(28828,58238,0),(28829,58240,0),(28830,58242,0),(28831,58243,0),(28832,58244,0),(28833,58245,0),(28834,58246,0),(28835,58247,0),(28836,58248,0),(28837,58255,0),(28838,58270,0),(28839,58272,0),(28840,58273,0),(28841,58283,0),(28842,58284,0),(28843,58285,0),(28844,58286,0),(28845,58287,0),(28846,58288,0),(28847,58289,0),(28848,58290,0),(28849,58291,0),(28850,58293,0),(28851,58294,0),(28852,58295,0),(28853,58296,0),(28854,58297,0),(28855,58298,0),(28856,58299,0),(28857,58300,0),(28858,58301,0),(28859,58302,0),(28860,58303,0),(28861,58304,0),(28862,58305,0),(28863,58306,0),(28864,58307,0),(28865,58308,0),(28866,58309,0),(28867,58310,0),(28868,58311,0),(28869,58312,0),(28870,58313,0),(28871,58314,0),(28872,58315,0),(28873,58316,0),(28874,58317,0),(28875,58318,0),(28876,58319,0),(28877,58320,0),(28878,58321,0),(28879,58322,0),(28880,58323,0),(28881,58324,0),(28882,58325,0),(28883,58326,0),(28884,58327,0),(28885,58328,0),(28886,58329,0),(28887,58330,0),(28888,58331,0),(28889,58332,0),(28890,58333,0),(28891,58334,0),(28892,58335,0),(28893,58336,0),(28894,58337,0),(28895,58338,0),(28896,58339,0),(28897,58340,0),(28898,58341,0),(28899,58342,0),(28900,58343,0),(28901,58344,0),(28902,58345,0),(28903,58346,0),(28904,58347,0),(28905,58348,0),(28906,58349,0),(28907,58350,0),(28908,58351,0),(28909,58352,0),(28910,58353,0),(28911,58354,0),(28912,58355,0),(28913,58356,0),(28914,58357,0),(28915,58358,0),(28916,58367,0),(28917,58368,0),(28918,58369,0),(28919,58370,0),(28920,58371,0),(28921,58372,0),(28922,58373,0),(28923,58374,0),(28924,58375,0),(28925,58376,0),(28926,58377,0),(28927,58378,0),(28928,58379,0),(28929,58380,0),(28930,58381,0),(28931,58382,0),(28932,58383,0),(28933,58384,0),(28934,58385,0),(28935,58386,0),(28936,58387,0),(28937,58388,0),(28938,58389,0),(28939,58390,0),(28940,58391,0),(28941,58392,0),(28942,58393,0),(28943,58394,0),(28944,58395,0),(28945,58396,0),(28946,58397,0),(28947,58398,0),(28948,58399,0),(28949,58400,0),(28950,58402,0),(28951,58403,0),(28952,58404,0),(28953,58405,0),(28954,58406,0),(28955,58407,0),(28956,58408,0),(28957,58409,0),(28958,58410,0),(28959,58412,0),(28960,58413,0),(28961,58414,0),(28962,58415,0),(28963,58416,0),(28964,58417,0),(28965,58418,0),(28966,58419,0),(28967,58420,0),(28968,58421,0),(28969,58422,0),(28970,58423,0),(28971,58424,0),(28972,58425,0),(28973,58426,0),(28974,58427,0),(28975,58428,0),(28976,58429,0),(28977,58430,0),(28978,58431,0),(28979,58432,0),(28980,58433,0),(28981,58434,0),(28982,58435,0),(28983,58436,0),(28984,58437,0),(28985,58438,0),(28986,58439,0),(28987,58440,0),(28988,58441,0),(28989,58442,0),(28990,58443,0),(28991,58444,0),(28992,58445,0),(28993,58446,0),(28994,58447,0),(28995,58448,0),(28996,58449,0),(28997,58450,0),(28998,58451,0),(28999,58452,0),(29000,58453,0),(29001,58454,0),(29002,58455,0),(29003,58456,0),(29004,58457,0),(29005,58458,0),(29006,58459,0),(29007,58460,0),(29008,58461,0),(29009,58462,0),(29010,58463,0),(29011,58464,0),(29012,58465,0),(29013,58466,0),(29014,58467,0),(29015,58468,0),(29016,58469,0),(29017,58470,0),(29018,58471,0),(29019,58472,0),(29020,58473,0),(29021,58474,0),(29022,58475,0),(29023,58476,0),(29024,58477,0),(29025,58478,0),(29026,58479,0),(29027,58481,0),(29028,58482,0),(29029,58484,0),(29030,58485,0),(29031,58486,0),(29032,58499,0),(29033,58505,0),(29034,58506,0),(29035,58507,0),(29036,58510,0),(29037,58511,0),(29038,58512,0),(29039,58513,0),(29040,58514,0),(29041,58515,0),(29042,58517,0),(29043,58518,0),(29044,58520,0),(29045,58521,0),(29046,58522,0),(29047,58523,0),(29048,58524,0),(29049,58526,0),(29050,58527,0),(29051,58530,0),(29052,58531,0),(29053,58532,0),(29054,58533,0),(29055,58534,0),(29056,58535,0),(29057,58537,0),(29058,58539,0),(29059,58540,0),(29060,58541,0),(29061,58542,0),(29062,58544,0),(29063,58545,0),(29064,58546,0),(29065,58547,0),(29066,58548,0),(29067,58549,0),(29068,58550,0),(29069,58551,0),(29070,58552,0),(29071,58554,0),(29072,58555,0),(29073,58556,0),(29074,58557,0),(29075,58558,0),(29076,58559,0),(29077,58560,0),(29078,58561,0),(29079,58562,0),(29080,58563,0),(29081,58564,0),(29082,58565,0),(29083,58566,0),(29084,58567,0),(29085,58568,0),(29086,58569,0),(29087,58570,0),(29088,58571,0),(29089,58572,0),(29090,58573,0),(29091,58574,0),(29092,58575,0),(29093,58576,0),(29094,58577,0),(29095,58578,0),(29096,58579,0),(29097,58580,0),(29098,58581,0),(29099,58582,0),(29100,58583,0),(29101,58584,0),(29102,58585,0),(29103,58586,0),(29104,58587,0),(29105,58588,0),(29106,58589,0),(29107,58590,0),(29108,58591,0),(29109,58592,0),(29110,58593,0),(29111,58594,0),(29112,58595,0),(29113,58596,0),(29114,58597,0),(29115,58600,0),(29116,58601,0),(29117,58602,0),(29118,58604,0),(29119,58605,0),(29120,58606,0),(29121,58609,0),(29122,58610,0),(29123,58611,0),(29124,58615,0),(29125,58616,0),(29126,58617,0),(29127,58618,0),(29128,58619,0),(29129,58621,0),(29130,58623,0),(29131,58624,0),(29132,58627,0),(29133,58628,0),(29134,58629,0),(29135,58630,0),(29136,58632,0),(29137,58633,0),(29138,58634,0),(29139,58637,0),(29140,58638,0),(29141,58639,0),(29142,58641,0),(29143,58642,0),(29144,58643,0),(29145,58644,0),(29146,58645,0),(29147,58646,0),(29148,58647,0),(29149,58650,0),(29150,58651,0),(29151,58652,0),(29152,58655,0),(29153,58657,0),(29154,58658,0),(29155,58660,0),(29156,58661,0),(29157,58662,0),(29158,58665,0),(29159,58668,0),(29160,58669,0),(29161,58671,0),(29162,58672,0),(29163,58675,0),(29164,58676,0),(29165,58677,0),(29166,58678,0),(29167,58679,0),(29168,58680,0),(29169,58681,0),(29170,58682,0),(29171,58683,0),(29172,58684,0),(29173,58685,0),(29174,58686,0),(29175,58687,0),(29176,58688,0),(29177,58690,0),(29178,58691,0),(29179,58692,0),(29180,58695,0),(29181,58696,0),(29182,58697,0),(29183,58698,0),(29184,58700,0),(29185,58702,0),(29186,58703,0),(29187,58704,0),(29188,58705,0),(29189,58707,0),(29190,58708,0),(29191,58710,0),(29192,58711,0),(29193,58713,0),(29194,58716,0),(29195,58717,0),(29196,58718,0),(29197,58720,0),(29198,58722,0),(29199,58723,0),(29200,58724,0),(29201,58726,0),(29202,58728,0),(29203,58729,0),(29204,58730,0),(29205,58731,0),(29206,58733,0),(29207,58735,0),(29208,58736,0),(29209,58738,0),(29210,58739,0),(29211,58740,0),(29212,58741,0),(29213,58743,0),(29214,58746,0),(29215,58747,0),(29216,58749,0),(29217,58750,0),(29218,58751,0),(29219,58752,0),(29220,58753,0),(29221,58754,0),(29222,58756,0),(29223,58757,0),(29224,58758,0),(29225,58759,0),(29226,58760,0),(29227,58762,0),(29228,58763,0),(29229,58767,0),(29230,58768,0),(29231,58769,0),(29232,58771,0),(29233,58773,0),(29234,58775,0),(29235,58778,0),(29236,58789,0),(29237,58790,0),(29238,58791,0),(29239,58792,0),(29240,58793,0),(29241,58794,0),(29242,58795,0),(29243,58796,0),(29244,58797,0),(29245,58799,0),(29246,58800,0),(29247,58801,0),(29248,58802,0),(29249,58803,0),(29250,58804,0),(29251,58805,0),(29252,58837,0),(29253,58838,0),(29254,58839,0),(29255,58840,0),(29256,58841,0),(29257,58842,0),(29258,58843,0),(29259,58844,0),(29260,58846,0),(29261,58871,0),(29262,58873,0),(29263,58902,0),(29264,58903,0),(29265,58904,0),(29266,58905,0),(29267,58906,0),(29268,58907,0),(29269,58908,0),(29270,58909,0),(29271,58910,0),(29272,58911,0),(29273,58912,0),(29274,58913,0),(29275,58914,0),(29276,58915,0),(29277,58916,0),(29278,58917,0),(29279,58918,0),(29280,58919,0),(29281,58920,0),(29282,58921,0),(29283,58922,0),(29284,58923,0),(29285,58924,0),(29286,58925,0),(29287,58926,0),(29288,58927,0),(29289,58928,0),(29290,58929,0),(29291,58930,0),(29292,58931,0),(29293,58938,0),(29294,58939,0),(29295,58940,0),(29296,58941,0),(29297,58942,0),(29298,58943,0),(29299,58947,0),(29300,58948,0),(29301,58968,0),(29302,58970,0),(29303,58971,0),(29304,58972,0),(29305,58973,0),(29306,58974,0),(29307,58975,0),(29308,58976,0),(29309,58977,0),(29310,58978,0),(29311,58979,0),(29312,58980,0),(29313,58981,0),(29314,58982,0),(29315,58983,0),(29316,58984,0),(29317,58985,0),(29318,58986,0),(29319,58987,0),(29320,58988,0),(29321,58989,0),(29322,58990,0),(29323,58991,0),(29324,58992,0),(29325,58993,0),(29326,58994,0),(29327,58995,0),(29328,58996,0),(29329,58997,0),(29330,58998,0),(29331,58999,0),(29332,59000,0),(29333,59001,0),(29334,59002,0),(29335,59003,0),(29336,59004,0),(29337,59005,0),(29338,59006,0),(29339,59007,0),(29340,59008,0),(29341,59009,0),(29342,59010,0),(29343,59011,0),(29344,59012,0),(29345,59013,0),(29346,59014,0),(29347,59015,0),(29348,59016,0),(29349,59017,0),(29350,59021,0),(29351,59022,0),(29352,59023,0),(29353,59024,0),(29354,59025,0),(29355,59026,0),(29356,59027,0),(29357,59038,0),(29358,59039,0),(29359,59040,0),(29360,59041,0),(29361,59042,0),(29362,59043,0),(29363,59044,0),(29364,59045,0),(29365,59046,0),(29366,59047,0),(29367,59048,0),(29368,59049,0),(29369,59050,0),(29370,59051,0),(29371,59052,0),(29372,59063,0),(29373,59064,0),(29374,59065,0),(29375,59066,0),(29376,59067,0),(29377,59068,0),(29378,59069,0),(29379,59070,0),(29380,59071,0),(29381,59072,0),(29382,59073,0),(29383,59074,0),(29384,59075,0),(29385,59076,0),(29386,59077,0),(29387,59078,0),(29388,59079,0),(29389,59080,0),(29390,59081,0),(29391,59082,0),(29392,59083,0),(29393,59084,0),(29394,59085,0),(29395,59086,0),(29396,59087,0),(29397,59088,0),(29398,59089,0),(29399,59090,0),(29400,59091,0),(29401,59092,0),(29402,59093,0),(29403,59094,0),(29404,59095,0),(29405,59096,0),(29406,59097,0),(29407,59098,0),(29408,59099,0),(29409,59100,0),(29410,59101,0),(29411,59102,0),(29412,59103,0),(29413,59104,0),(29414,59105,0),(29415,59106,0),(29416,59107,0),(29417,59108,0),(29418,59109,0),(29419,59110,0),(29420,59111,0),(29421,59112,0),(29422,59113,0),(29423,59117,0),(29424,59118,0),(29425,59119,0),(29426,59120,0),(29427,59122,0),(29428,59140,0),(29429,59141,0),(29430,59158,0),(29431,59159,0),(29432,59160,0),(29433,59161,0),(29434,59162,0),(29435,59163,0),(29436,59164,0),(29437,59165,0),(29438,59166,0),(29439,59167,0),(29440,59168,0),(29441,59169,0),(29442,59170,0),(29443,59171,0),(29444,59172,0),(29445,59173,0),(29446,59174,0),(29447,59175,0),(29448,59176,0),(29449,59177,0),(29450,59178,0),(29451,59179,0),(29452,59180,0),(29453,59181,0),(29454,59182,0),(29455,59183,0),(29456,59184,0),(29457,59185,0),(29458,59186,0),(29459,59187,0),(29460,59188,0),(29461,59189,0),(29462,59190,0),(29463,59191,0),(29464,59192,0),(29465,59193,0),(29466,59194,0),(29467,59195,0),(29468,59196,0),(29469,59197,0),(29470,59199,0),(29471,59200,0),(29472,59203,0),(29473,59204,0),(29474,59205,0),(29475,59206,0),(29476,59207,0),(29477,59208,0),(29478,59209,0),(29479,59210,0),(29480,59211,0),(29481,59212,0),(29482,59213,0),(29483,59214,0),(29484,59215,0),(29485,59216,0),(29486,59217,0),(29487,59218,0),(29488,59219,0),(29489,59221,0),(29490,59222,0),(29491,59223,0),(29492,59225,0),(29493,59234,0),(29494,59236,0),(29495,59237,0),(29496,59238,0),(29497,59239,0),(29498,59240,0),(29499,59241,0),(29500,59242,0),(29501,59243,0),(29502,59244,0),(29503,59245,0),(29504,59246,0),(29505,59247,0),(29506,59249,0),(29507,59251,0),(29508,59252,0),(29509,59253,0),(29510,59254,0),(29511,59255,0),(29512,59256,0),(29513,59257,0),(29514,59258,0),(29515,59259,0),(29516,59260,0),(29517,59262,0),(29518,59263,0),(29519,59264,0),(29520,59265,0),(29521,59266,0),(29522,59267,0),(29523,59268,0),(29524,59269,0),(29525,59270,0),(29526,59271,0),(29527,59272,0),(29528,59274,0),(29529,59275,0),(29530,59276,0),(29531,59277,0),(29532,59278,0),(29533,59279,0),(29534,59280,0),(29535,59281,0),(29536,59282,0),(29537,59283,0),(29538,59284,0),(29539,59285,0),(29540,59286,0),(29541,59287,0),(29542,59288,0),(29543,59290,0),(29544,59291,0),(29545,59292,0),(29546,59294,0),(29547,59295,0),(29548,59296,0),(29549,59297,0),(29550,59298,0),(29551,59299,0),(29552,59300,0),(29553,59301,0),(29554,59302,0),(29555,59303,0),(29556,59304,0),(29557,59305,0),(29558,59306,0),(29559,59307,0),(29560,59308,0),(29561,59309,0),(29562,59310,0),(29563,59311,0),(29564,59312,0),(29565,59313,0),(29566,59314,0),(29567,59315,0),(29568,59316,0),(29569,59317,0),(29570,59318,0),(29571,59320,0),(29572,59321,0),(29573,59322,0),(29574,59324,0),(29575,59325,0),(29576,59327,0),(29577,59328,0),(29578,59329,0),(29579,59330,0),(29580,59331,0),(29581,59333,0),(29582,59334,0),(29583,59335,0),(29584,59336,0),(29585,59337,0),(29586,59340,0),(29587,59341,0),(29588,59342,0),(29589,59343,0),(29590,59344,0),(29591,59346,0),(29592,59347,0),(29593,59348,0),(29594,59349,0),(29595,59350,0),(29596,59351,0),(29597,59352,0),(29598,59353,0),(29599,59355,0),(29600,59356,0),(29601,59359,0),(29602,59364,0),(29603,59367,0),(29604,59368,0),(29605,59369,0),(29606,59370,0),(29607,59371,0),(29608,59372,0),(29609,59373,0),(29610,59374,0),(29611,59375,0),(29612,59376,0),(29613,59377,0),(29614,59378,0),(29615,59379,0),(29616,59380,0),(29617,59381,0),(29618,59382,0),(29619,59383,0),(29620,59384,0),(29621,59385,0),(29622,59386,0),(29623,59387,0),(29624,59388,0),(29625,59389,0),(29626,59390,0),(29627,59391,0),(29628,59392,0),(29629,59393,0),(29630,59394,0),(29631,59395,0),(29632,59399,0),(29633,59400,0),(29634,59401,0),(29635,59402,0),(29636,59403,0),(29637,59404,0),(29638,59406,0),(29639,59407,0),(29640,59408,0),(29641,59409,0),(29642,59410,0),(29643,59411,0),(29644,59412,0),(29645,59413,0),(29646,59414,0),(29647,59415,0),(29648,59416,0),(29649,59417,0),(29650,59418,0),(29651,59419,0),(29652,59420,0),(29653,59421,0),(29654,59422,0),(29655,59423,0),(29656,59424,0),(29657,59425,0),(29658,59426,0),(29659,59427,0),(29660,59428,0),(29661,59429,0),(29662,59430,0),(29663,59431,0),(29664,59432,0),(29665,59433,0),(29666,59437,0),(29667,59438,0),(29668,59439,0),(29669,59440,0),(29670,59443,0),(29671,59444,0),(29672,59448,0),(29673,59449,0),(29674,59450,0),(29675,59451,0),(29676,59452,0),(29677,59453,0),(29678,59454,0),(29679,59455,0),(29680,59456,0),(29681,59457,0),(29682,59458,0),(29683,59459,0),(29684,59460,0),(29685,59462,0),(29686,59463,0),(29687,59464,0),(29688,59465,0),(29689,59466,0),(29690,59467,0),(29691,59468,0),(29692,59469,0),(29693,59470,0),(29694,59471,0),(29695,59472,0),(29696,59474,0),(29697,59475,0),(29698,59476,0),(29699,59481,0),(29700,59482,0),(29701,59484,0),(29702,59485,0),(29703,59486,0),(29704,59487,0),(29705,59490,0),(29706,59492,0),(29707,59494,0),(29708,59495,0),(29709,59497,0),(29710,59498,0),(29711,59499,0),(29712,59502,0),(29713,59503,0),(29714,59504,0),(29715,59505,0),(29716,59507,0),(29717,59508,0),(29718,59509,0),(29719,59510,0),(29720,59511,0),(29721,59513,0),(29722,59516,0),(29723,59521,0),(29724,59525,0),(29725,59526,0),(29726,59529,0),(29727,59530,0),(29728,59531,0),(29729,59532,0),(29730,59533,0),(29731,59534,0),(29732,59535,0),(29733,59536,0),(29734,59537,0),(29735,59538,0),(29736,59539,0),(29737,59540,0),(29738,59541,0),(29739,59542,0),(29740,59543,0),(29741,59544,0),(29742,59545,0),(29743,59546,0),(29744,59547,0),(29745,59548,0),(29746,59549,0),(29747,59550,0),(29748,59551,0),(29749,59552,0),(29750,59553,0),(29751,59554,0),(29752,59555,0),(29753,59556,0),(29754,59557,0),(29755,59558,0),(29756,59559,0),(29757,59560,0),(29758,59561,0),(29759,59562,0),(29760,59563,0),(29761,59564,0),(29762,59565,0),(29763,59566,0),(29764,59567,0),(29765,59568,0),(29766,59569,0),(29767,59570,0),(29768,59571,0),(29769,59572,0),(29770,59573,0),(29771,59574,0),(29772,59575,0),(29773,59576,0),(29774,59577,0),(29775,59578,0),(29776,59579,0),(29777,59580,0),(29778,59581,0),(29779,59582,0),(29780,59583,0),(29781,59584,0),(29782,59585,0),(29783,59586,0),(29784,59587,0),(29785,59591,0),(29786,59592,0),(29787,59593,0),(29788,59598,0),(29789,59599,0),(29790,59600,0),(29791,59601,0),(29792,59603,0),(29793,59604,0),(29794,59606,0),(29795,59608,0),(29796,59609,0),(29797,59610,0),(29798,59611,0),(29799,59612,0),(29800,59613,0),(29801,59614,0),(29802,59615,0),(29803,59616,0),(29804,59618,0),(29805,59620,0),(29806,59621,0),(29807,59622,0),(29808,59623,0),(29809,59624,0),(29810,59625,0),(29811,59627,0),(29812,59628,0),(29813,59629,0),(29814,59631,0),(29815,59632,0),(29816,59634,0),(29817,59636,0),(29818,59639,0),(29819,59641,0),(29820,59642,0),(29821,59643,0),(29822,59644,0),(29823,59645,0),(29824,59646,0),(29825,59647,0),(29826,59648,0),(29827,59649,0),(29828,59650,0),(29829,59651,0),(29830,59652,0),(29831,59653,0),(29832,59654,0),(29833,59655,0),(29834,59656,0),(29835,59657,0),(29836,59658,0),(29837,59659,0),(29838,59660,0),(29839,59662,0),(29840,59663,0),(29841,59666,0),(29842,59667,0),(29843,59670,0),(29844,59671,0),(29845,59673,0),(29846,59674,0),(29847,59675,0),(29848,59676,0),(29849,59677,0),(29850,59678,0),(29851,59679,0),(29852,59680,0),(29853,59681,0),(29854,59682,0),(29855,59683,0),(29856,59684,0),(29857,59686,0),(29858,59687,0),(29859,59688,0),(29860,59690,0),(29861,59691,0),(29862,59692,0),(29863,59693,0),(29864,59694,0),(29865,59695,0),(29866,59696,0),(29867,59697,0),(29868,59698,0),(29869,59699,0),(29870,59700,0),(29871,59701,0),(29872,59702,0),(29873,59703,0),(29874,59704,0),(29875,59705,0),(29876,59706,0),(29877,59708,0),(29878,59709,0),(29879,59711,0),(29880,59712,0),(29881,59713,0),(29882,59714,0),(29883,59715,0),(29884,59716,0),(29885,59717,0),(29886,59718,0),(29887,59720,0),(29888,59721,0),(29889,59723,0),(29890,59724,0),(29891,59725,0),(29892,59726,0),(29893,59727,0),(29894,59728,0),(29895,59729,0),(29896,59730,0),(29897,59731,0),(29898,59732,0),(29899,59733,0),(29900,59734,0),(29901,59735,0),(29902,59736,0),(29903,59737,0),(29904,59738,0),(29905,59739,0),(29906,59740,0),(29907,59741,0),(29908,59743,0),(29909,59744,0),(29910,59746,0),(29911,59747,0),(29912,59748,0),(29913,59749,0),(29914,59750,0),(29915,59751,0),(29916,59752,0),(29917,59753,0),(29918,59754,0),(29919,59755,0),(29920,59756,0),(29921,59757,0),(29922,59758,0),(29923,59759,0),(29924,59760,0),(29925,59761,0),(29926,59762,0),(29927,59763,0),(29928,59764,0),(29929,59765,0),(29930,59766,0),(29931,59767,0),(29932,59768,0),(29933,59769,0),(29934,59770,0),(29935,59771,0),(29936,59772,0),(29937,59773,0),(29938,59774,0),(29939,59775,0),(29940,59776,0),(29941,59777,0),(29942,59778,0),(29943,59779,0),(29944,59780,0),(29945,59781,0),(29946,59783,0),(29947,59784,0),(29948,59785,0),(29949,59786,0),(29950,59787,0),(29951,59788,0),(29952,59789,0),(29953,59790,0),(29954,59791,0),(29955,59795,0),(29956,59796,0),(29957,59797,0),(29958,59798,0),(29959,59799,0),(29960,59800,0),(29961,59801,0),(29962,59802,0),(29963,59803,0),(29964,59804,0),(29965,59805,0),(29966,59806,0),(29967,59807,0),(29968,59808,0),(29969,59809,0),(29970,59810,0),(29971,59901,0),(29972,60201,0),(29973,60202,0),(29974,60208,0),(29975,60209,0),(29976,60210,0),(29977,60211,0),(29978,60219,0),(29979,60220,0),(29980,60221,0),(29981,60222,0),(29982,60228,0),(29983,60229,0),(29984,60230,0),(29985,60231,0),(29986,60232,0),(29987,60234,0),(29988,60235,0),(29989,60236,0),(29990,60237,0),(29991,60238,0),(29992,60243,0),(29993,60244,0),(29994,60245,0),(29995,60246,0),(29996,60247,0),(29997,60248,0),(29998,60249,0),(29999,60250,0),(30000,60251,0),(30001,60252,0),(30002,60253,0),(30003,60254,0),(30004,60255,0),(30005,60256,0),(30006,60257,0),(30007,60258,0),(30008,60259,0),(30009,60261,0),(30010,60262,0),(30011,60275,0),(30012,60276,0),(30013,60277,0),(30014,60278,0),(30015,60279,0),(30016,60280,0),(30017,60281,0),(30018,60282,0),(30019,60283,0),(30020,60284,0),(30021,60285,0),(30022,60286,0),(30023,60287,0),(30024,60288,0),(30025,60289,0),(30026,60290,0),(30027,60292,0),(30028,60293,0),(30029,60294,0),(30030,60298,0),(30031,60299,0),(30032,60300,0),(30033,60301,0),(30034,60302,0),(30035,60303,0),(30036,60304,0),(30037,60305,0),(30038,60306,0),(30039,60307,0),(30040,60308,0),(30041,60309,0),(30042,60310,0),(30043,60311,0),(30044,60312,0),(30045,60313,0),(30046,60314,0),(30047,60315,0),(30048,60316,0),(30049,60317,0),(30050,60318,0),(30051,60319,0),(30052,60320,0),(30053,60321,0),(30054,60322,0),(30055,60323,0),(30056,60324,0),(30057,60325,0),(30058,60326,0),(30059,60327,0),(30060,60328,0),(30061,60329,0),(30062,60330,0),(30063,60331,0),(30064,60332,0),(30065,60338,0),(30066,60339,0),(30067,60340,0),(30068,60341,0),(30069,60342,0),(30070,60343,0),(30071,60344,0),(30072,60345,0),(30073,60346,0),(30074,60347,0),(30075,60348,0),(30076,60349,0),(30077,60350,0),(30078,60351,0),(30079,60352,0),(30080,60353,0),(30081,60354,0),(30082,60355,0),(30083,60356,0),(30084,60357,0),(30085,60358,0),(30086,60359,0),(30087,60360,0),(30088,60361,0),(30089,60362,0),(30090,60363,0),(30091,60408,0),(30092,60409,0),(30093,60410,0),(30094,60411,0),(30095,60412,0),(30096,60413,0),(30097,60414,0),(30098,60415,0),(30099,60416,0),(30100,60417,0),(30101,60418,0),(30102,60419,0),(30103,60420,0),(30104,60421,0),(30105,60422,0),(30106,60423,0),(30107,60424,0),(30108,60425,0),(30109,60426,0),(30110,60427,0),(30111,60428,0),(30112,60429,0),(30113,60430,0),(30114,60431,0),(30115,60432,0),(30116,60433,0),(30117,60434,0),(30118,60435,0),(30119,60436,0),(30120,60437,0),(30121,60438,0),(30122,60439,0),(30123,60440,0),(30124,60441,0),(30125,60442,0),(30126,60443,0),(30127,60444,0),(30128,60445,0),(30129,60446,0),(30130,60447,0),(30131,60448,0),(30132,60449,0),(30133,60450,0),(30134,60451,0),(30135,60452,0),(30136,60453,0),(30137,60454,0),(30138,60455,0),(30139,60456,0),(30140,60457,0),(30141,60458,0),(30142,60459,0),(30143,60460,0),(30144,60461,0),(30145,60462,0),(30146,60463,0),(30147,60464,0),(30148,60465,0),(30149,60466,0),(30150,60467,0),(30151,60468,0),(30152,60469,0),(30153,60470,0),(30154,60471,0),(30155,60472,0),(30156,60473,0),(30157,60474,0),(30158,60475,0),(30159,60476,0),(30160,60477,0),(30161,60478,0),(30162,60479,0),(30163,60480,0),(30164,60481,0),(30165,60482,0),(30166,60492,0),(30167,60505,0),(30168,60506,0),(30169,60507,0),(30170,60508,0),(30171,60509,0),(30172,60510,0),(30173,60512,0),(30174,60513,0),(30175,60514,0),(30176,60515,0),(30177,60516,0),(30178,60517,0),(30179,60518,0),(30180,60519,0),(30181,60520,0),(30182,60521,0),(30183,60522,0),(30184,60523,0),(30185,60524,0),(30186,60525,0),(30187,60526,0),(30188,60527,0),(30189,60528,0),(30190,60529,0),(30191,60533,0),(30192,60534,0),(30193,60535,0),(30194,60536,0),(30195,60537,0),(30196,60538,0),(30197,60539,0),(30198,60540,0),(30199,60541,0),(30200,60551,0),(30201,60552,0),(30202,60553,0),(30203,60554,0),(30204,60555,0),(30205,60556,0),(30206,60557,0),(30207,60558,0),(30208,60559,0),(30209,60560,0),(30210,60561,0),(30211,60562,0),(30212,60563,0),(30213,60564,0),(30214,60565,0),(30215,60566,0),(30216,60567,0),(30217,60568,0),(30218,60569,0),(30219,60570,0),(30220,60571,0),(30221,60580,0),(30222,60581,0),(30223,60582,0),(30224,60583,0),(30225,60584,0),(30226,60585,0),(30227,60586,0),(30228,60587,0),(30229,60588,0),(30230,60589,0),(30231,60590,0),(30232,60591,0),(30233,60592,0),(30234,60593,0),(30235,60594,0),(30236,60595,0),(30237,60596,0),(30238,60597,0),(30239,60598,0),(30240,60599,0),(30241,60600,0),(30242,60601,0),(30243,60602,0),(30244,60603,0),(30245,60604,0),(30246,60605,0),(30247,60606,0),(30248,60607,0),(30249,60608,0),(30250,60609,0),(30251,60610,0),(30252,60611,0),(30253,60612,0),(30254,60613,0),(30255,60614,0),(30256,60616,0),(30257,60617,0),(30258,60618,0),(30259,60619,0),(30260,60620,0),(30261,60621,0),(30262,60622,0),(30263,60623,0),(30264,60624,0),(30265,60625,0),(30266,60626,0),(30267,60627,0),(30268,60628,0),(30269,60629,0),(30270,60630,0),(30271,60631,0),(30272,60632,0),(30273,60633,0),(30274,60634,0),(30275,60635,0),(30276,60636,0),(30277,60637,0),(30278,60639,0),(30279,60640,0),(30280,60641,0),(30281,60642,0),(30282,60682,0),(30283,60683,0),(30284,60684,0),(30285,60685,0),(30286,60686,0),(30287,60687,0),(30288,60688,0),(30289,60689,0),(30290,60690,0),(30291,60691,0),(30292,60692,0),(30293,60693,0),(30294,60694,0),(30295,60695,0),(30296,60696,0),(30297,60697,0),(30298,60698,0),(30299,60699,0),(30300,60700,0),(30301,60701,0),(30302,60702,0),(30303,60703,0),(30304,60704,0),(30305,60705,0),(30306,60706,0),(30307,60707,0),(30308,60708,0),(30309,60709,0),(30310,60710,0),(30311,60711,0),(30312,60712,0),(30313,60713,0),(30314,60714,0),(30315,60715,0),(30316,60716,0),(30317,60717,0),(30318,60718,0),(30319,60719,0),(30320,60720,0),(30321,60721,0),(30322,60722,0),(30323,60723,0),(30324,60724,0),(30325,60725,0),(30326,60726,0),(30327,60727,0),(30328,60728,0),(30329,60729,0),(30330,60734,0),(30331,60746,0),(30332,60759,0),(30333,60764,0),(30334,60765,0),(30335,60769,0),(30336,60774,0),(30337,60775,0),(30338,60776,0),(30339,60777,0),(30340,60778,0),(30341,60779,0),(30342,60780,0),(30343,60781,0),(30344,60782,0),(30345,60783,0),(30346,60784,0),(30347,60785,0),(30348,60786,0),(30349,60787,0),(30350,60788,0),(30351,60789,0),(30352,60790,0),(30353,60812,0),(30354,60813,0),(30355,60820,0),(30356,60821,0),(30357,60822,0),(30358,60823,0),(30359,60824,0),(30360,60825,0),(30361,60826,0),(30362,60827,0),(30363,60828,0),(30364,60829,0),(30365,60830,0),(30366,60836,0),(30367,60846,0),(30368,60884,0),(30369,60887,0),(30370,60888,0),(30371,60889,0),(30372,60890,0),(30373,60892,0),(30374,60894,0),(30375,60896,0),(30376,60897,0),(30377,60899,0),(30378,60900,0),(30379,60901,0),(30380,60902,0),(30381,60903,0),(30382,60906,0),(30383,60907,0),(30384,60908,0),(30385,60909,0),(30386,60911,0),(30387,60912,0),(30388,60913,0),(30389,60914,0),(30390,60915,0),(30391,60916,0),(30392,60917,0),(30393,60918,0),(30394,60919,0),(30395,60920,0),(30396,60921,0),(30397,60922,0),(30398,60923,0),(30399,60924,0),(30400,60925,0),(30401,60926,0),(30402,60927,0),(30403,60928,0),(30404,60929,0),(30405,60930,0),(30406,60931,0),(30407,60932,0),(30408,60933,0),(30409,60934,0),(30410,60935,0),(30411,60937,0),(30412,60939,0),(30413,60940,0),(30414,60941,0),(30415,60942,0),(30416,60951,0),(30417,60952,0),(30418,60957,0),(30419,60960,0),(30420,60961,0),(30421,60962,0),(30422,60963,0),(30423,60964,0),(30424,60965,0),(30425,60966,0),(30426,60967,0),(30427,60968,0),(30428,60969,0),(30429,60970,0),(30430,60971,0),(30431,60972,0),(30432,60973,0),(30433,60974,0),(30434,60978,0),(30435,60985,0),(30436,60993,0),(30437,60994,0),(30438,60995,0),(30439,60996,0),(30440,60997,0),(30441,60998,0),(30442,60999,0),(30443,61000,0),(30444,61001,0),(30445,61002,0),(30446,61003,0),(30447,61004,0),(30448,61005,0),(30449,61006,0),(30450,61007,0),(30451,61008,0),(30452,61009,0),(30453,61010,0),(30454,61011,0),(30455,61012,0),(30456,61013,0),(30457,61014,0),(30458,61015,0),(30459,61016,0),(30460,61017,0),(30461,61018,0),(30462,61019,0),(30463,61020,0),(30464,61021,0),(30465,61050,0),(30466,61051,0),(30467,61052,0),(30468,61053,0),(30469,61054,0),(30470,61056,0),(30471,61057,0),(30472,61058,0),(30473,61059,0),(30474,61060,0),(30475,61061,0),(30476,61062,0),(30477,61063,0),(30478,61064,0),(30479,61065,0),(30480,61066,0),(30481,61067,0),(30482,61068,0),(30483,61069,0),(30484,61070,0),(30485,61071,0),(30486,61072,0),(30487,61073,0),(30488,61074,0),(30489,61075,0),(30490,61076,0),(30491,61077,0),(30492,61078,0),(30493,61079,0),(30494,61082,0),(30495,61083,0),(30496,61084,0),(30497,61085,0),(30498,61086,0),(30499,61088,0),(30500,61089,0),(30501,61090,0),(30502,61091,0),(30503,61092,0),(30504,61093,0),(30505,61094,0),(30506,61095,0),(30507,61096,0),(30508,61097,0),(30509,61098,0),(30510,61099,0),(30511,61100,0),(30512,61101,0),(30513,61102,0),(30514,61103,0),(30515,61104,0),(30516,61105,0),(30517,61106,0),(30518,61107,0),(30519,61108,0),(30520,61109,0),(30521,61110,0),(30522,61111,0),(30523,61113,0),(30524,61114,0),(30525,61115,0),(30526,61116,0),(30527,61117,0),(30528,61118,0),(30529,61119,0),(30530,61120,0),(30531,61121,0),(30532,61122,0),(30533,61124,0),(30534,61125,0),(30535,61126,0),(30536,61127,0),(30537,61128,0),(30538,61129,0),(30539,61130,0),(30540,61131,0),(30541,61132,0),(30542,61133,0),(30543,61134,0),(30544,61135,0),(30545,61136,0),(30546,61137,0),(30547,61138,0),(30548,61139,0),(30549,61140,0),(30550,61141,0),(30551,61142,0),(30552,61143,0),(30553,61144,0),(30554,61145,0),(30555,61146,0),(30556,61147,0),(30557,61148,0),(30558,61149,0),(30559,61150,0),(30560,61151,0),(30561,61152,0),(30562,61153,0),(30563,61154,0),(30564,61155,0),(30565,61156,0),(30566,61157,0),(30567,61158,0),(30568,61159,0),(30569,61160,0),(30570,61161,0),(30571,61162,0),(30572,61163,0),(30573,61164,0),(30574,61165,0),(30575,61166,0),(30576,61167,0),(30577,61168,0),(30578,61169,0),(30579,61170,0),(30580,61171,0),(30581,61172,0),(30582,61173,0),(30583,61174,0),(30584,61175,0),(30585,61176,0),(30586,61177,0),(30587,61178,0),(30588,61179,0),(30589,61180,0),(30590,61181,0),(30591,61182,0),(30592,61183,0),(30593,61184,0),(30594,61185,0),(30595,61186,0),(30596,61187,0),(30597,61188,0),(30598,61189,0),(30599,61190,0),(30600,61191,0),(30601,61192,0),(30602,61201,0),(30603,61202,0),(30604,61203,0),(30605,61204,0),(30606,61205,0),(30607,61206,0),(30608,61207,0),(30609,61208,0),(30610,61209,0),(30611,61210,0),(30612,61211,0),(30613,61212,0),(30614,61213,0),(30615,61214,0),(30616,61215,0),(30617,61216,0),(30618,61217,0),(30619,61218,0),(30620,61219,0),(30621,61220,0),(30622,61221,0),(30623,61222,0),(30624,61223,0),(30625,61224,0),(30626,61225,0),(30627,61226,0),(30628,61227,0),(30629,61228,0),(30630,61229,0),(30631,61230,0),(30632,61231,0),(30633,61232,0),(30634,61233,0),(30635,61234,0),(30636,61235,0),(30637,61236,0),(30638,61237,0),(30639,61238,0),(30640,61239,0),(30641,61240,0),(30642,61241,0),(30643,61242,0),(30644,61243,0),(30645,61244,0),(30646,61245,0),(30647,61246,0),(30648,61247,0),(30649,61248,0),(30650,61249,0),(30651,61250,0),(30652,61251,0),(30653,61252,0),(30654,61253,0),(30655,61254,0),(30656,61255,0),(30657,61256,0),(30658,61257,0),(30659,61258,0),(30660,61259,0),(30661,61260,0),(30662,61261,0),(30663,61262,0),(30664,61263,0),(30665,61264,0),(30666,61265,0),(30667,61266,0),(30668,61267,0),(30669,61268,0),(30670,61269,0),(30671,61270,0),(30672,61271,0),(30673,61272,0),(30674,61273,0),(30675,61274,0),(30676,61275,0),(30677,61276,0),(30678,61277,0),(30679,61278,0),(30680,61279,0),(30681,61290,0),(30682,61291,0),(30683,61295,0),(30684,61296,0),(30685,61297,0),(30686,61298,0),(30687,61305,0),(30688,61308,0),(30689,61320,0),(30690,61324,0),(30691,61325,0),(30692,61326,0),(30693,61327,0),(30694,61328,0),(30695,61329,0),(30696,61330,0),(30697,61331,0),(30698,61332,0),(30699,61333,0),(30700,61335,0),(30701,61336,0),(30702,61337,0),(30703,61338,0),(30704,61339,0),(30705,61340,0),(30706,61341,0),(30707,61342,0),(30708,61343,0),(30709,61344,0),(30710,61345,0),(30711,61346,0),(30712,61347,0),(30713,61348,0),(30714,61350,0),(30715,61351,0),(30716,61353,0),(30717,61354,0),(30718,61355,0),(30719,61357,0),(30720,61358,0),(30721,61359,0),(30722,61360,0),(30723,61361,0),(30724,61368,0),(30725,61370,0),(30726,61386,0),(30727,61392,0),(30728,61395,0),(30729,61396,0),(30730,61397,0),(30731,61398,0),(30732,61400,0),(30733,61401,0),(30734,61402,0),(30735,61403,0),(30736,61404,0),(30737,61405,0),(30738,61406,0),(30739,61407,0),(30740,61408,0),(30741,61410,0),(30742,61412,0),(30743,61413,0),(30744,61414,0),(30745,61415,0),(30746,61416,0),(30747,61417,0),(30748,61418,0),(30749,61419,0),(30750,61420,0),(30751,61421,0),(30752,61422,0),(30753,61423,0),(30754,61424,0),(30755,61425,0),(30756,61427,0),(30757,61428,0),(30758,61430,0),(30759,61431,0),(30760,61432,0),(30761,61434,0),(30762,61435,0),(30763,61436,0),(30764,61439,0),(30765,61442,0),(30766,61443,0),(30767,61444,0),(30768,61445,0),(30769,61446,0),(30770,61447,0),(30771,61449,0),(30772,61450,0),(30773,61451,0),(30774,61452,0),(30775,61453,0),(30776,61454,0),(30777,61455,0),(30778,61456,0),(30779,61457,0),(30780,61458,0),(30781,61459,0),(30782,61460,0),(30783,61463,0),(30784,61464,0),(30785,61465,0),(30786,61466,0),(30787,61467,0),(30788,61468,0),(30789,61469,0),(30790,61470,0),(30791,61471,0),(30792,61473,0),(30793,61476,0),(30794,61477,0),(30795,61478,0),(30796,61479,0),(30797,61480,0),(30798,61481,0),(30799,61482,0),(30800,61483,0),(30801,61484,0),(30802,61485,0),(30803,61486,0),(30804,61487,0),(30805,61488,0),(30806,61489,0),(30807,61490,0),(30808,61491,0),(30809,61492,0),(30810,61493,0),(30811,61494,0),(30812,61495,0),(30813,61496,0),(30814,61497,0),(30815,61498,0),(30816,61499,0),(30817,61500,0),(30818,61501,0),(30819,61502,0),(30820,61503,0),(30821,61504,0),(30822,61509,0),(30823,61512,0),(30824,61513,0),(30825,61514,0),(30826,61515,0),(30827,61516,0),(30828,61517,0),(30829,61518,0),(30830,61519,0),(30831,61520,0),(30832,61522,0),(30833,61524,0),(30834,61526,0),(30835,61527,0),(30836,61529,0),(30837,61530,0),(30838,61531,0),(30839,61532,0),(30840,61534,0),(30841,61535,0),(30842,61538,0),(30843,61540,0),(30844,61542,0),(30845,61543,0),(30846,61544,0),(30847,61545,0),(30848,61546,0),(30849,61547,0),(30850,61548,0),(30851,61550,0),(30852,61551,0),(30853,61553,0),(30854,61554,0),(30855,61556,0),(30856,61558,0),(30857,61560,0),(30858,61564,0),(30859,61566,0),(30860,61568,0),(30861,61570,0),(30862,61572,0),(30863,61574,0),(30864,61576,0),(30865,61578,0),(30866,61580,0),(30867,61582,0),(30868,61584,0),(30869,61586,0),(30870,61588,0),(30871,61589,0),(30872,61592,0),(30873,61594,0),(30874,61596,0),(30875,61598,0),(30876,61600,0),(30877,61602,0),(30878,61604,0),(30879,61606,0),(30880,61608,0),(30881,61612,0),(30882,61614,0),(30883,61616,0),(30884,61618,0),(30885,61620,0),(30886,61622,0),(30887,61624,0),(30888,61628,0),(30889,61630,0),(30890,61632,0),(30891,61635,0),(30892,61636,0),(30893,61637,0),(30894,61638,0),(30895,61639,0),(30896,61640,0),(30897,61641,0),(30898,61642,0),(30899,61644,0),(30900,61645,0),(30901,61646,0),(30902,61647,0),(30903,61648,0),(30904,61661,0),(30905,61662,0),(30906,61663,0),(30907,61664,0),(30908,61665,0),(30909,61666,0),(30910,61667,0),(30911,61668,0),(30912,61669,0),(30913,61670,0),(30914,61671,0),(30915,61672,0),(30916,61673,0),(30917,61674,0),(30918,61675,0),(30919,61676,0),(30920,61677,0),(30921,61678,0),(30922,61679,0),(30923,61680,0),(30924,61681,0),(30925,61682,0),(30926,61683,0),(30927,61684,0),(30928,61685,0),(30929,61686,0),(30930,61698,0),(30931,61699,0),(30932,61700,0),(30933,61701,0),(30934,61702,0),(30935,61703,0),(30936,61704,0),(30937,61705,0),(30938,61706,0),(30939,61707,0),(30940,61708,0),(30941,61709,0),(30942,61710,0),(30943,61711,0),(30944,61712,0),(30945,61713,0),(30946,61714,0),(30947,61715,0),(30948,61716,0),(30949,61717,0),(30950,61718,0),(30951,61719,0),(30952,61720,0),(30953,61721,0),(30954,61722,0),(30955,61723,0),(30956,61724,0),(30957,61725,0),(30958,61726,0),(30959,61727,0),(30960,61728,0),(30961,61729,0),(30962,61730,0),(30963,61731,0),(30964,61732,0),(30965,61733,0),(30966,61734,0),(30967,61735,0),(30968,61737,0),(30969,61745,0),(30970,61746,0),(30971,61747,0),(30972,61748,0),(30973,61749,0),(30974,61750,0),(30975,61751,0),(30976,61752,0),(30977,61753,0),(30978,61754,0),(30979,61755,0),(30980,61756,0),(30981,61757,0),(30982,61758,0),(30983,61759,0),(30984,61760,0),(30985,61761,0),(30986,61762,0),(30987,61763,0),(30988,61764,0),(30989,61765,0),(30990,61766,0),(30991,61767,0),(30992,61768,0),(30993,61769,0),(30994,61770,0),(30995,61771,0),(30996,61772,0),(30997,61773,0),(30998,61774,0),(30999,61775,0),(31000,61776,0),(31001,61777,0),(31002,61778,0),(31003,61779,0),(31004,61780,0),(31005,61781,0),(31006,61782,0),(31007,61783,0),(31008,61784,0),(31009,61785,0),(31010,61786,0),(31011,61787,0),(31012,61788,0),(31013,61789,0),(31014,61790,0),(31015,61791,0),(31016,61792,0),(31017,61793,0),(31018,61794,0),(31019,61795,0),(31020,61796,0),(31021,61797,0),(31022,61798,0),(31023,61799,0),(31024,61800,0),(31025,61801,0),(31026,61802,0),(31027,61803,0),(31028,61804,0),(31029,61805,0),(31030,61806,0),(31031,61807,0),(31032,61808,0),(31033,61809,0),(31034,61810,0),(31035,61811,0),(31036,61812,0),(31037,61813,0),(31038,61814,0),(31039,61815,0),(31040,61816,0),(31041,61817,0),(31042,61832,0),(31043,61833,0),(31044,61834,0),(31045,61835,0),(31046,61836,0),(31047,61837,0),(31048,61838,0),(31049,61839,0),(31050,61840,0),(31051,61841,0),(31052,61842,0),(31053,61843,0),(31054,61844,0),(31055,61845,0),(31056,61846,0),(31057,61847,0),(31058,61848,0),(31059,61849,0),(31060,61850,0),(31061,61851,0),(31062,61852,0),(31063,61853,0),(31064,61854,0),(31065,61855,0),(31066,61856,0),(31067,61857,0),(31068,61858,0),(31069,61859,0),(31070,61860,0),(31071,61861,0),(31072,61862,0),(31073,61863,0),(31074,61864,0),(31075,61865,0),(31076,61866,0),(31077,61867,0),(31078,61868,0),(31079,61869,0),(31080,61870,0),(31081,61871,0),(31082,61872,0),(31083,61873,0),(31084,61874,0),(31085,61875,0),(31086,61876,0),(31087,61877,0),(31088,61878,0),(31089,61879,0),(31090,61880,0),(31091,61881,0),(31092,61882,0),(31093,61883,0),(31094,61886,0),(31095,61887,0),(31096,61888,0),(31097,61889,0),(31098,61891,0),(31099,61892,0),(31100,61893,0),(31101,61894,0),(31102,61895,0),(31103,61908,0),(31104,61909,0),(31105,61910,0),(31106,61911,0),(31107,61912,0),(31108,61913,0),(31109,61914,0),(31110,61915,0),(31111,61916,0),(31112,61917,0),(31113,61918,0),(31114,61919,0),(31115,61931,0),(31116,61934,0),(31117,61935,0),(31118,61936,0),(31119,61937,0),(31120,61942,0),(31121,61958,0),(31122,61963,0),(31123,61964,0),(31124,61965,0),(31125,61966,0),(31126,61967,0),(31127,61969,0),(31128,62023,0),(31129,62024,0),(31130,62025,0),(31131,62026,0),(31132,62027,0),(31133,62029,0),(31134,62032,0),(31135,62034,0),(31136,62038,0),(31137,62039,0),(31138,62040,0),(31139,62052,0),(31140,62058,0),(31141,62059,0),(31142,62060,0),(31143,62061,0),(31144,62063,0),(31145,62064,0),(31146,62065,0),(31147,62066,0),(31148,62067,0),(31149,62068,0),(31150,62069,0),(31151,62070,0),(31152,62071,0),(31153,62072,0),(31154,62073,0),(31155,62074,0),(31156,62075,0),(31157,62076,0),(31158,62077,0),(31159,62078,0),(31160,62079,0),(31161,62080,0),(31162,62081,0),(31163,62082,0),(31164,62083,0),(31165,62084,0),(31166,62085,0),(31167,62086,0),(31168,62087,0),(31169,62088,0),(31170,62089,0),(31171,62090,0),(31172,62091,0),(31173,62092,0),(31174,62093,0),(31175,62094,0),(31176,62095,0),(31177,62096,0),(31178,62097,0),(31179,62098,0),(31180,62099,0),(31181,62100,0),(31182,62101,0),(31183,62102,0),(31184,62103,0),(31185,62104,0),(31186,62105,0),(31187,62106,0),(31188,62107,0),(31189,62108,0),(31190,62109,0),(31191,62110,0),(31192,62111,0),(31193,62112,0),(31194,62113,0),(31195,62114,0),(31196,62115,0),(31197,62116,0),(31198,62117,0),(31199,62118,0),(31200,62119,0),(31201,62120,0),(31202,62121,0),(31203,62122,0),(31204,62123,0),(31205,62124,0),(31206,62125,0),(31207,62126,0),(31208,62127,0),(31209,62128,0),(31210,62129,0),(31211,62130,0),(31212,62131,0),(31213,62132,0),(31214,62133,0),(31215,62134,0),(31216,62135,0),(31217,62136,0),(31218,62139,0),(31219,62140,0),(31220,62141,0),(31221,62142,0),(31222,62143,0),(31223,62144,0),(31224,62145,0),(31225,62146,0),(31226,62147,0),(31227,62148,0),(31228,62149,0),(31229,62150,0),(31230,62151,0),(31231,62152,0),(31232,62153,0),(31233,62154,0),(31234,62155,0),(31235,62157,0),(31236,62158,0),(31237,62159,0),(31238,62161,0),(31239,62162,0),(31240,62163,0),(31241,62165,0),(31242,62166,0),(31243,62167,0),(31244,62169,0),(31245,62170,0),(31246,62171,0),(31247,62172,0),(31248,62173,0),(31249,62174,0),(31250,62175,0),(31251,62176,0),(31252,62177,0),(31253,62178,0),(31254,62179,0),(31255,62181,0),(31256,62182,0),(31257,62183,0),(31258,62184,0),(31259,62185,0),(31260,62186,0),(31261,62187,0),(31262,62188,0),(31263,62190,0),(31264,62191,0),(31265,62193,0),(31266,62194,0),(31267,62195,0),(31268,62196,0),(31269,62197,0),(31270,62199,0),(31271,62200,0),(31272,62201,0),(31273,62202,0),(31274,62203,0),(31275,62204,0),(31276,62206,0),(31277,62207,0),(31278,62208,0),(31279,62211,0),(31280,62212,0),(31281,62213,0),(31282,62215,0),(31283,62216,0),(31284,62217,0),(31285,62218,0),(31286,62219,0),(31287,62220,0),(31288,62221,0),(31289,62222,0),(31290,62223,0),(31291,62224,0),(31292,62225,0),(31293,62226,0),(31294,62227,0),(31295,62229,0),(31296,62231,0),(31297,62232,0),(31298,62233,0),(31299,62234,0),(31300,62235,0),(31301,62236,0),(31302,62249,0),(31303,62252,0),(31304,62253,0),(31305,62254,0),(31306,62255,0),(31307,62256,0),(31308,62257,0),(31309,62258,0),(31310,62259,0),(31311,62260,0),(31312,62261,0),(31313,62262,0),(31314,62263,0),(31315,62264,0),(31316,62265,0),(31317,62266,0),(31318,62283,0),(31319,62285,0),(31320,62329,0),(31321,62335,0),(31322,62353,0),(31323,62355,0),(31324,62356,0),(31325,62357,0),(31326,62358,0),(31327,62359,0),(31328,62361,0),(31329,62363,0),(31330,62364,0),(31331,62365,0),(31332,62371,0),(31333,62372,0),(31334,62373,0),(31335,62374,0),(31336,62377,0),(31337,62380,0),(31338,62381,0),(31339,62382,0),(31340,62383,0),(31341,62384,0),(31342,62385,0),(31343,62386,0),(31344,62392,0),(31345,62400,0),(31346,62404,0),(31347,62405,0),(31348,62406,0),(31349,62407,0),(31350,62408,0),(31351,62409,0),(31352,62410,0),(31353,62417,0),(31354,62418,0),(31355,62420,0),(31356,62423,0),(31357,62424,0),(31358,62425,0),(31359,62426,0),(31360,62428,0),(31361,62429,0),(31362,62430,0),(31363,62431,0),(31364,62432,0),(31365,62433,0),(31366,62437,0),(31367,62438,0),(31368,62439,0),(31369,62441,0),(31370,62445,0),(31371,62446,0),(31372,62448,0),(31373,62449,0),(31374,62450,0),(31375,62454,0),(31376,62455,0),(31377,62456,0),(31378,62457,0),(31379,62458,0),(31380,62459,0),(31381,62460,0),(31382,62473,0),(31383,62474,0),(31384,62475,0),(31385,62476,0),(31386,62477,0),(31387,62478,0),(31388,62479,0),(31389,62481,0),(31390,62482,0),(31391,62484,0),(31392,62491,0),(31393,62504,0),(31394,62531,0),(31395,62532,0),(31396,62612,0),(31397,62613,0),(31398,62614,0),(31399,62615,0),(31400,62616,0),(31401,62617,0),(31402,62618,0),(31403,62619,0),(31404,62620,0),(31405,62622,0),(31406,62623,0),(31407,62624,0),(31408,62625,0),(31409,62626,0),(31410,62627,0),(31411,62628,0),(31412,62629,0),(31413,62630,0),(31414,62631,0),(31415,62632,0),(31416,62633,0),(31417,62634,0),(31418,62635,0),(31419,62636,0),(31420,62637,0),(31421,62638,0),(31422,62639,0),(31423,62640,0),(31424,62641,0),(31425,62642,0),(31426,62643,0),(31427,62644,0),(31428,62645,0),(31429,62646,0),(31430,62647,0),(31431,62648,0),(31432,62681,0),(31433,62682,0),(31434,62683,0),(31435,62684,0),(31436,62685,0),(31437,62686,0),(31438,62687,0),(31439,62688,0),(31440,62689,0),(31441,62690,0),(31442,62691,0),(31443,62692,0),(31444,62693,0),(31445,62694,0),(31446,62695,0),(31447,62696,0),(31448,62697,0),(31449,62698,0),(31450,62699,0),(31451,62700,0),(31452,62701,0),(31453,62702,0),(31454,62703,0),(31455,62704,0),(31456,62706,0),(31457,62707,0),(31458,62708,0),(31459,62709,0),(31460,62710,0),(31461,62711,0),(31462,62712,0),(31463,62713,0),(31464,62715,0),(31465,62716,0),(31466,62717,0),(31467,62718,0),(31468,62719,0),(31469,62720,0),(31470,62721,0),(31471,62722,0),(31472,62723,0),(31473,62724,0),(31474,62725,0),(31475,62726,0),(31476,62727,0),(31477,62728,0),(31478,62729,0),(31479,62730,0),(31480,62731,0),(31481,62732,0),(31482,62733,0),(31483,62734,0),(31484,62735,0),(31485,62736,0),(31486,62737,0),(31487,62738,0),(31488,62739,0),(31489,62740,0),(31490,62741,0),(31491,62742,0),(31492,62743,0),(31493,62744,0),(31494,62745,0),(31495,62746,0),(31496,62747,0),(31497,62752,0),(31498,62753,0),(31499,62754,0),(31500,62755,0),(31501,62756,0),(31502,62757,0),(31503,62758,0),(31504,62759,0),(31505,62760,0),(31506,62761,0),(31507,62797,0),(31508,62798,0),(31509,62812,0),(31510,62814,0),(31511,62815,0),(31512,62816,0),(31513,62831,0),(31514,62832,0),(31515,62833,0),(31516,62834,0),(31517,62835,0),(31518,62836,0),(31519,62837,0),(31520,62838,0),(31521,62839,0),(31522,62840,0),(31523,62841,0),(31524,62842,0),(31525,62843,0),(31526,62844,0),(31527,62845,0),(31528,62846,0),(31529,62847,0),(31530,62848,0),(31531,62849,0),(31532,62850,0),(31533,62851,0),(31534,62852,0),(31535,62853,0),(31536,62854,0),(31537,62855,0),(31538,62856,0),(31539,62857,0),(31540,62858,0),(31541,62859,0),(31542,62860,0),(31543,62861,0),(31544,62862,0),(31545,62863,0),(31546,62864,0),(31547,62865,0),(31548,62866,0),(31549,62867,0),(31550,62868,0),(31551,62869,0),(31552,62870,0),(31553,62871,0),(31554,62872,0),(31555,62873,0),(31556,62874,0),(31557,62875,0),(31558,62876,0),(31559,62877,0),(31560,62878,0),(31561,62879,0),(31562,62880,0),(31563,62881,0),(31564,62882,0),(31565,62883,0),(31566,62884,0),(31567,62885,0),(31568,62886,0),(31569,62887,0),(31570,62888,0),(31571,62889,0),(31572,62890,0),(31573,62891,0),(31574,62895,0),(31575,62896,0),(31576,62897,0),(31577,62902,0),(31578,62903,0),(31579,62904,0),(31580,62907,0),(31581,62928,0),(31582,62929,0),(31583,62930,0),(31584,62931,0),(31585,62935,0),(31586,62936,0),(31587,62937,0),(31588,62938,0),(31589,62939,0),(31590,62940,0),(31591,62941,0),(31592,62942,0),(31593,62943,0),(31594,62944,0),(31595,62945,0),(31596,62946,0),(31597,62947,0),(31598,62948,0),(31599,62949,0),(31600,62950,0),(31601,62951,0),(31602,62952,0),(31603,62953,0),(31604,62954,0),(31605,62955,0),(31606,62956,0),(31607,62957,0),(31608,62958,0),(31609,62960,0),(31610,62961,0),(31611,62962,0),(31612,62963,0),(31613,62964,0),(31614,62967,0),(31615,62968,0),(31616,62970,0),(31617,62971,0),(31618,62972,0),(31619,62973,0),(31620,62974,0),(31621,62975,0),(31622,62976,0),(31623,62977,0),(31624,62979,0),(31625,62980,0),(31626,62981,0),(31627,62983,0),(31628,62985,0),(31629,62986,0),(31630,62987,0),(31631,62988,0),(31632,62989,0),(31633,62990,0),(31634,62991,0),(31635,62993,0),(31636,62994,0),(31637,62997,0),(31638,62998,0),(31639,62999,0),(31640,63000,0),(31641,63001,0),(31642,63002,0),(31643,63003,0),(31644,63004,0),(31645,63005,0),(31646,63006,0),(31647,63007,0),(31648,63008,0),(31649,63009,0),(31650,63010,0),(31651,63011,0),(31652,63012,0),(31653,63013,0),(31654,63014,0),(31655,63015,0),(31656,63016,0),(31657,63017,0),(31658,63019,0),(31659,63020,0),(31660,63021,0),(31661,63052,0),(31662,63054,0),(31663,63055,0),(31664,63056,0),(31665,63057,0),(31666,63058,0),(31667,63059,0),(31668,63060,0),(31669,63061,0),(31670,63062,0),(31671,63063,0),(31672,63064,0),(31673,63065,0),(31674,63066,0),(31675,63067,0),(31676,63068,0),(31677,63069,0),(31678,63070,0),(31679,63072,0),(31680,63073,0),(31681,63074,0),(31682,63075,0),(31683,63076,0),(31684,63077,0),(31685,63080,0),(31686,63083,0),(31687,63084,0),(31688,63093,0),(31689,63094,0),(31690,63095,0),(31691,63101,0),(31692,63102,0),(31693,63106,0),(31694,63151,0),(31695,63152,0),(31696,63153,0),(31697,63154,0),(31698,63156,0),(31699,63157,0),(31700,63158,0),(31701,63159,0),(31702,63160,0),(31703,63161,0),(31704,63162,0),(31705,63163,0),(31706,63164,0),(31707,63165,0),(31708,63166,0),(31709,63167,0),(31710,63168,0),(31711,63169,0),(31712,63170,0),(31713,63171,0),(31714,63172,0),(31715,63173,0),(31716,63174,0),(31717,63175,0),(31718,63176,0),(31719,63177,0),(31720,63178,0),(31721,63179,0),(31722,63180,0),(31723,63181,0),(31724,63182,0),(31725,63183,0),(31726,63184,0),(31727,63185,0),(31728,63186,0),(31729,63187,0),(31730,63188,0),(31731,63189,0),(31732,63190,0),(31733,63191,0),(31734,63193,0),(31735,63195,0),(31736,63196,0),(31737,63197,0),(31738,63198,0),(31739,63199,0),(31740,63200,0),(31741,63201,0),(31742,63202,0),(31743,63203,0),(31744,63204,0),(31745,63205,0),(31746,63206,0),(31747,63207,0),(31748,63208,0),(31749,63209,0),(31750,63210,0),(31751,63211,0),(31752,63212,0),(31753,63213,0),(31754,63214,0),(31755,63215,0),(31756,63217,0),(31757,63218,0),(31758,63219,0),(31759,63220,0),(31760,63221,0),(31761,63222,0),(31762,63224,0),(31763,63225,0),(31764,63226,0),(31765,63227,0),(31766,63229,0),(31767,63230,0),(31768,63231,0),(31769,63232,0),(31770,63233,0),(31771,63234,0),(31772,63235,0),(31773,63236,0),(31774,63237,0),(31775,63238,0),(31776,63239,0),(31777,63240,0),(31778,63243,0),(31779,63244,0),(31780,63252,0),(31781,63253,0),(31782,63255,0),(31783,63257,0),(31784,63267,0),(31785,63268,0),(31786,63270,0),(31787,63277,0),(31788,63278,0),(31789,63280,0),(31790,63344,0),(31791,63345,0),(31792,63346,0),(31793,63352,0),(31794,63353,0),(31795,63378,0),(31796,63379,0),(31797,63381,0),(31798,63382,0),(31799,63433,0),(31800,63434,0),(31801,63435,0),(31802,63436,0),(31803,63437,0),(31804,63439,0),(31805,63440,0),(31806,63444,0),(31807,63445,0),(31808,63446,0),(31809,63447,0),(31810,63448,0),(31811,63449,0),(31812,63450,0),(31813,63452,0),(31814,63453,0),(31815,63454,0),(31816,63455,0),(31817,63456,0),(31818,63457,0),(31819,63458,0),(31820,63459,0),(31821,63461,0),(31822,63462,0),(31823,63463,0),(31824,63464,0),(31825,63465,0),(31826,63466,0),(31827,63467,0),(31828,63468,0),(31829,63470,0),(31830,63471,0),(31831,63472,0),(31832,63473,0),(31833,63474,0),(31834,63475,0),(31835,63476,0),(31836,63477,0),(31837,63478,0),(31838,63479,0),(31839,63482,0),(31840,63483,0),(31841,63484,0),(31842,63485,0),(31843,63486,0),(31844,63490,0),(31845,63491,0),(31846,63492,0),(31847,63493,0),(31848,63495,0),(31849,63496,0),(31850,63497,0),(31851,63498,0),(31852,63500,0),(31853,63501,0),(31854,63502,0),(31855,63503,0),(31856,63504,0),(31857,63505,0),(31858,63506,0),(31859,63507,0),(31860,63531,0),(31861,63532,0),(31862,63533,0),(31863,63534,0),(31864,63535,0),(31865,63536,0),(31866,63537,0),(31867,63538,0),(31868,63540,0),(31869,63542,0),(31870,63543,0),(31871,63544,0),(31872,63545,0),(31873,63546,0),(31874,63547,0),(31875,63548,0),(31876,63549,0),(31877,63550,0),(31878,63551,0),(31879,63552,0),(31880,63553,0),(31881,63554,0),(31882,63555,0),(31883,63556,0),(31884,63557,0),(31885,63559,0),(31886,63560,0),(31887,63561,0),(31888,63563,0),(31889,63564,0),(31890,63565,0),(31891,63566,0),(31892,63567,0),(31893,63568,0),(31894,63569,0),(31895,63570,0),(31896,63571,0),(31897,63572,0),(31898,63573,0),(31899,63574,0),(31900,63575,0),(31901,63576,0),(31902,63578,0),(31903,63579,0),(31904,63580,0),(31905,63583,0),(31906,63584,0),(31907,63585,0),(31908,63586,0),(31909,63588,0),(31910,63589,0),(31911,63590,0),(31912,63591,0),(31913,63592,0),(31914,63593,0),(31915,63594,0),(31916,63596,0),(31917,63597,0),(31918,63598,0),(31919,63600,0),(31920,63601,0),(31921,63602,0),(31922,63603,0),(31923,63604,0),(31924,63605,0),(31925,63606,0),(31926,63607,0),(31927,63608,0),(31928,63609,0),(31929,63610,0),(31930,63611,0),(31931,63612,0),(31932,63613,0),(31933,63614,0),(31934,63615,0),(31935,63616,0),(31936,63617,0),(31937,63618,0),(31938,63619,0),(31939,63620,0),(31940,63621,0),(31941,63622,0),(31942,63623,0),(31943,63624,0),(31944,63625,0),(31945,63626,0),(31946,63627,0),(31947,63628,0),(31948,63629,0),(31949,63630,0),(31950,63631,0),(31951,63634,0),(31952,63635,0),(31953,63636,0),(31954,63637,0),(31955,63638,0),(31956,63639,0),(31957,63640,0),(31958,63641,0),(31959,63642,0),(31960,63644,0),(31961,63645,0),(31962,63646,0),(31963,63648,0),(31964,63649,0),(31965,63650,0),(31966,63651,0),(31967,63652,0),(31968,63653,0),(31969,63654,0),(31970,63655,0),(31971,63656,0),(31972,63657,0),(31973,63658,0),(31974,63659,0),(31975,63660,0),(31976,63661,0),(31977,63662,0),(31978,63663,0),(31979,63664,0),(31980,63665,0),(31981,63666,0),(31982,63667,0),(31983,63668,0),(31984,63669,0),(31985,63670,0),(31986,63671,0),(31987,63672,0),(31988,63673,0),(31989,63674,0),(31990,63675,0),(31991,63676,0),(31992,63677,0),(31993,63678,0),(31994,63679,0),(31995,63680,0),(31996,63701,0),(31997,63702,0),(31998,63703,0),(31999,63704,0),(32000,63705,0),(32001,63706,0),(32002,63707,0),(32003,63708,0),(32004,63709,0),(32005,63710,0),(32006,63711,0),(32007,63712,0),(32008,63713,0),(32009,63715,0),(32010,63716,0),(32011,63717,0),(32012,63718,0),(32013,63719,0),(32014,63720,0),(32015,63721,0),(32016,63722,0),(32017,63724,0),(32018,63725,0),(32019,63727,0),(32020,63728,0),(32021,63729,0),(32022,63730,0),(32023,63731,0),(32024,63732,0),(32025,63733,0),(32026,63734,0),(32027,63735,0),(32028,63736,0),(32029,63737,0),(32030,63738,0),(32031,63739,0),(32032,63740,0),(32033,63741,0),(32034,63743,0),(32035,63744,0),(32036,63746,0),(32037,63747,0),(32038,63748,0),(32039,63749,0),(32040,63750,0),(32041,63751,0),(32042,63752,0),(32043,63753,0),(32044,63754,0),(32045,63755,0),(32046,63756,0),(32047,63757,0),(32048,63758,0),(32049,63759,0),(32050,63760,0),(32051,63763,0),(32052,63764,0),(32053,63765,0),(32054,63766,0),(32055,63767,0),(32056,63768,0),(32057,63770,0),(32058,63771,0),(32059,63773,0),(32060,63774,0),(32061,63775,0),(32062,63777,0),(32063,63778,0),(32064,63779,0),(32065,63780,0),(32066,63782,0),(32067,63783,0),(32068,63784,0),(32069,63785,0),(32070,63786,0),(32071,63787,0),(32072,63788,0),(32073,63789,0),(32074,63790,0),(32075,63791,0),(32076,63792,0),(32077,63795,0),(32078,63798,0),(32079,63799,0),(32080,63800,0),(32081,63801,0),(32082,63802,0),(32083,63803,0),(32084,63804,0),(32085,63805,0),(32086,63806,0),(32087,63807,0),(32088,63808,0),(32089,63809,0),(32090,63810,0),(32091,63811,0),(32092,63812,0),(32093,63813,0),(32094,63814,0),(32095,63815,0),(32096,63816,0),(32097,63817,0),(32098,63818,0),(32099,63819,0),(32100,63820,0),(32101,63821,0),(32102,63822,0),(32103,63823,0),(32104,63824,0),(32105,63825,0),(32106,63826,0),(32107,63827,0),(32108,63828,0),(32109,63829,0),(32110,63830,0),(32111,63831,0),(32112,63832,0),(32113,63833,0),(32114,63834,0),(32115,63835,0),(32116,63836,0),(32117,63837,0),(32118,63844,0),(32119,63845,0),(32120,63846,0),(32121,63847,0),(32122,63848,0),(32123,63849,0),(32124,63850,0),(32125,63851,0),(32126,63852,0),(32127,63853,0),(32128,63854,0),(32129,63855,0),(32130,63856,0),(32131,63857,0),(32132,63858,0),(32133,63859,0),(32134,63860,0),(32135,63861,0),(32136,63862,0),(32137,63863,0),(32138,63864,0),(32139,63865,0),(32140,63866,0),(32141,63867,0),(32142,63868,0),(32143,63869,0),(32144,63870,0),(32145,63871,0),(32146,63872,0),(32147,63873,0),(32148,63874,0),(32149,63875,0),(32150,63876,0),(32151,63877,0),(32152,63878,0),(32153,63879,0),(32154,63880,0),(32155,63881,0),(32156,63882,0),(32157,63883,0),(32158,63884,0),(32159,63885,0),(32160,63886,0),(32161,63887,0),(32162,63889,0),(32163,63892,0),(32164,63894,0),(32165,63895,0),(32166,63896,0),(32167,63897,0),(32168,63898,0),(32169,63899,0),(32170,63900,0),(32171,63901,0),(32172,63902,0),(32173,63903,0),(32174,63904,0),(32175,63905,0),(32176,63906,0),(32177,63907,0),(32178,63908,0),(32179,63909,0),(32180,63910,0),(32181,63911,0),(32182,63912,0),(32183,63913,0),(32184,63914,0),(32185,63915,0),(32186,63916,0),(32187,63917,0),(32188,63918,0),(32189,63919,0),(32190,63920,0),(32191,63921,0),(32192,63922,0),(32193,63923,0),(32194,63924,0),(32195,63925,0),(32196,63926,0),(32197,63927,0),(32198,64309,0),(32199,64310,0),(32200,64311,0),(32201,64351,0),(32202,64377,0),(32203,64433,0),(32204,64434,0),(32205,64435,0),(32206,64460,0),(32207,64489,0),(32208,64490,0),(32209,64495,0),(32210,64496,0),(32211,64498,0),(32212,64499,0),(32213,64501,0),(32214,64502,0),(32215,64505,0),(32216,64506,0),(32217,64507,0),(32218,64508,0),(32219,64509,0),(32220,64510,0),(32221,64511,0),(32222,64512,0),(32223,64513,0),(32224,64514,0),(32225,64515,0),(32226,64516,0),(32227,64517,0),(32228,64518,0),(32229,64519,0),(32230,64520,0),(32231,64521,0),(32232,64522,0),(32233,64523,0),(32234,64524,0),(32235,64525,0),(32236,64526,0),(32237,64527,0),(32238,64529,0),(32239,64530,0),(32240,64531,0),(32241,64534,0),(32242,64535,0),(32243,64536,0),(32244,64537,0),(32245,64539,0),(32246,64540,0),(32247,64541,0),(32248,64542,0),(32249,64543,0),(32250,64544,0),(32251,64545,0),(32252,64546,0),(32253,64547,0),(32254,64548,0),(32255,64549,0),(32256,64550,0),(32257,64551,0),(32258,64552,0),(32259,64553,0),(32260,64554,0),(32261,64555,0),(32262,64556,0),(32263,64557,0),(32264,64558,0),(32265,64560,0),(32266,64561,0),(32267,64562,0),(32268,64563,0),(32269,64565,0),(32270,64566,0),(32271,64567,0),(32272,64568,0),(32273,64569,0),(32274,64570,0),(32275,64572,0),(32276,64573,0),(32277,64574,0),(32278,64575,0),(32279,64576,0),(32280,64578,0),(32281,64579,0),(32282,64580,0),(32283,64588,0),(32284,64589,0),(32285,64590,0),(32286,64591,0),(32287,64592,0),(32288,64593,0),(32289,64594,0),(32290,64595,0),(32291,64598,0),(32292,64599,0),(32293,64600,0),(32294,64601,0),(32295,64602,0),(32296,64603,0),(32297,64604,0),(32298,64605,0),(32299,64607,0),(32300,64608,0),(32301,64609,0),(32302,64610,0),(32303,64611,0),(32304,64612,0),(32305,64613,0),(32306,64614,0),(32307,64616,0),(32308,64617,0),(32309,64618,0),(32310,64619,0),(32311,64620,0),(32312,64621,0),(32313,64622,0),(32314,64623,0),(32315,64624,0),(32316,64625,0),(32317,64626,0),(32318,64628,0),(32319,64629,0),(32320,64630,0),(32321,64631,0),(32322,64632,0),(32323,64633,0),(32324,64634,0),(32325,64635,0),(32326,64636,0),(32327,64643,0),(32328,64644,0),(32329,64681,0),(32330,64682,0),(32331,64683,0),(32332,64684,0),(32333,64685,0),(32334,64686,0),(32335,64694,0),(32336,64695,0),(32337,64696,0),(32338,64697,0),(32339,64698,0),(32340,64699,0),(32341,64700,0),(32342,64701,0),(32343,64702,0),(32344,64703,0),(32345,64704,0),(32346,64705,0),(32347,64706,0),(32348,64707,0),(32349,64708,0),(32350,64709,0),(32351,64710,0),(32352,64711,0),(32353,64712,0),(32354,64715,0),(32355,64716,0),(32356,64717,0),(32357,64718,0),(32358,64719,0),(32359,64720,0),(32360,64721,0),(32361,64722,0),(32362,64723,0),(32363,64724,0),(32364,64725,0),(32365,64726,0),(32366,64727,0),(32367,64728,0),(32368,64729,0),(32369,64730,0),(32370,64731,0),(32371,64732,0),(32372,64733,0),(32373,64734,0),(32374,64735,0),(32375,64736,0),(32376,64737,0),(32377,64738,0),(32378,64739,0),(32379,64744,0),(32380,64745,0),(32381,64746,0),(32382,64747,0),(32383,64748,0),(32384,64749,0),(32385,64750,0),(32386,64751,0),(32387,64752,0),(32388,64753,0),(32389,64754,0),(32390,64755,0),(32391,64756,0),(32392,64757,0),(32393,64758,0),(32394,64759,0),(32395,64760,0),(32396,64764,0),(32397,64765,0),(32398,64766,0),(32399,64767,0),(32400,64768,0),(32401,64769,0),(32402,64770,0),(32403,64771,0),(32404,64772,0),(32405,64773,0),(32406,64774,0),(32407,64775,0),(32408,64776,0),(32409,64777,0),(32410,64778,0),(32411,64779,0),(32412,64780,0),(32413,64781,0),(32414,64782,0),(32415,64783,0),(32416,64784,0),(32417,64785,0),(32418,64786,0),(32419,64787,0),(32420,64788,0),(32421,64795,0),(32422,64796,0),(32423,64797,0),(32424,64798,0),(32425,64799,0),(32426,64802,0),(32427,64803,0),(32428,64804,0),(32429,64805,0),(32430,64806,0),(32431,64810,0),(32432,64811,0),(32433,64812,0),(32434,64813,0),(32435,64814,0),(32436,64815,0),(32437,64816,0),(32438,64817,0),(32439,64824,0),(32440,64825,0),(32441,64826,0),(32442,64827,0),(32443,64828,0),(32444,64829,0),(32445,64830,0),(32446,64831,0),(32447,64834,0),(32448,64835,0),(32449,64836,0),(32450,64837,0),(32451,64838,0),(32452,64839,0),(32453,64840,0),(32454,64841,0),(32455,64842,0),(32456,64843,0),(32457,64844,0),(32458,64845,0),(32459,64846,0),(32460,64847,0),(32461,64848,0),(32462,64850,0),(32463,64853,0),(32464,64854,0),(32465,64855,0),(32466,64856,0),(32467,64857,0),(32468,64858,0),(32469,64859,0),(32470,64860,0),(32471,64861,0),(32472,64862,0),(32473,64863,0),(32474,64864,0),(32475,64865,0),(32476,64866,0),(32477,64867,0),(32478,64868,0),(32479,64869,0),(32480,64870,0),(32481,64871,0),(32482,64872,0),(32483,64873,0),(32484,64874,0),(32485,64875,0),(32486,64876,0),(32487,64877,0),(32488,64878,0),(32489,64879,0),(32490,64880,0),(32491,64882,0),(32492,64884,0),(32493,64885,0),(32494,64886,0),(32495,64887,0),(32496,64888,0),(32497,64889,0),(32498,64890,0),(32499,64891,0),(32500,64892,0),(32501,64893,0),(32502,64894,0),(32503,64895,0),(32504,64896,0),(32505,64897,0),(32506,64898,0),(32507,64899,0),(32508,64900,0),(32509,64901,0),(32510,64902,0),(32511,64903,0),(32512,64905,0),(32513,64906,0),(32514,64907,0),(32515,64908,0),(32516,64909,0),(32517,64910,0),(32518,64911,0),(32519,64912,0),(32520,64913,0),(32521,64914,0),(32522,64915,0),(32523,64916,0),(32524,64917,0),(32525,64918,0),(32526,64919,0),(32527,64920,0),(32528,64921,0),(32529,64922,0),(32530,64923,0),(32531,64924,0),(32532,64925,0),(32533,64926,0),(32534,64927,0),(32535,64928,0),(32536,64929,0),(32537,64930,0),(32538,64931,0),(32539,64932,0),(32540,64933,0),(32541,64934,0),(32542,64935,0),(32543,64936,0),(32544,64937,0),(32545,64938,0),(32546,64939,0),(32547,64940,0),(32548,64941,0),(32549,64942,0),(32550,64943,0),(32551,64944,0),(32552,64945,0),(32553,64946,0),(32554,64947,0),(32555,64948,0),(32556,64949,0),(32557,64950,0),(32558,64951,0),(32559,64952,0),(32560,64953,0),(32561,64954,0),(32562,64955,0),(32563,64956,0),(32564,64957,0),(32565,64958,0),(32566,64959,0),(32567,64960,0),(32568,64961,0),(32569,64962,0),(32570,64963,0),(32571,64964,0),(32572,64965,0),(32573,64966,0),(32574,64967,0),(32575,64968,0),(32576,64969,0),(32577,64970,0),(32578,64971,0),(32579,64972,0),(32580,64973,0),(32581,64974,0),(32582,64975,0),(32583,64976,0),(32584,64977,0),(32585,64978,0),(32586,64979,0),(32587,64980,0),(32588,64981,0),(32589,64982,0),(32590,64983,0),(32591,64984,0),(32592,64985,0),(32593,64986,0),(32594,64987,0),(32595,64988,0),(32596,64989,0),(32597,64990,0),(32598,64991,0),(32599,64992,0),(32600,65003,0),(32601,65004,0),(32602,65005,0),(32603,65006,0),(32604,65007,0),(32605,65008,0),(32606,65009,0),(32607,65010,0),(32608,65011,0),(32609,65012,0),(32610,65013,0),(32611,65014,0),(32612,65016,0),(32613,65017,0),(32614,65018,0),(32615,65019,0),(32616,65020,0),(32617,65021,0),(32618,65022,0),(32619,65023,0),(32620,65024,0),(32621,65027,0),(32622,65028,0),(32623,65030,0),(32624,65031,0),(32625,65032,0),(32626,65033,0),(32627,65034,0),(32628,65035,0),(32629,65036,0),(32630,65037,0),(32631,65038,0),(32632,65039,0),(32633,65040,0),(32634,65041,0),(32635,65042,0),(32636,65043,0),(32637,65044,0),(32638,65045,0),(32639,65046,0),(32640,65047,0),(32641,65049,0),(32642,65050,0),(32643,65051,0),(32644,65052,0),(32645,65054,0),(32646,65055,0),(32647,65056,0),(32648,65057,0),(32649,65058,0),(32650,65060,0),(32651,65061,0),(32652,65062,0),(32653,65063,0),(32654,65064,0),(32655,65065,0),(32656,65066,0),(32657,65067,0),(32658,65068,0),(32659,65069,0),(32660,65071,0),(32661,65073,0),(32662,65074,0),(32663,65075,0),(32664,65077,0),(32665,65078,0),(32666,65079,0),(32667,65080,0),(32668,65081,0),(32669,65083,0),(32670,65084,0),(32671,65085,0),(32672,65086,0),(32673,65090,0),(32674,65091,0),(32675,65092,0),(32676,65093,0),(32677,65094,0),(32678,65095,0),(32679,65096,0),(32680,65097,0),(32681,65098,0),(32682,65099,0),(32683,65100,0),(32684,65101,0),(32685,65102,0),(32686,65103,0),(32687,65108,0),(32688,65111,0),(32689,65113,0),(32690,65114,0),(32691,65115,0),(32692,65116,0),(32693,65117,0),(32694,65119,0),(32695,65120,0),(32696,65121,0),(32697,65122,0),(32698,65125,0),(32699,65126,0),(32700,65127,0),(32701,65128,0),(32702,65129,0),(32703,65130,0),(32704,65131,0),(32705,65132,0),(32706,65133,0),(32707,65135,0),(32708,65136,0),(32709,65137,0),(32710,65138,0),(32711,65139,0),(32712,65141,0),(32713,65142,0),(32714,65143,0),(32715,65144,0),(32716,65145,0),(32717,65147,0),(32718,65148,0),(32719,65149,0),(32720,65150,0),(32721,65151,0),(32722,65152,0),(32723,65153,0),(32724,65154,0),(32725,65155,0),(32726,65156,0),(32727,65163,0),(32728,65164,0),(32729,65165,0),(32730,65166,0),(32731,65167,0),(32732,65168,0),(32733,65170,0),(32734,65171,0),(32735,65172,0),(32736,65173,0),(32737,65174,0),(32738,65177,0),(32739,65178,0),(32740,65179,0),(32741,65180,0),(32742,65181,0),(32743,65182,0),(32744,65183,0),(32745,65184,0),(32746,65185,0),(32747,65186,0),(32748,65187,0),(32749,65188,0),(32750,65189,0),(32751,65190,0),(32752,65191,0),(32753,65192,0),(32754,65193,0),(32755,65194,0),(32756,65195,0),(32757,65196,0),(32758,65197,0),(32759,65198,0),(32760,65199,0),(32761,65200,0),(32762,65201,0),(32763,65202,0),(32764,65203,0),(32765,65204,0),(32766,65205,0),(32767,65206,0),(32768,65207,0),(32769,65208,0),(32770,65209,0),(32771,65210,0),(32772,65211,0),(32773,65212,0),(32774,65213,0),(32775,65214,0),(32776,65215,0),(32777,65216,0),(32778,65217,0),(32779,65218,0),(32780,65219,0),(32781,65220,0),(32782,65221,0),(32783,65222,0),(32784,65223,0),(32785,65224,0),(32786,65225,0),(32787,65226,0),(32788,65227,0),(32789,65228,0),(32790,65229,0),(32791,65230,0),(32792,65231,0),(32793,65232,0),(32794,65233,0),(32795,65234,0),(32796,65235,0),(32797,65236,0),(32798,65237,0),(32799,65238,0),(32800,65239,0),(32801,65240,0),(32802,65241,0),(32803,65242,0),(32804,65243,0),(32805,65244,0),(32806,65245,0),(32807,65246,0),(32808,65247,0),(32809,65248,0),(32810,65249,0),(32811,65250,0),(32812,65251,0),(32813,65252,0),(32814,65253,0),(32815,65254,0),(32816,65255,0),(32817,65256,0),(32818,65257,0),(32819,65258,0),(32820,65259,0),(32821,65260,0),(32822,65261,0),(32823,65262,0),(32824,65263,0),(32825,65264,0),(32826,65265,0),(32827,65266,0),(32828,65267,0),(32829,65268,0),(32830,65269,0),(32831,65270,0),(32832,65271,0),(32833,65272,0),(32834,65273,0),(32835,65274,0),(32836,65275,0),(32837,65276,0),(32838,65277,0),(32839,65278,0),(32840,65279,0),(32841,65280,0),(32842,65281,0),(32843,65282,0),(32844,65283,0),(32845,65284,0),(32846,65285,0),(32847,65287,0),(32848,65288,0),(32849,65289,0),(32850,65290,0),(32851,65291,0),(32852,65292,0),(32853,65293,0),(32854,65294,0),(32855,65295,0),(32856,65296,0),(32857,65297,0),(32858,65298,0),(32859,65299,0),(32860,65300,0),(32861,65301,0),(32862,65302,0),(32863,65303,0),(32864,65304,0),(32865,65307,0),(32866,65308,0),(32867,65309,0),(32868,65310,0),(32869,65311,0),(32870,65312,0),(32871,65313,0),(32872,65314,0),(32873,65315,0),(32874,65316,0),(32875,65318,0),(32876,65320,0),(32877,65321,0),(32878,65322,0),(32879,65323,0),(32880,65326,0),(32881,65327,0),(32882,65328,0),(32883,65329,0),(32884,65331,0),(32885,65332,0),(32886,65334,0),(32887,65335,0),(32888,65336,0),(32889,65337,0),(32890,65338,0),(32891,65339,0),(32892,65340,0),(32893,65341,0),(32894,65342,0),(32895,65343,0),(32896,65344,0),(32897,65345,0),(32898,65346,0),(32899,65347,0),(32900,65348,0),(32901,65349,0),(32902,65350,0),(32903,65351,0),(32904,65353,0),(32905,65354,0),(32906,65360,0),(32907,65368,0),(32908,65369,0),(32909,65370,0),(32910,65371,0),(32911,65374,0),(32912,65375,0),(32913,65376,0),(32914,65377,0),(32915,65378,0),(32916,65379,0),(32917,65380,0),(32918,65381,0),(32919,65383,0),(32920,65384,0),(32921,65385,0),(32922,65386,0),(32923,65434,0),(32924,65436,0),(32925,65437,0),(32926,65438,0),(32927,65439,0),(32928,65440,0),(32929,65441,0),(32930,65442,0),(32931,65443,0),(32932,65444,0),(32933,65445,0),(32934,65446,0),(32935,65447,0),(32936,65448,0),(32937,65449,0),(32938,65450,0),(32939,65451,0),(32940,65461,0),(32941,65462,0),(32942,65463,0),(32943,65464,0),(32944,65465,0),(32945,65466,0),(32946,65467,0),(32947,65468,0),(32948,65469,0),(32949,65470,0),(32950,65471,0),(32951,65472,0),(32952,65473,0),(32953,65474,0),(32954,65475,0),(32955,65476,0),(32956,65477,0),(32957,65478,0),(32958,65479,0),(32959,65480,0),(32960,65481,0),(32961,65482,0),(32962,65483,0),(32963,65484,0),(32964,65485,0),(32965,65486,0),(32966,65487,0),(32967,65488,0),(32968,65489,0),(32969,65490,0),(32970,65491,0),(32971,65492,0),(32972,65493,0),(32973,65494,0),(32974,65495,0),(32975,65496,0),(32976,65497,0),(32977,65518,0),(32978,65519,0),(32979,65520,0),(32980,65521,0),(32981,65522,0),(32982,65523,0),(32983,65524,0),(32984,65525,0),(32985,65526,0),(32986,65527,0),(32987,65528,0),(32988,65529,0),(32989,65530,0),(32990,65531,0),(32991,65532,0),(32992,65533,0),(32993,65534,0),(32994,65535,0),(32995,65536,0),(32996,65537,0),(32997,65538,0),(32998,65539,0),(32999,65540,0),(33000,65541,0),(33001,65542,0),(33002,65543,0),(33003,65544,0),(33004,65545,0),(33005,65546,0),(33006,65547,0),(33007,65548,0),(33008,65549,0),(33009,65550,0),(33010,65551,0),(33011,65552,0),(33012,65553,0),(33013,65554,0),(33014,65555,0),(33015,65556,0),(33016,65557,0),(33017,65558,0),(33018,65559,0),(33019,65560,0),(33020,65561,0),(33021,65562,0),(33022,65563,0),(33023,65564,0),(33024,65565,0),(33025,65566,0),(33026,65567,0),(33027,65568,0),(33028,65569,0),(33029,65570,0),(33030,65571,0),(33031,65572,0),(33032,65573,0),(33033,65574,0),(33034,65575,0),(33035,65576,0),(33036,65577,0),(33037,65578,0),(33038,65579,0),(33039,65580,0),(33040,65581,0),(33041,65582,0),(33042,65583,0),(33043,65584,0),(33044,65585,0),(33045,65586,0),(33046,65587,0),(33047,65588,0),(33048,65589,0),(33049,65590,0),(33050,65591,0),(33051,65592,0),(33052,65593,0),(33053,65594,0),(33054,65595,0),(33055,65596,0),(33056,65597,0),(33057,65598,0),(33058,65599,0),(33059,65600,0),(33060,65601,0),(33061,65602,0),(33062,65603,0),(33063,65604,0),(33064,65605,0),(33065,65606,0),(33066,65607,0),(33067,65608,0),(33068,65609,0),(33069,65610,0),(33070,65611,0),(33071,65612,0),(33072,65616,0),(33073,65617,0),(33074,65618,0),(33075,65619,0),(33076,65620,0),(33077,65621,0),(33078,65622,0),(33079,65623,0),(33080,65624,0),(33081,65625,0),(33082,65626,0),(33083,65627,0),(33084,65628,0),(33085,65629,0),(33086,65630,0),(33087,65631,0),(33088,65632,0),(33089,65633,0),(33090,65634,0),(33091,65635,0),(33092,65636,0),(33093,65637,0),(33094,65638,0),(33095,65639,0),(33096,65640,0),(33097,65641,0),(33098,65642,0),(33099,65643,0),(33100,65644,0),(33101,65645,0),(33102,65646,0),(33103,65647,0),(33104,65648,0),(33105,65653,0),(33106,65654,0),(33107,65655,0),(33108,65657,0),(33109,65658,0),(33110,65659,0),(33111,65663,0),(33112,65665,0),(33113,65666,0),(33114,65667,0),(33115,65668,0),(33116,65669,0),(33117,65670,0),(33118,65671,0),(33119,65672,0),(33120,65673,0),(33121,65674,0),(33122,65675,0),(33123,65676,0),(33124,65677,0),(33125,65678,0),(33126,65679,0),(33127,65680,0),(33128,65681,0),(33129,65682,0),(33130,65683,0),(33131,65684,0),(33132,65685,0),(33133,65686,0),(33134,65687,0),(33135,65688,0),(33136,65689,0),(33137,65690,0),(33138,65691,0),(33139,65692,0),(33140,65693,0),(33141,65694,0),(33142,65695,0),(33143,65696,0),(33144,65697,0),(33145,65698,0),(33146,65699,0),(33147,65700,0),(33148,65701,0),(33149,65702,0),(33150,65703,0),(33151,65704,0),(33152,65705,0),(33153,65706,0),(33154,65707,0),(33155,65708,0),(33156,65709,0),(33157,65710,0),(33158,65711,0),(33159,65713,0),(33160,65714,0),(33161,65716,0),(33162,65717,0),(33163,65718,0),(33164,65719,0),(33165,65720,0),(33166,65721,0),(33167,65722,0),(33168,65723,0),(33169,65724,0),(33170,65726,0),(33171,65728,0),(33172,65740,0),(33173,65741,0),(33174,65742,0),(33175,65743,0),(33176,65744,0),(33177,65745,0),(33178,65746,0),(33179,65773,0),(33180,65774,0),(33181,65775,0),(33182,65776,0),(33183,65786,0),(33184,65787,0),(33185,65788,0),(33186,65789,0),(33187,65790,0),(33188,65791,0),(33189,65792,0),(33190,65793,0),(33191,65794,0),(33192,65795,0),(33193,65796,0),(33194,65797,0),(33195,65798,0),(33196,65799,0),(33197,65800,0),(33198,65801,0),(33199,65802,0),(33200,65806,0),(33201,65807,0),(33202,65808,0),(33203,65809,0),(33204,65810,0),(33205,65813,0),(33206,65815,0),(33207,65816,0),(33208,65817,0),(33209,65818,0),(33210,65819,0),(33211,65820,0),(33212,65821,0),(33213,65822,0),(33214,65823,0),(33215,65824,0),(33216,65825,0),(33217,65826,0),(33218,65827,0),(33219,65828,0),(33220,65829,0),(33221,65830,0),(33222,65831,0),(33223,65832,0),(33224,65833,0),(33225,65834,0),(33226,65835,0),(33227,65836,0),(33228,65837,0),(33229,65838,0),(33230,65839,0),(33231,65840,0),(33232,65841,0),(33233,65842,0),(33234,65843,0),(33235,65844,0),(33236,65845,0),(33237,65846,0),(33238,65847,0),(33239,65848,0),(33240,65849,0),(33241,65850,0),(33242,65851,0),(33243,65852,0),(33244,65853,0),(33245,65854,0),(33246,65855,0),(33247,65856,0),(33248,65857,0),(33249,65858,0),(33250,65859,0),(33251,65860,0),(33252,65861,0),(33253,65862,0),(33254,65863,0),(33255,65865,0),(33256,65866,0),(33257,65867,0),(33258,65868,0),(33259,65869,0),(33260,65871,0),(33261,65872,0),(33262,65873,0),(33263,65874,0),(33264,65875,0),(33265,65876,0),(33266,65878,0),(33267,65881,0),(33268,65882,0),(33269,65883,0),(33270,65884,0),(33271,65885,0),(33272,65886,0),(33273,65887,0),(33274,65888,0),(33275,65889,0),(33276,65904,0),(33277,65905,0),(33278,65906,0),(33279,65907,0),(33280,65908,0),(33281,65909,0),(33282,65910,0),(33283,65911,0),(33284,65912,0),(33285,65913,0),(33286,65914,0),(33287,65915,0),(33288,65916,0),(33289,65917,0),(33290,65918,0),(33291,65919,0),(33292,65920,0),(33293,65921,0),(33294,65922,0),(33295,65924,0),(33296,65925,0),(33297,65926,0),(33298,65927,0),(33299,65928,0),(33300,65929,0),(33301,65930,0),(33302,65932,0),(33303,65933,0),(33304,65934,0),(33305,65935,0),(33306,65936,0),(33307,65937,0),(33308,65938,0),(33309,65939,0),(33310,65940,0),(33311,65941,0),(33312,65942,0),(33313,65943,0),(33314,65944,0),(33315,65945,0),(33316,65947,0),(33317,65948,0),(33318,65949,0),(33319,65950,0),(33320,65951,0),(33321,65952,0),(33322,65953,0),(33323,65954,0),(33324,65955,0),(33325,65956,0),(33326,65957,0),(33327,65958,0),(33328,65959,0),(33329,65960,0),(33330,65961,0),(33331,65962,0),(33332,65963,0),(33333,65964,0),(33334,65965,0),(33335,65967,0),(33336,65968,0),(33337,65969,0),(33338,65972,0),(33339,65973,0),(33340,65974,0),(33341,65975,0),(33342,65976,0),(33343,65977,0),(33344,65978,0),(33345,65979,0),(33346,65981,0),(33347,65982,0),(33348,65983,0),(33349,65984,0),(33350,65985,0),(33351,65986,0),(33352,65987,0),(33353,65988,0),(33354,65990,0),(33355,65991,0),(33356,65992,0),(33357,65993,0),(33358,65994,0),(33359,65996,0),(33360,65997,0),(33361,65998,0),(33362,65999,0),(33363,66001,0),(33364,66002,0),(33365,66003,0),(33366,66004,0),(33367,66005,0),(33368,66008,0),(33369,66010,0),(33370,66011,0),(33371,66012,0),(33372,66013,0),(33373,66014,0),(33374,66015,0),(33375,66016,0),(33376,66017,0),(33377,66018,0),(33378,66019,0),(33379,66020,0),(33380,66021,0),(33381,66022,0),(33382,66023,0),(33383,66024,0),(33384,66025,0),(33385,66027,0),(33386,66028,0),(33387,66029,0),(33388,66030,0),(33389,66031,0),(33390,66032,0),(33391,66034,0),(33392,66036,0),(33393,66037,0),(33394,66038,0),(33395,66039,0),(33396,66040,0),(33397,66041,0),(33398,66042,0),(33399,66043,0),(33400,66044,0),(33401,66045,0),(33402,66046,0),(33403,66148,0),(33404,66149,0),(33405,66150,0),(33406,66151,0),(33407,66152,0),(33408,66153,0),(33409,66154,0),(33410,66155,0),(33411,66156,0),(33412,66157,0),(33413,66158,0),(33414,66159,0),(33415,66160,0),(33416,66162,0),(33417,66163,0),(33418,66164,0),(33419,66165,0),(33420,66166,0),(33421,66167,0),(33422,66168,0),(33423,66169,0),(33424,66170,0),(33425,66171,0),(33426,66172,0),(33427,66173,0),(33428,66174,0),(33429,66175,0),(33430,66176,0),(33431,66177,0),(33432,66178,0),(33433,66179,0),(33434,66180,0),(33435,66181,0),(33436,66182,0),(33437,66183,0),(33438,66184,0),(33439,66185,0),(33440,66186,0),(33441,66189,0),(33442,66190,0),(33443,66191,0),(33444,66192,0),(33445,66193,0),(33446,66194,0),(33447,66195,0),(33448,66196,0),(33449,66197,0),(33450,66198,0),(33451,66199,0),(33452,66200,0),(33453,66201,0),(33454,66202,0),(33455,66203,0),(33456,66204,0),(33457,66205,0),(33458,66206,0),(33459,66207,0),(33460,66208,0),(33461,66209,0),(33462,66210,0),(33463,66211,0),(33464,66212,0),(33465,66213,0),(33466,66217,0),(33467,66218,0),(33468,66219,0),(33469,66220,0),(33470,66221,0),(33471,66222,0),(33472,66223,0),(33473,66224,0),(33474,66225,0),(33475,66226,0),(33476,66227,0),(33477,66228,0),(33478,66229,0),(33479,66230,0),(33480,66231,0),(33481,66232,0),(33482,66233,0),(33483,66234,0),(33484,66235,0),(33485,66236,0),(33486,66237,0),(33487,66238,0),(33488,66239,0),(33489,66243,0),(33490,66244,0),(33491,66245,0),(33492,66246,0),(33493,66247,0),(33494,66248,0),(33495,66249,0),(33496,66250,0),(33497,66251,0),(33498,66252,0),(33499,66253,0),(33500,66254,0),(33501,66255,0),(33502,66256,0),(33503,66257,0),(33504,66258,0),(33505,66259,0),(33506,66260,0),(33507,66261,0),(33508,66262,0),(33509,66263,0),(33510,66267,0),(33511,66268,0),(33512,66269,0),(33513,66270,0),(33514,66271,0),(33515,66272,0),(33516,66273,0),(33517,66274,0),(33518,66275,0),(33519,66276,0),(33520,66277,0),(33521,66278,0),(33522,66279,0),(33523,66280,0),(33524,66281,0),(33525,66282,0),(33526,66283,0),(33527,66284,0),(33528,66285,0),(33529,66289,0),(33530,66290,0),(33531,66291,0),(33532,66292,0),(33533,66293,0),(33534,66294,0),(33535,66295,0),(33536,66296,0),(33537,66297,0),(33538,66298,0),(33539,66299,0),(33540,66300,0),(33541,66301,0),(33542,66302,0),(33543,66303,0),(33544,66304,0),(33545,66305,0),(33546,66306,0),(33547,66308,0),(33548,66309,0),(33549,66310,0),(33550,66311,0),(33551,66312,0),(33552,66313,0),(33553,66314,0),(33554,66315,0),(33555,66316,0),(33556,66317,0),(33557,66318,0),(33558,66319,0),(33559,66320,0),(33560,66321,0),(33561,66322,0),(33562,66323,0),(33563,66324,0),(33564,66325,0),(33565,66326,0),(33566,66327,0),(33567,66328,0),(33568,66329,0),(33569,66330,0),(33570,66331,0),(33571,66332,0),(33572,66335,0),(33573,66336,0),(33574,66337,0),(33575,66338,0),(33576,66339,0),(33577,66340,0),(33578,66341,0),(33579,66342,0),(33580,66343,0),(33581,66344,0),(33582,66345,0),(33583,66346,0),(33584,66347,0),(33585,66348,0),(33586,66349,0),(33587,66350,0),(33588,66351,0),(33589,66352,0),(33590,66353,0),(33591,66354,0),(33592,66355,0),(33593,66356,0),(33594,66357,0),(33595,66358,0),(33596,66359,0),(33597,66363,0),(33598,66364,0),(33599,66365,0),(33600,66366,0),(33601,66367,0),(33602,66368,0),(33603,66369,0),(33604,66370,0),(33605,66371,0),(33606,66372,0),(33607,66373,0),(33608,66374,0),(33609,66375,0),(33610,66376,0),(33611,66377,0),(33612,66378,0),(33613,66379,0),(33614,66380,0),(33615,66381,0),(33616,66382,0),(33617,66383,0),(33618,66384,0),(33619,66385,0),(33620,66389,0),(33621,66390,0),(33622,66391,0),(33623,66392,0),(33624,66393,0),(33625,66394,0),(33626,66395,0),(33627,66396,0),(33628,66397,0),(33629,66398,0),(33630,66399,0),(33631,66400,0),(33632,66401,0),(33633,66402,0),(33634,66403,0),(33635,66404,0),(33636,66405,0),(33637,66406,0),(33638,66407,0),(33639,66408,0),(33640,66409,0),(33641,66413,0),(33642,66414,0),(33643,66415,0),(33644,66416,0),(33645,66417,0),(33646,66418,0),(33647,66419,0),(33648,66420,0),(33649,66421,0),(33650,66422,0),(33651,66423,0),(33652,66424,0),(33653,66425,0),(33654,66426,0),(33655,66427,0),(33656,66428,0),(33657,66429,0),(33658,66430,0),(33659,66431,0),(33660,66435,0),(33661,66436,0),(33662,66437,0),(33663,66438,0),(33664,66439,0),(33665,66440,0),(33666,66441,0),(33667,66442,0),(33668,66443,0),(33669,66444,0),(33670,66445,0),(33671,66446,0),(33672,66447,0),(33673,66448,0),(33674,66449,0),(33675,66450,0),(33676,66451,0),(33677,66452,0),(33678,66454,0),(33679,66455,0),(33680,66456,0),(33681,66457,0),(33682,66458,0),(33683,66459,0),(33684,66460,0),(33685,66461,0),(33686,66462,0),(33687,66463,0),(33688,66464,0),(33689,66465,0),(33690,66466,0),(33691,66467,0),(33692,66468,0),(33693,66469,0),(33694,66470,0),(33695,66471,0),(33696,66472,0),(33697,66473,0),(33698,66474,0),(33699,66475,0),(33700,66476,0),(33701,66477,0),(33702,66478,0),(33703,66481,0),(33704,66482,0),(33705,66483,0),(33706,66484,0),(33707,66485,0),(33708,66486,0),(33709,66487,0),(33710,66488,0),(33711,66489,0),(33712,66490,0),(33713,66491,0),(33714,66492,0),(33715,66493,0),(33716,66494,0),(33717,66495,0),(33718,66496,0),(33719,66497,0),(33720,66498,0),(33721,66499,0),(33722,66500,0),(33723,66501,0),(33724,66502,0),(33725,66503,0),(33726,66504,0),(33727,66505,0),(33728,66509,0),(33729,66510,0),(33730,66511,0),(33731,66512,0),(33732,66513,0),(33733,66514,0),(33734,66515,0),(33735,66516,0),(33736,66517,0),(33737,66518,0),(33738,66519,0),(33739,66520,0),(33740,66521,0),(33741,66522,0),(33742,66523,0),(33743,66524,0),(33744,66525,0),(33745,66526,0),(33746,66527,0),(33747,66528,0),(33748,66529,0),(33749,66530,0),(33750,66531,0),(33751,66535,0),(33752,66536,0),(33753,66537,0),(33754,66538,0),(33755,66539,0),(33756,66540,0),(33757,66541,0),(33758,66542,0),(33759,66543,0),(33760,66544,0),(33761,66545,0),(33762,66546,0),(33763,66547,0),(33764,66548,0),(33765,66549,0),(33766,66550,0),(33767,66551,0),(33768,66552,0),(33769,66553,0),(33770,66554,0),(33771,66555,0),(33772,66559,0),(33773,66560,0),(33774,66561,0),(33775,66562,0),(33776,66563,0),(33777,66564,0),(33778,66565,0),(33779,66566,0),(33780,66567,0),(33781,66568,0),(33782,66569,0),(33783,66570,0),(33784,66571,0),(33785,66572,0),(33786,66573,0),(33787,66574,0),(33788,66575,0),(33789,66576,0),(33790,66577,0),(33791,66581,0),(33792,66582,0),(33793,66583,0),(33794,66584,0),(33795,66585,0),(33796,66586,0),(33797,66587,0),(33798,66588,0),(33799,66589,0),(33800,66590,0),(33801,66591,0),(33802,66592,0),(33803,66593,0),(33804,66594,0),(33805,66595,0),(33806,66596,0),(33807,66597,0),(33808,66598,0),(33809,66600,0),(33810,66601,0),(33811,66602,0),(33812,66603,0),(33813,66604,0),(33814,66605,0),(33815,66606,0),(33816,66607,0),(33817,66608,0),(33818,66609,0),(33819,66610,0),(33820,66611,0),(33821,66612,0),(33822,66613,0),(33823,66614,0),(33824,66615,0),(33825,66616,0),(33826,66617,0),(33827,66618,0),(33828,66619,0),(33829,66620,0),(33830,66621,0),(33831,66622,0),(33832,66623,0),(33833,66624,0),(33834,66627,0),(33835,66628,0),(33836,66629,0),(33837,66630,0),(33838,66631,0),(33839,66632,0),(33840,66633,0),(33841,66634,0),(33842,66635,0),(33843,66636,0),(33844,66637,0),(33845,66638,0),(33846,66639,0),(33847,66640,0),(33848,66641,0),(33849,66642,0),(33850,66643,0),(33851,66644,0),(33852,66645,0),(33853,66646,0),(33854,66647,0),(33855,66648,0),(33856,66649,0),(33857,66650,0),(33858,66651,0),(33859,66652,0),(33860,66656,0),(33861,66657,0),(33862,66658,0),(33863,66659,0),(33864,66660,0),(33865,66661,0),(33866,66662,0),(33867,66663,0),(33868,66664,0),(33869,66665,0),(33870,66666,0),(33871,66667,0),(33872,66668,0),(33873,66669,0),(33874,66670,0),(33875,66671,0),(33876,66672,0),(33877,66673,0),(33878,66674,0),(33879,66675,0),(33880,66676,0),(33881,66677,0),(33882,66678,0),(33883,66682,0),(33884,66683,0),(33885,66684,0),(33886,66685,0),(33887,66686,0),(33888,66687,0),(33889,66688,0),(33890,66689,0),(33891,66690,0),(33892,66691,0),(33893,66692,0),(33894,66693,0),(33895,66694,0),(33896,66695,0),(33897,66696,0),(33898,66697,0),(33899,66698,0),(33900,66699,0),(33901,66700,0),(33902,66701,0),(33903,66702,0),(33904,66706,0),(33905,66707,0),(33906,66708,0),(33907,66709,0),(33908,66710,0),(33909,66711,0),(33910,66712,0),(33911,66713,0),(33912,66714,0),(33913,66715,0),(33914,66716,0),(33915,66717,0),(33916,66718,0),(33917,66719,0),(33918,66720,0),(33919,66721,0),(33920,66722,0),(33921,66723,0),(33922,66724,0),(33923,66728,0),(33924,66729,0),(33925,66730,0),(33926,66731,0),(33927,66732,0),(33928,66733,0),(33929,66734,0),(33930,66735,0),(33931,66736,0),(33932,66737,0),(33933,66738,0),(33934,66739,0),(33935,66740,0),(33936,66741,0),(33937,66742,0),(33938,66743,0),(33939,66744,0),(33940,66745,0),(33941,66747,0),(33942,66748,0),(33943,66749,0),(33944,66750,0),(33945,66751,0),(33946,66752,0),(33947,66753,0),(33948,66754,0),(33949,66755,0),(33950,66756,0),(33951,66757,0),(33952,66758,0),(33953,66759,0),(33954,66760,0),(33955,66761,0),(33956,66762,0),(33957,66763,0),(33958,66764,0),(33959,66765,0),(33960,66766,0),(33961,66767,0),(33962,66768,0),(33963,66769,0),(33964,66770,0),(33965,66771,0),(33966,66774,0),(33967,66775,0),(33968,66776,0),(33969,66777,0),(33970,66778,0),(33971,66779,0),(33972,66780,0),(33973,66781,0),(33974,66782,0),(33975,66783,0),(33976,66784,0),(33977,66785,0),(33978,66786,0),(33979,66787,0),(33980,66788,0),(33981,66789,0),(33982,66790,0),(33983,66791,0),(33984,66792,0),(33985,66793,0),(33986,66794,0),(33987,66795,0),(33988,66796,0),(33989,66797,0),(33990,66798,0),(33991,66802,0),(33992,66803,0),(33993,66804,0),(33994,66805,0),(33995,66806,0),(33996,66807,0),(33997,66808,0),(33998,66809,0),(33999,66810,0),(34000,66811,0),(34001,66812,0),(34002,66813,0),(34003,66814,0),(34004,66815,0),(34005,66816,0),(34006,66817,0),(34007,66818,0),(34008,66819,0),(34009,66820,0),(34010,66821,0),(34011,66822,0),(34012,66823,0),(34013,66824,0),(34014,66828,0),(34015,66829,0),(34016,66830,0),(34017,66831,0),(34018,66832,0),(34019,66833,0),(34020,66834,0),(34021,66835,0),(34022,66836,0),(34023,66837,0),(34024,66838,0),(34025,66839,0),(34026,66840,0),(34027,66841,0),(34028,66842,0),(34029,66843,0),(34030,66844,0),(34031,66845,0),(34032,66846,0),(34033,66847,0),(34034,66848,0),(34035,66852,0),(34036,66853,0),(34037,66854,0),(34038,66855,0),(34039,66856,0),(34040,66857,0),(34041,66858,0),(34042,66859,0),(34043,66860,0),(34044,66861,0),(34045,66862,0),(34046,66863,0),(34047,66864,0),(34048,66865,0),(34049,66866,0),(34050,66867,0),(34051,66868,0),(34052,66869,0),(34053,66870,0),(34054,66874,0),(34055,66875,0),(34056,66876,0),(34057,66877,0),(34058,66878,0),(34059,66880,0),(34060,66882,0),(34061,66883,0),(34062,66884,0),(34063,66885,0),(34064,66886,0),(34065,66887,0),(34066,66889,0),(34067,66891,0),(34068,66892,0),(34069,66894,0),(34070,66895,0),(34071,66896,0),(34072,66897,0),(34073,66898,0),(34074,66899,0),(34075,66901,0),(34076,66904,0),(34077,66905,0),(34078,66906,0),(34079,66907,0),(34080,66908,0),(34081,66909,0),(34082,66910,0),(34083,66911,0),(34084,66913,0),(34085,66914,0),(34086,66915,0),(34087,66916,0),(34088,66917,0),(34089,66919,0),(34090,66920,0),(34091,66921,0),(34092,66922,0),(34093,66923,0),(34094,66924,0),(34095,66925,0),(34096,66926,0),(34097,66928,0),(34098,66929,0),(34099,66930,0),(34100,66931,0),(34101,66933,0),(34102,66934,0),(34103,66935,0),(34104,66936,0),(34105,66937,0),(34106,66938,0),(34107,66940,0),(34108,66941,0),(34109,66952,0),(34110,66953,0),(34111,66954,0),(34112,66955,0),(34113,66956,0),(34114,66958,0),(34115,66959,0),(34116,66960,0),(34117,66962,0),(34118,66963,0),(34119,66964,0),(34120,66965,0),(34121,66966,0),(34122,66967,0),(34123,66968,0),(34124,66970,0),(34125,66971,0),(34126,66972,0),(34127,66973,0),(34128,66975,0),(34129,66976,0),(34130,66977,0),(34131,66978,0),(34132,66979,0),(34133,66980,0),(34134,66981,0),(34135,66982,0),(34136,66983,0),(34137,66985,0),(34138,66986,0),(34139,66989,0),(34140,66990,0),(34141,66991,0),(34142,66992,0),(34143,66993,0),(34144,67024,0),(34145,67029,0),(34146,67032,0),(34147,67043,0),(34148,67045,0),(34149,67050,0),(34150,67052,0),(34151,67057,0),(34152,67061,0),(34153,67067,0),(34154,67069,0),(34155,67071,0),(34156,67088,0),(34157,67098,0),(34158,67099,0),(34159,67102,0),(34160,67103,0),(34161,67104,0),(34162,67105,0),(34163,67106,0),(34164,67108,0),(34165,67109,0),(34166,67112,0),(34167,67113,0),(34168,67114,0),(34169,67115,0),(34170,67117,0),(34171,67119,0),(34172,67120,0),(34173,67121,0),(34174,67122,0),(34175,67123,0),(34176,67124,0),(34177,67125,0),(34178,67126,0),(34179,67127,0),(34180,67131,0),(34181,67132,0),(34182,67133,0),(34183,67134,0),(34184,67135,0),(34185,67140,0),(34186,67141,0),(34187,67142,0),(34188,67143,0),(34189,67144,0),(34190,67145,0),(34191,67146,0),(34192,67147,0),(34193,67148,0),(34194,67149,0),(34195,67150,0),(34196,67153,0),(34197,67154,0),(34198,67156,0),(34199,67157,0),(34200,67158,0),(34201,67159,0),(34202,67160,0),(34203,67161,0),(34204,67162,0),(34205,67163,0),(34206,67164,0),(34207,67165,0),(34208,67166,0),(34209,67167,0),(34210,67168,0),(34211,67169,0),(34212,67170,0),(34213,67171,0),(34214,67172,0),(34215,67173,0),(34216,67174,0),(34217,67175,0),(34218,67176,0),(34219,67178,0),(34220,67179,0),(34221,67180,0),(34222,67181,0),(34223,67182,0),(34224,67183,0),(34225,67184,0),(34226,67185,0),(34227,67186,0),(34228,67187,0),(34229,67188,0),(34230,67189,0),(34231,67190,0),(34232,67191,0),(34233,67192,0),(34234,67193,0),(34235,67195,0),(34236,67196,0),(34237,67197,0),(34238,67198,0),(34239,67199,0),(34240,67200,0),(34241,67201,0),(34242,67202,0),(34243,67203,0),(34244,67204,0),(34245,67206,0),(34246,67207,0),(34247,67208,0),(34248,67209,0),(34249,67210,0),(34250,67211,0),(34251,67212,0),(34252,67214,0),(34253,67215,0),(34254,67217,0),(34255,67218,0),(34256,67219,0),(34257,67220,0),(34258,67221,0),(34259,67222,0),(34260,67223,0),(34261,67224,0),(34262,67225,0),(34263,67226,0),(34264,67228,0),(34265,67233,0),(34266,67234,0),(34267,67235,0),(34268,67236,0),(34269,67237,0),(34270,67238,0),(34271,67239,0),(34272,67240,0),(34273,67242,0),(34274,67243,0),(34275,67244,0),(34276,67245,0),(34277,67246,0),(34278,67434,0),(34279,67436,0),(34280,67439,0),(34281,67440,0),(34282,67447,0),(34283,67448,0),(34284,67449,0),(34285,67450,0),(34286,67451,0),(34287,67452,0),(34288,67453,0),(34289,67454,0),(34290,67455,0),(34291,67456,0),(34292,67457,0),(34293,67458,0),(34294,67459,0),(34295,67460,0),(34296,67461,0),(34297,67462,0),(34298,67463,0),(34299,67464,0),(34300,67465,0),(34301,67466,0),(34302,67467,0),(34303,67468,0),(34304,67469,0),(34305,67470,0),(34306,67471,0),(34307,67472,0),(34308,67473,0),(34309,67474,0),(34310,67475,0),(34311,67476,0),(34312,67477,0),(34313,67478,0),(34314,67479,0),(34315,67493,0),(34316,67496,0),(34317,67497,0),(34318,67498,0),(34319,67499,0),(34320,67500,0),(34321,67501,0),(34322,67502,0),(34323,67503,0),(34324,67504,0),(34325,67505,0),(34326,67542,0),(34327,67543,0),(34328,67544,0),(34329,67545,0),(34330,67546,0),(34331,67547,0),(34332,67548,0),(34333,67549,0),(34334,67550,0),(34335,67551,0),(34336,67552,0),(34337,67553,0),(34338,67554,0),(34339,67555,0),(34340,67556,0),(34341,67557,0),(34342,67558,0),(34343,67559,0),(34344,67560,0),(34345,67561,0),(34346,67562,0),(34347,67563,0),(34348,67564,0),(34349,67565,0),(34350,67566,0),(34351,67567,0),(34352,67568,0),(34353,67569,0),(34354,67570,0),(34355,67571,0),(34356,67572,0),(34357,67573,0),(34358,67574,0),(34359,67575,0),(34360,67576,0),(34361,67577,0),(34362,67578,0),(34363,67579,0),(34364,67580,0),(34365,67581,0),(34366,67582,0),(34367,67583,0),(34368,67584,0),(34369,67585,0),(34370,67586,0),(34371,67587,0),(34372,67588,0),(34373,67589,0),(34374,67590,0),(34375,67591,0),(34376,67592,0),(34377,67593,0),(34378,67598,0),(34379,67602,0),(34380,67604,0),(34381,67605,0),(34382,67607,0),(34383,67608,0),(34384,67609,0),(34385,67610,0),(34386,67611,0),(34387,67612,0),(34388,67613,0),(34389,67614,0),(34390,67615,0),(34391,67616,0),(34392,67617,0),(34393,67618,0),(34394,67619,0),(34395,67620,0),(34396,67621,0),(34397,67622,0),(34398,67623,0),(34399,67624,0),(34400,67625,0),(34401,67626,0),(34402,67627,0),(34403,67628,0),(34404,67629,0),(34405,67630,0),(34406,67631,0),(34407,67632,0),(34408,67633,0),(34409,67634,0),(34410,67635,0),(34411,67636,0),(34412,67637,0),(34413,67638,0),(34414,67639,0),(34415,67640,0),(34416,67641,0),(34417,67642,0),(34418,67643,0),(34419,67644,0),(34420,67645,0),(34421,67646,0),(34422,67647,0),(34423,67648,0),(34424,67649,0),(34425,67650,0),(34426,67651,0),(34427,67652,0),(34428,67653,0),(34429,67654,0),(34430,67655,0),(34431,67656,0),(34432,67657,0),(34433,67658,0),(34434,67659,0),(34435,67660,0),(34436,67661,0),(34437,67662,0),(34438,67663,0),(34439,67664,0),(34440,67665,0),(34441,67666,0),(34442,67667,0),(34443,67668,0),(34444,67669,0),(34445,67670,0),(34446,67671,0),(34447,67672,0),(34448,67673,0),(34449,67674,0),(34450,67675,0),(34451,67676,0),(34452,67677,0),(34453,67678,0),(34454,67679,0),(34455,67680,0),(34456,67681,0),(34457,67682,0),(34458,67683,0),(34459,67684,0),(34460,67685,0),(34461,67686,0),(34462,67687,0),(34463,67688,0),(34464,67689,0),(34465,67690,0),(34466,67691,0),(34467,67692,0),(34468,67693,0),(34469,67694,0),(34470,67695,0),(34471,67696,0),(34472,67697,0),(34473,67698,0),(34474,67699,0),(34475,67700,0),(34476,67701,0),(34477,67702,0),(34478,67703,0),(34479,67704,0),(34480,67705,0),(34481,67706,0),(34482,67707,0),(34483,67708,0),(34484,67709,0),(34485,67710,0),(34486,67711,0),(34487,67712,0),(34488,67713,0),(34489,67714,0),(34490,67715,0),(34491,67716,0),(34492,67717,0),(34493,67718,0),(34494,67719,0),(34495,67720,0),(34496,67721,0),(34497,67722,0),(34498,67723,0),(34499,67724,0),(34500,67725,0),(34501,67726,0),(34502,67727,0),(34503,67728,0),(34504,67729,0),(34505,67730,0),(34506,67731,0),(34507,67732,0),(34508,67733,0),(34509,67734,0),(34510,67735,0),(34511,67736,0),(34512,67737,0),(34513,67738,0),(34514,67739,0),(34515,67740,0),(34516,67741,0),(34517,67742,0),(34518,67743,0),(34519,67744,0),(34520,67745,0),(34521,67746,0),(34522,67747,0),(34523,67748,0),(34524,67750,0),(34525,67751,0),(34526,67752,0),(34527,67753,0),(34528,67754,0),(34529,67755,0),(34530,67756,0),(34531,67757,0),(34532,67758,0),(34533,67759,0),(34534,67760,0),(34535,67761,0),(34536,67762,0),(34537,67763,0),(34538,67764,0),(34539,67765,0),(34540,67766,0),(34541,67767,0),(34542,67768,0),(34543,67769,0),(34544,67770,0),(34545,67771,0),(34546,67772,0),(34547,67773,0),(34548,67774,0),(34549,67775,0),(34550,67776,0),(34551,67777,0),(34552,67778,0),(34553,67779,0),(34554,67780,0),(34555,67781,0),(34556,67782,0),(34557,67783,0),(34558,67784,0),(34559,67785,0),(34560,67786,0),(34561,67787,0),(34562,67788,0),(34563,67789,0),(34564,67790,0),(34565,67791,0),(34566,67920,0),(34567,67921,0),(34568,67922,0),(34569,67923,0),(34570,67924,0),(34571,67925,0),(34572,67926,0),(34573,67927,0),(34574,67928,0),(34575,67929,0),(34576,67930,0),(34577,67931,0),(34578,67932,0),(34579,67933,0),(34580,67934,0),(34581,67935,0),(34582,67936,0),(34583,67937,0),(34584,67938,0),(34585,67939,0),(34586,67940,0),(34587,67941,0),(34588,67942,0),(34589,67943,0),(34590,67945,0),(34591,67946,0),(34592,67947,0),(34593,67948,0),(34594,67949,0),(34595,67950,0),(34596,67951,0),(34597,67952,0),(34598,67953,0),(34599,67954,0),(34600,67955,0),(34601,67956,0),(34602,67957,0),(34603,67958,0),(34604,67959,0),(34605,67960,0),(34606,67961,0),(34607,67962,0),(34608,67963,0),(34609,67964,0),(34610,67965,0),(34611,67966,0),(34612,67967,0),(34613,67968,0),(34614,67969,0),(34615,67970,0),(34616,67971,0),(34617,67972,0),(34618,67973,0),(34619,67974,0),(34620,67975,0),(34621,67976,0),(34622,67977,0),(34623,67978,0),(34624,67979,0),(34625,67980,0),(34626,67981,0),(34627,67982,0),(34628,67983,0),(34629,67984,0),(34630,67985,0),(34631,67986,0),(34632,67987,0),(34633,67988,0),(34634,67989,0),(34635,67990,0),(34636,67991,0),(34637,67992,0),(34638,67993,0),(34639,67994,0),(34640,67995,0),(34641,67996,0),(34642,67997,0),(34643,67998,0),(34644,67999,0),(34645,68000,0),(34646,68001,0),(34647,68002,0),(34648,68003,0),(34649,68005,0),(34650,68012,0),(34651,68013,0),(34652,68014,0),(34653,68015,0),(34654,68016,0),(34655,68017,0),(34656,68018,0),(34657,68019,0),(34658,68020,0),(34659,68021,0),(34660,68022,0),(34661,68023,0),(34662,68024,0),(34663,68025,0),(34664,68026,0),(34665,68027,0),(34666,68028,0),(34667,68029,0),(34668,68030,0),(34669,68031,0),(34670,68036,0),(34671,68040,0),(34672,68041,0),(34673,68042,0),(34674,68050,0),(34675,68052,0),(34676,68053,0),(34677,68058,0),(34678,68059,0),(34679,68060,0),(34680,68061,0),(34681,68062,0),(34682,68063,0),(34683,68064,0),(34684,68065,0),(34685,68066,0),(34686,68067,0),(34687,68068,0),(34688,68069,0),(34689,68070,0),(34690,68071,0),(34691,68072,0),(34692,68073,0),(34693,68074,0),(34694,68075,0),(34695,68076,0),(34696,68077,0),(34697,68078,0),(34698,68079,0),(34699,68080,0),(34700,68081,0),(34701,68082,0),(34702,68083,0),(34703,68084,0),(34704,68085,0),(34705,68086,0),(34706,68087,0),(34707,68088,0),(34708,68089,0),(34709,68090,0),(34710,68091,0),(34711,68092,0),(34712,68093,0),(34713,68094,0),(34714,68095,0),(34715,68096,0),(34716,68097,0),(34717,68098,0),(34718,68099,0),(34719,68100,0),(34720,68101,0),(34721,68102,0),(34722,68103,0),(34723,68104,0),(34724,68105,0),(34725,68106,0),(34726,68107,0),(34727,68108,0),(34728,68127,0),(34729,68128,0),(34730,68129,0),(34731,68130,0),(34732,68131,0),(34733,68132,0),(34734,68144,0),(34735,68145,0),(34736,68146,0),(34737,68147,0),(34738,68148,0),(34739,68149,0),(34740,68150,0),(34741,68151,0),(34742,68152,0),(34743,68153,0),(34744,68154,0),(34745,68155,0),(34746,68156,0),(34747,68157,0),(34748,68158,0),(34749,68159,0),(34750,68161,0),(34751,68162,0),(34752,68163,0),(34753,68164,0),(34754,68165,0),(34755,68166,0),(34756,68167,0),(34757,68168,0),(34758,68169,0),(34759,68170,0),(34760,68171,0),(34761,68177,0),(34762,68178,0),(34763,68179,0),(34764,68180,0),(34765,68181,0),(34766,68182,0),(34767,68183,0),(34768,68184,0),(34769,68185,0),(34770,68186,0),(34771,68187,0),(34772,68188,0),(34773,68189,0),(34774,68190,0),(34775,68191,0),(34776,68192,0),(34777,68194,0),(34778,68195,0),(34779,68200,0),(34780,68201,0),(34781,68202,0),(34782,68203,0),(34783,68204,0),(34784,68205,0),(34785,68206,0),(34786,68207,0),(34787,68208,0),(34788,68209,0),(34789,68210,0),(34790,68211,0),(34791,68212,0),(34792,68213,0),(34793,68214,0),(34794,68215,0),(34795,68216,0),(34796,68217,0),(34797,68218,0),(34798,68219,0),(34799,68220,0),(34800,68221,0),(34801,68222,0),(34802,68223,0),(34803,68224,0),(34804,68225,0),(34805,68226,0),(34806,68227,0),(34807,68228,0),(34808,68229,0),(34809,68230,0),(34810,68231,0),(34811,68232,0),(34812,68233,0),(34813,68244,0),(34814,68245,0),(34815,68246,0),(34816,68247,0),(34817,68248,0),(34818,68249,0),(34819,68250,0),(34820,68251,0),(34821,68252,0),(34822,68253,0),(34823,68254,0),(34824,68255,0),(34825,68256,0),(34826,68257,0),(34827,68258,0),(34828,68259,0),(34829,68260,0),(34830,68261,0),(34831,68262,0),(34832,68263,0),(34833,68264,0),(34834,68265,0),(34835,68266,0),(34836,68267,0),(34837,68268,0),(34838,68269,0),(34839,68270,0),(34840,68271,0),(34841,68272,0),(34842,68273,0),(34843,68274,0),(34844,68275,0),(34845,68276,0),(34846,68277,0),(34847,68278,0),(34848,68279,0),(34849,68280,0),(34850,68281,0),(34851,68282,0),(34852,68283,0),(34853,68284,0),(34854,68285,0),(34855,68286,0),(34856,68287,0),(34857,68288,0),(34858,68289,0),(34859,68290,0),(34860,68291,0),(34861,68292,0),(34862,68293,0),(34863,68294,0),(34864,68295,0),(34865,68296,0),(34866,68297,0),(34867,68298,0),(34868,68299,0),(34869,68300,0),(34870,68301,0),(34871,68302,0),(34872,68303,0),(34873,68305,0),(34874,68306,0),(34875,68307,0),(34876,68308,0),(34877,68309,0),(34878,68310,0),(34879,68311,0),(34880,68312,0),(34881,68313,0),(34882,68314,0),(34883,68315,0),(34884,68316,0),(34885,68317,0),(34886,68318,0),(34887,68319,0),(34888,68320,0),(34889,68321,0),(34890,68322,0),(34891,68323,0),(34892,68324,0),(34893,68325,0),(34894,68326,0),(34895,68327,0),(34896,68328,0),(34897,68329,0),(34898,68330,0),(34899,68331,0),(34900,68332,0),(34901,68333,0),(34902,68334,0),(34903,68335,0),(34904,68336,0),(34905,68337,0),(34906,68338,0),(34907,68339,0),(34908,68340,0),(34909,68341,0),(34910,68342,0),(34911,68343,0),(34912,68344,0),(34913,68345,0),(34914,68346,0),(34915,68347,0),(34916,68348,0),(34917,68349,0),(34918,68350,0),(34919,68351,0),(34920,68352,0),(34921,68353,0),(34922,68354,0),(34923,68355,0),(34924,68362,0),(34925,68363,0),(34926,68364,0),(34927,68365,0),(34928,68366,0),(34929,68367,0),(34930,68368,0),(34931,68369,0),(34932,68370,0),(34933,68371,0),(34934,68372,0),(34935,68373,0),(34936,68374,0),(34937,68375,0),(34938,68376,0),(34939,68377,0),(34940,68407,0),(34941,68408,0),(34942,68409,0),(34943,68410,0),(34944,68411,0),(34945,68412,0),(34946,68413,0),(34947,68414,0),(34948,68415,0),(34949,68416,0),(34950,68417,0),(34951,68418,0),(34952,68419,0),(34953,68420,0),(34954,68421,0),(34955,68422,0),(34956,68423,0),(34957,68424,0),(34958,68425,0),(34959,68426,0),(34960,68427,0),(34961,68428,0),(34962,68429,0),(34963,68430,0),(34964,68431,0),(34965,68432,0),(34966,68433,0),(34967,68434,0),(34968,68435,0),(34969,68436,0),(34970,68437,0),(34971,68438,0),(34972,68439,0),(34973,68440,0),(34974,68441,0),(34975,68442,0),(34976,68443,0),(34977,68444,0),(34978,68445,0),(34979,68446,0),(34980,68447,0),(34981,68448,0),(34982,68449,0),(34983,68450,0),(34984,68451,0),(34985,68452,0),(34986,68453,0),(34987,68454,0),(34988,68455,0),(34989,68456,0),(34990,68457,0),(34991,68458,0),(34992,68459,0),(34993,68460,0),(34994,68461,0),(34995,68462,0),(34996,68463,0),(34997,68464,0),(34998,68465,0),(34999,68466,0),(35000,68467,0),(35001,68468,0),(35002,68469,0),(35003,68470,0),(35004,68471,0),(35005,68472,0),(35006,68473,0),(35007,68474,0),(35008,68475,0),(35009,68476,0),(35010,68477,0),(35011,68478,0),(35012,68479,0),(35013,68480,0),(35014,68481,0),(35015,68482,0),(35016,68483,0),(35017,68484,0),(35018,68485,0),(35019,68486,0),(35020,68487,0),(35021,68488,0),(35022,68489,0),(35023,68490,0),(35024,68491,0),(35025,68492,0),(35026,68493,0),(35027,68494,0),(35028,68495,0),(35029,68496,0),(35030,68497,0),(35031,68498,0),(35032,68499,0),(35033,68500,0),(35034,68501,0),(35035,68502,0),(35036,68503,0),(35037,68504,0),(35038,68505,0),(35039,68506,0),(35040,68507,0),(35041,68508,0),(35042,68509,0),(35043,68510,0),(35044,68511,0),(35045,68512,0),(35046,68513,0),(35047,68514,0),(35048,68515,0),(35049,68516,0),(35050,68517,0),(35051,68518,0),(35052,68519,0),(35053,68520,0),(35055,68522,0),(35056,68523,0),(35057,68524,0),(35058,68525,0),(35059,68526,0),(35060,68527,0),(35061,68528,0),(35062,68529,0),(35063,68530,0),(35064,68531,0),(35065,68532,0),(35066,68533,0),(35067,68534,0),(35068,68535,0),(35069,68536,0),(35070,68537,0),(35071,68538,0),(35072,68539,0),(35073,68540,0),(35074,68541,0),(35075,68542,0),(35076,68543,0),(35077,68544,0),(35078,68545,0),(35079,68546,0),(35080,68547,0),(35081,68548,0),(35082,68549,0),(35083,68550,0),(35084,68551,0),(35085,68552,0),(35086,68553,0),(35087,68554,0),(35088,68555,0),(35089,68556,0),(35090,68557,0),(35091,68558,0),(35092,68559,0),(35093,68560,0),(35094,68561,0),(35095,68562,0),(35096,68563,0),(35097,68564,0),(35098,68565,0),(35099,68566,0),(35100,68567,0),(35101,68568,0),(35102,68569,0),(35103,68570,0),(35104,68571,0),(35105,68572,0),(35106,68573,0),(35107,68574,0),(35108,68575,0),(35109,68576,0),(35110,68577,0),(35111,68578,0),(35112,68579,0),(35113,68580,0),(35114,68581,0),(35115,68582,0),(35116,68583,0),(35117,68584,0),(35118,68585,0),(35119,68586,0),(35120,68587,0),(35121,68588,0),(35122,68589,0),(35123,68590,0),(35124,68591,0),(35125,68592,0),(35126,68593,0),(35127,68594,0),(35128,68595,0),(35129,68596,0),(35130,68597,0),(35131,68600,0),(35132,68601,0),(35133,68608,0),(35134,68611,0),(35135,68626,0),(35136,68653,0),(35137,68664,0),(35138,68665,0),(35139,68666,0),(35140,68667,0),(35141,68724,0),(35142,68730,0),(35143,68739,0),(35144,68740,0),(35145,68743,0),(35146,68744,0),(35147,68745,0),(35148,68746,0),(35149,68747,0),(35150,68748,0),(35151,68749,0),(35152,68750,0),(35153,68751,0),(35154,68752,0),(35155,68753,0),(35156,68754,0),(35157,68755,0),(35158,68756,0),(35159,68757,0),(35160,68758,0),(35161,68759,0),(35162,68760,0),(35163,68761,0),(35164,68762,0),(35165,68814,0),(35166,68818,0),(35167,68821,0),(35168,68822,0),(35169,68834,0),(35170,68838,0),(35171,68842,0),(35172,68843,0),(35173,68844,0),(35174,68845,0),(35175,68846,0),(35176,68847,0),(35177,68848,0),(35178,68849,0),(35179,68850,0),(35180,68851,0),(35181,68852,0),(35182,68853,0),(35183,68854,0),(35184,68855,0),(35185,68856,0),(35186,68857,0),(35187,68858,0),(35188,68859,0),(35189,68860,0),(35190,68861,0),(35191,68862,0),(35192,68863,0),(35193,68864,0),(35194,68865,0),(35195,68866,0),(35196,68867,0),(35197,68868,0),(35198,68869,0),(35199,68870,0),(35200,68871,0),(35201,68872,0),(35202,68873,0),(35203,68874,0),(35204,68875,0),(35205,68876,0),(35206,68877,0),(35207,68878,0),(35208,68879,0),(35209,68880,0),(35210,68881,0),(35211,68882,0),(35212,68883,0),(35213,68884,0),(35214,68885,0),(35215,68886,0),(35216,68887,0),(35217,68888,0),(35218,68889,0),(35219,68891,0),(35220,68892,0),(35221,68893,0),(35222,68894,0),(35223,68895,0),(35224,68896,0),(35225,68897,0),(35226,68898,0),(35227,68899,0),(35228,68900,0),(35229,68901,0),(35230,68902,0),(35231,68903,0),(35232,68904,0),(35233,68905,0),(35234,68906,0),(35235,68907,0),(35236,68908,0),(35237,68909,0),(35238,68910,0),(35239,68911,0),(35240,68912,0),(35241,68913,0),(35242,68914,0),(35243,68916,0),(35244,68917,0),(35245,68918,0),(35246,68919,0),(35247,68920,0),(35248,68921,0),(35249,68922,0),(35250,68923,0),(35251,68924,0),(35252,68928,0),(35253,68929,0),(35254,68930,0),(35255,68931,0),(35256,68932,0),(35257,68933,0),(35258,68934,0),(35259,68935,0),(35260,68936,0),(35261,68938,0),(35262,68939,0),(35263,68940,0),(35264,68941,0),(35265,68942,0),(35266,68943,0),(35267,68944,0),(35268,68945,0),(35269,68946,0),(35270,68947,0),(35271,68948,0),(35272,68949,0),(35273,68950,0),(35274,68951,0),(35275,68952,0),(35276,68953,0),(35277,68954,0),(35278,68956,0),(35279,68957,0),(35280,68958,0),(35281,68959,0),(35282,68960,0),(35283,68961,0),(35284,68962,0),(35285,68963,0),(35286,68964,0),(35287,68965,0),(35288,68966,0),(35289,68967,0),(35290,68968,0),(35291,68969,0),(35292,68970,0),(35293,68971,0),(35294,68973,0),(35295,68974,0),(35296,68975,0),(35297,68976,0),(35298,68977,0),(35299,68978,0),(35300,68979,0),(35301,68980,0),(35302,68999,0),(35303,69009,0),(35304,69010,0),(35305,69011,0),(35306,69012,0),(35307,69013,0),(35308,69014,0),(35309,69015,0),(35310,69016,0),(35311,69030,0),(35312,69033,0),(35313,69036,0),(35314,69037,0),(35315,69038,0),(35316,69039,0),(35317,69041,0),(35318,69042,0),(35319,69043,0),(35320,69044,0),(35321,69045,0),(35322,69046,0),(35323,69047,0),(35324,69048,0),(35325,69049,0),(35326,69050,0),(35327,69051,0),(35328,69052,0),(35329,69053,0),(35330,69054,0),(35331,69055,0),(35332,69058,0),(35333,69059,0),(35334,69060,0),(35335,69061,0),(35336,69062,0),(35337,69063,0),(35338,69064,0),(35339,69065,0),(35340,69066,0),(35341,69067,0),(35342,69068,0),(35343,69069,0),(35344,69070,0),(35345,69071,0),(35346,69072,0),(35347,69073,0),(35348,69074,0),(35349,69075,0),(35350,69076,0),(35351,69078,0),(35352,69079,0),(35353,69080,0),(35354,69081,0),(35355,69082,0),(35356,69083,0),(35357,69084,0),(35358,69085,0),(35359,69086,0),(35360,69087,0),(35361,69088,0),(35362,69089,0),(35363,69090,0),(35364,69091,0),(35365,69092,0),(35366,69093,0),(35367,69094,0),(35368,69095,0),(35369,69096,0),(35370,69097,0),(35371,69099,0),(35372,69100,0),(35373,69102,0),(35374,69104,0),(35375,69105,0),(35376,69106,0),(35377,69107,0),(35378,69108,0),(35379,69114,0),(35380,69115,0),(35381,69116,0),(35382,69117,0),(35383,69118,0),(35384,69119,0),(35385,69120,0),(35386,69121,0),(35387,69122,0),(35388,69123,0),(35389,69124,0),(35390,69125,0),(35391,69126,0),(35392,69127,0),(35393,69128,0),(35394,69129,0),(35395,69130,0),(35396,69131,0),(35397,69132,0),(35398,69133,0),(35399,69134,0),(35400,69135,0),(35401,69136,0),(35402,69137,0),(35403,69140,0),(35404,69141,0),(35405,69142,0),(35406,69143,0),(35407,69144,0),(35408,69145,0),(35409,69146,0),(35410,69147,0),(35411,69148,0),(35412,69151,0),(35413,69152,0),(35414,69153,0),(35415,69154,0),(35416,69155,0),(35417,69156,0),(35418,69157,0),(35419,69158,0),(35420,69159,0),(35421,69160,0),(35422,69161,0),(35423,69162,0),(35424,69163,0),(35425,69164,0),(35426,69165,0),(35427,69166,0),(35428,69168,0),(35429,69169,0),(35430,69170,0),(35431,69171,0),(35432,69172,0),(35433,69173,0),(35434,69174,0),(35435,69175,0),(35436,69176,0),(35437,69177,0),(35438,69178,0),(35439,69179,0),(35440,69180,0),(35441,69181,0),(35442,69182,0),(35443,69183,0),(35444,69202,0),(35445,69207,0),(35446,69208,0),(35447,69209,0),(35448,69210,0),(35449,69216,0),(35450,69217,0),(35451,69218,0),(35452,69219,0),(35453,69220,0),(35454,69221,0),(35455,69222,0),(35456,69223,0),(35457,69229,0),(35458,69255,0),(35459,69256,0),(35460,69257,0),(35461,69258,0),(35462,69259,0),(35463,69260,0),(35464,69263,0),(35465,69549,0),(35466,69550,0),(35467,69551,0),(35468,69552,0),(35469,69554,0),(35470,69555,0),(35471,69556,0),(35472,69557,0),(35473,69558,0),(35474,69559,0),(35475,69560,0),(35476,69561,0),(35477,69562,0),(35478,69564,0),(35479,69565,0),(35480,69567,0),(35481,69568,0),(35482,69569,0),(35483,69570,0),(35484,69572,0),(35485,69573,0),(35486,69574,0),(35487,69575,0),(35488,69576,0),(35489,69577,0),(35490,69578,0),(35491,69579,0),(35492,69580,0),(35493,69581,0),(35494,69582,0),(35495,69583,0),(35496,69584,0),(35497,69585,0),(35498,69586,0),(35499,69587,0),(35500,69588,0),(35501,69589,0),(35502,69590,0),(35503,69591,0),(35504,69592,0),(35505,69593,0),(35506,69594,0),(35507,69595,0),(35508,69596,0),(35509,69597,0),(35510,69598,0),(35511,69599,0),(35512,69600,0),(35513,69601,0),(35514,69603,0),(35515,69604,0),(35516,69606,0),(35517,69607,0),(35518,69608,0),(35519,69609,0),(35520,69611,0),(35521,69612,0),(35522,69613,0),(35523,69614,0),(35524,69615,0),(35525,69616,0),(35526,69617,0),(35527,69618,0),(35528,69619,0),(35529,69620,0),(35530,69621,0),(35531,69622,0),(35532,69623,0),(35533,69624,0),(35534,69625,0),(35535,69626,0),(35536,69627,0),(35537,69628,0),(35538,69629,0),(35539,69630,0),(35540,69631,0),(35541,69632,0),(35542,69633,0),(35543,69634,0),(35544,69636,0),(35545,69637,0),(35546,69638,0),(35547,69639,0),(35548,69640,0),(35549,69641,0),(35550,69642,0),(35551,69643,0),(35552,69644,0),(35553,69755,0),(35554,69756,0),(35555,69757,0),(35556,69758,0),(35557,69764,0),(35558,69766,0),(35559,69767,0),(35560,69768,0),(35561,69769,0),(35562,69770,0),(35563,69771,0),(35564,69796,0),(35565,69797,0),(35566,69798,0),(35567,69800,0),(35568,69801,0),(35569,69803,0),(35570,69804,0),(35571,69805,0),(35572,69814,0),(35573,69819,0),(35574,69831,0),(35575,69833,0),(35576,69834,0),(35577,69835,0),(35578,69842,0),(35579,69843,0),(35580,69844,0),(35581,69849,0),(35582,69857,0),(35583,69858,0),(35584,69859,0),(35585,69864,0),(35586,69865,0),(35587,69876,0),(35588,69877,0),(35589,69878,0),(35590,69879,0),(35591,69881,0),(35592,69884,0),(35593,69887,0),(35594,69888,0),(35595,69889,0),(35596,69890,0),(35597,69892,0),(35598,69893,0),(35599,69897,0),(35600,69916,0),(35601,69936,0),(35602,69937,0),(35603,69938,0),(35604,69939,0),(35605,69941,0),(35606,69942,0),(35607,69943,0),(35608,69944,0),(35609,69945,0),(35610,69946,0),(35611,69947,0),(35612,69948,0),(35613,69949,0),(35614,69950,0),(35615,69951,0),(35616,69952,0),(35617,69953,0),(35618,69954,0),(35619,70004,0),(35620,70005,0),(35621,70006,0),(35622,70007,0),(35623,70008,0),(35624,70009,0),(35625,70010,0),(35626,70011,0),(35627,70012,0),(35628,70013,0),(35629,70014,0),(35630,70015,0),(35631,70016,0),(35632,70017,0),(35633,70018,0),(35634,70019,0),(35635,70020,0),(35636,70021,0),(35637,70022,0),(35638,70023,0),(35639,70024,0),(35640,70025,0),(35641,70026,0),(35642,70027,0),(35643,70028,0),(35644,70029,0),(35645,70030,0),(35646,70031,0),(35647,70032,0),(35648,70033,0),(35649,70034,0),(35650,70035,0),(35651,70036,0),(35652,70037,0),(35653,70038,0),(35654,70039,0),(35655,70040,0),(35656,70041,0),(35657,70042,0),(35658,70043,0),(35659,70044,0),(35660,70045,0),(35661,70046,0),(35662,70047,0),(35663,70048,0),(35664,70049,0),(35665,70050,0),(35666,70051,0),(35667,70052,0),(35668,70053,0),(35669,70054,0),(35670,70055,0),(35671,70056,0),(35672,70057,0),(35673,70058,0),(35674,70059,0),(35675,70060,0),(35676,70061,0),(35677,70062,0),(35678,70063,0),(35679,70064,0),(35680,70065,0),(35681,70066,0),(35682,70067,0),(35683,70068,0),(35684,70069,0),(35685,70070,0),(35686,70080,0),(35687,70081,0),(35688,70082,0),(35689,70083,0),(35690,70084,0),(35691,70085,0),(35692,70086,0),(35693,70087,0),(35694,70088,0),(35695,70089,0),(35696,70090,0),(35697,70091,0),(35698,70092,0),(35699,70093,0),(35700,70094,0),(35701,70095,0),(35702,70096,0),(35703,70097,0),(35704,70098,0),(35705,70104,0),(35706,70108,0),(35707,70112,0),(35708,70114,0),(35709,70115,0),(35710,70116,0),(35711,70117,0),(35712,70118,0),(35713,70120,0),(35714,70121,0),(35715,70122,0),(35716,70123,0),(35717,70155,0),(35718,70156,0),(35719,70157,0),(35720,70158,0),(35721,70162,0),(35722,70163,0),(35723,70164,0),(35724,70165,0),(35725,70178,0),(35726,70179,0),(35727,70180,0),(35728,70181,0),(35729,70182,0),(35730,70183,0),(35731,70184,0),(35732,70185,0),(35733,70186,0),(35734,70187,0),(35735,70188,0),(35736,70189,0),(35737,70190,0),(35738,70191,0),(35739,70192,0),(35740,70193,0),(35741,70194,0),(35742,70195,0),(35743,70196,0),(35744,70197,0),(35745,70198,0),(35746,70199,0),(35747,70200,0),(35748,70201,0),(35749,70202,0),(35750,70203,0),(35751,70204,0),(35752,70205,0),(35753,70206,0),(35754,70207,0),(35755,70208,0),(35756,70209,0),(35757,70210,0),(35758,70211,0),(35759,70212,0),(35760,70213,0),(35761,70214,0),(35762,70215,0),(35763,70216,0),(35764,70217,0),(35765,70218,0),(35766,70219,0),(35767,70220,0),(35768,70221,0),(35769,70222,0),(35770,70223,0),(35771,70224,0),(35772,70225,0),(35773,70226,0),(35774,70227,0),(35775,70228,0),(35776,70229,0),(35777,70230,0),(35778,70231,0),(35779,70232,0),(35780,70233,0),(35781,70234,0),(35782,70235,0),(35783,70236,0),(35784,70237,0),(35785,70238,0),(35786,70239,0),(35787,70240,0),(35788,70241,0),(35789,70242,0),(35790,70243,0),(35791,70244,0),(35792,70245,0),(35793,70246,0),(35794,70247,0),(35795,70248,0),(35796,70249,0),(35797,70250,0),(35798,70251,0),(35799,70252,0),(35800,70253,0),(35801,70254,0),(35802,70255,0),(35803,70256,0),(35804,70257,0),(35805,70258,0),(35806,70259,0),(35807,70260,0),(35808,70261,0),(35809,70262,0),(35810,70263,0),(35811,70264,0),(35812,70265,0),(35813,70266,0),(35814,70267,0),(35815,70268,0),(35816,70269,0),(35817,70270,0),(35818,70271,0),(35819,70272,0),(35820,70273,0),(35821,70274,0),(35822,70275,0),(35823,70276,0),(35824,70277,0),(35825,70278,0),(35826,70279,0),(35827,70280,0),(35828,70281,0),(35829,70282,0),(35830,70283,0),(35831,70284,0),(35832,70285,0),(35833,70286,0),(35834,70287,0),(35835,70288,0),(35836,70289,0),(35837,70290,0),(35838,70291,0),(35839,70292,0),(35840,70293,0),(35841,70294,0),(35842,70295,0),(35843,70296,0),(35844,70297,0),(35845,70298,0),(35846,70299,0),(35847,70300,0),(35848,70301,0),(35849,70302,0),(35850,70303,0),(35851,70304,0),(35852,70305,0),(35853,70306,0),(35854,70307,0),(35855,70308,0),(35856,70309,0),(35857,70310,0),(35858,70311,0),(35859,70312,0),(35860,70313,0),(35861,70314,0),(35862,70315,0),(35863,70316,0),(35864,70317,0),(35865,70318,0),(35866,70319,0),(35867,70320,0),(35868,70321,0),(35869,70322,0),(35870,70323,0),(35871,70324,0),(35872,70325,0),(35873,70326,0),(35874,70327,0),(35875,70328,0),(35876,70329,0),(35877,70330,0),(35878,70331,0),(35879,70332,0),(35880,70333,0),(35881,70334,0),(35882,70335,0),(35883,70336,0),(35884,70337,0),(35885,70338,0),(35886,70339,0),(35887,70340,0),(35888,70341,0),(35889,70342,0),(35890,70343,0),(35891,70344,0),(35892,70345,0),(35893,70346,0),(35894,70347,0),(35895,70348,0),(35896,70349,0),(35897,70350,0),(35898,70351,0),(35899,70352,0),(35900,70353,0),(35901,70354,0),(35902,70355,0),(35903,70356,0),(35904,70357,0),(35905,70358,0),(35906,70359,0),(35907,70360,0),(35908,70361,0),(35909,70362,0),(35910,70363,0),(35911,70364,0),(35912,70365,0),(35913,70366,0),(35914,70367,0),(35915,70368,0),(35916,70383,0),(35917,70384,0),(35918,70385,0),(35919,70386,0),(35920,70387,0),(35921,70388,0),(35922,70389,0),(35923,70415,0),(35924,70416,0),(35925,70417,0),(35926,70418,0),(35927,70419,0),(35928,70420,0),(35929,70421,0),(35930,70422,0),(35931,70423,0),(35932,70424,0),(35933,70425,0),(35934,70426,0),(35935,70427,0),(35936,70428,0),(35937,70429,0),(35938,70430,0),(35939,70431,0),(35940,70432,0),(35941,70433,0),(35942,70434,0),(35943,70435,0),(35944,70436,0),(35945,70437,0),(35946,70438,0),(35947,70439,0),(35948,70440,0),(35949,70441,0),(35950,70442,0),(35951,70443,0),(35952,70444,0),(35953,70445,0),(35954,70446,0),(35955,70447,0),(35956,70448,0),(35957,70449,0),(35958,70450,0),(35959,70451,0),(35960,70452,0),(35961,70453,0),(35962,70454,0),(35963,70455,0),(35964,70456,0),(35965,70457,0),(35966,70458,0),(35967,70459,0),(35968,70460,0),(35969,70461,0),(35970,70462,0),(35971,70463,0),(35972,70464,0),(35973,70465,0),(35974,70466,0),(35975,70467,0),(35976,70468,0),(35977,70469,0),(35978,70470,0),(35979,70471,0),(35980,70472,0),(35981,70473,0),(35982,70474,0),(35983,70475,0),(35984,70476,0),(35985,70477,0),(35986,70478,0),(35987,70479,0),(35988,70480,0),(35989,70481,0),(35990,70482,0),(35991,70483,0),(35992,70484,0),(35993,70485,0),(35994,70486,0),(35995,70487,0),(35996,70488,0),(35997,70489,0),(35998,70490,0),(35999,70491,0),(36000,70492,0),(36001,70493,0),(36002,70494,0),(36003,70495,0),(36004,70496,0),(36005,70497,0),(36006,70498,0),(36007,70499,0),(36008,70500,0),(36009,70501,0),(36010,70502,0),(36011,70503,0),(36012,70504,0),(36013,70505,0),(36014,70506,0),(36015,70507,0),(36016,70508,0),(36017,70509,0),(36018,70511,0),(36019,70512,0),(36020,70513,0),(36021,70514,0),(36022,70515,0),(36023,70516,0),(36024,70523,0),(36025,70524,0),(36026,70525,0),(36027,70526,0),(36028,70527,0),(36029,70528,0),(36030,70529,0),(36031,70530,0),(36032,70531,0),(36033,70532,0),(36034,70533,0),(36035,70534,0),(36036,70535,0),(36037,70536,0),(36038,70537,0),(36039,70540,0),(36040,70541,0),(36041,70542,0),(36042,70543,0),(36043,70544,0),(36044,70545,0),(36045,70546,0),(36046,70547,0),(36047,70548,0),(36048,70549,0),(36049,70550,0),(36050,70551,0),(36051,70552,0),(36052,70553,0),(36053,70554,0),(36054,70555,0),(36055,70556,0),(36056,70557,0),(36057,70558,0),(36058,70559,0),(36059,70560,0),(36060,70561,0),(36061,70562,0),(36062,70566,0),(36063,70567,0),(36064,70568,0),(36065,70569,0),(36066,70570,0),(36067,70571,0),(36068,70572,0),(36069,70573,0),(36070,70574,0),(36071,70575,0),(36072,70576,0),(36073,70580,0),(36074,70581,0),(36075,70582,0),(36076,70583,0),(36077,70584,0),(36078,70585,0),(36079,70586,0),(36080,70587,0),(36081,70588,0),(36082,70589,0),(36083,70590,0),(36084,70591,0),(36085,70592,0),(36086,70593,0),(36087,70594,0),(36088,70595,0),(36089,70596,0),(36090,70597,0),(36091,70598,0),(36092,70599,0),(36093,70600,0),(36094,70601,0),(36095,70608,0),(36096,70609,0),(36097,70610,0),(36098,70611,0),(36099,70612,0),(36100,70615,0),(36101,70616,0),(36102,70617,0),(36103,70618,0),(36104,70619,0),(36105,70623,0),(36106,70624,0),(36107,70625,0),(36108,70626,0),(36109,70627,0),(36110,70632,0),(36111,70633,0),(36112,70634,0),(36113,70635,0),(36114,70636,0),(36115,70639,0),(36116,70640,0),(36117,70641,0),(36118,70642,0),(36119,70643,0),(36120,70644,0),(36121,70645,0),(36122,70646,0),(36123,70647,0),(36124,70648,0),(36125,70649,0),(36126,70650,0),(36127,70651,0),(36128,70652,0),(36129,70655,0),(36130,70656,0),(36131,70657,0),(36132,70658,0),(36133,70659,0),(36134,70660,0),(36135,70661,0),(36136,70662,0),(36137,70663,0),(36138,70664,0),(36139,70665,0),(36140,70666,0),(36141,70667,0),(36142,70668,0),(36143,70669,0),(36144,70670,0),(36145,70671,0),(36146,70672,0),(36147,70673,0),(36148,70674,0),(36149,70675,0),(36150,70691,0),(36151,70693,0),(36152,70723,0),(36153,70729,0),(36154,70731,0),(36155,70733,0),(36156,70734,0),(36157,70735,0),(36158,70736,0),(36159,70737,0),(36160,70739,0),(36161,70741,0),(36162,70742,0),(36163,70743,0),(36164,70744,0),(36165,70745,0),(36166,70746,0),(36167,70747,0),(36168,70748,0),(36169,70749,0),(36170,70750,0),(36171,70751,0),(36172,70752,0),(36173,70753,0),(36174,70754,0),(36175,70755,0),(36176,70756,0),(36177,70757,0),(36178,70758,0),(36179,70759,0),(36180,70760,0),(36181,70761,0),(36182,70762,0),(36183,70763,0),(36184,70764,0),(36185,70765,0),(36186,70766,0),(36187,70767,0),(36188,70768,0),(36189,70769,0),(36190,70770,0),(36191,70771,0),(36192,70772,0),(36193,70773,0),(36194,70774,0),(36195,70775,0),(36196,70776,0),(36197,70777,0),(36198,70778,0),(36199,70779,0),(36200,70780,0),(36201,70781,0),(36202,70782,0),(36203,70783,0),(36204,70784,0),(36205,70785,0),(36206,70786,0),(36207,70787,0),(36208,70788,0),(36209,70789,0),(36210,70790,0),(36211,70791,0),(36212,70792,0),(36213,70793,0),(36214,70794,0),(36215,70795,0),(36216,70796,0),(36217,70797,0),(36218,70798,0),(36219,70799,0),(36220,70800,0),(36221,70801,0),(36222,70802,0),(36223,70803,0),(36224,70804,0),(36225,70805,0),(36226,70806,0),(36227,70807,0),(36228,70808,0),(36229,70809,0),(36230,70810,0),(36231,70811,0),(36232,70812,0),(36233,70813,0),(36234,70814,0),(36235,70815,0),(36236,70816,0),(36237,70817,0),(36238,70818,0),(36239,70823,0),(36240,70824,0),(36241,70825,0),(36242,70826,0),(36243,70827,0),(36244,70828,0),(36245,70829,0),(36246,70830,0),(36247,70831,0),(36248,70832,0),(36249,70833,0),(36250,70834,0),(36251,70835,0),(36252,70836,0),(36253,70837,0),(36254,70838,0),(36255,70839,0),(36256,70840,0),(36257,70841,0),(36258,70842,0),(36259,70843,0),(36260,70844,0),(36261,70845,0),(36262,70846,0),(36263,70847,0),(36264,70848,0),(36265,70849,0),(36266,70850,0),(36267,70851,0),(36268,70852,0),(36269,70853,0),(36270,70854,0),(36271,70855,0),(36272,70856,0),(36273,70857,0),(36274,70858,0),(36275,70859,0),(36276,70860,0),(36277,70861,0),(36278,70862,0),(36279,70863,0),(36280,70864,0),(36281,70865,0),(36282,70866,0),(36283,70867,0),(36284,70868,0),(36285,70869,0),(36286,70870,0),(36287,70871,0),(36288,70872,0),(36289,70873,0),(36290,70874,0),(36291,70875,0),(36292,70876,0),(36293,70877,0),(36294,70878,0),(36295,70879,0),(36296,70880,0),(36297,70881,0),(36298,70884,0),(36299,70885,0),(36300,70886,0),(36301,70887,0),(36302,70888,0),(36303,70889,0),(36304,70890,0),(36305,70891,0),(36306,70892,0),(36307,70893,0),(36308,70894,0),(36309,70895,0),(36310,70896,0),(36311,70897,0),(36312,70898,0),(36313,70899,0),(36314,70900,0),(36315,70901,0),(36316,70902,0),(36317,70903,0),(36318,70904,0),(36319,70905,0),(36320,70906,0),(36321,70907,0),(36322,70911,0),(36323,70912,0),(36324,70913,0),(36325,70914,0),(36326,70915,0),(36327,70916,0),(36328,70917,0),(36329,70920,0),(36330,70921,0),(36331,70922,0),(36332,70923,0),(36333,70930,0),(36334,70933,0),(36335,70936,0),(36336,70937,0),(36337,70941,0),(36338,70942,0),(36339,70943,0),(36340,70944,0),(36341,70945,0),(36342,70946,0),(36343,70947,0),(36344,70948,0),(36345,70949,0),(36346,70950,0),(36347,70951,0),(36348,70952,0),(36349,70953,0),(36350,70954,0),(36351,70955,0),(36352,70956,0),(36353,70957,0),(36354,70958,0),(36355,70959,0),(36356,70960,0),(36357,70961,0),(36358,70962,0),(36359,70963,0),(36360,70964,0),(36361,70965,0),(36362,70966,0),(36363,70967,0),(36364,70968,0),(36365,70969,0),(36366,70970,0),(36367,70971,0),(36368,70972,0),(36369,70973,0),(36370,70974,0),(36371,70975,0),(36372,70976,0),(36373,70977,0),(36374,70978,0),(36375,70979,0),(36376,70985,0),(36377,70986,0),(36378,70987,0),(36379,70988,0),(36380,70989,0),(36381,70990,0),(36382,70991,0),(36383,70992,0),(36384,70993,0),(36385,71003,0),(36386,71004,0),(36387,71005,0),(36388,71006,0),(36389,71007,0),(36390,71009,0),(36391,71010,0),(36392,71011,0),(36393,71013,0),(36394,71014,0),(36395,71018,0),(36396,71020,0),(36397,71021,0),(36398,71022,0),(36399,71023,0),(36400,71025,0),(36401,71026,0),(36402,71027,0),(36403,71028,0),(36404,71029,0),(36405,71030,0),(36406,71031,0),(36407,71036,0),(36408,71038,0),(36409,71039,0),(36410,71040,0),(36411,71041,0),(36412,71042,0),(36413,71043,0),(36414,71044,0),(36415,71045,0),(36416,71046,0),(36417,71047,0),(36418,71048,0),(36419,71049,0),(36420,71050,0),(36421,71051,0),(36422,71052,0),(36423,71053,0),(36424,71054,0),(36425,71055,0),(36426,71058,0),(36427,71059,0),(36428,71060,0),(36429,71061,0),(36430,71062,0),(36431,71063,0),(36432,71064,0),(36433,71065,0),(36434,71066,0),(36435,71067,0),(36436,71068,0),(36437,71069,0),(36438,71070,0),(36439,71071,0),(36440,71072,0),(36441,71077,0),(36442,71080,0),(36443,71081,0),(36444,71082,0),(36445,71084,0),(36446,71085,0),(36447,71086,0),(36448,71089,0),(36449,71090,0),(36450,71091,0),(36451,71092,0),(36452,71093,0),(36453,71094,0),(36454,71095,0),(36455,71097,0),(36456,71098,0),(36457,71099,0),(36458,71100,0),(36459,71101,0),(36460,71102,0),(36461,71103,0),(36462,71104,0),(36463,71105,0),(36464,71106,0),(36465,71107,0),(36466,71108,0),(36467,71109,0),(36468,71110,0),(36469,71111,0),(36470,71115,0),(36471,71116,0),(36472,71117,0),(36473,71118,0),(36474,71119,0),(36475,71120,0),(36476,71121,0),(36477,71122,0),(36478,71130,0),(36479,71131,0),(36480,71138,0),(36481,71139,0),(36482,71142,0),(36483,71145,0),(36484,71150,0),(36485,71151,0),(36486,71152,0),(36487,71154,0),(36488,71156,0),(36489,71157,0),(36490,71158,0),(36491,71159,0),(36492,71160,0),(36493,71161,0),(36494,71162,0),(36495,71163,0),(36496,71164,0),(36497,71165,0),(36498,71166,0),(36499,71167,0),(36500,71168,0),(36501,71169,0),(36502,71170,0),(36503,71171,0),(36504,71172,0),(36505,71173,0),(36506,71174,0),(36507,71175,0),(36508,71176,0),(36509,71177,0),(36510,71178,0),(36511,71179,0),(36512,71180,0),(36513,71189,0),(36514,71190,0),(36515,71191,0),(36516,71192,0),(36517,71193,0),(36518,71194,0),(36519,71195,0),(36520,71196,0),(36521,71197,0),(36522,71198,0),(36523,71199,0),(36524,71200,0),(36525,71201,0),(36526,71202,0),(36527,71203,0),(36528,71204,0),(36529,71205,0),(36530,71206,0),(36531,71218,0),(36532,71227,0),(36533,71228,0),(36534,71229,0),(36535,71230,0),(36536,71249,0),(36537,71250,0),(36538,71253,0),(36539,71254,0),(36540,71255,0),(36541,71258,0),(36542,71260,0),(36543,71261,0),(36544,71262,0),(36545,71263,0),(36546,71264,0),(36547,71265,0),(36548,71266,0),(36549,71267,0),(36550,71268,0),(36551,71269,0),(36552,71270,0),(36553,71271,0),(36554,71272,0),(36555,71273,0),(36556,71274,0),(36557,71275,0),(36558,71276,0),(36559,71277,0),(36560,71278,0),(36561,71279,0),(36562,71280,0),(36563,71281,0),(36564,71282,0),(36565,71283,0),(36566,71284,0),(36567,71285,0),(36568,71286,0),(36569,71287,0),(36570,71288,0),(36571,71289,0),(36572,71290,0),(36573,71291,0),(36574,71292,0),(36575,71293,0),(36576,71294,0),(36577,71295,0),(36578,71296,0),(36579,71297,0),(36580,71298,0),(36581,71299,0),(36582,71300,0),(36583,71301,0),(36584,71302,0),(36585,71303,0),(36586,71304,0),(36587,71305,0),(36588,71312,0),(36589,71313,0),(36590,71314,0),(36591,71315,0),(36592,71323,0),(36593,71325,0),(36594,71326,0),(36595,71331,0),(36596,71332,0),(36597,71340,0),(36598,71341,0),(36599,71342,0),(36600,71343,0),(36601,71344,0),(36602,71345,0),(36603,71346,0),(36604,71347,0),(36605,71349,0),(36606,71350,0),(36607,71351,0),(36608,71352,0),(36609,71353,0),(36610,71355,0),(36611,71356,0),(36612,71357,0),(36613,71358,0),(36614,71359,0),(36615,71360,0),(36616,71361,0),(36617,71362,0),(36618,71365,0),(36619,71366,0),(36620,71368,0),(36621,71388,0),(36622,71389,0),(36623,71390,0),(36624,71391,0),(36625,71392,0),(36626,71393,0),(36627,71394,0),(36628,71395,0),(36629,71396,0),(36630,71397,0),(36631,71398,0),(36632,71399,0),(36633,71400,0),(36634,71402,0),(36635,71403,0),(36636,71404,0),(36637,71405,0),(36638,71406,0),(36639,71407,0),(36640,71408,0),(36641,71409,0),(36642,71410,0),(36643,71411,0),(36644,71412,0),(36645,71413,0),(36646,71414,0),(36647,71415,0),(36648,71416,0),(36649,71417,0),(36650,71418,0),(36651,71419,0),(36652,71420,0),(36653,71421,0),(36654,71422,0),(36655,71424,0),(36656,71425,0),(36657,71426,0),(36658,71427,0),(36659,71428,0),(36660,71429,0),(36661,71430,0),(36662,71431,0),(36663,71432,0),(36664,71434,0),(36665,71435,0),(36666,71436,0),(36667,71437,0),(36668,71438,0),(36669,71439,0),(36670,71440,0),(36671,71441,0),(36672,71442,0),(36673,71443,0),(36674,71444,0),(36675,71445,0),(36676,71447,0),(36677,71448,0),(36678,71450,0),(36679,71451,0),(36680,71452,0),(36681,71453,0),(36682,71454,0),(36683,71455,0),(36684,71456,0),(36685,71457,0),(36686,71458,0),(36687,71459,0),(36688,71460,0),(36689,71461,0),(36690,71462,0),(36691,71463,0),(36692,71464,0),(36693,71465,0),(36694,71466,0),(36695,71467,0),(36696,71468,0),(36697,71469,0),(36698,71470,0),(36699,71471,0),(36700,71473,0),(36701,71474,0),(36702,71475,0),(36703,71476,0),(36704,71477,0),(36705,71478,0),(36706,71479,0),(36707,71480,0),(36708,71481,0),(36709,71482,0),(36710,71483,0),(36711,71484,0),(36712,71485,0),(36713,71486,0),(36714,71487,0),(36715,71488,0),(36716,71489,0),(36717,71490,0),(36718,71491,0),(36719,71492,0),(36720,71493,0),(36721,71494,0),(36722,71495,0),(36723,71496,0),(36724,71497,0),(36725,71498,0),(36726,71499,0),(36727,71500,0),(36728,71501,0),(36729,71502,0),(36730,71503,0),(36731,71504,0),(36732,71505,0),(36733,71507,0),(36734,71508,0),(36735,71509,0),(36736,71510,0),(36737,71511,0),(36738,71512,0),(36739,71513,0),(36740,71514,0),(36741,71515,0),(36742,71516,0),(36743,71517,0),(36744,71518,0),(36745,71519,0),(36746,71520,0),(36747,71521,0),(36748,71522,0),(36749,71523,0),(36750,71524,0),(36751,71525,0),(36752,71526,0),(36753,71527,0),(36754,71528,0),(36755,71529,0),(36756,71530,0),(36757,71531,0),(36758,71532,0),(36759,71533,0),(36760,71534,0),(36761,71535,0),(36762,71536,0),(36763,71537,0),(36764,71538,0),(36765,71539,0),(36766,71540,0),(36767,71541,0),(36768,71542,0),(36769,71543,0),(36770,71544,0),(36771,71545,0),(36772,71546,0),(36773,71547,0),(36774,71548,0),(36775,71549,0),(36776,71550,0),(36777,71551,0),(36778,71552,0),(36779,71553,0),(36780,71554,0),(36781,71555,0),(36782,71556,0),(36783,71557,0),(36784,71558,0),(36785,71559,0),(36786,71560,0),(36787,71561,0),(36788,71562,0),(36789,71568,0),(36790,71569,0),(36791,71570,0),(36792,71571,0),(36793,71572,0),(36794,71575,0),(36795,71579,0),(36796,71581,0),(36797,71582,0),(36798,71583,0),(36799,71584,0),(36800,71585,0),(36801,71592,0),(36802,71593,0),(36803,71594,0),(36804,71595,0),(36805,71596,0),(36806,71597,0),(36807,71598,0),(36808,71599,0),(36809,71600,0),(36810,71601,0),(36811,71602,0),(36812,71603,0),(36813,71604,0),(36814,71605,0),(36815,71606,0),(36816,71607,0),(36817,71608,0),(36818,71611,0),(36819,71612,0),(36820,71613,0),(36821,71614,0),(36822,71615,0),(36823,71616,0),(36824,71640,0),(36825,71641,0),(36826,71713,0),(36827,71732,0),(36828,71736,0),(36829,71739,0),(36830,71741,0),(36831,71744,0),(36832,71745,0),(36833,71746,0),(36834,71747,0),(36835,71748,0),(36836,71749,0),(36837,71750,0),(36838,71751,0),(36839,71752,0),(36840,71753,0),(36841,71754,0),(36842,71755,0),(36843,71756,0),(36844,71757,0),(36845,71758,0),(36846,71759,0),(36847,71760,0),(36848,71761,0),(36849,71762,0),(36850,71763,0),(36851,71764,0),(36852,71765,0),(36853,71766,0),(36854,71767,0),(36855,71768,0),(36856,71769,0),(36857,71770,0),(36858,71774,0),(36859,71775,0),(36860,71776,0),(36861,71777,0),(36862,71778,0),(36863,71779,0),(36864,71780,0),(36865,71781,0),(36866,71782,0),(36867,71783,0),(36868,71784,0),(36869,71785,0),(36870,71786,0),(36871,71787,0),(36872,71797,0),(36873,71798,0),(36874,71963,0),(36875,71969,0),(36876,71980,0),(36877,71981,0),(36878,71982,0),(36879,71983,0),(36880,71984,0),(36881,71985,0),(36882,71986,0),(36883,71987,0),(36884,71988,0),(36885,71989,0),(36886,71990,0),(36887,71991,0),(36888,71992,0),(36889,71993,0),(36890,71994,0),(36891,71995,0),(36892,71996,0),(36893,71997,0),(36894,72019,0),(36895,72020,0),(36896,72021,0),(36897,72022,0),(36898,72023,0),(36899,72024,0),(36900,72032,0),(36901,72034,0),(36902,72036,0),(36903,72037,0),(36904,72038,0),(36905,72039,0),(36906,72040,0),(36907,72041,0),(36908,72069,0),(36909,72098,0),(36910,72107,0),(36911,72156,0),(36912,72158,0),(36913,72202,0),(36914,72203,0),(36915,72204,0),(36916,72205,0),(36917,72206,0),(36918,72207,0),(36919,72208,0),(36920,72209,0),(36921,72210,0),(36922,72211,0),(36923,72212,0),(36924,72213,0),(36925,72214,0),(36926,72215,0),(36927,72216,0),(36928,72217,0),(36929,72218,0),(36930,72219,0),(36931,72220,0),(36932,72221,0),(36933,72222,0),(36934,72223,0),(36935,72224,0),(36936,72225,0),(36937,72226,0),(36938,72227,0),(36939,72228,0),(36940,72229,0),(36941,72230,0),(36942,72231,0),(36943,72232,0),(36944,72233,0),(36945,72242,0),(36946,72243,0),(36947,72244,0),(36948,72245,0),(36949,72248,0),(36950,72249,0),(36951,72250,0),(36952,72251,0),(36953,72252,0),(36954,72253,0),(36955,72254,0),(36956,72255,0),(36957,72256,0),(36958,72257,0),(36959,72258,0),(36960,72259,0),(36961,72260,0),(36962,72261,0),(36963,72262,0),(36964,72263,0),(36965,72264,0),(36966,72265,0),(36967,72266,0),(36968,72267,0),(36969,72268,0),(36970,72269,0),(36971,72270,0),(36972,72271,0),(36973,72272,0),(36974,72273,0),(36975,72274,0),(36976,72275,0),(36977,72276,0),(36978,72277,0),(36979,72278,0),(36980,72279,0),(36981,72280,0),(36982,72281,0),(36983,72282,0),(36984,72283,0),(36985,72284,0),(36986,72285,0),(36987,72288,0),(36988,72289,0),(36989,72291,0),(36990,72293,0),(36991,72294,0),(36992,72296,0),(36993,72297,0),(36994,72298,0),(36995,72299,0),(36996,72300,0),(36997,72301,0),(36998,72305,0),(36999,72306,0),(37000,72313,0),(37001,72314,0),(37002,72315,0),(37003,72316,0),(37004,72317,0),(37005,72318,0),(37006,72319,0),(37007,72320,0),(37008,72321,0),(37009,72322,0),(37010,72323,0),(37011,72324,0),(37012,72332,0),(37013,72333,0),(37014,72334,0),(37015,72335,0),(37016,72336,0),(37017,72337,0),(37018,72338,0),(37019,72339,0),(37020,72340,0),(37021,72341,0),(37022,72342,0),(37023,72343,0),(37024,72344,0),(37025,72345,0),(37026,72346,0),(37027,72347,0),(37028,72348,0),(37029,72349,0),(37030,72350,0),(37031,72351,0),(37032,72352,0),(37033,72353,0),(37034,72354,0),(37035,72355,0),(37036,72356,0),(37037,72357,0),(37038,72362,0),(37039,72363,0),(37040,72364,0),(37041,72365,0),(37042,72366,0),(37043,72367,0),(37044,72368,0),(37045,72369,0),(37046,72370,0),(37047,72371,0),(37048,72372,0),(37049,72373,0),(37050,72374,0),(37051,72375,0),(37052,72376,0),(37053,72377,0),(37054,72378,0),(37055,72379,0),(37056,72380,0),(37057,72381,0),(37058,72382,0),(37059,72383,0),(37060,72384,0),(37061,72385,0),(37062,72386,0),(37063,72387,0),(37064,72388,0),(37065,72389,0),(37066,72390,0),(37067,72391,0),(37068,72392,0),(37069,72393,0),(37070,72394,0),(37071,72395,0),(37072,72396,0),(37073,72397,0),(37074,72398,0),(37075,72399,0),(37076,72400,0),(37077,72401,0),(37078,72402,0),(37079,72403,0),(37080,72404,0),(37081,72405,0),(37082,72406,0),(37083,72407,0),(37084,72408,0),(37085,72409,0),(37086,72416,0),(37087,72417,0),(37088,72418,0),(37089,72419,0),(37090,72420,0),(37091,72421,0),(37092,72422,0),(37093,72423,0),(37094,72424,0),(37095,72425,0),(37096,72426,0),(37097,72427,0),(37098,72428,0),(37099,72429,0),(37100,72430,0),(37101,72431,0),(37102,72432,0),(37103,72433,0),(37104,72434,0),(37105,72435,0),(37106,72436,0),(37107,72437,0),(37108,72438,0),(37109,72439,0),(37110,72440,0),(37111,72441,0),(37112,72442,0),(37113,72443,0),(37114,72444,0),(37115,72445,0),(37116,72446,0),(37117,72447,0),(37118,72451,0),(37119,72452,0),(37120,72459,0),(37121,72460,0),(37122,72461,0),(37123,72462,0),(37124,72463,0),(37125,72464,0),(37126,72465,0),(37127,72466,0),(37128,72467,0),(37129,72468,0),(37130,72469,0),(37131,72470,0),(37132,72471,0),(37133,72472,0),(37134,72473,0),(37135,72474,0),(37136,72476,0),(37137,72477,0),(37138,72478,0),(37139,72479,0),(37140,72481,0),(37141,72482,0),(37142,72483,0),(37143,72484,0),(37144,72485,0),(37145,72486,0),(37146,72487,0),(37147,72488,0),(37148,72489,0),(37149,72490,0),(37150,72491,0),(37151,72492,0),(37152,72493,0),(37153,72494,0),(37154,72495,0),(37155,72496,0),(37156,72497,0),(37157,72498,0),(37158,72499,0),(37159,72500,0),(37160,72501,0),(37161,72502,0),(37162,72503,0),(37163,72504,0),(37164,72505,0),(37165,72506,0),(37166,72507,0),(37167,72508,0),(37168,72509,0),(37169,72510,0),(37170,72511,0),(37171,72512,0),(37172,72513,0),(37173,72514,0),(37174,72515,0),(37175,72553,0),(37176,72584,0),(37177,72585,0),(37178,72586,0),(37179,72587,0),(37180,72603,0),(37181,72604,0),(37182,72605,0),(37183,72606,0),(37184,72607,0),(37185,72608,0),(37186,72609,0),(37187,72610,0),(37188,72611,0),(37189,72612,0),(37190,72613,0),(37191,72614,0),(37192,72615,0),(37193,72616,0),(37194,72617,0),(37195,72618,0),(37196,72621,0),(37197,72622,0),(37198,72623,0),(37199,72624,0),(37200,72625,0),(37201,72626,0),(37202,72627,0),(37203,72628,0),(37204,72629,0),(37205,72630,0),(37206,72631,0),(37207,72632,0),(37208,72633,0),(37209,72634,0),(37210,72635,0),(37211,72636,0),(37212,72637,0),(37213,72638,0),(37214,72639,0),(37215,72640,0),(37216,72641,0),(37217,72642,0),(37218,72643,0),(37219,72644,0),(37220,72645,0),(37221,72646,0),(37222,72647,0),(37223,72648,0),(37224,72649,0),(37225,72650,0),(37226,72651,0),(37227,72652,0),(37228,72653,0),(37229,72655,0),(37230,72656,0),(37231,72657,0),(37232,72658,0),(37233,72659,0),(37234,72660,0),(37235,72661,0),(37236,72662,0),(37237,72664,0),(37238,72665,0),(37239,72666,0),(37240,72667,0),(37241,72668,0),(37242,72669,0),(37243,72670,0),(37244,72671,0),(37245,72672,0),(37246,72673,0),(37247,72674,0),(37248,72675,0),(37249,72676,0),(37250,72677,0),(37251,72678,0),(37252,72679,0),(37253,72681,0),(37254,72682,0),(37255,72683,0),(37256,72684,0),(37257,72685,0),(37258,72686,0),(37259,72687,0),(37260,72688,0),(37261,72689,0),(37262,72690,0),(37263,72691,0),(37264,72692,0),(37265,72693,0),(37266,72694,0),(37267,72695,0),(37268,72696,0),(37269,72697,0),(37270,72698,0),(37271,72699,0),(37272,72700,0),(37273,72701,0),(37274,72702,0),(37275,72703,0),(37276,72704,0),(37277,72705,0),(37278,72798,0),(37279,72799,0),(37280,72800,0),(37281,72801,0),(37282,72802,0),(37283,72803,0),(37284,72804,0),(37285,72805,0),(37286,72806,0),(37287,72807,0),(37288,72808,0),(37289,72809,0),(37290,72810,0),(37291,72811,0),(37292,72812,0),(37293,72813,0),(37294,72814,0),(37295,72815,0),(37296,72816,0),(37297,72817,0),(37298,72818,0),(37299,72819,0),(37300,72820,0),(37301,72821,0),(37302,72822,0),(37303,72823,0),(37304,72824,0),(37305,72825,0),(37306,72826,0),(37307,72827,0),(37308,72828,0),(37309,72829,0),(37310,72830,0),(37311,72832,0),(37312,72833,0),(37313,72834,0),(37314,72835,0),(37315,72836,0),(37316,72838,0),(37317,72839,0),(37318,72840,0),(37319,72841,0),(37320,72842,0),(37321,72843,0),(37322,72844,0),(37323,72846,0),(37324,72847,0),(37325,72848,0),(37326,72849,0),(37327,72850,0),(37328,72851,0),(37329,72852,0),(37330,72853,0),(37331,72854,0),(37332,72855,0),(37333,72856,0),(37334,72857,0),(37335,72858,0),(37336,72859,0),(37337,72860,0),(37338,72861,0),(37339,72862,0),(37340,72863,0),(37341,72864,0),(37342,72865,0),(37343,72866,0),(37344,72867,0),(37345,72868,0),(37346,72869,0),(37347,72870,0),(37348,72871,0),(37349,72872,0),(37350,72873,0),(37351,72874,0),(37352,72875,0),(37353,72876,0),(37354,72877,0),(37355,72878,0),(37356,72879,0),(37357,72881,0),(37358,72882,0),(37359,72883,0),(37360,72884,0),(37361,72887,0),(37362,72889,0),(37363,72890,0),(37364,72891,0),(37365,72892,0),(37366,72893,0),(37367,72894,0),(37368,72895,0),(37369,72896,0),(37370,72902,0),(37371,72903,0),(37372,72904,0),(37373,72905,0),(37374,72906,0),(37375,72907,0),(37376,72908,0),(37377,72909,0),(37378,72910,0),(37379,72911,0),(37380,72912,0),(37381,72913,0),(37382,72914,0),(37383,72915,0),(37384,72916,0),(37385,72917,0),(37386,72918,0),(37387,72919,0),(37388,72920,0),(37389,72921,0),(37390,72922,0),(37391,72923,0),(37392,72924,0),(37393,72925,0),(37394,72929,0),(37395,72930,0),(37396,72931,0),(37397,72932,0),(37398,72933,0),(37399,72934,0),(37400,72935,0),(37401,72936,0),(37402,72937,0),(37403,72938,0),(37404,72939,0),(37405,72940,0),(37406,72941,0),(37407,72942,0),(37408,72943,0),(37409,72944,0),(37410,72945,0),(37411,72946,0),(37412,72947,0),(37413,72948,0),(37414,72949,0),(37415,72950,0),(37416,72951,0),(37417,72952,0),(37418,72955,0),(37419,72956,0),(37420,72957,0),(37421,72958,0),(37422,72959,0),(37423,72960,0),(37424,72961,0),(37425,72962,0),(37426,72963,0),(37427,72964,0),(37428,72965,0),(37429,72966,0),(37430,72967,0),(37431,72968,0),(37432,72969,0),(37433,72970,0),(37434,72971,0),(37435,72972,0),(37436,72973,0),(37437,72974,0),(37438,72975,0),(37439,72976,0),(37440,72977,0),(37441,72978,0),(37442,72980,0),(37443,72981,0),(37444,72982,0),(37445,72983,0),(37446,72984,0),(37447,72989,0),(37448,72990,0),(37449,72991,0),(37450,72992,0),(37451,72993,0),(37452,72994,0),(37453,72995,0),(37454,72996,0),(37455,72997,0),(37456,72998,0),(37457,72999,0),(37458,73000,0),(37459,73001,0),(37460,73002,0),(37461,73003,0),(37462,73004,0),(37463,73005,0),(37464,73006,0),(37465,73007,0),(37466,73008,0),(37467,73009,0),(37468,73010,0),(37469,73011,0),(37470,73012,0),(37471,73028,0),(37472,73029,0),(37473,73030,0),(37474,73031,0),(37475,73032,0),(37476,73033,0),(37477,73034,0),(37478,73035,0),(37479,73036,0),(37480,73038,0),(37481,73039,0),(37482,73040,0),(37483,73041,0),(37484,73043,0),(37485,73044,0),(37486,73045,0),(37487,73046,0),(37488,73047,0),(37489,73048,0),(37490,73049,0),(37491,73050,0),(37492,73051,0),(37493,73052,0),(37494,73053,0),(37495,73054,0),(37496,73055,0),(37497,73056,0),(37498,73057,0),(37499,73070,0),(37500,73071,0),(37501,73072,0),(37502,73093,0),(37503,73203,0),(37504,73207,0),(37505,73208,0),(37506,73209,0),(37507,73210,0),(37508,73211,0),(37509,73212,0),(37510,73213,0),(37511,73214,0),(37512,73215,0),(37513,73216,0),(37514,73217,0),(37515,73218,0),(37516,73219,0),(37517,73220,0),(37518,73221,0),(37519,73222,0),(37520,73223,0),(37521,73224,0),(37522,73225,0),(37523,73226,0),(37524,73227,0),(37525,73228,0),(37526,73229,0),(37527,73230,0),(37528,73231,0),(37529,73232,0),(37530,73233,0),(37531,73234,0),(37532,73235,0),(37533,73236,0),(37534,73237,0),(37535,73238,0),(37536,73239,0),(37537,73240,0),(37538,73302,0),(37539,73306,0),(37540,73307,0),(37541,73308,0),(37542,73309,0),(37543,73310,0),(37544,73311,0),(37545,73312,0),(37546,73313,0),(37547,73314,0),(37548,73315,0),(37549,73316,0),(37550,73317,0),(37551,73318,0),(37552,73319,0),(37553,73320,0),(37554,73321,0),(37555,73322,0),(37556,73323,0),(37557,73324,0),(37558,73325,0),(37559,73326,0),(37560,73327,0),(37561,73328,0),(37562,73329,0),(37563,73330,0),(37564,73331,0),(37565,73332,0),(37566,73333,0),(37567,73334,0),(37568,73335,0),(37569,73336,0),(37570,73344,0),(37571,73345,0),(37572,73347,0),(37573,73348,0),(37574,73349,0),(37575,73350,0),(37576,73351,0),(37577,73352,0),(37578,73353,0),(37579,73357,0),(37580,73358,0),(37581,73359,0),(37582,73361,0),(37583,73362,0),(37584,73363,0),(37585,73364,0),(37586,73373,0),(37587,73374,0),(37588,73375,0),(37589,73376,0),(37590,73377,0),(37591,73378,0),(37592,73379,0),(37593,73380,0),(37594,73381,0),(37595,73382,0),(37596,73383,0),(37597,73384,0),(37598,73385,0),(37599,73386,0),(37600,73387,0),(37601,73388,0),(37602,73389,0),(37603,73390,0),(37604,73391,0),(37605,73392,0),(37606,73393,0),(37607,73394,0),(37608,73395,0),(37609,73396,0),(37610,73397,0),(37611,73401,0),(37612,73402,0),(37613,73403,0),(37614,73404,0),(37615,73405,0),(37616,73406,0),(37617,73407,0),(37618,73408,0),(37619,73409,0),(37620,73412,0),(37621,73413,0),(37622,73414,0),(37623,73415,0),(37624,73416,0),(37625,73417,0),(37626,73418,0),(37627,73419,0),(37628,73420,0),(37629,73421,0),(37630,73422,0),(37631,73423,0),(37632,73424,0),(37633,73425,0),(37634,73426,0),(37635,73427,0),(37636,73428,0),(37637,73429,0),(37638,73430,0),(37639,73431,0),(37640,73432,0),(37641,73433,0),(37642,73434,0),(37643,73435,0),(37644,73436,0),(37645,73437,0),(37646,73438,0),(37647,73439,0),(37648,73440,0),(37649,73441,0),(37650,73442,0),(37651,73443,0),(37652,73444,0),(37653,73445,0),(37654,73446,0),(37655,73447,0),(37656,73448,0),(37657,73449,0),(37658,73450,0),(37659,73451,0),(37660,73452,0),(37661,73453,0),(37662,73454,0),(37663,73455,0),(37664,73456,0),(37665,73457,0),(37666,73458,0),(37667,73459,0),(37668,73460,0),(37669,73461,0),(37670,73462,0),(37671,73463,0),(37672,73464,0),(37673,73465,0),(37674,73466,0),(37675,73467,0),(37676,73468,0),(37677,73469,0),(37678,73470,0),(37679,73471,0),(37680,73472,0),(37681,73473,0),(37682,73474,0),(37683,73475,0),(37684,73476,0),(37685,73477,0),(37686,73478,0),(37687,73479,0),(37688,73480,0),(37689,73481,0),(37690,73482,0),(37691,73483,0),(37692,73484,0),(37693,73485,0),(37694,73486,0),(37695,73487,0),(37696,73494,0),(37697,73495,0),(37698,73502,0),(37699,73503,0),(37700,73504,0),(37701,73505,0),(37702,73506,0),(37703,73507,0),(37704,73508,0),(37705,73509,0),(37706,73510,0),(37707,73511,0),(37708,73512,0),(37709,73513,0),(37710,73514,0),(37711,73515,0),(37712,73516,0),(37713,73517,0),(37714,73518,0),(37715,73519,0),(37716,73520,0),(37717,73521,0),(37718,73522,0),(37719,73523,0),(37720,73524,0),(37721,73525,0),(37722,73526,0),(37723,73527,0),(37724,73528,0),(37725,73529,0),(37726,73530,0),(37727,73531,0),(37728,73532,0),(37729,73533,0),(37730,73540,0),(37731,73541,0),(37732,73542,0),(37733,73543,0),(37734,73544,0),(37735,73545,0),(37736,73546,0),(37737,73547,0),(37738,73548,0),(37739,73549,0),(37740,73550,0),(37741,73551,0),(37742,73552,0),(37743,73553,0),(37744,73554,0),(37745,73555,0),(37746,73556,0),(37747,73557,0),(37748,73558,0),(37749,73559,0),(37750,73560,0),(37751,73561,0),(37752,73562,0),(37753,73563,0),(37754,73564,0),(37755,73565,0),(37756,73566,0),(37757,73567,0),(37758,73568,0),(37759,73569,0),(37760,73570,0),(37761,73571,0),(37762,73572,0),(37763,73573,0),(37764,73574,0),(37765,73575,0),(37766,73576,0),(37767,73580,0),(37768,73581,0),(37769,73582,0),(37770,73583,0),(37771,73584,0),(37772,73585,0),(37773,73586,0),(37774,73587,0),(37775,73588,0),(37776,73589,0),(37777,73590,0),(37778,73595,0),(37779,73596,0),(37780,73597,0),(37781,73598,0),(37782,73599,0),(37783,73600,0),(37784,73601,0),(37785,73602,0),(37786,73603,0),(37787,73604,0),(37788,73605,0),(37789,73606,0),(37790,73607,0),(37791,73608,0),(37792,73609,0),(37793,73610,0),(37794,73611,0),(37795,73612,0),(37796,73613,0),(37797,73614,0),(37798,73615,0),(37799,73616,0),(37800,73617,0),(37801,73618,0),(37802,73619,0),(37803,73620,0),(37804,73628,0),(37805,73629,0),(37806,73630,0),(37807,73631,0),(37808,73632,0),(37809,73633,0),(37810,73634,0),(37811,73635,0),(37812,73636,0),(37813,73637,0),(37814,73638,0),(37815,73639,0),(37816,73646,0),(37817,73647,0),(37818,73651,0),(37819,73652,0),(37820,73653,0),(37821,73654,0),(37822,73655,0),(37823,73656,0),(37824,73657,0),(37825,73658,0),(37826,73659,0),(37827,73660,0),(37828,73661,0),(37829,73662,0),(37830,73663,0),(37831,73664,0),(37832,73665,0),(37833,73666,0),(37834,73667,0),(37835,73668,0),(37836,73669,0),(37837,73670,0),(37838,73671,0),(37839,73672,0),(37840,73673,0),(37841,73674,0),(37842,73675,0),(37843,73676,0),(37844,73677,0),(37845,73678,0),(37846,73679,0),(37847,73680,0),(37848,73681,0),(37849,73682,0),(37850,73683,0),(37851,73684,0),(37852,73685,0),(37853,73686,0),(37854,73687,0),(37855,73688,0),(37856,73689,0),(37857,73690,0),(37858,73691,0),(37859,73692,0),(37860,73693,0),(37861,73694,0),(37862,73695,0),(37863,73696,0),(37864,73697,0),(37865,73698,0),(37866,73699,0),(37867,73700,0),(37868,73701,0),(37869,73702,0),(37870,73703,0),(37871,73704,0),(37872,73705,0),(37873,73706,0),(37874,73707,0),(37875,73708,0),(37876,73709,0),(37877,73710,0),(37878,73711,0),(37879,73712,0),(37880,73713,0),(37881,73714,0),(37882,73715,0),(37883,73716,0),(37884,73717,0),(37885,73718,0),(37886,73719,0),(37887,73720,0),(37888,73721,0),(37889,73722,0),(37890,73723,0),(37891,73724,0),(37892,73725,0),(37893,73726,0),(37894,73727,0),(37895,73728,0),(37896,73729,0),(37897,73730,0),(37898,73731,0),(37899,73732,0),(37900,73733,0),(37901,73734,0),(37902,73735,0),(37903,73736,0),(37904,73737,0),(37905,73738,0),(37906,73739,0),(37907,73740,0),(37908,73741,0),(37909,73742,0),(37910,73743,0),(37911,73744,0),(37912,73745,0),(37913,73793,0),(37914,73794,0),(37915,73795,0),(37916,73796,0),(37917,73803,0),(37918,73804,0),(37919,73805,0),(37920,73806,0),(37921,73807,0),(37922,73808,0),(37923,73809,0),(37924,73810,0),(37925,73811,0),(37926,73812,0),(37927,73813,0),(37928,73814,0),(37929,73815,0),(37930,73816,0),(37931,73817,0),(37932,73818,0),(37933,73819,0),(37934,73820,0),(37935,73821,0),(37936,73822,0),(37937,73823,0),(37938,73824,0),(37939,73825,0),(37940,73826,0),(37941,73840,0),(37942,73841,0),(37943,73842,0),(37944,73843,0),(37945,73844,0),(37946,73845,0),(37947,73846,0),(37948,73847,0),(37949,73848,0),(37950,73864,0),(37951,73865,0),(37952,73866,0),(37953,73867,0),(37954,73868,0),(37955,73869,0),(37956,73870,0),(37957,73871,0),(37958,73872,0),(37959,73873,0),(37960,73874,0),(37961,73875,0),(37962,73876,0),(37963,73877,0),(37964,73878,0),(37965,73879,0),(37966,73880,0),(37967,73881,0),(37968,73882,0),(37969,73883,0),(37970,73884,0),(37971,73885,0),(37972,73886,0),(37973,73887,0),(37974,73888,0),(37975,73889,0),(37976,73890,0),(37977,73891,0),(37978,73892,0),(37979,73893,0),(37980,73894,0),(37981,73915,0),(37982,73916,0),(37983,73917,0),(37984,73918,0),(37985,73919,0),(37986,73920,0),(37987,73921,0),(37988,73922,0),(37989,73923,0),(37990,73924,0),(37991,73925,0),(37992,73926,0),(37993,73927,0),(37994,73928,0),(37995,73929,0),(37996,73930,0),(37997,73931,0),(37998,73932,0),(37999,74049,0),(38000,74050,0),(38001,74051,0),(38002,74052,0),(38003,74125,0),(38004,74126,0),(38005,74127,0),(38006,74128,0),(38007,74129,0),(38008,74130,0),(38009,74131,0),(38010,74132,0),(38011,74133,0),(38012,74134,0),(38013,74135,0),(38014,74136,0),(38015,74137,0),(38016,74138,0),(38017,74139,0),(38018,74140,0),(38019,74148,0),(38020,74149,0),(38021,74150,0),(38022,74151,0),(38023,74152,0),(38024,74153,0),(38025,74154,0),(38026,74155,0),(38027,74189,0),(38028,74190,0),(38029,74191,0),(38030,74192,0),(38031,74193,0),(38032,74194,0),(38033,74195,0),(38034,74196,0),(38035,74197,0),(38036,74206,0),(38037,74207,0),(38038,74208,0),(38039,74209,0),(38040,74210,0),(38041,74211,0),(38042,74212,0),(38043,74213,0),(38044,74214,0),(38045,74221,0),(38046,74222,0),(38047,74223,0),(38048,74224,0),(38049,74225,0),(38050,74226,0),(38051,74227,0),(38052,74228,0),(38053,74229,0),(38054,74278,0),(38055,74282,0),(38056,74283,0),(38057,74285,0),(38058,74292,0),(38059,74293,0),(38060,74294,0),(38061,74302,0),(38062,74568,0),(38063,74569,0),(38064,74570,0),(38065,74571,0),(38066,74572,0),(38067,74573,0),(38068,74574,0),(38069,74575,0),(38070,74576,0),(38071,74577,0),(38072,74578,0),(38073,74579,0),(38074,74580,0),(38075,74581,0),(38076,74582,0),(38077,74583,0),(38078,74584,0),(38079,74585,0),(38080,74586,0),(38081,74587,0),(38082,74588,0),(38083,74589,0),(38084,74590,0),(38085,74591,0),(38086,74592,0),(38087,74593,0),(38088,74594,0),(38089,74595,0),(38090,74596,0),(38091,74597,0),(38092,74598,0),(38093,74599,0),(38094,74600,0),(38095,74601,0),(38096,74602,0),(38097,74603,0),(38098,74604,0),(38099,74605,0),(38100,74606,0),(38101,74607,0),(38102,74608,0),(38103,74678,0),(38104,74679,0),(38105,74680,0),(38106,74681,0),(38107,74682,0),(38108,74683,0),(38109,74684,0),(38110,74685,0),(38111,74686,0),(38112,74687,0),(38113,74688,0),(38114,74689,0),(38115,74690,0),(38116,74691,0),(38117,74692,0),(38118,74693,0),(38119,74699,0),(38120,74730,0),(38121,74731,0),(38122,74732,0),(38123,74733,0),(38124,74734,0),(38125,74735,0),(38126,74736,0),(38127,74737,0),(38128,74738,0),(38129,74739,0),(38130,74740,0),(38131,74741,0),(38132,74742,0),(38133,74743,0),(38134,74744,0),(38135,74745,0),(38136,74746,0),(38137,74747,0),(38138,74756,0),(38139,74757,0),(38140,74758,0),(38141,74759,0),(38142,74776,0),(38143,74819,0),(38144,74871,0),(38145,74888,0),(38146,74889,0),(38147,74890,0),(38148,74891,0),(38149,74892,0),(38150,74893,0),(38151,74894,0),(38152,74895,0),(38153,74896,0),(38154,74897,0),(38155,74898,0),(38156,74899,0),(38157,74900,0),(38158,74901,0),(38159,74902,0),(38160,74903,0),(38161,74904,0),(38162,74905,0),(38163,74906,0),(38164,74907,0),(38165,74908,0),(38166,74909,0),(38167,74910,0),(38168,74911,0),(38169,74912,0),(38170,74913,0),(38171,74914,0),(38172,74920,0),(38173,74922,0),(38174,74923,0),(38175,74924,0),(38176,74930,0),(38177,74931,0),(38178,74932,0),(38179,74933,0),(38180,74934,0),(38181,74935,0),(38182,74936,0),(38183,74937,0),(38184,74939,0),(38185,74940,0),(38186,74941,0),(38187,74942,0),(38188,74943,0),(38189,74944,0),(38190,74945,0),(38191,74946,0),(38192,74947,0),(38193,74948,0),(38194,74949,0),(38195,74950,0),(38196,74951,0),(38197,74952,0),(38198,74953,0),(38199,74954,0),(38200,74956,0),(38201,74959,0),(38202,74960,0),(38203,74961,0),(38204,74972,0),(38205,74973,0),(38206,74974,0),(38207,74975,0),(38208,74976,0),(38209,74977,0),(38210,74978,0),(38211,74979,0),(38212,74982,0),(38213,74983,0),(38214,74984,0),(38215,74985,0),(38216,74986,0),(38217,74987,0),(38218,74988,0),(38219,74989,0),(38220,74990,0),(38221,74991,0),(38222,74992,0),(38223,74993,0),(38224,74994,0),(38225,74995,0),(38226,74996,0),(38227,74997,0),(38228,75006,0),(38229,75007,0),(38230,75009,0),(38231,75010,0),(38232,75011,0),(38233,75039,0),(38234,75061,0),(38235,75062,0),(38236,75063,0),(38237,75064,0),(38238,75065,0),(38239,75070,0),(38240,75072,0),(38241,75073,0),(38242,75076,0),(38243,75077,0),(38244,75080,0),(38245,75081,0),(38246,75082,0),(38247,75083,0),(38248,75084,0),(38249,75085,0),(38250,75086,0),(38251,75087,0),(38252,75088,0),(38253,75089,0),(38254,75090,0),(38255,75091,0),(38256,75092,0),(38257,75093,0),(38258,75094,0),(38259,75095,0),(38260,75096,0),(38261,75097,0),(38262,75098,0),(38263,75099,0),(38264,75100,0),(38265,75101,0),(38266,75102,0),(38267,75103,0),(38268,75104,0),(38269,75105,0),(38270,75106,0),(38271,75107,0),(38272,75108,0),(38273,75109,0),(38274,75110,0),(38275,75111,0),(38276,75112,0),(38277,75113,0),(38278,75114,0),(38279,75115,0),(38280,75116,0),(38281,75117,0),(38282,75118,0),(38283,75119,0),(38284,75120,0),(38285,75121,0),(38286,75122,0),(38287,75123,0),(38288,75124,0),(38289,75125,0),(38290,75126,0),(38291,75127,0),(38292,75128,0),(38293,75129,0),(38294,75130,0),(38295,75131,0),(38296,75132,0),(38297,75133,0),(38298,75134,0),(38299,75135,0),(38300,75136,0),(38301,75137,0),(38302,75138,0),(38303,75139,0),(38304,75140,0),(38305,75141,0),(38306,75142,0),(38307,75143,0),(38308,75144,0),(38309,75146,0),(38310,75147,0),(38311,75148,0),(38312,75149,0),(38313,75150,0),(38314,75151,0),(38315,75152,0),(38316,75153,0),(38317,75156,0),(38318,75157,0),(38319,75158,0),(38320,75159,0),(38321,75160,0),(38322,75161,0),(38323,75162,0),(38324,75163,0),(38325,75167,0),(38326,75168,0),(38327,75169,0),(38328,75170,0),(38329,75171,0),(38330,75172,0),(38331,75173,0),(38332,75174,0),(38333,75177,0),(38334,75178,0),(38335,75179,0),(38336,75180,0),(38337,75181,0),(38338,75182,0),(38339,75183,0),(38340,75184,0),(38341,75185,0),(38342,75186,0),(38343,75187,0),(38344,75188,0),(38345,75189,0),(38346,75190,0),(38347,75191,0),(38348,75192,0),(38349,75193,0),(38350,75194,0),(38351,75195,0),(38352,75196,0),(38353,75197,0),(38354,75198,0),(38355,75199,0),(38356,75200,0),(38357,75203,0),(38358,75204,0),(38359,75205,0),(38360,75206,0),(38361,75207,0),(38362,75209,0),(38363,75210,0),(38364,75211,0),(38365,75213,0),(38366,75222,0),(38367,75223,0),(38368,75224,0),(38369,75225,0),(38370,75226,0),(38371,75236,0),(38372,75237,0),(38373,75238,0),(38374,75239,0),(38375,75240,0),(38376,75241,0),(38377,75242,0),(38378,75252,0),(38379,75253,0),(38380,75254,0),(38381,75255,0),(38382,75261,0),(38383,75262,0),(38384,75265,0),(38385,75266,0),(38386,75267,0),(38387,76063,0),(38388,76064,0),(38389,76065,0),(38390,76066,0),(38391,76067,0),(38392,76101,0),(38393,76102,0),(38394,76103,0),(38395,76104,0),(38396,76105,0),(38397,76108,0),(38398,76109,0),(38399,76111,0),(38400,76112,0),(38401,76113,0),(38402,76114,0),(38403,76116,0),(38404,76117,0),(38405,76146,0),(38406,76147,0),(38407,76148,0),(38408,76149,0),(38409,76150,0),(38410,76151,0),(38411,76152,0),(38412,76154,0),(38413,76155,0),(38414,76156,0),(38415,76157,0),(38416,76158,0),(38417,76159,0),(38418,76160,0),(38419,76161,0),(38420,76163,0),(38421,76164,0),(38422,76165,0),(38423,76166,0),(38424,76169,0),(38425,76170,0),(38426,76171,0),(38427,76172,0),(38428,76175,0),(38429,76176,0),(38430,76177,0),(38431,76178,0),(38432,76179,0),(38433,76180,0),(38434,76181,0),(38435,76182,0),(38436,76183,0),(38437,76184,0),(38438,76185,0),(38439,76186,0),(38440,76187,0),(38441,76188,0),(38442,76189,0),(38443,76190,0),(38444,76191,0),(38445,76192,0),(38446,76193,0),(38447,76194,0),(38448,76195,0),(38449,76196,0),(38450,76197,0),(38451,76198,0),(38452,76199,0),(38453,76200,0),(38454,76201,0),(38455,76202,0),(38456,76203,0),(38457,76204,0),(38458,76205,0),(38459,76206,0),(38460,76207,0),(38461,76208,0),(38462,76212,0),(38463,76213,0),(38464,76214,0),(38465,76215,0),(38466,76216,0),(38467,76217,0),(38468,76218,0),(38469,76219,0),(38470,76220,0),(38471,76221,0),(38472,76222,0),(38473,76223,0),(38474,76224,0),(38475,76226,0),(38476,76227,0),(38477,76228,0),(38478,76229,0),(38479,76230,0),(38480,76231,0),(38481,76232,0),(38482,76233,0),(38483,76236,0),(38484,76237,0),(38485,76238,0),(38486,76239,0),(38487,76240,0),(38488,76241,0),(38489,76242,0),(38490,76243,0),(38491,76244,0),(38492,76245,0),(38493,76246,0),(38494,76247,0),(38495,76248,0),(38496,76249,0),(38497,76250,0),(38498,76251,0),(38499,76252,0),(38500,76253,0),(38501,76254,0),(38502,76255,0),(38503,76256,0),(38504,76257,0),(38505,76258,0),(38506,76259,0),(38507,76263,0),(38508,76264,0),(38509,76265,0),(38510,76266,0),(38511,76267,0),(38512,76268,0),(38513,76269,0),(38514,76270,0),(38515,76271,0),(38516,76272,0),(38517,76273,0),(38518,76274,0),(38519,76276,0),(38520,76277,0),(38521,76278,0),(38522,76279,0),(38523,76280,0),(38524,76281,0),(38525,76282,0),(38526,76283,0),(38527,76284,0),(38528,76285,0),(38529,76286,0),(38530,76287,0),(38531,76288,0),(38532,76289,0),(38533,76290,0),(38534,76291,0),(38535,76308,0),(38536,76309,0),(38537,76310,0),(38538,76311,0),(38539,76312,0),(38540,76313,0),(38541,76314,0),(38542,76315,0),(38543,76316,0),(38544,76317,0),(38545,76318,0),(38546,76319,0),(38547,76320,0),(38548,76321,0),(38549,76322,0),(38550,76323,0),(38551,76324,0),(38552,76325,0),(38553,76326,0),(38554,76327,0),(38555,76328,0),(38556,76329,0),(38557,76330,0),(38558,76331,0),(38559,76332,0),(38560,76339,0),(38561,76340,0),(38562,76341,0),(38563,76342,0),(38564,76343,0),(38565,76344,0),(38566,76345,0),(38567,76346,0),(38568,76347,0),(38569,76348,0),(38570,76351,0),(38571,76357,0),(38572,76358,0),(38573,76359,0),(38574,76360,0),(38575,76361,0),(38576,76363,0),(38577,76364,0),(38578,76366,0),(38579,76367,0),(38580,76368,0),(38581,76369,0),(38582,76390,0),(38583,76391,0),(38584,76392,0),(38585,76393,0),(38586,76394,0),(38587,76395,0),(38588,76396,0),(38589,76397,0),(38590,76398,0),(38591,76399,0),(38592,76400,0),(38593,76406,0),(38594,76407,0),(38595,76408,0),(38596,76409,0),(38597,76410,0),(38598,76411,0),(38599,76412,0),(38600,76413,0),(38601,76414,0),(38602,76415,0),(38603,76416,0),(38604,76417,0),(38605,76421,0),(38606,76422,0),(38607,76423,0),(38608,76424,0),(38609,76425,0),(38610,76426,0),(38611,76427,0),(38612,76428,0),(38613,76429,0),(38614,76432,0),(38615,76433,0),(38616,76434,0),(38617,76435,0),(38618,76436,0),(38619,76437,0),(38620,76438,0),(38621,76439,0),(38622,76440,0),(38623,76442,0),(38624,76443,0),(38625,76444,0),(38626,76445,0),(38627,76446,0),(38628,76447,0),(38629,76448,0),(38630,76449,0),(38631,76450,0),(38632,76451,0),(38633,76452,0),(38634,76453,0),(38635,76454,0),(38636,76467,0),(38637,76468,0),(38638,76469,0),(38639,76470,0),(38640,76471,0),(38641,76473,0),(38642,76474,0),(38643,76475,0),(38644,76476,0),(38645,76492,0),(38646,76495,0),(38647,76496,0),(38648,76497,0),(38649,76498,0),(38650,76711,0),(38651,76712,0),(38652,76713,0),(38653,76715,0),(38654,76721,0),(38655,76722,0),(38656,76723,0),(38657,76724,0),(38658,76741,0),(38659,76744,0),(38660,76745,0),(38661,76746,0),(38662,76749,0),(38663,76750,0),(38664,76751,0),(38665,76752,0),(38666,76753,0),(38667,76756,0),(38668,76757,0),(38669,76758,0),(38670,76759,0),(38671,76760,0),(38672,76765,0),(38673,76766,0),(38674,76767,0),(38675,76768,0),(38676,76769,0),(38677,76772,0),(38678,76773,0),(38679,76774,0),(38680,76775,0),(38681,76776,0),(38682,76777,0),(38683,76778,0),(38684,76779,0),(38685,76780,0),(38686,76781,0),(38687,76782,0),(38688,76783,0),(38689,76784,0),(38690,76785,0),(38691,76786,0),(38692,76787,0),(38693,76788,0),(38694,76789,0),(38695,76790,0),(38696,76791,0),(38697,76792,0),(38698,76793,0),(38699,76794,0),(38700,76795,0),(38701,76796,0),(38702,76797,0),(38703,76798,0),(38704,76799,0),(38705,76800,0),(38706,76801,0),(38707,76802,0),(38708,76803,0),(38709,76804,0),(38710,76805,0),(38711,76806,0),(38712,76807,0),(38713,76808,0),(38714,76809,0),(38715,76810,0),(38716,76811,0),(38717,76828,0),(38718,76829,0),(38719,76830,0),(38720,76831,0),(38721,76832,0),(38722,76833,0),(38723,76843,0),(38724,76844,0),(38725,76845,0),(38726,76846,0),(38727,76847,0),(38728,76848,0),(38729,76849,0),(38730,76850,0),(38731,76851,0),(38732,76852,0),(38733,76853,0),(38734,76854,0),(38735,76855,0),(38736,76856,0),(38737,76857,0),(38738,76858,0),(38739,76859,0),(38740,76860,0),(38741,76865,0),(38742,76874,0),(38743,76875,0),(38744,76876,0),(38745,76877,0),(38746,76878,0),(38747,76910,0),(38748,76911,0),(38749,76912,0),(38750,76913,0),(38751,76914,0),(38752,76915,0),(38753,76916,0),(38754,76917,0),(38755,76918,0),(38756,76920,0),(38757,76921,0),(38758,76922,0),(38759,76923,0),(38760,76924,0),(38761,76925,0),(38762,76926,0),(38763,76927,0),(38764,76928,0),(38765,76929,0),(38766,76930,0),(38767,76931,0),(38768,76932,0),(38769,76933,0),(38770,76934,0),(38771,76935,0),(38772,76936,0),(38773,76937,0),(38774,76938,0),(38775,76939,0),(38776,76940,0),(38777,76941,0),(38778,76942,0),(38779,76943,0),(38780,76944,0),(38781,76945,0),(38782,76946,0),(38783,76947,0),(38784,76948,0),(38785,76949,0),(38786,76950,0),(38787,76951,0),(38788,76952,0),(38789,76953,0),(38790,76954,0),(38791,76955,0),(38792,76956,0),(38793,76957,0),(38794,76958,0),(38795,76959,0),(38796,76960,0),(38797,76961,0),(38798,76962,0),(38799,76963,0),(38800,76964,0),(38801,76969,0),(38802,76970,0),(38803,76971,0),(38804,76972,0),(38805,76974,0),(38806,76975,0),(38807,76976,0),(38808,76977,0),(38809,76978,0),(38810,76979,0),(38811,76980,0),(38812,76981,0),(38813,76982,0),(38814,76983,0),(38815,76984,0),(38816,76985,0),(38817,76986,0),(38818,76987,0),(38819,76988,0),(38820,76989,0),(38821,76990,0),(38822,76991,0),(38823,76992,0),(38824,77003,0),(38825,77004,0),(38826,77005,0),(38827,77006,0),(38828,77007,0),(38829,77008,0),(38830,77009,0),(38831,77010,0),(38832,77011,0),(38833,77012,0),(38834,77013,0),(38835,77014,0),(38836,77015,0),(38837,77016,0),(38838,77017,0),(38839,77018,0),(38840,77019,0),(38841,77020,0),(38842,77021,0),(38843,77022,0),(38844,77023,0),(38845,77024,0),(38846,77025,0),(38847,77026,0),(38848,77027,0),(38849,77028,0),(38850,77029,0),(38851,77030,0),(38852,77031,0),(38853,77032,0),(38854,77035,0),(38855,77036,0),(38856,77037,0),(38857,77038,0),(38858,77039,0),(38859,77040,0),(38860,77041,0),(38861,77042,0),(38862,77043,0),(38863,77044,0),(38864,77074,0),(38865,77075,0),(38866,77076,0),(38867,77077,0),(38868,77078,0),(38869,77079,0),(38870,77085,0),(38871,77086,0),(38872,77087,0),(38873,77095,0),(38874,77096,0),(38875,77097,0),(38876,77098,0),(38877,77099,0),(38878,77119,0),(38879,77120,0),(38880,77121,0),(38881,77122,0),(38882,77123,0),(38883,77124,0),(38884,77125,0),(38885,77126,0),(38886,77127,0),(38887,77146,0),(38888,77147,0),(38889,77148,0),(38890,77149,0),(38891,77150,0),(38892,77151,0),(38893,77153,0),(38894,77155,0),(38895,77156,0),(38896,77157,0),(38897,77159,0),(38898,77160,0),(38899,77161,0),(38900,77162,0),(38901,77163,0),(38902,77164,0),(38903,77165,0),(38904,77166,0),(38905,77169,0),(38906,77170,0),(38907,77171,0),(38908,77172,0),(38909,77173,0),(38910,77174,0),(38911,77175,0),(38912,77176,0),(38913,77177,0),(38914,77179,0),(38915,77180,0),(38916,77181,0),(38917,77182,0),(38918,77183,0),(38919,77184,0),(38920,77185,0),(38921,77186,0),(38922,77187,0),(38923,77188,0),(38924,77189,0),(38925,77190,0),(38926,77191,0),(38927,77192,0),(38928,77193,0),(38929,77194,0),(38930,77195,0),(38931,77196,0),(38932,77212,0),(38933,77213,0),(38934,77214,0),(38935,77215,0),(38936,77216,0),(38937,77217,0),(38938,77218,0),(38939,77219,0),(38940,77220,0),(38941,77221,0),(38942,77223,0),(38943,77224,0),(38944,77225,0),(38945,77226,0),(38946,77227,0),(38947,77233,0),(38948,77234,0),(38949,77235,0),(38950,77236,0),(38951,77237,0),(38952,77238,0),(38953,77239,0),(38954,77240,0),(38955,77241,0),(38956,77242,0),(38957,77243,0),(38958,77244,0),(38959,77245,0),(38960,77246,0),(38961,77247,0),(38962,77248,0),(38963,77249,0),(38964,77250,0),(38965,77251,0),(38966,77252,0),(38967,77253,0),(38968,77254,0),(38969,77255,0),(38970,77256,0),(38971,77257,0),(38972,77258,0),(38973,77259,0),(38974,77260,0),(38975,77261,0),(38976,77263,0),(38977,77265,0),(38978,77266,0),(38979,77267,0),(38980,77268,0),(38981,77269,0),(38982,77270,0),(38983,77271,0),(38984,77278,0),(38985,77279,0),(38986,77303,0),(38987,77304,0),(38988,77305,0),(38989,77306,0),(38990,77307,0),(38991,77308,0),(38992,77309,0),(38993,77310,0),(38994,77311,0),(38995,77312,0),(38996,77313,0),(38997,77314,0),(38998,77316,0),(38999,77317,0),(39000,77318,0),(39001,77319,0),(39002,77320,0),(39003,77321,0),(39004,77322,0),(39005,77323,0),(39006,77324,0),(39007,77328,0),(39008,77329,0),(39009,77330,0),(39010,77331,0),(39011,77332,0),(39012,77333,0),(39013,77357,0),(39014,77358,0),(39015,77359,0),(39016,77360,0),(39017,77364,0),(39018,77365,0),(39019,77369,0),(39020,77370,0),(39021,77371,0),(39022,77372,0),(39023,77373,0),(39024,77374,0),(39025,77375,0),(39026,77376,0),(39027,77377,0),(39028,77380,0),(39029,77381,0),(39030,77382,0),(39031,77383,0),(39032,77384,0),(39033,77385,0),(39034,77386,0),(39035,77387,0),(39036,77388,0),(39037,77389,0),(39038,77390,0),(39039,77391,0),(39040,77392,0),(39041,77394,0),(39042,77395,0),(39043,77396,0),(39044,77397,0),(39045,77398,0),(39046,77399,0),(39047,77400,0),(39048,77401,0),(39049,77402,0),(39050,77403,0),(39051,77404,0),(39052,77405,0),(39053,77406,0),(39054,77407,0),(39055,77408,0),(39056,77409,0),(39057,77410,0),(39058,77412,0),(39059,77414,0),(39060,77420,0),(39061,77421,0),(39062,77422,0),(39063,77423,0),(39064,77426,0),(39065,77427,0),(39066,77428,0),(39067,77429,0),(39068,77430,0),(39069,77433,0),(39070,77434,0),(39071,77435,0),(39072,77436,0),(39073,77437,0),(39074,77438,0),(39075,77439,0),(39076,77440,0),(39077,77441,0),(39078,77442,0),(39079,77443,0),(39080,77444,0),(39081,77451,0),(39082,77477,0),(39083,77478,0),(39084,77479,0),(39085,77480,0),(39086,77481,0),(39087,77482,0),(39088,77483,0),(39089,77484,0),(39090,77485,0),(39091,77486,0),(39092,77487,0),(39093,77488,0),(39094,77491,0),(39095,77492,0),(39096,77493,0),(39097,77494,0),(39098,77495,0),(39099,77496,0),(39100,77505,0),(39101,77506,0),(39102,77507,0),(39103,77508,0),(39104,77509,0),(39105,77511,0),(39106,77512,0),(39107,77513,0),(39108,77514,0),(39109,77515,0),(39110,77516,0),(39111,77517,0),(39112,77518,0),(39113,77519,0),(39114,77520,0),(39115,77521,0),(39116,77522,0),(39117,77523,0),(39118,77524,0),(39119,77526,0),(39120,77527,0),(39121,77528,0),(39122,77533,0),(39123,77534,0),(39124,77535,0),(39125,77536,0),(39126,77537,0),(39127,77538,0),(39128,77539,0),(39129,77548,0),(39130,77549,0),(39131,77550,0),(39132,77551,0),(39133,77552,0),(39134,77553,0),(39135,77554,0),(39136,77555,0),(39137,77556,0),(39138,77557,0),(39139,77558,0),(39140,77559,0),(39141,77560,0),(39142,77561,0),(39143,77562,0),(39144,77563,0),(39145,77564,0),(39146,77565,0),(39147,77566,0),(39148,77567,0),(39149,77568,0),(39150,77569,0),(39151,77570,0),(39152,77571,0),(39153,77572,0),(39154,77573,0),(39155,77574,0),(39156,77575,0),(39157,77576,0),(39158,77577,0),(39159,77578,0),(39160,77579,0),(39161,77580,0),(39162,77581,0),(39163,77582,0),(39164,77583,0),(39165,77584,0),(39166,77585,0),(39167,77586,0),(39168,77587,0),(39169,77588,0),(39170,77592,0),(39171,77593,0),(39172,77594,0),(39173,77595,0),(39174,77596,0),(39175,77597,0),(39176,77598,0),(39177,77599,0),(39178,77600,0),(39179,77601,0),(39180,77602,0),(39181,77603,0),(39182,77604,0),(39183,77605,0),(39184,77606,0),(39185,77607,0),(39186,77608,0),(39187,77609,0),(39188,77610,0),(39189,77611,0),(39190,77612,0),(39191,77613,0),(39192,77614,0),(39193,77615,0),(39194,77616,0),(39195,77617,0),(39196,77618,0),(39197,77619,0),(39198,77620,0),(39199,77621,0),(39200,77622,0),(39201,77623,0),(39202,77624,0),(39203,77625,0),(39204,77626,0),(39205,77627,0),(39206,77628,0),(39207,77629,0),(39208,77630,0),(39209,77631,0),(39210,77632,0),(39211,77633,0),(39212,77634,0),(39213,77635,0),(39214,77636,0),(39215,77637,0),(39216,77638,0),(39217,77639,0),(39218,77640,0),(39219,77641,0),(39220,77642,0),(39221,77643,0),(39222,77644,0),(39223,77645,0),(39224,77646,0),(39225,77647,0),(39226,77648,0),(39227,77649,0),(39228,77650,0),(39229,77651,0),(39230,77652,0),(39231,77653,0),(39232,77654,0),(39233,77655,0),(39234,77656,0),(39235,77657,0),(39236,77658,0),(39237,77659,0),(39238,77660,0),(39239,77661,0),(39240,77662,0),(39241,77663,0),(39242,77664,0),(39243,77665,0),(39244,77666,0),(39245,77667,0),(39246,77668,0),(39247,77669,0),(39248,77670,0),(39249,77671,0),(39250,77672,0),(39251,77673,0),(39252,77674,0),(39253,77675,0),(39254,77676,0),(39255,77677,0),(39256,77678,0),(39257,77679,0),(39258,77680,0),(39259,77681,0),(39260,77682,0),(39261,77683,0),(39262,77684,0),(39263,77685,0),(39264,77686,0),(39265,77687,0),(39266,77688,0),(39267,77689,0),(39268,77690,0),(39269,77691,0),(39270,77692,0),(39271,77693,0),(39272,77694,0),(39273,77695,0),(39274,77696,0),(39275,77697,0),(39276,77698,0),(39277,77699,0),(39278,77700,0),(39279,77701,0),(39280,77702,0),(39281,77703,0),(39282,77704,0),(39283,77705,0),(39284,77706,0),(39285,77707,0),(39286,77708,0),(39287,77709,0),(39288,77710,0),(39289,77711,0),(39290,77712,0),(39291,77713,0),(39292,77714,0),(39293,77715,0),(39294,77716,0),(39295,77717,0),(39296,77718,0),(39297,77719,0),(39298,77720,0),(39299,77721,0),(39300,77722,0),(39301,77723,0),(39302,77724,0),(39303,77725,0),(39304,77726,0),(39305,77727,0),(39306,77728,0),(39307,77729,0),(39308,77730,0),(39309,77731,0),(39310,77732,0),(39311,77733,0),(39312,77734,0),(39313,77735,0),(39314,77736,0),(39315,77737,0),(39316,77738,0),(39317,77739,0),(39318,77740,0),(39319,77741,0),(39320,77742,0),(39321,77743,0),(39322,77744,0),(39323,77745,0),(39324,77746,0),(39325,77747,0),(39326,77748,0),(39327,77749,0),(39328,77750,0),(39329,77751,0),(39330,77752,0),(39331,77753,0),(39332,77754,0),(39333,77755,0),(39334,77756,0),(39335,77757,0),(39336,77758,0),(39337,77759,0),(39338,77760,0),(39339,77761,0),(39340,77762,0),(39341,77763,0),(39342,77764,0),(39343,77765,0),(39344,77766,0),(39345,77767,0),(39346,77768,0),(39347,77769,0),(39348,77770,0),(39349,77771,0),(39350,77772,0),(39351,77773,0),(39352,77774,0),(39353,77775,0),(39354,77776,0),(39355,77777,0),(39356,77778,0),(39357,77779,0),(39358,77780,0),(39359,77781,0),(39360,77782,0),(39361,77783,0),(39362,77784,0),(39363,77785,0),(39364,77786,0),(39365,77787,0),(39366,77788,0),(39367,77789,0),(39368,77790,0),(39369,77791,0),(39370,77792,0),(39371,77793,0),(39372,77794,0),(39373,77795,0),(39374,77796,0),(39375,77797,0),(39376,77798,0),(39377,77799,0),(39378,77800,0),(39379,77801,0),(39380,77802,0),(39381,77803,0),(39382,77804,0),(39383,77805,0),(39384,77806,0),(39385,77807,0),(39386,77808,0),(39387,77809,0),(39388,77810,0),(39389,77811,0),(39390,77812,0),(39391,77813,0),(39392,77814,0),(39393,77815,0),(39394,77816,0),(39395,77817,0),(39396,77818,0),(39397,77819,0),(39398,77820,0),(39399,77821,0),(39400,77822,0),(39401,77823,0),(39402,77824,0),(39403,77825,0),(39404,77826,0),(39405,77827,0),(39406,77828,0),(39407,77829,0),(39408,77830,0),(39409,77831,0),(39410,77832,0),(39411,77833,0),(39412,77834,0),(39413,77835,0),(39414,77836,0),(39415,77837,0),(39416,77838,0),(39417,77839,0),(39418,77840,0),(39419,77841,0),(39420,77842,0),(39421,77843,0),(39422,77844,0),(39423,77845,0),(39424,77846,0),(39425,77847,0),(39426,77848,0),(39427,77849,0),(39428,77850,0),(39429,77851,0),(39430,77852,0),(39431,77853,0),(39432,77854,0),(39433,77855,0),(39434,77856,0),(39435,77857,0),(39436,77858,0),(39437,77859,0),(39438,77860,0),(39439,77861,0),(39440,77862,0),(39441,77863,0),(39442,77864,0),(39443,77865,0),(39444,77866,0),(39445,77867,0),(39446,77868,0),(39447,77869,0),(39448,77870,0),(39449,77871,0),(39450,77872,0),(39451,77873,0),(39452,77874,0),(39453,77875,0),(39454,77876,0),(39455,77877,0),(39456,77878,0),(39457,77879,0),(39458,77880,0),(39459,77881,0),(39460,77882,0),(39461,77883,0),(39462,77884,0),(39463,77885,0),(39464,77886,0),(39465,77887,0),(39466,77888,0),(39467,77889,0),(39468,77890,0),(39469,77891,0),(39470,77892,0),(39471,77893,0),(39472,77894,0),(39473,77895,0),(39474,77896,0),(39475,77897,0),(39476,77898,0),(39477,77899,0),(39478,77900,0),(39479,77901,0),(39480,77902,0),(39481,77903,0),(39482,77904,0),(39483,77905,0),(39484,77906,0),(39485,77907,0),(39486,77908,0),(39487,77909,0),(39488,77910,0),(39489,77911,0),(39490,77912,0),(39491,77913,0),(39492,77914,0),(39493,77915,0),(39494,77916,0),(39495,77917,0),(39496,77918,0),(39497,77919,0),(39498,77920,0),(39499,77921,0),(39500,77922,0),(39501,77923,0),(39502,77924,0),(39503,77925,0),(39504,77926,0),(39505,77927,0),(39506,77928,0),(39507,77929,0),(39508,77933,0),(39509,77934,0),(39510,77937,0),(39511,77938,0),(39512,77945,0),(39513,77946,0),(39514,77947,0),(39515,77948,0),(39516,77949,0),(39517,77950,0),(39518,77960,0),(39519,77968,0),(39520,78014,0),(39521,78015,0),(39522,78016,0),(39523,78017,0),(39524,78018,0),(39525,78019,0),(39526,78020,0),(39527,78021,0),(39528,78030,0),(39529,78031,0),(39530,78032,0),(39531,78033,0),(39532,78034,0),(39533,78035,0),(39534,78036,0),(39535,78037,0),(39536,78046,0),(39537,78047,0),(39538,78048,0),(39539,78049,0),(39540,78050,0),(39541,78051,0),(39542,78052,0),(39543,78053,0),(39544,78062,0),(39545,78063,0),(39546,78064,0),(39547,78065,0),(39548,78066,0),(39549,78067,0),(39550,78068,0),(39551,78069,0),(39552,78078,0),(39553,78079,0),(39554,78080,0),(39555,78081,0),(39556,78082,0),(39557,78083,0),(39558,78084,0),(39559,78085,0),(39560,78094,0),(39561,78095,0),(39562,78096,0),(39563,78097,0),(39564,78098,0),(39565,78099,0),(39566,78100,0),(39567,78101,0),(39568,78119,0),(39569,78120,0),(39570,78121,0),(39571,78122,0),(39572,78123,0),(39573,78124,0),(39574,78125,0),(39575,78126,0),(39576,78135,0),(39577,78136,0),(39578,78137,0),(39579,78138,0),(39580,78139,0),(39581,78140,0),(39582,78141,0),(39583,78142,0),(39584,78151,0),(39585,78152,0),(39586,78153,0),(39587,78154,0),(39588,78155,0),(39589,78156,0),(39590,78157,0),(39591,78158,0),(39592,78167,0),(39593,78168,0),(39594,78169,0),(39595,78186,0),(39596,78187,0),(39597,78188,0),(39598,78189,0),(39599,78190,0),(39600,78191,0),(39601,78192,0),(39602,78193,0),(39603,78196,0),(39604,78197,0),(39605,78198,0),(39606,78199,0),(39607,78200,0),(39608,78201,0),(39609,78202,0),(39610,78203,0),(39611,78204,0),(39612,78205,0),(39613,78206,0),(39614,78207,0),(39615,78208,0),(39616,78209,0),(39617,78210,0),(39618,78211,0),(39619,78212,0),(39620,78213,0),(39621,78214,0),(39622,78215,0),(39623,78216,0),(39624,78217,0),(39625,78218,0),(39626,78219,0),(39627,78222,0),(39628,78223,0),(39629,78224,0),(39630,78225,0),(39631,78226,0),(39632,78227,0),(39633,78228,0),(39634,78229,0),(39635,78230,0),(39636,78231,0),(39637,78232,0),(39638,78233,0),(39639,78234,0),(39640,78235,0),(39641,78236,0),(39642,78237,0),(39643,78238,0),(39644,78239,0),(39645,78240,0),(39646,78241,0),(39647,78242,0),(39648,78243,0),(39649,78244,0),(39650,78245,0),(39651,78246,0),(39652,78247,0),(39653,78248,0),(39654,78249,0),(39655,78250,0),(39656,78251,0),(39657,78252,0),(39658,78253,0),(39659,78254,0),(39660,78255,0),(39661,78256,0),(39662,78257,0),(39663,78258,0),(39664,78259,0),(39665,78260,0),(39666,78261,0),(39667,78262,0),(39668,78263,0),(39669,78264,0),(39670,78265,0),(39671,78266,0),(39672,78267,0),(39673,78268,0),(39674,78269,0),(39675,78270,0),(39676,78271,0),(39677,78272,0),(39678,78273,0),(39679,78274,0),(39680,78275,0),(39681,78276,0),(39682,78277,0),(39683,78278,0),(39684,78279,0),(39685,78280,0),(39686,78281,0),(39687,78282,0),(39688,78283,0),(39689,78284,0),(39690,78285,0),(39691,78286,0),(39692,78287,0),(39693,78288,0),(39694,78289,0),(39695,78290,0),(39696,78291,0),(39697,78292,0),(39698,78293,0),(39699,78294,0),(39700,78295,0),(39701,78296,0),(39702,78297,0),(39703,78298,0),(39704,78299,0),(39705,78300,0),(39706,78301,0),(39707,78302,0),(39708,78303,0),(39709,78304,0),(39710,78305,0),(39711,78306,0),(39712,78307,0),(39713,78308,0),(39714,78309,0),(39715,78310,0),(39716,78311,0),(39717,78312,0),(39718,78313,0),(39719,78314,0),(39720,78315,0),(39721,78316,0),(39722,78317,0),(39723,78318,0),(39724,78319,0),(39725,78320,0),(39726,78321,0),(39727,78322,0),(39728,78323,0),(39729,78324,0),(39730,78325,0),(39731,78326,0),(39732,78327,0),(39733,78328,0),(39734,78329,0),(39735,78330,0),(39736,78331,0),(39737,78332,0),(39738,78333,0),(39739,78337,0),(39740,78338,0),(39741,78340,0),(39742,78341,0),(39743,78357,0),(39744,78359,0),(39745,78360,0),(39746,78361,0),(39747,78362,0),(39748,78363,0),(39749,78365,0),(39750,78366,0),(39751,78367,0),(39752,78368,0),(39753,78369,0),(39754,78370,0),(39755,78371,0),(39756,78372,0),(39757,78373,0),(39758,78374,0),(39759,78375,0),(39760,78376,0),(39761,78377,0),(39762,78378,0),(39763,78379,0),(39764,78380,0),(39765,78381,0),(39766,78383,0),(39767,78384,0),(39768,78385,0),(39769,78386,0),(39770,78387,0),(39771,78388,0),(39772,78389,0),(39773,78390,0),(39774,78391,0),(39775,78392,0),(39776,78393,0),(39777,78394,0),(39778,78395,0),(39779,78396,0),(39780,78397,0),(39781,78398,0),(39782,78399,0),(39783,78400,0),(39784,78401,0),(39785,78402,0),(39786,78403,0),(39787,78404,0),(39788,78405,0),(39789,78406,0),(39790,78407,0),(39791,78408,0),(39792,78409,0),(39793,78410,0),(39794,78411,0),(39795,78412,0),(39796,78414,0),(39797,78415,0),(39798,78416,0),(39799,78417,0),(39800,78418,0),(39801,78420,0),(39802,78422,0),(39803,78423,0),(39804,78424,0),(39805,78425,0),(39806,78426,0),(39807,78428,0),(39808,78429,0),(39809,78430,0),(39810,78431,0),(39811,78433,0),(39812,78434,0),(39813,78435,0),(39814,78436,0),(39815,78437,0),(39816,78438,0),(39817,78439,0),(39818,78441,0),(39819,78442,0),(39820,78443,0),(39821,78444,0),(39822,78445,0),(39823,78446,0),(39824,78447,0),(39825,78448,0),(39826,78449,0),(39827,78450,0),(39828,78451,0),(39829,78452,0),(39830,78453,0),(39831,78454,0),(39832,78455,0),(39833,78456,0),(39834,78457,0),(39835,78458,0),(39836,78459,0),(39837,78460,0),(39838,78461,0),(39839,78462,0),(39840,78463,0),(39841,78464,0),(39842,78465,0),(39843,78466,0),(39844,78467,0),(39845,78468,0),(39846,78469,0),(39847,78470,0),(39848,78471,0),(39849,78472,0),(39850,78473,0),(39851,78474,0),(39852,78475,0),(39853,78476,0),(39854,78477,0),(39855,78478,0),(39856,78479,0),(39857,78480,0),(39858,78481,0),(39859,78482,0),(39860,78483,0),(39861,78484,0),(39862,78485,0),(39863,78486,0),(39864,78487,0),(39865,78488,0),(39866,78499,0),(39867,78500,0),(39868,78501,0),(39869,78502,0),(39870,78503,0),(39871,78504,0),(39872,78505,0),(39873,78506,0),(39874,78507,0),(39875,78508,0),(39876,78509,0),(39877,78510,0),(39878,78511,0),(39879,78512,0),(39880,78513,0),(39881,78514,0),(39882,78515,0),(39883,78516,0),(39884,78517,0),(39885,78518,0),(39886,78519,0),(39887,78525,0),(39888,78526,0),(39889,78527,0),(39890,78528,0),(39891,78529,0),(39892,78530,0),(39893,78531,0),(39894,78532,0),(39895,78533,0),(39896,78534,0),(39897,78535,0),(39898,78536,0),(39899,78537,0),(39900,78538,0),(39901,78539,0),(39902,78540,0),(39903,78541,0),(39904,78542,0),(39905,78548,0),(39906,78549,0),(39907,78555,0),(39908,78556,0),(39909,78557,0),(39910,78558,0),(39911,78559,0),(39912,78560,0),(39913,78561,0),(39914,78562,0),(39915,78563,0),(39916,78564,0),(39917,78565,0),(39918,78566,0),(39919,78567,0),(39920,78568,0),(39921,78569,0),(39922,78570,0),(39923,78571,0),(39924,78572,0),(39925,78573,0),(39926,78574,0),(39927,78575,0),(39928,78576,0),(39929,78577,0),(39930,78578,0),(39931,78579,0),(39932,78580,0),(39933,78581,0),(39934,78582,0),(39935,78583,0),(39936,78584,0),(39937,78585,0),(39938,78586,0),(39939,78587,0),(39940,78588,0),(39941,78589,0),(39942,78590,0),(39943,78591,0),(39944,78592,0),(39945,78593,0),(39946,78594,0),(39947,78595,0),(39948,78596,0),(39949,78597,0),(39950,78598,0),(39951,78604,0),(39952,78605,0),(39953,78606,0),(39954,78607,0),(39955,78608,0),(39956,78609,0),(39957,78610,0),(39958,78611,0),(39959,78612,0),(39960,78613,0),(39961,78614,0),(39962,78615,0),(39963,78616,0),(39964,78617,0),(39965,78618,0),(39966,78619,0),(39967,78620,0),(39968,78621,0),(39969,78627,0),(39970,78628,0),(39971,78634,0),(39972,78635,0),(39973,78636,0),(39974,78637,0),(39975,78638,0),(39976,78639,0),(39977,78640,0),(39978,78641,0),(39979,78642,0),(39980,78643,0),(39981,78644,0),(39982,78645,0),(39983,78646,0),(39984,78647,0),(39985,78648,0),(39986,78649,0),(39987,78650,0),(39988,78651,0),(39989,78652,0),(39990,78653,0),(39991,78654,0),(39992,78655,0),(39993,78656,0),(39994,78657,0),(39995,78658,0),(39996,78659,0),(39997,78660,0),(39998,78661,0),(39999,78662,0),(40000,78663,0),(40001,78664,0),(40002,78665,0),(40003,78666,0),(40004,78667,0),(40005,78668,0),(40006,78669,0),(40007,78670,0),(40008,78671,0),(40009,78672,0),(40010,78673,0),(40011,78674,0),(40012,78675,0),(40013,78676,0),(40014,78677,0),(40015,78678,0),(40016,78679,0),(40017,78680,0),(40018,78681,0),(40019,78682,0),(40020,78683,0),(40021,78684,0),(40022,78685,0),(40023,78686,0),(40024,78687,0),(40025,78688,0),(40026,78689,0),(40027,78690,0),(40028,78691,0),(40029,78692,0),(40030,78693,0),(40031,78694,0),(40032,78695,0),(40033,78696,0),(40034,78697,0),(40035,78698,0),(40036,78699,0),(40037,78700,0),(40038,78701,0),(40039,78702,0),(40040,78703,0),(40041,78704,0),(40042,78705,0),(40043,78706,0),(40044,78707,0),(40045,78708,0),(40046,78709,0),(40047,78710,0),(40048,78711,0),(40049,78712,0),(40050,78713,0),(40051,78714,0),(40052,78715,0),(40053,78716,0),(40054,78717,0),(40055,78718,0),(40056,78719,0),(40057,78720,0),(40058,78721,0),(40059,78722,0),(40060,78723,0),(40061,78724,0),(40062,78725,0),(40063,78726,0),(40064,78727,0),(40065,78728,0),(40066,78729,0),(40067,78730,0),(40068,78731,0),(40069,78732,0),(40070,78733,0),(40071,78734,0),(40072,78735,0),(40073,78736,0),(40074,78737,0),(40075,78738,0),(40076,78739,0),(40077,78740,0),(40078,78741,0),(40079,78742,0),(40080,78743,0),(40081,78744,0),(40082,78745,0),(40083,78746,0),(40084,78747,0),(40085,78748,0),(40086,78749,0),(40087,78750,0),(40088,78751,0),(40089,78752,0),(40090,78753,0),(40091,78754,0),(40092,78755,0),(40093,78756,0),(40094,78757,0),(40095,78758,0),(40096,78759,0),(40097,78760,0),(40098,78761,0),(40099,78762,0),(40100,78763,0),(40101,78764,0),(40102,78765,0),(40103,78766,0),(40104,78767,0),(40105,78768,0),(40106,78769,0),(40107,78770,0),(40108,78771,0),(40109,78772,0),(40110,78773,0),(40111,78774,0),(40112,78775,0),(40113,78776,0),(40114,78777,0),(40115,78778,0),(40116,78779,0),(40117,78780,0),(40118,78781,0),(40119,78782,0),(40120,78783,0),(40121,78784,0),(40122,78785,0),(40123,78786,0),(40124,78787,0),(40125,78788,0),(40126,78789,0),(40127,78790,0),(40128,78791,0),(40129,78792,0),(40130,78793,0),(40131,78794,0),(40132,78795,0),(40133,78796,0),(40134,78797,0),(40135,78798,0),(40136,78799,0),(40137,78800,0),(40138,78801,0),(40139,78802,0),(40140,78803,0),(40141,78804,0),(40142,78805,0),(40143,78806,0),(40144,78807,0),(40145,78808,0),(40146,78809,0),(40147,78810,0),(40148,78811,0),(40149,78812,0),(40150,78813,0),(40151,78814,0),(40152,78815,0),(40153,78816,0),(40154,78817,0),(40155,78818,0),(40156,78819,0),(40157,78820,0),(40158,78821,0),(40159,78822,0),(40160,78823,0),(40161,78824,0),(40162,78825,0),(40163,78826,0),(40164,78827,0),(40165,78828,0),(40166,78829,0),(40167,78830,0),(40168,78831,0),(40169,78832,0),(40170,78833,0),(40171,78834,0),(40172,78835,0),(40173,78836,0),(40174,78837,0),(40175,78838,0),(40176,78839,0),(40177,78840,0),(40178,78841,0),(40179,78842,0),(40180,78843,0),(40181,78844,0),(40182,78845,0),(40183,78846,0),(40184,78878,0),(40185,78879,0),(40186,78882,0),(40187,78884,0),(40188,78885,0),(40189,78886,0),(40190,78887,0),(40191,78888,0),(40192,78889,0),(40193,79001,0),(40194,79002,0),(40195,79003,0),(40196,79004,0),(40197,79005,0),(40198,79006,0),(40199,79062,0),(40200,79131,0),(40201,79211,0),(40202,79259,0),(40203,79270,0),(40204,79272,0),(40205,79273,0),(40206,79274,0),(40207,79275,0),(40208,79319,0),(40209,79321,0),(40210,79322,0),(40211,79333,0),(40212,79334,0),(40213,79335,0),(40214,79339,0),(40215,79340,0),(40216,79341,0),(40217,79342,0),(40218,79343,0),(40219,79347,0),(40220,79711,0),(40221,79712,0),(40222,79716,0),(40223,79717,0),(40224,79718,0),(40225,79719,0),(40226,79720,0),(40227,79721,0),(40228,79722,0),(40229,79723,0),(40230,79734,0),(40231,79735,0),(40232,79740,0),(40233,79746,0),(40234,79749,0),(40235,79750,0),(40236,79775,0),(40237,79784,0),(40238,79785,0),(40239,79786,0),(40240,79787,0),(40241,79788,0),(40242,79789,0),(40243,79790,0),(40244,79791,0),(40245,79792,0),(40246,79793,0),(40247,79795,0),(40248,79796,0),(40249,79797,0),(40250,79798,0),(40251,79799,0),(40252,79800,0),(40253,79801,0),(40254,79803,0),(40255,79804,0),(40256,79805,0),(40257,79820,0),(40258,79829,0),(40259,79830,0),(40260,79831,0),(40261,79832,0),(40262,79834,0),(40263,79835,0),(40264,79836,0),(40265,79837,0),(40266,79838,0),(40267,79839,0),(40268,79840,0),(40269,79841,0),(40270,79842,0),(40271,79843,0),(40272,79844,0),(40273,79845,0),(40274,79846,0),(40275,79847,0),(40276,79848,0),(40277,79849,0),(40278,79850,0),(40279,79851,0),(40280,79852,0),(40281,79853,0),(40282,79854,0),(40283,79855,0),(40284,79856,0),(40285,79857,0),(40286,79858,0),(40287,79859,0),(40288,79860,0),(40289,79933,0),(40290,79934,0),(40291,79935,0),(40292,79936,0),(40293,79937,0),(40294,79938,0),(40295,79939,0),(40296,79940,0),(40297,79941,0),(40298,79942,0),(40299,79953,0),(40300,79954,0),(40301,79955,0),(40302,79956,0),(40303,79957,0),(40304,79958,0),(40305,79959,0),(40306,79960,0),(40307,79961,0),(40308,79962,0),(40309,79963,0),(40310,79964,0),(40311,79965,0),(40312,79966,0),(40313,79967,0),(40314,79968,0),(40315,79969,0),(40316,79970,0),(40317,79971,0),(40318,79972,0),(40319,79973,0),(40320,79974,0),(40321,79975,0),(40322,79976,0),(40323,79977,0),(40324,79978,0),(40325,79979,0),(40326,79980,0),(40327,79983,0),(40328,79984,0),(40329,79985,0),(40330,79986,0),(40331,79987,0),(40332,79988,0),(40333,79989,0),(40334,79990,0),(40335,79999,0),(40336,80000,0),(40337,80001,0),(40338,80002,0),(40339,80003,0),(40340,80004,0),(40341,80005,0),(40342,80006,0),(40343,80007,0),(40344,80012,0),(40345,80057,0),(40346,80067,0),(40347,80069,0),(40348,80070,0),(40349,80072,0),(40350,80120,0),(40351,80123,0),(40352,80124,0),(40353,80125,0),(40354,80126,0),(40355,80130,0),(40356,80131,0),(40357,80132,0),(40358,80145,0),(40359,80146,0),(40360,80147,0),(40361,80148,0),(40362,80149,0),(40363,80150,0),(40364,80151,0),(40365,80152,0),(40366,80185,0),(40367,80186,0),(40368,80187,0),(40369,80188,0),(40370,80189,0),(40371,80190,0),(40372,80191,0),(40373,80192,0),(40374,80193,0),(40375,80194,0),(40376,80195,0),(40377,80196,0),(40378,80197,0),(40379,80198,0),(40380,80199,0),(40381,80200,0),(40382,80202,0),(40383,80203,0),(40384,80204,0),(40385,80205,0),(40386,80206,0),(40387,80207,0),(40388,80208,0),(40389,80209,0),(40390,80211,0),(40391,80219,0),(40392,80246,0),(40393,80263,0),(40394,80264,0),(40395,80265,0),(40396,80266,0),(40397,80267,0),(40398,80268,0),(40399,80269,0),(40400,80270,0),(40401,80271,0),(40402,80272,0),(40403,80273,0),(40404,80274,0),(40405,80275,0),(40406,80278,0),(40407,80279,0),(40408,80280,0),(40409,80281,0),(40410,80282,0),(40411,80283,0),(40412,80284,0),(40413,80285,0),(40414,80286,0),(40415,80287,0),(40416,80288,0),(40417,80289,0),(40418,80290,0),(40419,80292,0),(40420,80304,0),(40421,80328,0),(40422,80329,0),(40423,80330,0),(40424,80331,0),(40425,80332,0),(40426,80333,0),(40427,80334,0),(40428,80335,0),(40429,80357,0),(40430,80358,0),(40431,80359,0),(40432,80360,0),(40433,80361,0),(40434,80362,0),(40435,80363,0),(40436,80364,0),(40437,80365,0),(40438,80366,0),(40439,80367,0),(40440,80368,0),(40441,80369,0),(40442,80370,0),(40443,80371,0),(40444,80372,0),(40445,80373,0),(40446,80374,0),(40447,80375,0),(40448,80376,0),(40449,80377,0),(40450,80378,0),(40451,80379,0),(40452,80380,0),(40453,80384,0),(40454,80385,0),(40455,80386,0),(40456,80387,0),(40457,80388,0),(40458,80389,0),(40459,80390,0),(40460,80391,0),(40461,80394,0),(40462,80395,0),(40463,80396,0),(40464,80397,0),(40465,80398,0),(40466,80399,0),(40467,80400,0),(40468,80401,0),(40469,80404,0),(40470,80405,0),(40471,80406,0),(40472,80407,0),(40473,80408,0),(40474,80409,0),(40475,80410,0),(40476,80411,0),(40477,80412,0),(40478,80413,0),(40479,80414,0),(40480,80415,0),(40481,80416,0),(40482,80417,0),(40483,80418,0),(40484,80419,0),(40485,80420,0),(40486,80421,0),(40487,80422,0),(40488,80423,0),(40489,80424,0),(40490,80425,0),(40491,80426,0),(40492,80427,0),(40493,80434,0),(40494,80441,0),(40495,80442,0),(40496,80443,0),(40497,80444,0),(40498,80445,0),(40499,80446,0),(40500,80447,0),(40501,80448,0),(40502,80449,0),(40503,80450,0),(40504,80451,0),(40505,80452,0),(40506,80453,0),(40507,80454,0),(40508,80455,0),(40509,80456,0),(40510,80457,0),(40511,80458,0),(40512,80459,0),(40513,80460,0),(40514,80461,0),(40515,80462,0),(40516,80463,0),(40517,80464,0),(40518,80465,0),(40519,80466,0),(40520,80467,0),(40521,80468,0),(40522,80469,0),(40523,80470,0),(40524,80471,0),(40525,80472,0),(40526,80476,0),(40527,80477,0),(40528,80478,0),(40529,80479,0),(40530,80480,0),(40531,80481,0),(40532,80482,0),(40533,80483,0),(40534,80485,0),(40535,80486,0),(40536,80487,0),(40537,80488,0),(40538,80489,0),(40539,80490,0),(40540,80491,0),(40541,80492,0),(40542,80493,0),(40543,80494,0),(40544,80495,0),(40545,80496,0),(40546,80497,0),(40547,80498,0),(40548,80499,0),(40549,80500,0),(40550,80503,0),(40551,80504,0),(40552,80505,0),(40553,80506,0),(40554,80522,0),(40555,80537,0),(40556,80538,0),(40557,80539,0),(40558,80540,0),(40559,80541,0),(40560,80542,0),(40561,80543,0),(40562,80544,0),(40563,80545,0),(40564,80548,0),(40565,80549,0),(40566,80550,0),(40567,80551,0),(40568,80552,0),(40569,80553,0),(40570,80554,0),(40571,80555,0),(40572,80556,0),(40573,80557,0),(40574,80558,0),(40575,80559,0),(40576,80560,0),(40577,80561,0),(40578,80562,0),(40579,80563,0),(40580,80565,0),(40581,80566,0),(40582,80567,0),(40583,80568,0),(40584,80569,0),(40585,80570,0),(40586,80571,0),(40587,80572,0),(40588,80578,0),(40589,80580,0),(40590,80589,0),(40591,80686,0),(40592,80687,0),(40593,80688,0),(40594,80689,0),(40595,80690,0),(40596,80691,0),(40597,80692,0),(40598,80693,0),(40599,80694,0),(40600,80695,0),(40601,80696,0),(40602,80697,0),(40603,80698,0),(40604,80699,0),(40605,80700,0),(40606,80701,0),(40607,80702,0),(40608,80703,0),(40609,80704,0),(40610,80705,0),(40611,80706,0),(40612,80707,0),(40613,80708,0),(40614,80709,0),(40615,80710,0),(40616,80711,0),(40617,80712,0),(40618,80713,0),(40619,80714,0),(40620,80715,0),(40621,80716,0),(40622,80717,0),(40623,80718,0),(40624,80719,0),(40625,80720,0),(40626,80721,0),(40627,80722,0),(40628,80723,0),(40629,80724,0),(40630,80725,0),(40631,80726,0),(40632,80727,0),(40633,80728,0),(40634,80729,0),(40635,80730,0),(40636,80731,0),(40637,80732,0),(40638,80733,0),(40639,80734,0),(40640,80735,0),(40641,80736,0),(40642,80737,0),(40643,80738,0),(40644,80739,0),(40645,80740,0),(40646,80741,0),(40647,80742,0),(40648,80743,0),(40649,80744,0),(40650,80745,0),(40651,80746,0),(40652,80747,0),(40653,80748,0),(40654,80749,0),(40655,80750,0),(40656,80751,0),(40657,80752,0),(40658,80753,0),(40659,80754,0),(40660,80755,0),(40661,80756,0),(40662,80757,0),(40663,80783,0),(40664,80784,0),(40665,80785,0),(40666,80786,0),(40667,80787,0),(40668,80788,0),(40669,80789,0),(40670,80790,0),(40671,80791,0),(40672,80792,0),(40673,80793,0),(40674,80794,0),(40675,80795,0),(40676,80796,0),(40677,80797,0),(40678,80798,0),(40679,80799,0),(40680,80800,0),(40681,80801,0),(40682,80802,0),(40683,80803,0),(40684,80811,0),(40685,80818,0),(40686,80829,0),(40687,80839,0),(40688,80840,0),(40689,80841,0),(40690,80842,0),(40691,80852,0),(40692,80853,0),(40693,80854,0),(40694,80855,0),(40695,80856,0),(40696,80857,0),(40697,80858,0),(40698,80859,0),(40699,80860,0),(40700,80861,0),(40701,80862,0),(40702,80863,0),(40703,80864,0),(40704,80865,0),(40705,80866,0),(40706,80867,0),(40707,80868,0),(40708,80869,0),(40709,80870,0),(40710,80871,0),(40711,80872,0),(40712,80873,0),(40713,80874,0),(40714,80875,0),(40715,80876,0),(40716,80877,0),(40717,80878,0),(40718,80879,0),(40719,80880,0),(40720,80881,0),(40721,80882,0),(40722,80883,0),(40723,80884,0),(40724,80885,0),(40725,80886,0),(40726,80887,0),(40727,80888,0),(40728,80889,0),(40729,80890,0),(40730,80891,0),(40731,80892,0),(40732,80893,0),(40733,80894,0),(40734,80895,0),(40735,80896,0),(40736,80897,0),(40737,80898,0),(40738,80899,0),(40739,80900,0),(40740,80901,0),(40741,80902,0),(40742,80903,0),(40743,80906,0),(40744,80908,0),(40745,80909,0),(40746,80910,0),(40747,80911,0),(40748,80912,0),(40749,80913,0),(40750,80915,0),(40751,80916,0),(40752,80917,0),(40753,80918,0),(40754,80919,0),(40755,80920,0),(40756,80921,0),(40757,80922,0),(40758,80923,0),(40759,80924,0),(40760,80925,0),(40761,80926,0),(40762,80927,0),(40763,80928,0),(40764,80929,0),(40765,80930,0),(40766,80931,0),(40767,80932,0),(40768,80933,0),(40769,80935,0),(40770,80936,0),(40771,80937,0),(40772,80939,0),(40773,80946,0),(40774,80947,0),(40775,80948,0),(40776,80949,0),(40777,80950,0),(40778,80951,0),(40779,80952,0),(40780,80953,0),(40781,80954,0),(40782,80965,0),(40783,80966,0),(40784,80967,0),(40785,80968,0),(40786,80969,0),(40787,80970,0),(40788,80971,0),(40789,80972,0),(40790,80973,0),(40791,80974,0),(40792,80975,0),(40793,80976,0),(40794,80977,0),(40795,80978,0),(40796,80979,0),(40797,80980,0),(40798,80981,0),(40799,80982,0),(40800,80983,0),(40801,80984,0),(40802,80985,0),(40803,80986,0),(40804,80987,0),(40805,80988,0),(40806,80989,0),(40807,80990,0),(40808,80991,0),(40809,80992,0),(40810,80993,0),(40811,80994,0),(40812,80995,0),(40813,80996,0),(40814,80997,0),(40815,80998,0),(40816,80999,0),(40817,81000,0),(40818,81001,0),(40819,81002,0),(40820,81003,0),(40821,81004,0),(40822,81005,0),(40823,81006,0),(40824,81007,0),(40825,81008,0),(40826,81009,0),(40827,81010,0),(40828,81011,0),(40829,81012,0),(40830,81013,0),(40831,81014,0),(40832,81015,0),(40833,81016,0),(40834,81017,0),(40835,81018,0),(40836,81019,0),(40837,81020,0),(40838,81021,0),(40839,81022,0),(40840,81023,0),(40841,81024,0),(40842,81025,0),(40843,81026,0),(40844,81027,0),(40845,81028,0),(40846,81029,0),(40847,81030,0),(40848,81031,0),(40849,81032,0),(40850,81033,0),(40851,81034,0),(40852,81035,0),(40853,81036,0),(40854,81037,0),(40855,81038,0),(40856,81039,0),(40857,81040,0),(40858,81041,0),(40859,81042,0),(40860,81043,0),(40861,81044,0),(40862,81045,0),(40863,81046,0),(40864,81047,0),(40865,81048,0),(40866,81058,0),(40867,81059,0),(40868,81060,0),(40869,81061,0),(40870,81062,0),(40871,81063,0),(40872,81064,0),(40873,81065,0),(40874,81066,0),(40875,81067,0),(40876,81068,0),(40877,81069,0),(40878,81070,0),(40879,81071,0),(40880,81072,0),(40881,81073,0),(40882,81074,0),(40883,81075,0),(40884,81076,0),(40885,81077,0),(40886,81078,0),(40887,81079,0),(40888,81080,0),(40889,81081,0),(40890,81082,0),(40891,81083,0),(40892,81084,0),(40893,81085,0),(40894,81086,0),(40895,81087,0),(40896,81088,0),(40897,81089,0),(40898,81090,0),(40899,81091,0),(40900,81092,0),(40901,81093,0),(40902,81094,0),(40903,81096,0),(40904,81097,0),(40905,81098,0),(40906,81099,0),(40907,81100,0),(40908,81101,0),(40909,81102,0),(40910,81103,0),(40911,81104,0),(40912,81105,0),(40913,81106,0),(40914,81107,0),(40915,81108,0),(40916,81109,0),(40917,81110,0),(40918,81111,0),(40919,81112,0),(40920,81113,0),(40921,81114,0),(40922,81123,0),(40923,81126,0),(40924,81127,0),(40925,81129,0),(40926,81130,0),(40927,81132,0),(40928,81134,0),(40929,81135,0),(40930,81136,0),(40931,81140,0),(40932,81143,0),(40933,81145,0),(40934,81146,0),(40935,81147,0),(40936,81148,0),(40937,81149,0),(40938,81150,0),(40939,81151,0),(40940,81152,0),(40941,81153,0),(40942,81154,0),(40943,81155,0),(40944,81156,0),(40945,81157,0),(40946,81158,0),(40947,81159,0),(40948,81160,0),(40949,81161,0),(40950,81162,0),(40951,81163,0),(40952,81164,0),(40953,81165,0),(40954,81166,0),(40955,81167,0),(40956,81168,0),(40957,81169,0),(40958,81170,0),(40959,81171,0),(40960,81172,0),(40961,81179,0),(40962,81185,0),(40963,81187,0),(40964,81188,0),(40965,81190,0),(40966,81229,0),(40967,81230,0),(40968,81233,0),(40969,81234,0),(40970,81235,0),(40971,81236,0),(40972,81237,0),(40973,81238,0),(40974,81240,0),(40975,81241,0),(40976,81242,0),(40977,81244,0),(40978,81245,0),(40979,81246,0),(40980,81247,0),(40981,81248,0),(40982,81249,0),(40983,81252,0),(40984,81253,0),(40985,81255,0),(40986,81256,0),(40987,81257,0),(40988,81262,0),(40989,81270,0),(40990,81272,0),(40991,81273,0),(40992,81274,0),(40993,81275,0),(40994,81276,0),(40995,81277,0),(40996,81279,0),(40997,81280,0),(40998,81281,0),(40999,81282,0),(41000,81283,0),(41001,81284,0),(41002,81285,0),(41003,81286,0),(41004,81287,0),(41005,81288,0),(41006,81289,0),(41007,81290,0),(41008,81291,0),(41009,81292,0),(41010,81294,0),(41011,81295,0),(41012,81296,0),(41013,81297,0),(41014,81298,0),(41015,81299,0),(41016,81300,0),(41017,81301,0),(41018,81302,0),(41019,81303,0),(41020,81304,0),(41021,81305,0),(41022,81306,0),(41023,81307,0),(41024,81308,0),(41025,81309,0),(41026,81310,0),(41027,81311,0),(41028,81312,0),(41029,81313,0),(41030,81314,0),(41031,81315,0),(41032,81316,0),(41033,81317,0),(41034,81318,0),(41035,81320,0),(41036,81321,0),(41037,81324,0),(41038,81325,0),(41039,81326,0),(41040,81327,0),(41041,81328,0),(41042,81329,0),(41043,81330,0),(41044,81331,0),(41045,81332,0),(41046,81333,0),(41047,81334,0),(41048,81335,0),(41049,81336,0),(41050,81337,0),(41051,81338,0),(41052,81339,0),(41053,81340,0),(41054,81341,0),(41055,81342,0),(41056,81343,0),(41057,81344,0),(41058,81345,0),(41059,81346,0),(41060,81347,0),(41061,81348,0),(41062,81349,0),(41063,81350,0),(41064,81351,0),(41065,81352,0),(41066,81353,0),(41067,81357,0),(41068,81358,0),(41069,81359,0),(41070,81360,0),(41071,81361,0),(41072,81362,0),(41073,81364,0),(41074,81365,0),(41075,81366,0),(41076,81367,0),(41077,81368,0),(41078,81369,0),(41079,81370,0),(41080,81371,0),(41081,81372,0),(41082,81373,0),(41083,81375,0),(41084,81376,0),(41085,81389,0),(41086,81390,0),(41087,81391,0),(41088,81396,0),(41089,81397,0),(41090,81418,0),(41091,81440,0),(41092,81441,0),(41093,81442,0),(41094,81443,0),(41095,81444,0),(41096,81445,0),(41097,81446,0),(41098,81447,0),(41099,81448,0),(41100,81449,0),(41101,81450,0),(41102,81451,0),(41103,81452,0),(41104,81453,0),(41105,81454,0),(41106,81455,0),(41107,81456,0),(41108,81457,0),(41109,81458,0),(41110,81459,0),(41111,81460,0),(41112,81461,0),(41113,81462,0),(41114,81463,0),(41115,81464,0),(41116,81465,0),(41117,81466,0),(41118,81467,0),(41119,81468,0),(41120,81469,0),(41121,81470,0),(41122,81471,0),(41123,81472,0),(41124,81473,0),(41125,81474,0),(41126,81475,0),(41127,81476,0),(41128,81477,0),(41129,81478,0),(41130,81479,0),(41131,81480,0),(41132,81481,0),(41133,81482,0),(41134,81483,0),(41135,81484,0),(41136,81485,0),(41137,81486,0),(41138,81487,0),(41139,81488,0),(41140,81489,0),(41141,81490,0),(41142,81491,0),(41143,81492,0),(41144,81493,0),(41145,81494,0),(41146,81495,0),(41147,81496,0),(41148,81497,0),(41149,81498,0),(41150,81499,0),(41151,81500,0),(41152,81501,0),(41153,81502,0),(41154,81503,0),(41155,81504,0),(41156,81505,0),(41157,81506,0),(41158,81507,0),(41159,81508,0),(41160,81509,0),(41161,81510,0),(41162,81511,0),(41163,81537,0),(41164,81538,0),(41165,81539,0),(41166,81540,0),(41167,81541,0),(41168,81542,0),(41169,81543,0),(41170,81544,0),(41171,81545,0),(41172,81546,0),(41173,81547,0),(41174,81548,0),(41175,81549,0),(41176,81550,0),(41177,81551,0),(41178,81552,0),(41179,81553,0),(41180,81554,0),(41181,81555,0),(41182,81556,0),(41183,81557,0),(41184,81569,0),(41185,81570,0),(41186,81571,0),(41187,81572,0),(41188,81573,0),(41189,81574,0),(41190,81575,0),(41191,81576,0),(41192,81577,0),(41193,81578,0),(41194,81579,0),(41195,81580,0),(41196,81581,0),(41197,81582,0),(41198,81583,0),(41199,81584,0),(41200,81585,0),(41201,81586,0),(41202,81587,0),(41203,81588,0),(41204,81589,0),(41205,81590,0),(41206,81591,0),(41207,81592,0),(41208,81593,0),(41209,81594,0),(41210,81595,0),(41211,81596,0),(41212,81597,0),(41213,81598,0),(41214,81599,0),(41215,81600,0),(41216,81601,0),(41217,81602,0),(41218,81603,0),(41219,81604,0),(41220,81605,0),(41221,81606,0),(41222,81607,0),(41223,81608,0),(41224,81609,0),(41225,81610,0),(41226,81611,0),(41227,81612,0),(41228,81613,0),(41229,81614,0),(41230,81615,0),(41231,81616,0),(41232,81617,0),(41233,81618,0),(41234,81619,0),(41235,81620,0),(41236,81621,0),(41237,81622,0),(41238,81623,0),(41239,81624,0),(41240,81625,0),(41241,81626,0),(41242,81627,0),(41243,81628,0),(41244,81629,0),(41245,81630,0),(41246,81631,0),(41247,81632,0),(41248,81633,0),(41249,81634,0),(41250,81635,0),(41251,81636,0),(41252,81637,0),(41253,81638,0),(41254,81639,0),(41255,81640,0),(41256,81641,0),(41257,81642,0),(41258,81643,0),(41259,81644,0),(41260,81645,0),(41261,81646,0),(41262,81647,0),(41263,81648,0),(41264,81649,0),(41265,81650,0),(41266,81666,0),(41267,81667,0),(41268,81668,0),(41269,81669,0),(41270,81670,0),(41271,81671,0),(41272,81672,0),(41273,81673,0),(41274,81674,0),(41275,81675,0),(41276,81676,0),(41277,81677,0),(41278,81678,0),(41279,81679,0),(41280,81680,0),(41281,81681,0),(41282,81682,0),(41283,81683,0),(41284,81684,0),(41285,81685,0),(41286,81686,0),(41287,81687,0),(41288,81688,0),(41289,81689,0),(41290,81690,0),(41291,81691,0),(41292,81692,0),(41293,81693,0),(41294,81694,0),(41295,81695,0),(41296,81696,0),(41297,81697,0),(41298,81698,0),(41299,81699,0),(41300,81700,0),(41301,81701,0),(41302,81702,0),(41303,81703,0),(41304,81704,0),(41305,81705,0),(41306,81706,0),(41307,81707,0),(41308,81708,0),(41309,81709,0),(41310,81710,0),(41311,81711,0),(41312,81714,0),(41313,81715,0),(41314,81716,0),(41315,81717,0),(41316,81718,0),(41317,81719,0),(41318,81720,0),(41319,81721,0),(41320,81722,0),(41321,81723,0),(41322,81724,0),(41323,81725,0),(41324,81726,0),(41325,81727,0),(41326,81728,0),(41327,81729,0),(41328,81730,0),(41329,81731,0),(41330,81732,0),(41331,81733,0),(41332,81734,0),(41333,81735,0),(41334,81736,0),(41335,81737,0),(41336,81738,0),(41337,81739,0),(41338,81740,0),(41339,81742,0),(41340,81743,0),(41341,81744,0),(41342,81745,0),(41343,81746,0),(41344,81747,0),(41345,81748,0),(41346,81749,0),(41347,81750,0),(41348,81751,0),(41349,81752,0),(41350,81753,0),(41351,81754,0),(41352,81755,0),(41353,81756,0),(41354,81757,0),(41355,81758,0),(41356,81759,0),(41357,81760,0),(41358,81761,0),(41359,81762,0),(41360,81763,0),(41361,81764,0),(41362,81765,0),(41363,81766,0),(41364,81767,0),(41365,81768,0),(41366,81769,0),(41367,81770,0),(41368,81771,0),(41369,81772,0),(41370,81773,0),(41371,81774,0),(41372,81775,0),(41373,81776,0),(41374,81777,0),(41375,81778,0),(41376,81779,0),(41377,81780,0),(41378,81781,0),(41379,81782,0),(41380,81783,0),(41381,81784,0),(41382,81785,0),(41383,81786,0),(41384,81787,0),(41385,81788,0),(41386,81789,0),(41387,81790,0),(41388,81791,0),(41389,81792,0),(41390,81793,0),(41391,81794,0),(41392,81795,0),(41393,81796,0),(41394,81797,0),(41395,81798,0),(41396,81799,0),(41397,81800,0),(41398,81801,0),(41399,81802,0),(41400,81803,0),(41401,81804,0),(41402,81805,0),(41403,81806,0),(41404,81807,0),(41405,81808,0),(41406,81809,0),(41407,81810,0),(41408,81811,0),(41409,81812,0),(41410,81813,0),(41411,81839,0),(41412,81840,0),(41413,81841,0),(41414,81842,0),(41415,81843,0),(41416,81844,0),(41417,81845,0),(41418,81846,0),(41419,81847,0),(41420,81848,0),(41421,81849,0),(41422,81850,0),(41423,81851,0),(41424,81852,0),(41425,81853,0),(41426,81854,0),(41427,81855,0),(41428,81856,0),(41429,81857,0),(41430,81858,0),(41431,81859,0),(41432,81860,0),(41433,81861,0),(41434,81862,0),(41435,81863,0),(41436,81864,0),(41437,81865,0),(41438,81866,0),(41439,81867,0),(41440,81868,0),(41441,81869,0),(41442,81870,0),(41443,81871,0),(41444,81872,0),(41445,81873,0),(41446,81874,0),(41447,81875,0),(41448,81876,0),(41449,81877,0),(41450,81878,0),(41451,81879,0),(41452,81880,0),(41453,81881,0),(41454,81882,0),(41455,81883,0),(41456,81884,0),(41457,81885,0),(41458,81886,0),(41459,81887,0),(41460,81888,0),(41461,81906,0),(41462,81926,0),(41463,81938,0),(41464,81939,0),(41465,81940,0),(41466,81941,0),(41467,81942,0),(41468,81943,0),(41469,81944,0),(41470,81945,0),(41471,81946,0),(41472,81947,0),(41473,81948,0),(41474,81949,0),(41475,81950,0),(41476,81951,0),(41477,81952,0),(41478,81953,0),(41479,81954,0),(41480,81955,0),(41481,81957,0),(41482,81958,0),(41483,81959,0),(41484,81960,0),(41485,81961,0),(41486,81962,0),(41487,81963,0),(41488,81964,0),(41489,81965,0),(41490,81966,0),(41491,81967,0),(41492,81968,0),(41493,81969,0),(41494,81970,0),(41495,81971,0),(41496,81972,0),(41497,81973,0),(41498,81974,0),(41499,81975,0),(41500,81976,0),(41501,81977,0),(41502,81978,0),(41503,81979,0),(41504,81980,0),(41505,81981,0),(41506,81982,0),(41507,81983,0),(41508,81984,0),(41509,81985,0),(41510,81986,0),(41511,81987,0),(41512,81988,0),(41513,81989,0),(41514,81990,0),(41515,81991,0),(41516,81992,0),(41517,81993,0),(41518,81994,0),(41519,81995,0),(41520,81996,0),(41521,81997,0),(41522,81998,0),(41523,81999,0),(41524,82000,0),(41525,82001,0),(41526,82002,0),(41527,82003,0),(41528,82004,0),(41529,82006,0),(41530,82008,0),(41531,82009,0),(41532,82010,0),(41533,82011,0),(41534,82012,0),(41535,82013,0),(41536,82014,0),(41537,82015,0),(41538,82016,0),(41539,82017,0),(41540,82018,0),(41541,82019,0),(41542,82020,0),(41543,82021,0),(41544,82022,0),(41545,82023,0),(41546,82024,0),(41547,82025,0),(41548,82026,0),(41549,82027,0),(41550,82028,0),(41551,82029,0),(41552,82030,0),(41553,82031,0),(41554,82032,0),(41555,82033,0),(41556,82034,0),(41557,82035,0),(41558,82036,0),(41559,82037,0),(41560,82038,0),(41561,82039,0),(41562,82040,0),(41563,82041,0),(41564,82042,0),(41565,82043,0),(41566,82044,0),(41567,82045,0),(41568,82046,0),(41569,82047,0),(41570,82048,0),(41571,82049,0),(41572,82050,0),(41573,82051,0),(41574,82052,0),(41575,82053,0),(41576,82054,0),(41577,82055,0),(41578,82056,0),(41579,82057,0),(41580,82058,0),(41581,82059,0),(41582,82061,0),(41583,82062,0),(41584,82064,0),(41585,82065,0),(41586,82066,0),(41587,82067,0),(41588,82068,0),(41589,82069,0),(41590,82070,0),(41591,82071,0),(41592,82072,0),(41593,82073,0),(41594,82074,0),(41595,82075,0),(41596,82076,0),(41597,82077,0),(41598,82078,0),(41599,82079,0),(41600,82080,0),(41601,82081,0),(41602,82082,0),(41603,82083,0),(41604,82084,0),(41605,82085,0),(41606,82086,0),(41607,82087,0),(41608,82088,0),(41609,82089,0),(41610,82090,0),(41611,82091,0),(41612,82092,0),(41613,82093,0),(41614,82094,0),(41615,82095,0),(41616,82096,0),(41617,82097,0),(41618,82098,0),(41619,82099,0),(41620,82100,0),(41621,82101,0),(41622,82102,0),(41623,82103,0),(41624,82104,0),(41625,82105,0),(41626,82106,0),(41627,82107,0),(41628,82108,0),(41629,82109,0),(41630,82110,0),(41631,82111,0),(41632,82112,0),(41633,82113,0),(41634,82114,0),(41635,82116,0),(41636,82117,0),(41637,82119,0),(41638,82120,0),(41639,82121,0),(41640,82122,0),(41641,82123,0),(41642,82124,0),(41643,82125,0),(41644,82126,0),(41645,82127,0),(41646,82128,0),(41647,82129,0),(41648,82130,0),(41649,82131,0),(41650,82132,0),(41651,82133,0),(41652,82134,0),(41653,82135,0),(41654,82136,0),(41655,82137,0),(41656,82138,0),(41657,82139,0),(41658,82140,0),(41659,82141,0),(41660,82142,0),(41661,82143,0),(41662,82144,0),(41663,82145,0),(41664,82146,0),(41665,82147,0),(41666,82148,0),(41667,82149,0),(41668,82150,0),(41669,82151,0),(41670,82152,0),(41671,82153,0),(41672,82154,0),(41673,82155,0),(41674,82156,0),(41675,82157,0),(41676,82158,0),(41677,82159,0),(41678,82160,0),(41679,82161,0),(41680,82162,0),(41681,82163,0),(41682,82164,0),(41683,82165,0),(41684,82166,0),(41685,82167,0),(41686,82168,0),(41687,82169,0),(41688,82171,0),(41689,82172,0),(41690,82174,0),(41691,82175,0),(41692,82176,0),(41693,82177,0),(41694,82178,0),(41695,82179,0),(41696,82180,0),(41697,82181,0),(41698,82182,0),(41699,82183,0),(41700,82184,0),(41701,82185,0),(41702,82186,0),(41703,82187,0),(41704,82188,0),(41705,82189,0),(41706,82190,0),(41707,82191,0),(41708,82192,0),(41709,82193,0),(41710,82194,0),(41711,82195,0),(41712,82196,0),(41713,82197,0),(41714,82198,0),(41715,82199,0),(41716,82200,0),(41717,82201,0),(41718,82202,0),(41719,82203,0),(41720,82204,0),(41721,82205,0),(41722,82206,0),(41723,82207,0),(41724,82208,0),(41725,82209,0),(41726,82210,0),(41727,82211,0),(41728,82212,0),(41729,82213,0),(41730,82214,0),(41731,82215,0),(41732,82216,0),(41733,82217,0),(41734,82218,0),(41735,82219,0),(41736,82220,0),(41737,82221,0),(41738,82222,0),(41739,82223,0),(41740,82224,0),(41741,82226,0),(41742,82227,0),(41743,82229,0),(41744,82230,0),(41745,82231,0),(41746,82232,0),(41747,82233,0),(41748,82234,0),(41749,82235,0),(41750,82236,0),(41751,82237,0),(41752,82238,0),(41753,82239,0),(41754,82240,0),(41755,82241,0),(41756,82242,0),(41757,82243,0),(41758,82244,0),(41759,82245,0),(41760,82246,0),(41761,82247,0),(41762,82248,0),(41763,82249,0),(41764,82250,0),(41765,82251,0),(41766,82252,0),(41767,82253,0),(41768,82254,0),(41769,82255,0),(41770,82256,0),(41771,82257,0),(41772,82258,0),(41773,82259,0),(41774,82260,0),(41775,82261,0),(41776,82262,0),(41777,82263,0),(41778,82264,0),(41779,82265,0),(41780,82266,0),(41781,82267,0),(41782,82268,0),(41783,82269,0),(41784,82270,0),(41785,82271,0),(41786,82272,0),(41787,82273,0),(41788,82274,0),(41789,82275,0),(41790,82276,0),(41791,82277,0),(41792,82278,0),(41793,82279,0),(41794,82281,0),(41795,82282,0),(41796,82284,0),(41797,82285,0),(41798,82286,0),(41799,82287,0),(41800,82288,0),(41801,82289,0),(41802,82290,0),(41803,82291,0),(41804,82292,0),(41805,82293,0),(41806,82294,0),(41807,82295,0),(41808,82320,0),(41809,82321,0),(41810,82322,0),(41811,82323,0),(41812,82324,0),(41813,82325,0),(41814,82326,0),(41815,82347,0),(41816,82348,0),(41817,82349,0),(41818,82351,0),(41819,82352,0),(41820,82382,0),(41821,82383,0),(41822,82384,0),(41823,82397,0),(41824,82398,0),(41825,82399,0),(41826,82400,0),(41827,82401,0),(41828,82402,0),(41829,82403,0),(41830,82404,0),(41831,82421,0),(41832,82422,0),(41833,82423,0),(41834,82424,0),(41835,82425,0),(41836,82426,0),(41837,82427,0),(41838,82428,0),(41839,82429,0),(41840,82430,0),(41841,82431,0),(41842,82432,0),(41843,82433,0),(41844,82434,0),(41845,82435,0),(41846,82436,0),(41847,82437,0),(41848,82438,0),(41849,82439,0),(41850,82440,0),(41851,82465,0),(41852,82471,0),(41853,82472,0),(41854,82473,0),(41855,82474,0),(41856,82475,0),(41857,82476,0),(41858,82477,0),(41859,82478,0),(41860,82479,0),(41861,82480,0),(41862,82481,0),(41863,82482,0),(41864,82483,0),(41865,82484,0),(41866,82485,0),(41867,82486,0),(41868,82487,0),(41869,82488,0),(41870,82489,0),(41871,82490,0),(41872,82491,0),(41873,82492,0),(41874,82493,0),(41875,82494,0),(41876,82495,0),(41877,82496,0),(41878,82497,0),(41879,82498,0),(41880,82499,0),(41881,82500,0),(41882,82501,0),(41883,82502,0),(41884,82503,0),(41885,82504,0),(41886,82505,0),(41887,82506,0),(41888,82507,0),(41889,82508,0),(41890,82509,0),(41891,82510,0),(41892,82511,0),(41893,82512,0),(41894,82513,0),(41895,82514,0),(41896,82515,0),(41897,82516,0),(41898,82517,0),(41899,82518,0),(41900,82519,0),(41901,82520,0),(41902,82521,0),(41903,82522,0),(41904,82523,0),(41905,82524,0),(41906,82525,0),(41907,82526,0),(41908,82527,0),(41909,82528,0),(41910,82529,0),(41911,82530,0),(41912,82531,0),(41913,82532,0),(41914,82533,0),(41915,82534,0),(41916,82535,0),(41917,82536,0),(41918,82537,0),(41919,82538,0),(41920,82539,0),(41921,82540,0),(41922,82541,0),(41923,82542,0),(41924,82543,0),(41925,82544,0),(41926,82545,0),(41927,82546,0),(41928,82547,0),(41929,82548,0),(41930,82549,0),(41931,82550,0),(41932,82551,0),(41933,82552,0),(41934,82553,0),(41935,82554,0),(41936,82555,0),(41937,82556,0),(41938,82557,0),(41939,82558,0),(41940,82584,0),(41941,82585,0),(41942,82586,0),(41943,82587,0),(41944,82588,0),(41945,82589,0),(41946,82590,0),(41947,82591,0),(41948,82592,0),(41949,82593,0),(41950,82594,0),(41951,82595,0),(41952,82596,0),(41953,82597,0),(41954,82598,0),(41955,82599,0),(41956,82600,0),(41957,82601,0),(41958,82602,0),(41959,82603,0),(41960,82604,0),(41961,82606,0),(41962,82607,0),(41963,82608,0),(41964,82609,0),(41965,82610,0),(41966,82611,0),(41967,82612,0),(41968,82613,0),(41969,82614,0),(41970,82615,0),(41971,82616,0),(41972,82617,0),(41973,82618,0),(41974,82619,0),(41975,82620,0),(41976,82621,0),(41977,82622,0),(41978,82623,0),(41979,82624,0),(41980,82625,0),(41981,82626,0),(41982,82627,0),(41983,82628,0),(41984,82629,0),(41985,82630,0),(41986,82631,0),(41987,82632,0),(41988,82633,0),(41989,82634,0),(41990,82635,0),(41991,82636,0),(41992,82637,0),(41993,82638,0),(41994,82639,0),(41995,82640,0),(41996,82641,0),(41997,82642,0),(41998,82643,0),(41999,82644,0),(42000,82645,0),(42001,82646,0),(42002,82647,0),(42003,82648,0),(42004,82649,0),(42005,82650,0),(42006,82651,0),(42007,82652,0),(42008,82653,0),(42009,82654,0),(42010,82655,0),(42011,82656,0),(42012,82657,0),(42013,82658,0),(42014,82659,0),(42015,82660,0),(42016,82661,0),(42017,82662,0),(42018,82663,0),(42019,82664,0),(42020,82665,0),(42021,82666,0),(42022,82667,0),(42023,82668,0),(42024,82669,0),(42025,82670,0),(42026,82671,0),(42027,82672,0),(42028,82673,0),(42029,82674,0),(42030,82675,0),(42031,82676,0),(42032,82677,0),(42033,82678,0),(42034,82679,0),(42035,82680,0),(42036,82681,0),(42037,82682,0),(42038,82683,0),(42039,82684,0),(42040,82685,0),(42041,82701,0),(42042,82702,0),(42043,82703,0),(42044,82704,0),(42045,82705,0),(42046,82706,0),(42047,82707,0),(42048,82708,0),(42049,82709,0),(42050,82710,0),(42051,82711,0),(42052,82712,0),(42053,82713,0),(42054,82714,0),(42055,82715,0),(42056,82716,0),(42057,82717,0),(42058,82718,0),(42059,82719,0),(42060,82720,0),(42061,82721,0),(42062,82735,0),(42063,82736,0),(42064,82737,0),(42065,82738,0),(42066,82739,0),(42067,82740,0),(42068,82741,0),(42069,82742,0),(42070,82743,0),(42071,82745,0),(42072,82746,0),(42073,82747,0),(42074,82748,0),(42075,82749,0),(42076,82750,0),(42077,82751,0),(42078,82752,0),(42079,82753,0),(42080,82754,0),(42081,82755,0),(42082,82756,0),(42083,82757,0),(42084,82758,0),(42085,82759,0),(42086,82760,0),(42087,82761,0),(42088,82762,0),(42089,82767,0),(42090,82769,0),(42091,82770,0),(42092,82771,0),(42093,82772,0),(42094,82773,0),(42095,82785,0),(42096,82788,0),(42097,82789,0),(42098,82790,0),(42099,82791,0),(42100,82792,0),(42101,82793,0),(42102,82794,0),(42103,82795,0),(42104,82796,0),(42105,82797,0),(42106,82798,0),(42107,82802,0),(42108,82803,0),(42109,82810,0),(42110,82812,0),(42111,82813,0),(42112,82814,0),(42113,82815,0),(42114,82816,0),(42115,82817,0),(42116,82818,0),(42117,82819,0),(42118,82820,0),(42119,82821,0),(42120,82822,0),(42121,82823,0),(42122,82824,0),(42123,82825,0),(42124,82826,0),(42125,82827,0),(42126,82828,0),(42127,82831,0),(42128,82832,0),(42129,82833,0),(42130,82834,0),(42131,82835,0),(42132,82836,0),(42133,82837,0),(42134,82838,0),(42135,82839,0),(42136,82840,0),(42137,82841,0),(42138,82842,0),(42139,82843,0),(42140,82844,0),(42141,82845,0),(42142,82846,0),(42143,82847,0),(42144,82848,0),(42145,82849,0),(42146,82850,0),(42147,82851,0),(42148,82852,0),(42149,82853,0),(42150,82854,0),(42151,82855,0),(42152,82856,0),(42153,82857,0),(42154,82858,0),(42155,82859,0),(42156,82860,0),(42157,82861,0),(42158,82862,0),(42159,82877,0),(42160,82878,0),(42161,82879,0),(42162,82880,0),(42163,82881,0),(42164,82882,0),(42165,82883,0),(42166,82884,0),(42167,82885,0),(42168,82886,0),(42169,82888,0),(42170,82891,0),(42171,82892,0),(42172,82893,0),(42173,82894,0),(42174,82895,0),(42175,82896,0),(42176,82897,0),(42177,82898,0),(42178,82899,0),(42179,82900,0),(42180,82901,0),(42181,82902,0),(42182,82903,0),(42183,82904,0),(42184,82905,0),(42185,82906,0),(42186,82907,0),(42187,82908,0),(42188,82909,0),(42189,82910,0),(42190,82911,0),(42191,82912,0),(42192,82913,0),(42193,82914,0),(42194,82915,0),(42195,82916,0),(42196,82917,0),(42197,82918,0),(42198,82919,0),(42199,82920,0),(42200,82921,0),(42201,82922,0),(42202,82923,0),(42203,82924,0),(42204,82925,0),(42205,82926,0),(42206,82927,0),(42207,82928,0),(42208,82929,0),(42209,82930,0),(42210,82931,0),(42211,82932,0),(42212,82933,0),(42213,82934,0),(42214,82935,0),(42215,82936,0),(42216,82937,0),(42217,82938,0),(42218,82939,0),(42219,82940,0),(42220,82941,0),(42221,82942,0),(42222,82943,0),(42223,82944,0),(42224,82945,0),(42225,82946,0),(42226,82947,0),(42227,82948,0),(42228,82949,0),(42229,82950,0),(42230,82951,0),(42231,82952,0),(42232,82953,0),(42233,82954,0),(42234,82955,0),(42235,82956,0),(42236,82957,0),(42237,82958,0),(42238,82961,0),(42239,82962,0),(42240,82963,0),(42241,82964,0),(42242,82965,0),(42243,82966,0),(42244,82967,0),(42245,82968,0),(42246,82969,0),(42247,82970,0),(42248,82971,0),(42249,82972,0),(42250,82973,0),(42251,82974,0),(42252,82975,0),(42253,82976,0),(42254,82977,0),(42255,82978,0),(42256,82979,0),(42257,82980,0),(42258,82987,0),(42259,82988,0),(42260,82989,0),(42261,82990,0),(42262,82991,0),(42263,82992,0),(42264,82993,0),(42265,82994,0),(42266,82995,0),(42267,82997,0),(42268,82998,0),(42269,82999,0),(42270,83000,0),(42271,83001,0),(42272,83002,0),(42273,83003,0),(42274,83004,0),(42275,83005,0),(42276,83008,0),(42277,83009,0),(42278,83010,0),(42279,83011,0),(42280,83012,0),(42281,83013,0),(42282,83014,0),(42283,83015,0),(42284,83016,0),(42285,83018,0),(42286,83019,0),(42287,83020,0),(42288,83021,0),(42289,83025,0),(42290,83026,0),(42291,83027,0),(42292,83028,0),(42293,83029,0),(42294,83030,0),(42295,83031,0),(42296,83032,0),(42297,83037,0),(42298,83038,0),(42299,83039,0),(42300,83040,0),(42301,83041,0),(42302,83042,0),(42303,83043,0),(42304,83044,0),(42305,83045,0),(42306,83046,0),(42307,83047,0),(42308,83048,0),(42309,83049,0),(42310,83050,0),(42311,83051,0),(42312,83052,0),(42313,83054,0),(42314,83055,0),(42315,83056,0),(42316,83057,0),(42317,83058,0),(42318,83059,0),(42319,83060,0),(42320,83061,0),(42321,83066,0),(42322,83071,0),(42323,83072,0),(42324,83073,0),(42325,83074,0),(42326,83079,0),(42327,83080,0),(42328,83081,0),(42329,83082,0),(42330,83083,0),(42331,83084,0),(42332,83085,0),(42333,83121,0),(42334,83122,0),(42335,83123,0),(42336,83125,0),(42337,83126,0),(42338,83158,0),(42339,83159,0),(42340,83160,0),(42341,83161,0),(42342,83162,0),(42343,83163,0),(42344,83164,0),(42345,83165,0),(42346,83166,0),(42347,83167,0),(42348,83168,0),(42349,83169,0),(42350,83170,0),(42351,83171,0),(42352,83172,0),(42353,83173,0),(42354,83174,0),(42355,83175,0),(42356,83176,0),(42357,83177,0),(42358,83178,0),(42359,83179,0),(42360,83180,0),(42361,83181,0),(42362,83182,0),(42363,83183,0),(42364,83184,0),(42365,83185,0),(42366,83186,0),(42367,83187,0),(42368,83188,0),(42369,83189,0),(42370,83190,0),(42371,83191,0),(42372,83192,0),(42373,83193,0),(42374,83194,0),(42375,83195,0),(42376,83196,0),(42377,83197,0),(42378,83198,0),(42379,83199,0),(42380,83200,0),(42381,83201,0),(42382,83202,0),(42383,83203,0),(42384,83204,0),(42385,83205,0),(42386,83206,0),(42387,83207,0),(42388,83208,0),(42389,83209,0),(42390,83210,0),(42391,83211,0),(42392,83212,0),(42393,83213,0),(42394,83214,0),(42395,83215,0),(42396,83216,0),(42397,83217,0),(42398,83218,0),(42399,83219,0),(42400,83220,0),(42401,83221,0),(42402,83222,0),(42403,83223,0),(42404,83224,0),(42405,83225,0),(42406,83226,0),(42407,83227,0),(42408,83228,0),(42409,83229,0),(42410,83255,0),(42411,83256,0),(42412,83257,0),(42413,83258,0),(42414,83259,0),(42415,83260,0),(42416,83261,0),(42417,83262,0),(42418,83263,0),(42419,83264,0),(42420,83265,0),(42421,83266,0),(42422,83267,0),(42423,83268,0),(42424,83269,0),(42425,83270,0),(42426,83271,0),(42427,83272,0),(42428,83273,0),(42429,83274,0),(42430,83275,0),(42431,83277,0),(42432,83278,0),(42433,83279,0),(42434,83280,0),(42435,83281,0),(42436,83282,0),(42437,83283,0),(42438,83284,0),(42439,83285,0),(42440,83286,0),(42441,83287,0),(42442,83288,0),(42443,83289,0),(42444,83290,0),(42445,83291,0),(42446,83292,0),(42447,83293,0),(42448,83294,0),(42449,83295,0),(42450,83296,0),(42451,83297,0),(42452,83298,0),(42453,83299,0),(42454,83300,0),(42455,83301,0),(42456,83302,0),(42457,83303,0),(42458,83304,0),(42459,83305,0),(42460,83306,0),(42461,83307,0),(42462,83308,0),(42463,83309,0),(42464,83310,0),(42465,83311,0),(42466,83312,0),(42467,83313,0),(42468,83314,0),(42469,83315,0),(42470,83316,0),(42471,83317,0),(42472,83318,0),(42473,83319,0),(42474,83320,0),(42475,83321,0),(42476,83322,0),(42477,83323,0),(42478,83324,0),(42479,83325,0),(42480,83326,0),(42481,83327,0),(42482,83328,0),(42483,83329,0),(42484,83330,0),(42485,83331,0),(42486,83332,0),(42487,83333,0),(42488,83334,0),(42489,83335,0),(42490,83336,0),(42491,83337,0),(42492,83338,0),(42493,83353,0),(42494,83354,0),(42495,83355,0),(42496,83356,0),(42497,83357,0),(42498,83358,0),(42499,83359,0),(42500,83360,0),(42501,83361,0),(42502,83362,0),(42503,83363,0),(42504,83364,0),(42505,83365,0),(42506,83366,0),(42507,83367,0),(42508,83368,0),(42509,83369,0),(42510,83370,0),(42511,83371,0),(42512,83372,0),(42513,83373,0),(42514,83374,0),(42515,83375,0),(42516,83376,0),(42517,83377,0),(42518,83382,0),(42519,83383,0),(42520,83389,0),(42521,83390,0),(42522,83391,0),(42523,83392,0),(42524,83393,0),(42525,83394,0),(42526,83395,0),(42527,83396,0),(42528,83402,0),(42529,83403,0),(42530,83404,0),(42531,83405,0),(42532,83406,0),(42533,83407,0),(42534,83408,0),(42535,83409,0),(42536,83410,0),(42537,83411,0),(42538,83412,0),(42539,83413,0),(42540,83414,0),(42541,83415,0),(42542,83416,0),(42543,83417,0),(42544,83418,0),(42545,83419,0),(42546,83420,0),(42547,83421,0),(42548,83422,0),(42549,83423,0),(42550,83424,0),(42551,83425,0),(42552,83426,0),(42553,83427,0),(42554,83432,0),(42555,83433,0),(42556,83434,0),(42557,83440,0),(42558,83441,0),(42559,83442,0),(42560,83443,0),(42561,83444,0),(42562,83445,0),(42563,83451,0),(42564,83452,0),(42565,83453,0),(42566,83454,0),(42567,83455,0),(42568,83456,0),(42569,83457,0),(42570,83458,0),(42571,83459,0),(42572,83460,0),(42573,83461,0),(42574,83462,0),(42575,83463,0),(42576,83464,0),(42577,83465,0),(42578,83466,0),(42579,83467,0),(42580,83468,0),(42581,83469,0),(42582,83470,0),(42583,83471,0),(42584,83472,0),(42585,83473,0),(42586,83474,0),(42587,83475,0),(42588,83476,0),(42589,83477,0),(42590,83478,0),(42591,83479,0),(42592,83480,0),(42593,83481,0),(42594,83482,0),(42595,83483,0),(42596,83484,0),(42597,83485,0),(42598,83486,0),(42599,83487,0),(42600,83488,0),(42601,83489,0),(42602,83490,0),(42603,83491,0),(42604,83492,0),(42605,83493,0),(42606,83494,0),(42607,83495,0),(42608,83496,0),(42609,83497,0),(42610,83498,0),(42611,83499,0),(42612,83500,0),(42613,83501,0),(42614,83502,0),(42615,83503,0),(42616,83504,0),(42617,83505,0),(42618,83506,0),(42619,83507,0),(42620,83508,0),(42621,83509,0),(42622,83510,0),(42623,83511,0),(42624,83512,0),(42625,83513,0),(42626,83514,0),(42627,83515,0),(42628,83516,0),(42629,83517,0),(42630,83518,0),(42631,83519,0),(42632,83520,0),(42633,83521,0),(42634,83522,0),(42635,83523,0),(42636,83524,0),(42637,83525,0),(42638,83526,0),(42639,83527,0),(42640,83528,0),(42641,83529,0),(42642,83530,0),(42643,83531,0),(42644,83532,0),(42645,83533,0),(42646,83534,0),(42647,83535,0),(42648,83536,0),(42649,83537,0),(42650,83538,0),(42651,83539,0),(42652,83540,0),(42653,83541,0),(42654,83542,0),(42655,83543,0),(42656,83544,0),(42657,83545,0),(42658,83546,0),(42659,83547,0),(42660,83548,0),(42661,83549,0),(42662,83550,0),(42663,83551,0),(42664,83552,0),(42665,83553,0),(42666,83554,0),(42667,83555,0),(42668,83556,0),(42669,83557,0),(42670,83558,0),(42671,83559,0),(42672,83560,0),(42673,83561,0),(42674,83562,0),(42675,83563,0),(42676,83564,0),(42677,83565,0),(42678,83566,0),(42679,83567,0),(42680,83568,0),(42681,83569,0),(42682,83570,0),(42683,83571,0),(42684,83572,0),(42685,83573,0),(42686,83574,0),(42687,83575,0),(42688,83576,0),(42689,83577,0),(42690,83578,0),(42691,83579,0),(42692,83580,0),(42693,83581,0),(42694,83582,0),(42695,83583,0),(42696,83584,0),(42697,83598,0),(42698,83599,0),(42699,83600,0),(42700,83601,0),(42701,83602,0),(42702,83603,0),(42703,83611,0),(42704,83612,0),(42705,83613,0),(42706,83614,0),(42707,83644,0),(42708,83645,0),(42709,83646,0),(42710,83647,0),(42711,83648,0),(42712,83649,0),(42713,83650,0),(42714,83651,0),(42715,83652,0),(42716,83653,0),(42717,83654,0),(42718,83655,0),(42719,83656,0),(42720,83657,0),(42721,83658,0),(42722,83659,0),(42723,83660,0),(42724,83661,0),(42725,83662,0),(42726,83663,0),(42727,83664,0),(42728,83665,0),(42729,83666,0),(42730,83667,0),(42731,83668,0),(42732,83669,0),(42733,83670,0),(42734,83671,0),(42735,83672,0),(42736,83673,0),(42737,83674,0),(42738,83675,0),(42739,83676,0),(42740,83677,0),(42741,83678,0),(42742,83679,0),(42743,83680,0),(42744,83681,0),(42745,83682,0),(42746,83683,0),(42747,83684,0),(42748,83685,0),(42749,83686,0),(42750,83687,0),(42751,83688,0),(42752,83689,0),(42753,83690,0),(42754,83691,0),(42755,83692,0),(42756,83693,0),(42757,83694,0),(42758,83695,0),(42759,83696,0),(42760,83697,0),(42761,83698,0),(42762,83699,0),(42763,83700,0),(42764,83701,0),(42765,83702,0),(42766,83703,0),(42767,83704,0),(42768,83705,0),(42769,83706,0),(42770,83707,0),(42771,83708,0),(42772,83709,0),(42773,83710,0),(42774,83711,0),(42775,83712,0),(42776,83713,0),(42777,83714,0),(42778,83715,0),(42779,83741,0),(42780,83742,0),(42781,83743,0),(42782,83744,0),(42783,83745,0),(42784,83746,0),(42785,83747,0),(42786,83748,0),(42787,83749,0),(42788,83750,0),(42789,83751,0),(42790,83752,0),(42791,83753,0),(42792,83754,0),(42793,83755,0),(42794,83756,0),(42795,83757,0),(42796,83758,0),(42797,83759,0),(42798,83760,0),(42799,83761,0),(42800,83766,0),(42801,83983,0),(42802,83984,0),(42803,83985,0),(42804,83986,0),(42805,83987,0),(42806,83988,0),(42807,83989,0),(42808,83990,0),(42809,83991,0),(42810,83992,0),(42811,83993,0),(42812,83994,0),(42813,83995,0),(42814,83996,0),(42815,83997,0),(42816,83998,0),(42817,83999,0),(42818,84000,0),(42819,84001,0),(42820,84002,0),(42821,84003,0),(42822,84004,0),(42823,84005,0),(42824,84006,0),(42825,84007,0),(42826,84008,0),(42827,84009,0),(42828,84010,0),(42829,84011,0),(42830,84012,0),(42831,84013,0),(42832,84014,0),(42833,84015,0),(42834,84016,0),(42835,84017,0),(42836,84018,0),(42837,84019,0),(42838,84020,0),(42839,84021,0),(42840,84022,0),(42841,84023,0),(42842,84024,0),(42843,84025,0),(42844,84026,0),(42845,84027,0),(42846,84028,0),(42847,84029,0),(42848,84030,0),(42849,84031,0),(42850,84032,0),(42851,84033,0),(42852,84034,0),(42853,84035,0),(42854,84036,0),(42855,84037,0),(42856,84038,0),(42857,84039,0),(42858,84040,0),(42859,84041,0),(42860,84042,0),(42861,84043,0),(42862,84044,0),(42863,84045,0),(42864,84046,0),(42865,84047,0),(42866,84048,0),(42867,84049,0),(42868,84050,0),(42869,84051,0),(42870,84052,0),(42871,84053,0),(42872,84054,0),(42873,84080,0),(42874,84081,0),(42875,84082,0),(42876,84083,0),(42877,84084,0),(42878,84085,0),(42879,84086,0),(42880,84087,0),(42881,84088,0),(42882,84089,0),(42883,84090,0),(42884,84091,0),(42885,84092,0),(42886,84093,0),(42887,84094,0),(42888,84095,0),(42889,84096,0),(42890,84097,0),(42891,84098,0),(42892,84099,0),(42893,84100,0),(42894,84243,0),(42895,84244,0),(42896,84245,0),(42897,84246,0),(42898,84247,0),(42899,84248,0),(42900,84249,0),(42901,84250,0),(42902,84251,0),(42903,84252,0),(42904,84253,0),(42905,84254,0),(42906,84255,0),(42907,84256,0),(42908,84257,0),(42909,84258,0),(42910,84259,0),(42911,84260,0),(42912,84261,0),(42913,84262,0),(42914,84263,0),(42915,84264,0),(42916,84265,0),(42917,84266,0),(42918,84272,0),(42919,84273,0),(42920,84274,0),(42921,84275,0),(42922,84276,0),(42923,84277,0),(42924,84278,0),(42925,84279,0),(42926,84280,0),(42927,84291,0),(42928,84292,0),(42929,84293,0),(42930,84294,0),(42931,84295,0),(42932,84320,0),(42933,84321,0),(42934,84322,0),(42935,84323,0),(42936,84324,0),(42937,84325,0),(42938,84326,0),(42939,84327,0),(42940,84328,0),(42941,84339,0),(42942,84340,0),(42943,84341,0),(42944,84342,0),(42945,84343,0),(42946,84345,0),(42947,84346,0),(42948,84353,0),(42949,84354,0),(42950,84355,0),(42951,84356,0),(42952,84357,0),(42953,84358,0),(42954,84359,0),(42955,84360,0),(42956,84361,0),(42957,84362,0),(42958,84363,0),(42959,84364,0),(42960,84372,0),(42961,84373,0),(42962,84374,0),(42963,84375,0),(42964,84376,0),(42965,84377,0),(42966,84378,0),(42967,84379,0),(42968,84380,0),(42969,84381,0),(42970,84382,0),(42971,84383,0),(42972,84384,0),(42973,84385,0),(42974,84386,0),(42975,84387,0),(42976,84388,0),(42977,84389,0),(42978,84390,0),(42979,84391,0),(42980,84392,0),(42981,84393,0),(42982,84394,0),(42983,84395,0),(42984,84396,0),(42985,84397,0),(42986,84402,0),(42987,84403,0),(42988,84404,0),(42989,84405,0),(42990,84406,0),(42991,84407,0),(42992,84408,0),(42993,84409,0),(42994,84410,0),(42995,84411,0),(42996,84412,0),(42997,84413,0),(42998,84414,0),(42999,84415,0),(43000,84416,0),(43001,84417,0),(43002,84418,0),(43003,84419,0),(43004,84420,0),(43005,84421,0),(43006,84422,0),(43007,84423,0),(43008,84424,0),(43009,84425,0),(43010,84426,0),(43011,84427,0),(43012,84428,0),(43013,84429,0),(43014,84430,0),(43015,84431,0),(43016,84432,0),(43017,84433,0),(43018,84434,0),(43019,84435,0),(43020,84436,0),(43021,84437,0),(43022,84438,0),(43023,84439,0),(43024,84440,0),(43025,84441,0),(43026,84442,0),(43027,84443,0),(43028,84444,0),(43029,84445,0),(43030,84446,0),(43031,84447,0),(43032,84448,0),(43033,84449,0),(43034,84456,0),(43035,84457,0),(43036,84458,0),(43037,84459,0),(43038,84460,0),(43039,84461,0),(43040,84462,0),(43041,84463,0),(43042,84464,0),(43043,84465,0),(43044,84466,0),(43045,84467,0),(43046,84468,0),(43047,84469,0),(43048,84470,0),(43049,84471,0),(43050,84472,0),(43051,84473,0),(43052,84474,0),(43053,84475,0),(43054,84476,0),(43055,84477,0),(43056,84478,0),(43057,84479,0),(43058,84480,0),(43059,84481,0),(43060,84482,0),(43061,84483,0),(43062,84484,0),(43063,84485,0),(43064,84486,0),(43065,84487,0),(43066,84491,0),(43067,84492,0),(43068,84499,0),(43069,84500,0),(43070,84501,0),(43071,84502,0),(43072,84503,0),(43073,84504,0),(43074,84505,0),(43075,84506,0),(43076,84507,0),(43077,84508,0),(43078,84509,0),(43079,84510,0),(43080,84511,0),(43081,84512,0),(43082,84513,0),(43083,84514,0),(43084,84515,0),(43085,84516,0),(43086,84517,0),(43087,84518,0),(43088,84519,0),(43089,84520,0),(43090,84521,0),(43091,84522,0),(43092,84523,0),(43093,84524,0),(43094,84525,0),(43095,84526,0),(43096,84527,0),(43097,84528,0),(43098,84529,0),(43099,84530,0),(43100,84531,0),(43101,84532,0),(43102,84533,0),(43103,84534,0),(43104,84535,0),(43105,84536,0),(43106,84537,0),(43107,84538,0),(43108,84539,0),(43109,84540,0),(43110,84541,0),(43111,84542,0),(43112,84543,0),(43113,84544,0),(43114,84545,0),(43115,84546,0),(43116,84547,0),(43117,84548,0),(43118,84549,0),(43119,84550,0),(43120,84551,0),(43121,84552,0),(43122,84587,0),(43123,84588,0),(43124,84589,0),(43125,84590,0),(43126,84591,0),(43127,84592,0),(43128,84593,0),(43129,84594,0),(43130,84595,0),(43131,84596,0),(43132,84597,0),(43133,84598,0),(43134,84599,0),(43135,84600,0),(43136,84601,0),(43137,84602,0),(43138,84603,0),(43139,84604,0),(43140,84617,0),(43141,84618,0),(43142,84619,0),(43143,84620,0),(43144,84621,0),(43145,84622,0),(43146,84623,0),(43147,84624,0),(43148,84625,0),(43149,84626,0),(43150,84627,0),(43151,84628,0),(43152,84629,0),(43153,84630,0),(43154,84631,0),(43155,84632,0),(43156,84633,0),(43157,84634,0),(43158,84660,0),(43159,84661,0),(43160,84668,0),(43161,84669,0),(43162,84670,0),(43163,84671,0),(43164,84672,0),(43165,84673,0),(43166,84674,0),(43167,84675,0),(43168,84676,0),(43169,84677,0),(43170,84678,0),(43171,84679,0),(43172,84680,0),(43173,84681,0),(43174,84682,0),(43175,84683,0),(43176,84684,0),(43177,84685,0),(43178,84687,0),(43179,84688,0),(43180,84689,0),(43181,84690,0),(43182,84691,0),(43183,84692,0),(43184,84693,0),(43185,84694,0),(43186,84695,0),(43187,84696,0),(43188,84697,0),(43189,84698,0),(43190,84699,0),(43191,84700,0),(43192,84701,0),(43193,84702,0),(43194,84703,0),(43195,84704,0),(43196,84705,0),(43197,84706,0),(43198,84707,0),(43199,84708,0),(43200,84709,0),(43201,84710,0),(43202,84711,0),(43203,84712,0),(43204,84713,0),(43205,84714,0),(43206,84715,0),(43207,84716,0),(43208,84717,0),(43209,84718,0),(43210,84719,0),(43211,84720,0),(43212,84721,0),(43213,84722,0),(43214,84723,0),(43215,84724,0),(43216,84725,0),(43217,84729,0),(43218,84730,0),(43219,84731,0),(43220,84732,0),(43221,84733,0),(43222,84734,0),(43223,84735,0),(43224,84736,0),(43225,84737,0),(43226,84738,0),(43227,84739,0),(43228,84740,0),(43229,84741,0),(43230,84742,0),(43231,84743,0),(43232,84744,0),(43233,84745,0),(43234,84746,0),(43235,84747,0),(43236,84748,0),(43237,84749,0),(43238,84750,0),(43239,84751,0),(43240,84752,0),(43241,84763,0),(43242,84764,0),(43243,84765,0),(43244,84766,0),(43245,84767,0),(43246,84769,0),(43247,84770,0),(43248,84772,0),(43249,84773,0),(43250,84774,0),(43251,84775,0),(43252,84776,0),(43253,84777,0),(43254,84778,0),(43255,84780,0),(43256,84784,0),(43257,84785,0),(43258,84786,0),(43259,84787,0),(43260,84788,0),(43261,84789,0),(43262,84790,0),(43263,84791,0),(43264,84792,0),(43265,84793,0),(43266,84794,0),(43267,84795,0),(43268,84796,0),(43269,84797,0),(43270,84798,0),(43271,84799,0),(43272,84800,0),(43273,84801,0),(43274,84802,0),(43275,84803,0),(43276,84804,0),(43277,84805,0),(43278,84806,0),(43279,84807,0),(43280,84808,0),(43281,84809,0),(43282,84810,0),(43283,84811,0),(43284,84812,0),(43285,84813,0),(43286,84814,0),(43287,84815,0),(43288,84816,0),(43289,84817,0),(43290,84818,0),(43291,84819,0),(43292,84820,0),(43293,84821,0),(43294,84822,0),(43295,84830,0),(43296,84831,0),(43297,84832,0),(43298,84833,0),(43299,84834,0),(43300,84835,0),(43301,84836,0),(43302,84837,0),(43303,84838,0),(43304,84839,0),(43305,84840,0),(43306,84841,0),(43307,84842,0),(43308,84843,0),(43309,84844,0),(43310,84845,0),(43311,84846,0),(43312,84847,0),(43313,84848,0),(43314,84849,0),(43315,84850,0),(43316,84851,0),(43317,84852,0),(43318,84853,0),(43319,84854,0),(43320,84855,0),(43321,84856,0),(43322,84857,0),(43323,84858,0),(43324,84859,0),(43325,84860,0),(43326,84861,0),(43327,84862,0),(43328,84863,0),(43329,84864,0),(43330,84865,0),(43331,84866,0),(43332,84867,0),(43333,84868,0),(43334,84869,0),(43335,84870,0),(43336,84871,0),(43337,84872,0),(43338,84873,0),(43339,84874,0),(43340,84875,0),(43341,84876,0),(43342,84877,0),(43343,84878,0),(43344,84879,0),(43345,84880,0),(43346,84881,0),(43347,84882,0),(43348,84883,0),(43349,84884,0),(43350,84885,0),(43351,84893,0),(43352,84894,0),(43353,84895,0),(43354,84896,0),(43355,84897,0),(43356,84898,0),(43357,84899,0),(43358,84900,0),(43359,84901,0),(43360,84902,0),(43361,84903,0),(43362,84904,0),(43363,84905,0),(43364,84906,0),(43365,84907,0),(43366,84908,0),(43367,84909,0),(43368,84910,0),(43369,84911,0),(43370,84912,0),(43371,84913,0),(43372,84914,0),(43373,84915,0),(43374,84916,0),(43375,84917,0),(43376,84918,0),(43377,84919,0),(43378,84920,0),(43379,84921,0),(43380,84922,0),(43381,84923,0),(43382,84924,0),(43383,84925,0),(43384,84926,0),(43385,84927,0),(43386,84928,0),(43387,84929,0),(43388,84930,0),(43389,84946,0),(43390,84947,0),(43391,84948,0),(43392,84949,0),(43393,84950,0),(43394,84951,0),(43395,84952,0),(43396,84953,0),(43397,84954,0),(43398,84955,0),(43399,84956,0),(43400,84957,0),(43401,84958,0),(43402,84959,0),(43403,84960,0),(43404,84961,0),(43405,84962,0),(43406,84963,0),(43407,84964,0),(43408,84965,0),(43409,84966,0),(43410,84967,0),(43411,84968,0),(43412,84969,0),(43413,84970,0),(43414,84971,0),(43415,84972,0),(43416,84973,0),(43417,84974,0),(43418,84975,0),(43419,84976,0),(43420,84977,0),(43421,84978,0),(43422,84979,0),(43423,84980,0),(43424,84981,0),(43425,84982,0),(43426,84983,0),(43427,84984,0),(43428,84985,0),(43429,84986,0),(43430,84987,0),(43431,84988,0),(43432,84989,0),(43433,84990,0),(43434,84991,0),(43435,84992,0),(43436,84993,0),(43437,84994,0),(43438,84995,0),(43439,84996,0),(43440,84997,0),(43441,84998,0),(43442,84999,0),(43443,85000,0),(43444,85001,0),(43445,85002,0),(43446,85003,0),(43447,85004,0),(43448,85005,0),(43449,85006,0),(43450,85007,0),(43451,85008,0),(43452,85009,0),(43453,85010,0),(43454,85011,0),(43455,85012,0),(43456,85013,0),(43457,85014,0),(43458,85015,0),(43459,85016,0),(43460,85017,0),(43461,85018,0),(43462,85019,0),(43463,85020,0),(43464,85021,0),(43465,85022,0),(43466,85023,0),(43467,85024,0),(43468,85025,0),(43469,85026,0),(43470,85027,0),(43471,85028,0),(43472,85029,0),(43473,85030,0),(43474,85031,0),(43475,85032,0),(43476,85033,0),(43477,85034,0),(43478,85035,0),(43479,85036,0),(43480,85037,0),(43481,85038,0),(43482,85039,0),(43483,85040,0),(43484,85041,0),(43485,85042,0),(43486,85043,0),(43487,85044,0),(43488,85045,0),(43489,85046,0),(43490,85047,0),(43491,85048,0),(43492,85049,0),(43493,85050,0),(43494,85051,0),(43495,85052,0),(43496,85053,0),(43497,85054,0),(43498,85055,0),(43499,85056,0),(43500,85057,0),(43501,85058,0),(43502,85059,0),(43503,85060,0),(43504,85061,0),(43505,85062,0),(43506,85063,0),(43507,85064,0),(43508,85065,0),(43509,85066,0),(43510,85067,0),(43511,85068,0),(43512,85069,0),(43513,85070,0),(43514,85071,0),(43515,85072,0),(43516,85073,0),(43517,85074,0),(43518,85075,0),(43519,85076,0),(43520,85077,0),(43521,85078,0),(43522,85079,0),(43523,85080,0),(43524,85081,0),(43525,85082,0),(43526,85083,0),(43527,85084,0),(43528,85085,0),(43529,85086,0),(43530,85087,0),(43531,85088,0),(43532,85089,0),(43533,85090,0),(43534,85091,0),(43535,85092,0),(43536,85093,0),(43537,85094,0),(43538,85095,0),(43539,85096,0),(43540,85097,0),(43541,85098,0),(43542,85099,0),(43543,85100,0),(43544,85101,0),(43545,85102,0),(43546,85103,0),(43547,85104,0),(43548,85105,0),(43549,85106,0),(43550,85107,0),(43551,85108,0),(43552,85109,0),(43553,85110,0),(43554,85111,0),(43555,85112,0),(43556,85113,0),(43557,85114,0),(43558,85115,0),(43559,85116,0),(43560,85117,0),(43561,85118,0),(43562,85119,0),(43563,85120,0),(43564,85121,0),(43565,85122,0),(43566,85123,0),(43567,85124,0),(43568,85125,0),(43569,85126,0),(43570,85127,0),(43571,85128,0),(43572,85129,0),(43573,85130,0),(43574,85131,0),(43575,85132,0),(43576,85133,0),(43577,85134,0),(43578,85135,0),(43579,85136,0),(43580,85137,0),(43581,85138,0),(43582,85139,0),(43583,85140,0),(43584,85141,0),(43585,85142,0),(43586,85143,0),(43587,85144,0),(43588,85145,0),(43589,85146,0),(43590,85147,0),(43591,85148,0),(43592,85149,0),(43593,85150,0),(43594,85151,0),(43595,85165,0),(43596,85166,0),(43597,85167,0),(43598,85168,0),(43599,85169,0),(43600,85170,0),(43601,85171,0),(43602,85172,0),(43603,85173,0),(43604,85175,0),(43605,85176,0),(43606,85178,0),(43607,85179,0),(43608,85180,0),(43609,85182,0),(43610,85183,0),(43611,85184,0),(43612,85185,0),(43613,85186,0),(43614,85187,0),(43615,85189,0),(43616,85190,0),(43617,85192,0),(43618,85193,0),(43619,85194,0),(43620,85198,0),(43621,85199,0),(43622,85200,0),(43623,85232,0),(43624,85233,0),(43625,85234,0),(43626,85235,0),(43627,85236,0),(43628,85237,0),(43629,85238,0),(43630,85239,0),(43631,85240,0),(43632,85248,0),(43633,85249,0),(43634,85250,0),(43635,85251,0),(43636,85252,0),(43637,85253,0),(43638,85254,0),(43639,85255,0),(43640,85256,0),(43641,85281,0),(43642,85284,0),(43643,85285,0),(43644,85286,0),(43645,85287,0),(43646,85288,0),(43647,85289,0),(43648,85290,0),(43649,85291,0),(43650,85292,0),(43651,85293,0),(43652,85294,0),(43653,85295,0),(43654,85296,0),(43655,85297,0),(43656,85298,0),(43657,85299,0),(43658,85300,0),(43659,85301,0),(43660,85302,0),(43661,85303,0),(43662,85304,0),(43663,85305,0),(43664,85306,0),(43665,85307,0),(43666,85308,0),(43667,85309,0),(43668,85310,0),(43669,85311,0),(43670,85312,0),(43671,85313,0),(43672,85314,0),(43673,85315,0),(43674,85316,0),(43675,85317,0),(43676,85318,0),(43677,85319,0),(43678,85320,0),(43679,85321,0),(43680,85322,0),(43681,85323,0),(43682,85324,0),(43683,85325,0),(43684,85326,0),(43685,85327,0),(43686,85328,0),(43687,85329,0),(43688,85330,0),(43689,85331,0),(43690,85332,0),(43691,85333,0),(43692,85334,0),(43693,85335,0),(43694,85336,0),(43695,85337,0),(43696,85338,0),(43697,85339,0),(43698,85340,0),(43699,85341,0),(43700,85342,0),(43701,85343,0),(43702,85344,0),(43703,85345,0),(43704,85346,0),(43705,85347,0),(43706,85348,0),(43707,85349,0),(43708,85350,0),(43709,85351,0),(43710,85352,0),(43711,85353,0),(43712,85354,0),(43713,85355,0),(43714,85356,0),(43715,85357,0),(43716,85358,0),(43717,85359,0),(43718,85360,0),(43719,85361,0),(43720,85362,0),(43721,85363,0),(43722,85364,0),(43723,85365,0),(43724,85366,0),(43725,85367,0),(43726,85368,0),(43727,85369,0),(43728,85370,0),(43729,85371,0),(43730,85372,0),(43731,85373,0),(43732,85374,0),(43733,85375,0),(43734,85376,0),(43735,85377,0),(43736,85378,0),(43737,85379,0),(43738,85380,0),(43739,85381,0),(43740,85382,0),(43741,85383,0),(43742,85384,0),(43743,85385,0),(43744,85386,0),(43745,85387,0),(43746,85388,0),(43747,85389,0),(43748,85390,0),(43749,85391,0),(43750,85392,0),(43751,85393,0),(43752,85394,0),(43753,85395,0),(43754,85396,0),(43755,85397,0),(43756,85398,0),(43757,85399,0),(43758,85400,0),(43759,85401,0),(43760,85402,0),(43761,85403,0),(43762,85404,0),(43763,85405,0),(43764,85406,0),(43765,85407,0),(43766,85408,0),(43767,85409,0),(43768,85410,0),(43769,85411,0),(43770,85412,0),(43771,85413,0),(43772,85414,0),(43773,85415,0),(43774,85416,0),(43775,85417,0),(43776,85418,0),(43777,85419,0),(43778,85420,0),(43779,85421,0),(43780,85422,0),(43781,85423,0),(43782,85424,0),(43783,85425,0),(43784,85426,0),(43785,85427,0),(43786,85428,0),(43787,85431,0),(43788,85432,0),(43789,85433,0),(43790,85434,0),(43791,85435,0),(43792,85436,0),(43793,85437,0),(43794,85438,0),(43795,85439,0),(43796,85440,0),(43797,85441,0),(43798,85442,0),(43799,85443,0),(43800,85444,0),(43801,85445,0),(43802,85446,0),(43803,85448,0),(43804,85449,0),(43805,85450,0),(43806,85451,0),(43807,85452,0),(43808,85453,0),(43809,85454,0),(43810,85455,0),(43811,85456,0),(43812,85457,0),(43813,85458,0),(43814,85459,0),(43815,85460,0),(43816,85461,0),(43817,85462,0),(43818,85463,0),(43819,85464,0),(43820,85465,0),(43821,85466,0),(43822,85467,0),(43823,85468,0),(43824,85469,0),(43825,85470,0),(43826,85471,0),(43827,85472,0),(43828,85473,0),(43829,85474,0),(43830,85475,0),(43831,85476,0),(43832,85478,0),(43833,85479,0),(43834,85480,0),(43835,85481,0),(43836,85482,0),(43837,85483,0),(43838,85484,0),(43839,85485,0),(43840,85486,0),(43841,85487,0),(43842,85488,0),(43843,85489,0),(43844,85490,0),(43845,85491,0),(43846,85492,0),(43847,85493,0),(43848,85494,0),(43849,85495,0),(43850,85496,0),(43851,85508,0),(43852,85509,0),(43853,85510,0),(43854,85514,0),(43855,85515,0),(43856,85516,0),(43857,85517,0),(43858,85518,0),(43859,85519,0),(43860,85520,0),(43861,85521,0),(43862,85522,0),(43863,85523,0),(43864,85524,0),(43865,85525,0),(43866,85526,0),(43867,85527,0),(43868,85528,0),(43869,85529,0),(43870,85530,0),(43871,85531,0),(43872,85532,0),(43873,85533,0),(43874,85534,0),(43875,85535,0),(43876,85536,0),(43877,85537,0),(43878,85538,0),(43879,85539,0),(43880,85540,0),(43881,85560,0),(43882,85561,0),(43883,85562,0),(43884,85563,0),(43885,85566,0),(43886,85567,0),(43887,85574,0),(43888,85575,0),(43889,85576,0),(43890,85587,0),(43891,85588,0),(43892,85590,0),(43893,85594,0),(43894,85595,0),(43895,85596,0),(43896,85597,0),(43897,85598,0),(43898,85599,0),(43899,85600,0),(43900,85601,0),(43901,85602,0),(43902,85603,0),(43903,85604,0),(43904,85605,0),(43905,85606,0),(43906,85607,0),(43907,85608,0),(43908,85609,0),(43909,85610,0),(43910,85611,0),(43911,85612,0),(43912,85613,0),(43913,85614,0),(43914,85615,0),(43915,85616,0),(43916,85617,0),(43917,85618,0),(43918,85619,0),(43919,85620,0),(43920,85621,0),(43921,85622,0),(43922,85623,0),(43923,85624,0),(43924,85625,0),(43925,85626,0),(43926,85627,0),(43927,85628,0),(43928,85629,0),(43929,85630,0),(43930,85631,0),(43931,85632,0),(43932,85633,0),(43933,85638,0),(43934,85639,0),(43935,85640,0),(43936,85641,0),(43937,85642,0),(43938,85643,0),(43939,85644,0),(43940,85645,0),(43941,85646,0),(43942,85647,0),(43943,85648,0),(43944,85649,0),(43945,85650,0),(43946,85651,0),(43947,85652,0),(43948,85653,0),(43949,85654,0),(43950,85655,0),(43951,85656,0),(43952,85657,0),(43953,85658,0),(43954,85659,0),(43955,85660,0),(43956,85661,0),(43957,85662,0),(43958,85663,0),(43959,85667,0),(43960,85668,0),(43961,85669,0),(43962,85670,0),(43963,85671,0),(43964,85672,0),(43965,85673,0),(43966,85674,0),(43967,85675,0),(43968,85676,0),(43969,85677,0),(43970,85678,0),(43971,85679,0),(43972,85680,0),(43973,85682,0),(43974,85724,0),(43975,85725,0),(43976,85726,0),(43977,85727,0),(43978,85728,0),(43979,85729,0),(43980,85730,0),(43981,85731,0),(43982,85732,0),(43983,85733,0),(43984,85734,0),(43985,85735,0),(43986,85736,0),(43987,85737,0),(43988,85738,0),(43989,85739,0),(43990,85741,0),(43991,85742,0),(43992,85743,0),(43993,85744,0),(43994,85748,0),(43995,85749,0),(43996,85750,0),(43997,85751,0),(43998,85752,0),(43999,85754,0),(44000,85755,0),(44001,85756,0),(44002,85757,0),(44003,85758,0),(44004,85759,0),(44005,85760,0),(44006,85761,0),(44007,85762,0),(44008,85763,0),(44009,85764,0),(44010,85765,0),(44011,85766,0),(44012,85767,0),(44013,85768,0),(44014,85769,0),(44015,85770,0),(44016,85771,0),(44017,85772,0),(44018,85773,0),(44019,85776,0),(44020,85777,0),(44021,85787,0),(44022,85788,0),(44023,85789,0),(44024,85790,0),(44025,85791,0),(44026,85792,0),(44027,85793,0),(44028,85794,0),(44029,85795,0),(44030,85796,0),(44031,85797,0),(44032,85798,0),(44033,85799,0),(44034,85800,0),(44035,85801,0),(44036,85802,0),(44037,85803,0),(44038,85804,0),(44039,85805,0),(44040,85806,0),(44041,85807,0),(44042,85808,0),(44043,85809,0),(44044,85810,0),(44045,85811,0),(44046,85812,0),(44047,85813,0),(44048,85814,0),(44049,85815,0),(44050,85816,0),(44051,85817,0),(44052,85818,0),(44053,85819,0),(44054,85820,0),(44055,85821,0),(44056,85822,0),(44057,85823,0),(44058,85824,0),(44059,85825,0),(44060,85826,0),(44061,85827,0),(44062,85828,0),(44063,85829,0),(44064,85830,0),(44065,85831,0),(44066,85832,0),(44067,85833,0),(44068,85834,0),(44069,85835,0),(44070,85836,0),(44071,85837,0),(44072,85838,0),(44073,85839,0),(44074,85840,0),(44075,85841,0),(44076,85842,0),(44077,85843,0),(44078,85844,0),(44079,85845,0),(44080,85846,0),(44081,85847,0),(44082,85848,0),(44083,85849,0),(44084,85850,0),(44085,85851,0),(44086,85852,0),(44087,85853,0),(44088,85857,0),(44089,85861,0),(44090,85862,0),(44091,85863,0),(44092,85864,0),(44093,85865,0),(44094,85866,0),(44095,85867,0),(44096,85868,0),(44097,85882,0),(44098,85883,0),(44099,85887,0),(44100,85888,0),(44101,85889,0),(44102,85890,0),(44103,85891,0),(44104,85892,0),(44105,85893,0),(44106,85894,0),(44107,85895,0),(44108,85896,0),(44109,85897,0),(44110,85898,0),(44111,85899,0),(44112,85900,0),(44113,85901,0),(44114,85902,0),(44115,85903,0),(44116,85904,0),(44117,85905,0),(44118,85906,0),(44119,85907,0),(44120,85908,0),(44121,85909,0),(44122,85910,0),(44123,85911,0),(44124,85912,0),(44125,85913,0),(44126,85914,0),(44127,85915,0),(44128,85916,0),(44129,85917,0),(44130,85918,0),(44131,85919,0),(44132,85920,0),(44133,85921,0),(44134,85923,0),(44135,85924,0),(44136,85925,0),(44137,85926,0),(44138,85927,0),(44139,85928,0),(44140,85929,0),(44141,85930,0),(44142,85931,0),(44143,85932,0),(44144,85933,0),(44145,85935,0),(44146,85936,0),(44147,85937,0),(44148,85938,0),(44149,85939,0),(44150,85940,0),(44151,85941,0),(44152,85942,0),(44153,85943,0),(44154,85944,0),(44155,85945,0),(44156,85946,0),(44157,85947,0),(44158,85948,0),(44159,85949,0),(44160,85951,0),(44161,85956,0),(44162,85957,0),(44163,85958,0),(44164,85959,0),(44165,85960,0),(44166,85961,0),(44167,85962,0),(44168,85963,0),(44169,85974,0),(44170,85975,0),(44171,85976,0),(44172,85977,0),(44173,85978,0),(44174,85979,0),(44175,85980,0),(44176,85982,0),(44177,85983,0),(44178,85984,0),(44179,85985,0),(44180,85987,0),(44181,85988,0),(44182,85989,0),(44183,85990,0),(44184,85992,0),(44185,85993,0),(44186,85994,0),(44187,85995,0),(44188,85996,0),(44189,85997,0),(44190,86000,0),(44191,86001,0),(44192,86002,0),(44193,86003,0),(44194,86004,0),(44195,86005,0),(44196,86006,0),(44197,86007,0),(44198,86010,0),(44199,86011,0),(44200,86012,0),(44201,86013,0),(44202,86014,0),(44203,86015,0),(44204,86016,0),(44205,86017,0),(44206,86018,0),(44207,86019,0),(44208,86020,0),(44209,86021,0),(44210,86022,0),(44211,86023,0),(44212,86024,0),(44213,86025,0),(44214,86027,0),(44215,86028,0),(44216,86029,0),(44217,86030,0),(44218,86031,0),(44219,86032,0),(44220,86033,0),(44221,86034,0),(44222,86035,0),(44223,86036,0),(44224,86037,0),(44225,86039,0),(44226,86040,0),(44227,86041,0),(44228,86048,0),(44229,86049,0),(44230,86050,0),(44231,86051,0),(44232,86052,0),(44233,86053,0),(44234,86054,0),(44235,86055,0),(44236,86056,0),(44237,86058,0),(44238,86059,0),(44239,86060,0),(44240,86061,0),(44241,86062,0),(44242,86063,0),(44243,86064,0),(44244,86065,0),(44245,86066,0),(44246,86071,0),(44247,86075,0),(44248,86076,0),(44249,86079,0),(44250,86080,0),(44251,86081,0),(44252,86082,0),(44253,86084,0),(44254,86086,0),(44255,86088,0),(44256,86089,0),(44257,86090,0),(44258,86091,0),(44259,86092,0),(44260,86093,0),(44261,86094,0),(44262,86095,0),(44263,86096,0),(44264,86097,0),(44265,86098,0),(44266,86115,0),(44267,86116,0),(44268,86117,0),(44269,86118,0),(44270,86119,0),(44271,86120,0),(44272,86121,0),(44273,86122,0),(44274,86123,0),(44275,86124,0),(44276,86126,0),(44277,86127,0),(44278,86128,0),(44279,86129,0),(44280,86130,0),(44281,86134,0),(44282,86135,0),(44283,86136,0),(44284,86137,0),(44285,86138,0),(44286,86139,0),(44287,86140,0),(44288,86141,0),(44289,86142,0),(44290,86145,0),(44291,86146,0),(44292,86148,0),(44293,86149,0),(44294,86150,0),(44295,86151,0),(44296,86153,0),(44297,86154,0),(44298,86157,0),(44299,86158,0),(44300,86159,0),(44301,86160,0),(44302,86161,0),(44303,86163,0),(44304,86164,0),(44305,86165,0),(44306,86167,0),(44307,86168,0),(44308,86169,0),(44309,86170,0),(44310,86171,0),(44311,86173,0),(44312,86174,0),(44313,86175,0),(44314,86176,0),(44315,86178,0),(44316,86179,0),(44317,86180,0),(44318,86181,0),(44319,86182,0),(44320,86183,0),(44321,86184,0),(44322,86185,0),(44323,86186,0),(44324,86187,0),(44325,86188,0),(44326,86189,0),(44327,86190,0),(44328,86191,0),(44329,86192,0),(44330,86193,0),(44331,86194,0),(44332,86195,0),(44333,86196,0),(44334,86197,0),(44335,86198,0),(44336,86199,0),(44337,86201,0),(44338,86202,0),(44339,86203,0),(44340,86204,0),(44341,86206,0),(44342,86207,0),(44343,86208,0),(44344,86209,0),(44345,86210,0),(44346,86212,0),(44347,86213,0),(44348,86214,0),(44349,86215,0),(44350,86217,0),(44351,86218,0),(44352,86219,0),(44353,86221,0),(44354,86222,0),(44355,86223,0),(44356,86224,0),(44357,86225,0),(44358,86226,0),(44359,86227,0),(44360,86228,0),(44361,86229,0),(44362,86230,0),(44363,86232,0),(44364,86310,0),(44365,86311,0),(44366,86312,0),(44367,86313,0),(44368,86314,0),(44369,86316,0),(44370,86317,0),(44371,86318,0),(44372,86319,0),(44373,86320,0),(44374,86321,0),(44375,86324,0),(44376,86325,0),(44377,86326,0),(44378,86328,0),(44379,86329,0),(44380,86330,0),(44381,86331,0),(44382,86333,0),(44383,86334,0),(44384,86335,0),(44385,86337,0),(44386,86338,0),(44387,86339,0),(44388,86340,0),(44389,86341,0),(44390,86342,0),(44391,86343,0),(44392,86383,0),(44393,86384,0),(44394,86385,0),(44395,86386,0),(44396,86387,0),(44397,86389,0),(44398,86390,0),(44399,86391,0),(44400,86394,0),(44401,86395,0),(44402,86396,0),(44403,86397,0),(44404,86398,0),(44405,86399,0),(44406,86400,0),(44407,86401,0),(44408,86402,0),(44409,86403,0),(44410,86405,0),(44411,86406,0),(44412,86407,0),(44413,86408,0),(44414,86409,0),(44415,86410,0),(44416,86411,0),(44417,86412,0),(44418,86413,0),(44419,86414,0),(44420,86415,0),(44421,86416,0),(44422,86417,0),(44423,86418,0),(44424,86419,0),(44425,86420,0),(44426,86429,0),(44427,86437,0),(44428,86438,0),(44429,86439,0),(44430,86440,0),(44431,86441,0),(44432,86442,0),(44433,86443,0),(44434,86444,0),(44435,86445,0),(44436,86447,0),(44437,86448,0),(44438,86449,0),(44439,86450,0),(44440,86451,0),(44441,86452,0),(44442,86453,0),(44443,86454,0),(44444,86455,0),(44445,86456,0),(44446,86457,0),(44447,86458,0),(44448,86459,0),(44449,86460,0),(44450,86461,0),(44451,86462,0),(44452,86463,0),(44453,86464,0),(44454,86468,0),(44455,86469,0),(44456,86470,0),(44457,86480,0),(44458,86481,0),(44459,86482,0),(44460,86483,0),(44461,86484,0),(44462,86485,0),(44463,86486,0),(44464,86487,0),(44465,86490,0),(44466,86491,0),(44467,86492,0),(44468,86493,0),(44469,86494,0),(44470,86495,0),(44471,86496,0),(44472,86497,0),(44473,86498,0),(44474,86499,0),(44475,86500,0),(44476,86501,0),(44477,86502,0),(44478,86503,0),(44479,86504,0),(44480,86505,0),(44481,86510,0),(44482,86513,0),(44483,86514,0),(44484,86518,0),(44485,86519,0),(44486,86520,0),(44487,86522,0),(44488,86523,0),(44489,86524,0),(44490,86527,0),(44491,86537,0),(44492,86538,0),(44493,86539,0),(44494,86540,0),(44495,86548,0),(44496,86549,0),(44497,86558,0),(44498,86559,0),(44499,86560,0),(44500,86566,0),(44501,86600,0),(44502,86601,0),(44503,86602,0),(44504,86603,0),(44505,86604,0),(44506,86605,0),(44507,86606,0),(44508,86608,0),(44509,86609,0),(44510,86610,0),(44511,86611,0),(44512,86612,0),(44513,86613,0),(44514,86614,0),(44515,86615,0),(44516,86617,0),(44517,86618,0),(44518,86619,0),(44519,86620,0),(44520,86621,0),(44521,86622,0),(44522,86624,0),(44523,86625,0),(44524,86626,0),(44525,86627,0),(44526,86628,0),(44527,86629,0),(44528,86630,0),(44529,86631,0),(44530,86632,0),(44531,86633,0),(44532,86634,0),(44533,86635,0),(44534,86636,0),(44535,86637,0),(44536,86638,0),(44537,86639,0),(44538,86640,0),(44539,86641,0),(44540,86642,0),(44541,86643,0),(44542,86644,0),(44543,86645,0),(44544,86646,0),(44545,86647,0),(44546,86648,0),(44547,86649,0),(44548,86650,0),(44549,86651,0),(44550,86652,0),(44551,86653,0),(44552,86654,0),(44553,86655,0),(44554,86656,0),(44555,86657,0),(44556,86658,0),(44557,86659,0),(44558,86660,0),(44559,86661,0),(44560,86662,0),(44561,86663,0),(44562,86664,0),(44563,86665,0),(44564,86666,0),(44565,86667,0),(44566,86668,0),(44567,86669,0),(44568,86670,0),(44569,86671,0),(44570,86672,0),(44571,86673,0),(44572,86674,0),(44573,86675,0),(44574,86676,0),(44575,86677,0),(44576,86678,0),(44577,86679,0),(44578,86680,0),(44579,86681,0),(44580,86682,0),(44581,86683,0),(44582,86684,0),(44583,86685,0),(44584,86686,0),(44585,86687,0),(44586,86688,0),(44587,86689,0),(44588,86690,0),(44589,86691,0),(44590,86692,0),(44591,86693,0),(44592,86694,0),(44593,86695,0),(44594,86696,0),(44595,86697,0),(44596,86698,0),(44597,86699,0),(44598,86700,0),(44599,86701,0),(44600,86702,0),(44601,86703,0),(44602,86704,0),(44603,86705,0),(44604,86706,0),(44605,86707,0),(44606,86708,0),(44607,86709,0),(44608,86710,0),(44609,86711,0),(44610,86712,0),(44611,86713,0),(44612,86714,0),(44613,86715,0),(44614,86716,0),(44615,86717,0),(44616,86718,0),(44617,86719,0),(44618,86720,0),(44619,86721,0),(44620,86722,0),(44621,86723,0),(44622,86724,0),(44623,86725,0),(44624,86726,0),(44625,86727,0),(44626,86728,0),(44627,86729,0),(44628,86730,0),(44629,86731,0),(44630,86732,0),(44631,86733,0),(44632,86734,0),(44633,86735,0),(44634,86736,0),(44635,86737,0),(44636,86738,0),(44637,86740,0),(44638,86741,0),(44639,86742,0),(44640,86743,0),(44641,86744,0),(44642,86745,0),(44643,86746,0),(44644,86747,0),(44645,86748,0),(44646,86749,0),(44647,86750,0),(44648,86751,0),(44649,86752,0),(44650,86753,0),(44651,86755,0),(44652,86756,0),(44653,86757,0),(44654,86758,0),(44655,86760,0),(44656,86761,0),(44657,86762,0),(44658,86763,0),(44659,86764,0),(44660,86765,0),(44661,86766,0),(44662,86768,0),(44663,86769,0),(44664,86770,0),(44665,86777,0),(44666,86778,0),(44667,86779,0),(44668,86780,0),(44669,86781,0),(44670,86782,0),(44671,86784,0),(44672,86785,0),(44673,86786,0),(44674,86787,0),(44675,86788,0),(44676,86789,0),(44677,86793,0),(44678,86794,0),(44679,86795,0),(44680,86796,0),(44681,86797,0),(44682,86798,0),(44683,86799,0),(44684,86800,0),(44685,86801,0),(44686,86803,0),(44687,86804,0),(44688,86806,0),(44689,86807,0),(44690,86808,0),(44691,86809,0),(44692,86811,0),(44693,86812,0),(44694,86815,0),(44695,86816,0),(44696,86817,0),(44697,86818,0),(44698,86819,0),(44699,86821,0),(44700,86822,0),(44701,86823,0),(44702,86825,0),(44703,86826,0),(44704,86827,0),(44705,86828,0),(44706,86829,0),(44707,86831,0),(44708,86832,0),(44709,86833,0),(44710,86834,0),(44711,86836,0),(44712,86837,0),(44713,86838,0),(44714,86839,0),(44715,86840,0),(44716,86841,0),(44717,86842,0),(44718,86843,0),(44719,86844,0),(44720,86845,0),(44721,86846,0),(44722,86847,0),(44723,86848,0),(44724,86849,0),(44725,86850,0),(44726,86852,0),(44727,86853,0),(44728,86854,0),(44729,86855,0),(44730,86857,0),(44731,86859,0),(44732,86860,0),(44733,86861,0),(44734,86862,0),(44735,86863,0),(44736,86864,0),(44737,86865,0),(44738,86866,0),(44739,86867,0),(44740,86868,0),(44741,86870,0),(44742,86874,0),(44743,86875,0),(44744,86876,0),(44745,86877,0),(44746,86878,0),(44747,86879,0),(44748,86882,0),(44749,86883,0),(44750,86884,0),(44751,86886,0),(44752,86887,0),(44753,86888,0),(44754,86889,0),(44755,86891,0),(44756,86892,0),(44757,86893,0),(44758,86895,0),(44759,86896,0),(44760,86897,0),(44761,86898,0),(44762,86899,0),(44763,86900,0),(44764,86901,0),(44765,86902,0),(44766,86903,0),(44767,86904,0),(44768,86905,0),(44769,86906,0),(44770,86908,0),(44771,86909,0),(44772,86910,0),(44773,86911,0),(44774,86912,0),(44775,86913,0),(44776,86914,0),(44777,86915,0),(44778,86916,0),(44779,86917,0),(44780,86918,0),(44781,86919,0),(44782,86920,0),(44783,86921,0),(44784,86922,0),(44785,86923,0),(44786,86924,0),(44787,86925,0),(44788,86926,0),(44789,86927,0),(44790,86928,0),(44791,86929,0),(44792,86930,0),(44793,86931,0),(44794,86932,0),(44795,86933,0),(44796,86934,0),(44797,86935,0),(44798,86936,0),(44799,86937,0),(44800,86938,0),(44801,86939,0),(44802,86940,0),(44803,86941,0),(44804,86942,0),(44805,86943,0),(44806,86944,0),(44807,86945,0),(44808,86947,0),(44809,86948,0),(44810,86950,0),(44811,86951,0),(44812,86952,0),(44813,86954,0),(44814,86955,0),(44815,86956,0),(44816,86958,0),(44817,86959,0),(44818,86960,0),(44819,86961,0),(44820,86962,0),(44821,86963,0),(44822,86964,0),(44823,86965,0),(44824,86966,0),(44825,86969,0),(44826,86970,0),(44827,86971,0),(44828,86972,0),(44829,86973,0),(44830,86975,0),(44831,86977,0),(44832,86978,0),(44833,86979,0),(44834,86980,0),(44835,86981,0),(44836,86983,0),(44837,86984,0),(44838,86985,0),(44839,86986,0),(44840,86987,0),(44841,86988,0),(44842,86989,0),(44843,86990,0),(44844,86991,0),(44845,86992,0),(44846,86993,0),(44847,86994,0),(44848,86995,0),(44849,86996,0),(44850,86997,0),(44851,86998,0),(44852,86999,0),(44853,87000,0),(44854,87001,0),(44855,87002,0),(44856,87003,0),(44857,87004,0),(44858,87005,0),(44859,87006,0),(44860,87007,0),(44861,87008,0),(44862,87009,0),(44863,87010,0),(44864,87011,0),(44865,87012,0),(44866,87013,0),(44867,87014,0),(44868,87015,0),(44869,87017,0),(44870,87018,0),(44871,87019,0),(44872,87020,0),(44873,87021,0),(44874,87022,0),(44875,87023,0),(44876,87024,0),(44877,87025,0),(44878,87026,0),(44879,87027,0),(44880,87029,0),(44881,87030,0),(44882,87031,0),(44883,87032,0),(44884,87033,0),(44885,87034,0),(44886,87035,0),(44887,87037,0),(44888,87038,0),(44889,87039,0),(44890,87041,0),(44891,87042,0),(44892,87043,0),(44893,87044,0),(44894,87046,0),(44895,87047,0),(44896,87048,0),(44897,87049,0),(44898,87050,0),(44899,87051,0),(44900,87052,0),(44901,87054,0),(44902,87055,0),(44903,87056,0),(44904,87058,0),(44905,87059,0),(44906,87060,0),(44907,87061,0),(44908,87062,0),(44909,87064,0),(44910,87066,0),(44911,87067,0),(44912,87068,0),(44913,87069,0),(44914,87070,0),(44915,87071,0),(44916,87073,0),(44917,87074,0),(44918,87077,0),(44919,87078,0),(44920,87084,0),(44921,87085,0),(44922,87086,0),(44923,87087,0),(44924,87088,0),(44925,87089,0),(44926,87090,0),(44927,87091,0),(44928,87092,0),(44929,87093,0),(44930,87094,0),(44931,87095,0),(44932,87096,0),(44933,87097,0),(44934,87098,0),(44935,87099,0),(44936,87100,0),(44937,87101,0),(44938,87102,0),(44939,87103,0),(44940,87104,0),(44941,87105,0),(44942,87106,0),(44943,87107,0),(44944,87108,0),(44945,87109,0),(44946,87110,0),(44947,87111,0),(44948,87112,0),(44949,87113,0),(44950,87114,0),(44951,87115,0),(44952,87116,0),(44953,87117,0),(44954,87118,0),(44955,87119,0),(44956,87120,0),(44957,87121,0),(44958,87122,0),(44959,87123,0),(44960,87124,0),(44961,87125,0),(44962,87126,0),(44963,87127,0),(44964,87128,0),(44965,87129,0),(44966,87130,0),(44967,87131,0),(44968,87132,0),(44969,87133,0),(44970,87134,0),(44971,87135,0),(44972,87136,0),(44973,87137,0),(44974,87138,0),(44975,87139,0),(44976,87140,0),(44977,87141,0),(44978,87142,0),(44979,87143,0),(44980,87145,0),(44981,87146,0),(44982,87149,0),(44983,87150,0),(44984,87152,0),(44985,87153,0),(44986,87154,0),(44987,87155,0),(44988,87156,0),(44989,87157,0),(44990,87159,0),(44991,87161,0),(44992,87162,0),(44993,87164,0),(44994,87165,0),(44995,87166,0),(44996,87168,0),(44997,87169,0),(44998,87170,0),(44999,87171,0),(45000,87173,0),(45001,87174,0),(45002,87176,0),(45003,87177,0),(45004,87178,0),(45005,87179,0),(45006,87180,0),(45007,87181,0),(45008,87182,0),(45009,87183,0),(45010,87184,0),(45011,87185,0),(45012,87186,0),(45013,87187,0),(45014,87188,0),(45015,87189,0),(45016,87190,0),(45017,87191,0),(45018,87192,0),(45019,87193,0),(45020,87194,0),(45021,87195,0),(45022,87196,0),(45023,87197,0),(45024,87198,0),(45025,87199,0),(45026,87200,0),(45027,87201,0),(45028,87203,0),(45029,87204,0),(45030,87205,0),(45031,87206,0),(45032,87213,0),(45033,87254,0),(45034,87256,0),(45035,87260,0),(45036,87265,0),(45037,87270,0),(45038,87271,0),(45039,87272,0),(45040,87273,0),(45041,87274,0),(45042,87275,0),(45043,87280,0),(45044,87281,0),(45045,87283,0),(45046,87284,0),(45047,87285,0),(45048,87286,0),(45049,87287,0),(45050,87288,0),(45051,87289,0),(45052,87290,0),(45053,87291,0),(45054,87292,0),(45055,87293,0),(45056,87294,0),(45057,87295,0),(45058,87296,0),(45059,87297,0),(45060,87298,0),(45061,87299,0),(45062,87300,0),(45063,87301,0),(45064,87302,0),(45065,87303,0),(45066,87304,0),(45067,87305,0),(45068,87306,0),(45069,87307,0),(45070,87308,0),(45071,87309,0),(45072,87310,0),(45073,87311,0),(45074,87312,0),(45075,87313,0),(45076,87314,0),(45077,87315,0),(45078,87316,0),(45079,87317,0),(45080,87318,0),(45081,87319,0),(45082,87320,0),(45083,87321,0),(45084,87322,0),(45085,87323,0),(45086,87324,0),(45087,87325,0),(45088,87326,0),(45089,87327,0),(45090,87328,0),(45091,87329,0),(45092,87330,0),(45093,87331,0),(45094,87332,0),(45095,87333,0),(45096,87334,0),(45097,87335,0),(45098,87336,0),(45099,87337,0),(45100,87338,0),(45101,87339,0),(45102,87340,0),(45103,87341,0),(45104,87342,0),(45105,87343,0),(45106,87344,0),(45107,87345,0),(45108,87346,0),(45109,87347,0),(45110,87348,0),(45111,87349,0),(45112,87350,0),(45113,87351,0),(45114,87352,0),(45115,87353,0),(45116,87354,0),(45117,87355,0),(45118,87361,0),(45119,87362,0),(45120,87363,0),(45121,87364,0),(45122,87365,0),(45123,87366,0),(45124,87367,0),(45125,87368,0),(45126,87369,0),(45127,87370,0),(45128,87371,0),(45129,87372,0),(45130,87373,0),(45131,87374,0),(45132,87375,0),(45133,87376,0),(45134,87377,0),(45135,87378,0),(45136,87379,0),(45137,87380,0),(45138,87381,0),(45139,87382,0),(45140,87383,0),(45141,87384,0),(45142,87385,0),(45143,87386,0),(45144,87387,0),(45145,87395,0),(45146,87396,0),(45147,87397,0),(45148,87398,0),(45149,87402,0),(45150,87403,0),(45151,87404,0),(45152,87405,0),(45153,87406,0),(45154,87407,0),(45155,87417,0),(45156,87418,0),(45157,87419,0),(45158,87420,0),(45159,87421,0),(45160,87422,0),(45161,87423,0),(45162,87424,0),(45163,87425,0),(45164,87426,0),(45165,87427,0),(45166,87428,0),(45167,87429,0),(45168,87430,0),(45169,87431,0),(45170,87432,0),(45171,87433,0),(45172,87434,0),(45173,87435,0),(45174,87436,0),(45175,87443,0),(45176,87444,0),(45177,87445,0),(45178,87446,0),(45179,87447,0),(45180,87448,0),(45181,87449,0),(45182,87450,0),(45183,87451,0),(45184,87452,0),(45185,87453,0),(45186,87454,0),(45187,87455,0),(45188,87456,0),(45189,87457,0),(45190,87458,0),(45191,87459,0),(45192,87460,0),(45193,87461,0),(45194,87462,0),(45195,87463,0),(45196,87464,0),(45197,87465,0),(45198,87466,0),(45199,87467,0),(45200,87474,0),(45201,87475,0),(45202,87476,0),(45203,87477,0),(45204,87478,0),(45205,87484,0),(45206,87485,0),(45207,87486,0),(45208,87487,0),(45209,87488,0),(45210,87489,0),(45211,87490,0),(45212,87491,0),(45213,87492,0),(45214,87493,0),(45215,87494,0),(45216,87501,0),(45217,87502,0),(45218,87503,0),(45219,87504,0),(45220,87505,0),(45221,87506,0),(45222,87507,0),(45223,87508,0),(45224,87509,0),(45225,87510,0),(45226,87511,0),(45227,87512,0),(45228,87513,0),(45229,87514,0),(45230,87515,0),(45231,87516,0),(45232,87517,0),(45233,87518,0),(45234,87519,0),(45235,87520,0),(45236,87521,0),(45237,87522,0),(45238,87523,0),(45239,87525,0),(45240,87531,0),(45241,87532,0),(45242,87542,0),(45243,87543,0),(45244,87544,0),(45245,87545,0),(45246,87546,0),(45247,87547,0),(45248,87561,0),(45249,87562,0),(45250,87565,0),(45251,87566,0),(45252,87569,0),(45253,87570,0),(45254,87586,0),(45255,87587,0),(45256,87588,0),(45257,87589,0),(45258,87590,0),(45259,87591,0),(45260,87592,0),(45261,87593,0),(45262,87594,0),(45263,87595,0),(45264,87596,0),(45265,87597,0),(45266,87598,0),(45267,87599,0),(45268,87600,0),(45269,87601,0),(45270,87602,0),(45271,87603,0),(45272,87604,0),(45273,87605,0),(45274,87606,0),(45275,87607,0),(45276,87608,0),(45277,87609,0),(45278,87610,0),(45279,87611,0),(45280,87612,0),(45281,87613,0),(45282,87614,0),(45283,87615,0),(45284,87616,0),(45285,87617,0),(45286,87618,0),(45287,87619,0),(45288,87620,0),(45289,87621,0),(45290,87627,0),(45291,87628,0),(45292,87629,0),(45293,87630,0),(45294,87631,0),(45295,87632,0),(45296,87633,0),(45297,87634,0),(45298,87635,0),(45299,87636,0),(45300,87637,0),(45301,87638,0),(45302,87639,0),(45303,87640,0),(45304,87641,0),(45305,87642,0),(45306,87643,0),(45307,87646,0),(45308,87649,0),(45309,87650,0),(45310,87651,0),(45311,87652,0),(45312,87695,0),(45313,87770,0),(45314,87772,0),(45315,87822,0),(45316,87823,0),(45317,87824,0),(45318,87825,0),(45319,87826,0),(45320,87827,0),(45321,87832,0),(45322,87833,0),(45323,87834,0),(45324,87835,0),(45325,87836,0),(45326,87837,0),(45327,87838,0),(45328,87839,0),(45329,87843,0),(45330,87844,0),(45331,87846,0),(45332,87848,0),(45333,87849,0),(45334,87850,0),(45335,87853,0),(45336,87854,0),(45337,87855,0),(45338,87856,0),(45339,87862,0),(45340,87864,0),(45341,87866,0),(45342,87911,0),(45343,87912,0),(45344,87913,0),(45345,87914,0),(45346,87915,0),(45347,87916,0),(45348,87917,0),(45349,87918,0),(45350,87919,0),(45351,87920,0),(45352,87921,0),(45353,87922,0),(45354,87923,0),(45355,87924,0),(45356,87925,0),(45357,87926,0),(45358,87927,0),(45359,87928,0),(45360,87929,0),(45361,87930,0),(45362,87931,0),(45363,87932,0),(45364,87933,0),(45365,87934,0),(45366,87935,0),(45367,87936,0),(45368,87937,0),(45369,87938,0),(45370,87939,0),(45371,87940,0),(45372,87941,0),(45373,87942,0),(45374,87943,0),(45375,87944,0),(45376,87945,0),(45377,87946,0),(45378,87947,0),(45379,87948,0),(45380,87949,0),(45381,87950,0),(45382,87951,0),(45383,87952,0),(45384,87953,0),(45385,87954,0),(45386,87955,0),(45387,87956,0),(45388,87957,0),(45389,87958,0),(45390,87959,0),(45391,87960,0),(45392,87961,0),(45393,87962,0),(45394,87963,0),(45395,87964,0),(45396,87965,0),(45397,87966,0),(45398,87967,0),(45399,87968,0),(45400,87969,0),(45401,87970,0),(45402,87971,0),(45403,87972,0),(45404,87973,0),(45405,87974,0),(45406,87975,0),(45407,87976,0),(45408,87977,0),(45409,87978,0),(45410,87979,0),(45411,87980,0),(45412,87981,0),(45413,87982,0),(45414,87983,0),(45415,87984,0),(45416,87985,0),(45417,87986,0),(45418,87987,0),(45419,87988,0),(45420,87989,0),(45421,87990,0),(45422,87991,0),(45423,87992,0),(45424,87993,0),(45425,87994,0),(45426,87995,0),(45427,87996,0),(45428,87998,0),(45429,87999,0),(45430,88000,0),(45431,88001,0),(45432,88004,0),(45433,88005,0),(45434,88006,0),(45435,88007,0),(45436,88010,0),(45437,88011,0),(45438,88012,0),(45439,88013,0),(45440,88014,0),(45441,88015,0),(45442,88016,0),(45443,88017,0),(45444,88018,0),(45445,88019,0),(45446,88020,0),(45447,88021,0),(45448,88022,0),(45449,88023,0),(45450,88024,0),(45451,88025,0),(45452,88026,0),(45453,88027,0),(45454,88028,0),(45455,88029,0),(45456,88030,0),(45457,88031,0),(45458,88032,0),(45459,88033,0),(45460,88034,0),(45461,88035,0),(45462,88036,0),(45463,88037,0),(45464,88038,0),(45465,88039,0),(45466,88040,0),(45467,88041,0),(45468,88042,0),(45469,88043,0),(45470,88044,0),(45471,88045,0),(45472,88046,0),(45473,88047,0),(45474,88048,0),(45475,88049,0),(45476,88050,0),(45477,88051,0),(45478,88052,0),(45479,88053,0),(45480,88054,0),(45481,88055,0),(45482,88056,0),(45483,88057,0),(45484,88058,0),(45485,88059,0),(45486,88060,0),(45487,88061,0),(45488,88062,0),(45489,88063,0),(45490,88064,0),(45491,88065,0),(45492,88066,0),(45493,88067,0),(45494,88068,0),(45495,88069,0),(45496,88070,0),(45497,88071,0),(45498,88072,0),(45499,88073,0),(45500,88074,0),(45501,88075,0),(45502,88076,0),(45503,88077,0),(45504,88078,0),(45505,88079,0),(45506,88080,0),(45507,88081,0),(45508,88082,0),(45509,88083,0),(45510,88084,0),(45511,88085,0),(45512,88086,0),(45513,88087,0),(45514,88088,0),(45515,88089,0),(45516,88090,0),(45517,88091,0),(45518,88092,0),(45519,88093,0),(45520,88094,0),(45521,88095,0),(45522,88096,0),(45523,88097,0),(45524,88098,0),(45525,88099,0),(45526,88100,0),(45527,88101,0),(45528,88102,0),(45529,88103,0),(45530,88104,0),(45531,88105,0),(45532,88106,0),(45533,88107,0),(45534,88108,0),(45535,88109,0),(45536,88110,0),(45537,88111,0),(45538,88112,0),(45539,88113,0),(45540,88114,0),(45541,88115,0),(45542,88116,0),(45543,88117,0),(45544,88118,0),(45545,88119,0),(45546,88120,0),(45547,88121,0),(45548,88122,0),(45549,88123,0),(45550,88124,0),(45551,88125,0),(45552,88126,0),(45553,88127,0),(45554,88128,0),(45555,88129,0),(45556,88130,0),(45557,88131,0),(45558,88132,0),(45559,88133,0),(45560,88134,0),(45561,88135,0),(45562,88136,0),(45563,88137,0),(45564,88138,0),(45565,88139,0),(45566,88140,0),(45567,88141,0),(45568,88142,0),(45569,88143,0),(45570,88144,0),(45571,88145,0),(45572,88146,0),(45573,88149,0),(45574,88150,0),(45575,88170,0),(45576,88171,0),(45577,88172,0),(45578,88173,0),(45579,88174,0),(45580,88175,0),(45581,88176,0),(45582,88177,0),(45583,88178,0),(45584,88179,0),(45585,88180,0),(45586,88181,0),(45587,88182,0),(45588,88183,0),(45589,88184,0),(45590,88185,0),(45591,88186,0),(45592,88187,0),(45593,88188,0),(45594,88189,0),(45595,88190,0),(45596,88191,0),(45597,88192,0),(45598,88193,0),(45599,88194,0),(45600,88195,0),(45601,88196,0),(45602,88197,0),(45603,88198,0),(45604,88199,0),(45605,88200,0),(45606,88201,0),(45607,88202,0),(45608,88203,0),(45609,88204,0),(45610,88205,0),(45611,88206,0),(45612,88207,0),(45613,88208,0),(45614,88209,0),(45615,88210,0),(45616,88211,0),(45617,88212,0),(45618,88213,0),(45619,88214,0),(45620,88215,0),(45621,88216,0),(45622,88217,0),(45623,88218,0),(45624,88219,0),(45625,88220,0),(45626,88221,0),(45627,88222,0),(45628,88223,0),(45629,88224,0),(45630,88225,0),(45631,88226,0),(45632,88227,0),(45633,88228,0),(45634,88229,0),(45635,88230,0),(45636,88231,0),(45637,88232,0),(45638,88233,0),(45639,88234,0),(45640,88235,0),(45641,88236,0),(45642,88237,0),(45643,88238,0),(45644,88239,0),(45645,88240,0),(45646,88241,0),(45647,88242,0),(45648,88243,0),(45649,88244,0),(45650,88245,0),(45651,88246,0),(45652,88247,0),(45653,88248,0),(45654,88249,0),(45655,88250,0),(45656,88251,0),(45657,88252,0),(45658,88253,0),(45659,88254,0),(45660,88255,0),(45661,88256,0),(45662,88257,0),(45663,88258,0),(45664,88259,0),(45665,88260,0),(45666,88263,0),(45667,88264,0),(45668,88266,0),(45669,88267,0),(45670,88268,0),(45671,88269,0),(45672,88270,0),(45673,88271,0),(45674,88272,0),(45675,88274,0),(45676,88276,0),(45677,88277,0),(45678,88278,0),(45679,88279,0),(45680,88280,0),(45681,88282,0),(45682,88283,0),(45683,88284,0),(45684,88286,0),(45685,88287,0),(45686,88288,0),(45687,88289,0),(45688,88290,0),(45689,88291,0),(45690,88292,0),(45691,88295,0),(45692,88296,0),(45693,88297,0),(45694,88298,0),(45695,88299,0),(45696,88301,0),(45697,88302,0),(45698,88303,0),(45699,88336,0),(45700,88337,0),(45701,88338,0),(45702,88339,0),(45703,88340,0),(45704,88341,0),(45705,88342,0),(45706,88343,0),(45707,88344,0),(45708,88345,0),(45709,88346,0),(45710,88347,0),(45711,88348,0),(45712,88349,0),(45713,88350,0),(45714,88351,0),(45715,88352,0),(45716,88353,0),(45717,88356,0),(45718,88357,0),(45719,88359,0),(45720,88361,0),(45721,88362,0),(45722,88389,0),(45723,88390,0),(45724,88391,0),(45725,88392,0),(45726,88393,0),(45727,88394,0),(45728,88395,0),(45729,88396,0),(45730,88399,0),(45731,88400,0),(45732,88401,0),(45733,88402,0),(45734,88403,0),(45735,88404,0),(45736,88405,0),(45737,88406,0),(45738,88407,0),(45739,88408,0),(45740,88409,0),(45741,88410,0),(45742,88411,0),(45743,88412,0),(45744,88413,0),(45745,88414,0),(45746,88418,0),(45747,88419,0),(45748,88420,0),(45749,88421,0),(45750,88422,0),(45751,88423,0),(45752,88424,0),(45753,88425,0),(45754,88426,0),(45755,88427,0),(45756,88428,0),(45757,88429,0),(45758,88430,0),(45759,88431,0),(45760,88432,0),(45761,88433,0),(45762,88435,0),(45763,88437,0),(45764,88438,0),(45765,88439,0),(45766,88440,0),(45767,88441,0),(45768,88442,0),(45769,88443,0),(45770,88444,0),(45771,88445,0),(45772,88446,0),(45773,88447,0),(45774,88448,0),(45775,88449,0),(45776,88450,0),(45777,88451,0),(45778,88452,0),(45779,88453,0),(45780,88454,0),(45781,88455,0),(45782,88456,0),(45783,88459,0),(45784,88460,0),(45785,88461,0),(45786,88462,0),(45787,88463,0),(45788,88464,0),(45789,88465,0),(45790,88466,0),(45791,88468,0),(45792,88469,0),(45793,88470,0),(45794,88471,0),(45795,88472,0),(45796,88473,0),(45797,88474,0),(45798,88475,0),(45799,88476,0),(45800,88477,0),(45801,88478,0),(45802,88479,0),(45803,88480,0),(45804,88481,0),(45805,88482,0),(45806,88483,0),(45807,88484,0),(45808,88485,0),(45809,88486,0),(45810,88488,0),(45811,88494,0),(45812,88495,0),(45813,88497,0),(45814,88498,0),(45815,88499,0),(45816,88500,0),(45817,88501,0),(45818,88502,0),(45819,88503,0),(45820,88504,0),(45821,88505,0),(45822,88507,0),(45823,88508,0),(45824,88509,0),(45825,88510,0),(45826,88511,0),(45827,88512,0),(45828,88513,0),(45829,88514,0),(45830,88515,0),(45831,88516,0),(45832,88517,0),(45833,88518,0),(45834,88519,0),(45835,88520,0),(45836,88521,0),(45837,88522,0),(45838,88523,0),(45839,88524,0),(45840,88525,0),(45841,88526,0),(45842,88527,0),(45843,88528,0),(45844,88533,0),(45845,88535,0),(45846,88536,0),(45847,88537,0),(45848,88542,0),(45849,88543,0),(45850,88544,0),(45851,88545,0),(45852,88548,0),(45853,88549,0),(45854,88550,0),(45855,88551,0),(45856,88553,0),(45857,88554,0),(45858,88555,0),(45859,88556,0),(45860,88557,0),(45861,88558,0),(45862,88559,0),(45863,88568,0),(45864,88569,0),(45865,88570,0),(45866,88571,0),(45867,88572,0),(45868,88573,0),(45869,88574,0),(45870,88575,0),(45871,88591,0),(45872,88592,0),(45873,88593,0),(45874,88594,0),(45875,88595,0),(45876,88596,0),(45877,88597,0),(45878,88598,0),(45879,88599,0),(45880,88600,0),(45881,88601,0),(45882,88602,0),(45883,88603,0),(45884,88605,0),(45885,88606,0),(45886,88607,0),(45887,88608,0),(45888,88609,0),(45889,88610,0),(45890,88611,0),(45891,88612,0),(45892,88613,0),(45893,88614,0),(45894,88615,0),(45895,88616,0),(45896,88617,0),(45897,88618,0),(45898,88619,0),(45899,88620,0),(45900,88621,0),(45901,88622,0),(45902,88623,0),(45903,88624,0),(45904,88625,0),(45905,88626,0),(45906,88627,0),(45907,88628,0),(45908,88629,0),(45909,88630,0),(45910,88632,0),(45911,88633,0),(45912,88648,0),(45913,88649,0),(45914,88651,0),(45915,88652,0),(45916,88653,0),(45917,88654,0),(45918,88655,0),(45919,88656,0),(45920,88657,0),(45921,88658,0),(45922,88659,0),(45923,88660,0),(45924,88661,0),(45925,88662,0),(45926,88663,0),(45927,88664,0),(45928,88665,0),(45929,88666,0),(45930,88668,0),(45931,88682,0),(45932,88683,0),(45933,88684,0),(45934,88685,0),(45935,88686,0),(45936,88687,0),(45937,88688,0),(45938,88690,0),(45939,88691,0),(45940,88692,0),(45941,88693,0),(45942,88694,0),(45943,88695,0),(45944,88696,0),(45945,88697,0),(45946,88698,0),(45947,88699,0),(45948,88700,0),(45949,88701,0),(45950,88702,0),(45951,88703,0),(45952,88709,0),(45953,88710,0),(45954,88711,0),(45955,88712,0),(45956,88723,0),(45957,88724,0),(45958,88725,0),(45959,88726,0),(45960,88727,0),(45961,88728,0),(45962,88729,0),(45963,88730,0),(45964,88731,0),(45965,88732,0),(45966,88733,0),(45967,88734,0),(45968,88735,0),(45969,88736,0),(45970,88737,0),(45971,88738,0),(45972,88739,0),(45973,88740,0),(45974,88741,0),(45975,88742,0),(45976,88743,0),(45977,88744,0),(45978,88745,0),(45979,88746,0),(45980,88747,0),(45981,88748,0),(45982,88749,0),(45983,88750,0),(45984,88751,0),(45985,88752,0),(45986,88763,0),(45987,88764,0),(45988,88765,0),(45989,88766,0),(45990,88767,0),(45991,88768,0),(45992,88769,0),(45993,88770,0),(45994,88771,0),(45995,88772,0),(45996,88773,0),(45997,88774,0),(45998,88775,0),(45999,88776,0),(46000,88777,0),(46001,88778,0),(46002,88779,0),(46003,88780,0),(46004,88781,0),(46005,88782,0),(46006,88783,0),(46007,88784,0),(46008,88785,0),(46009,88786,0),(46010,88787,0),(46011,88788,0),(46012,88789,0),(46013,88790,0),(46014,88791,0),(46015,88792,0),(46016,88793,0),(46017,88794,0),(46018,88797,0),(46019,88798,0),(46020,88799,0),(46021,88800,0),(46022,88804,0),(46023,88805,0),(46024,88809,0),(46025,88810,0),(46026,88811,0),(46027,88812,0),(46028,88813,0),(46029,88814,0),(46030,88815,0),(46031,88816,0),(46032,88817,0),(46033,88818,0),(46034,88819,0),(46035,88820,0),(46036,88821,0),(46037,88822,0),(46038,88823,0),(46039,88824,0),(46040,88825,0),(46041,88826,0),(46042,88827,0),(46043,88828,0),(46044,88829,0),(46045,88830,0),(46046,88831,0),(46047,88832,0),(46048,88833,0),(46049,88834,0),(46050,88835,0),(46051,88836,0),(46052,88837,0),(46053,88840,0),(46054,88841,0),(46055,88842,0),(46056,88843,0),(46057,88844,0),(46058,88845,0),(46059,88846,0),(46060,88847,0),(46061,88848,0),(46062,88849,0),(46063,88850,0),(46064,88856,0),(46065,88857,0),(46066,88862,0),(46067,88864,0),(46068,88865,0),(46069,88866,0),(46070,88867,0),(46071,88868,0),(46072,88876,0),(46073,88877,0),(46074,88878,0),(46075,88879,0),(46076,88880,0),(46077,88881,0),(46078,88882,0),(46079,88883,0),(46080,88884,0),(46081,88885,0),(46082,88886,0),(46083,88887,0),(46084,88889,0),(46085,88890,0),(46086,88892,0),(46087,88893,0),(46088,88896,0),(46089,88897,0),(46090,88898,0),(46091,88999,0),(46092,89000,0),(46093,89001,0),(46094,89002,0),(46095,89003,0),(46096,89004,0),(46097,89005,0),(46098,89006,0),(46099,89007,0),(46100,89009,0),(46101,89010,0),(46102,89011,0),(46103,89012,0),(46104,89013,0),(46105,89014,0),(46106,89015,0),(46107,89016,0),(46108,89017,0),(46109,89019,0),(46110,89020,0),(46111,89021,0),(46112,89022,0),(46113,89023,0),(46114,89024,0),(46115,89025,0),(46116,89026,0),(46117,89027,0),(46118,89028,0),(46119,89029,0),(46120,89030,0),(46121,89031,0),(46122,89032,0),(46123,89033,0),(46124,89034,0),(46125,89035,0),(46126,89036,0),(46127,89037,0),(46128,89038,0),(46129,89039,0),(46130,89040,0),(46131,89041,0),(46132,89042,0),(46133,89043,0),(46134,89044,0),(46135,89045,0),(46136,89046,0),(46137,89047,0),(46138,89048,0),(46139,89049,0),(46140,89050,0),(46141,89051,0),(46142,89055,0),(46143,89056,0),(46144,89057,0),(46145,89058,0),(46146,89059,0),(46147,89060,0),(46148,89061,0),(46149,89062,0),(46150,89063,0),(46151,89074,0),(46152,89075,0),(46153,89076,0),(46154,89077,0),(46155,89078,0),(46156,89087,0),(46157,89088,0),(46158,89089,0),(46159,89090,0),(46160,89091,0),(46161,89092,0),(46162,89093,0),(46163,89094,0),(46164,89095,0),(46165,89096,0),(46166,89102,0),(46167,89103,0),(46168,89104,0),(46169,89105,0),(46170,89108,0),(46171,89109,0),(46172,89115,0),(46173,89116,0),(46174,89117,0),(46175,89118,0),(46176,89119,0),(46177,89120,0),(46178,89121,0),(46179,89122,0),(46180,89126,0),(46181,89127,0),(46182,89128,0),(46183,89129,0),(46184,89130,0),(46185,89131,0),(46186,89132,0),(46187,89133,0),(46188,89135,0),(46189,89136,0),(46190,89137,0),(46191,89138,0),(46192,89144,0),(46193,89147,0),(46194,89148,0),(46195,89149,0),(46196,89150,0),(46197,89151,0),(46198,89152,0),(46199,89153,0),(46200,89156,0),(46201,89157,0),(46202,89158,0),(46203,89159,0),(46204,89160,0),(46205,89161,0),(46206,89190,0),(46207,89191,0),(46208,89192,0),(46209,89193,0),(46210,89194,0),(46211,89195,0),(46212,89196,0),(46213,89216,0),(46214,89221,0),(46215,89226,0),(46216,89228,0),(46217,89229,0),(46218,89279,0),(46219,89280,0),(46220,89282,0),(46221,89285,0),(46222,89286,0),(46223,89291,0),(46224,89294,0),(46225,89295,0),(46226,89296,0),(46227,89298,0),(46228,89299,0),(46229,89300,0),(46230,89308,0),(46231,89309,0),(46232,89310,0),(46233,89311,0),(46234,89312,0),(46235,89313,0),(46236,89314,0),(46237,89315,0),(46238,89316,0),(46239,89318,0),(46240,89319,0),(46241,89320,0),(46242,89321,0),(46243,89322,0),(46244,89323,0),(46245,89324,0),(46246,89325,0),(46247,89327,0),(46248,89330,0),(46249,89331,0),(46250,89332,0),(46251,89333,0),(46252,89334,0),(46253,89335,0),(46254,89336,0),(46255,89337,0),(46256,89338,0),(46257,89339,0),(46258,89340,0),(46259,89341,0),(46260,89342,0),(46261,89343,0),(46262,89344,0),(46263,89345,0),(46264,89346,0),(46265,89347,0),(46266,89348,0),(46267,89349,0),(46268,89350,0),(46269,89351,0),(46270,89364,0),(46271,89374,0),(46272,89375,0),(46273,89376,0),(46274,89377,0),(46275,89378,0),(46276,89379,0),(46277,89380,0),(46278,89381,0),(46279,89382,0),(46280,89383,0),(46281,89384,0),(46282,89385,0),(46283,89386,0),(46284,89387,0),(46285,89388,0),(46286,89389,0),(46287,89392,0),(46288,89393,0),(46289,89394,0),(46290,89395,0),(46291,89396,0),(46292,89397,0),(46293,89398,0),(46294,89399,0),(46295,89400,0),(46296,89401,0),(46297,89402,0),(46298,89403,0),(46299,89404,0),(46300,89405,0),(46301,89406,0),(46302,89407,0),(46303,89408,0),(46304,89409,0),(46305,89410,0),(46306,89411,0),(46307,89412,0),(46308,89413,0),(46309,89414,0),(46310,89415,0),(46311,89416,0),(46312,89417,0),(46313,89418,0),(46314,89419,0),(46315,89420,0),(46316,89421,0),(46317,89423,0),(46318,89424,0),(46319,89425,0),(46320,89426,0),(46321,89429,0),(46322,89430,0),(46323,89431,0),(46324,89432,0),(46325,89433,0),(46326,89434,0),(46327,89435,0),(46328,89437,0),(46329,89438,0),(46330,89439,0),(46331,89440,0),(46332,89441,0),(46333,89442,0),(46334,89443,0),(46335,89444,0),(46336,89445,0),(46337,89446,0),(46338,89447,0),(46339,89448,0),(46340,89449,0),(46341,89450,0),(46342,89451,0),(46343,89452,0),(46344,89453,0),(46345,89454,0),(46346,89455,0),(46347,89456,0),(46348,89457,0),(46349,89458,0),(46350,89459,0),(46351,89460,0),(46352,89461,0),(46353,89462,0),(46354,89463,0),(46355,89464,0),(46356,89465,0),(46357,89466,0),(46358,89467,0),(46359,89468,0),(46360,89469,0),(46361,89470,0),(46362,89471,0),(46363,89472,0),(46364,89473,0),(46365,89474,0),(46366,89475,0),(46367,89476,0),(46368,89477,0),(46369,89478,0),(46370,89479,0),(46371,89480,0),(46372,89481,0),(46373,89482,0),(46374,89483,0),(46375,89484,0),(46376,89485,0),(46377,89486,0),(46378,89487,0),(46379,89488,0),(46380,89489,0),(46381,89490,0),(46382,89491,0),(46383,89492,0),(46384,89493,0),(46385,89494,0),(46386,89495,0),(46387,89496,0),(46388,89497,0),(46389,89498,0),(46390,89499,0),(46391,89500,0),(46392,89501,0),(46393,89502,0),(46394,89503,0),(46395,89514,0),(46396,89515,0),(46397,89516,0),(46398,89517,0),(46399,89518,0),(46400,89519,0),(46401,89520,0),(46402,89521,0),(46403,89532,0),(46404,89533,0),(46405,89534,0),(46406,89535,0),(46407,89536,0),(46408,89537,0),(46409,89538,0),(46410,89539,0),(46411,89540,0),(46412,89541,0),(46413,89542,0),(46414,89543,0),(46415,89544,0),(46416,89545,0),(46417,89546,0),(46418,89548,0),(46419,89549,0),(46420,89550,0),(46421,89551,0),(46422,89552,0),(46423,89553,0),(46424,89554,0),(46425,89555,0),(46426,89556,0),(46427,89557,0),(46428,89558,0),(46429,89559,0),(46430,89560,0),(46431,89561,0),(46432,89562,0),(46433,89563,0),(46434,89564,0),(46435,89565,0),(46436,89566,0),(46437,89567,0),(46438,89568,0),(46439,89569,0),(46440,89570,0),(46441,89571,0),(46442,89572,0),(46443,89573,0),(46444,89574,0),(46445,89575,0),(46446,89576,0),(46447,89577,0),(46448,89578,0),(46449,89579,0),(46450,89580,0),(46451,89581,0),(46452,89582,0),(46453,89583,0),(46454,89584,0),(46455,89585,0),(46456,89586,0),(46457,89606,0),(46458,89630,0),(46459,89632,0),(46460,89633,0),(46461,89634,0),(46462,89635,0),(46463,89642,0),(46464,89643,0),(46465,89644,0),(46466,89645,0),(46467,89646,0),(46468,89647,0),(46469,89648,0),(46470,89649,0),(46471,89650,0),(46472,89651,0),(46473,89652,0),(46474,89653,0),(46475,89654,0),(46476,89655,0),(46477,89656,0),(46478,89657,0),(46479,89658,0),(46480,89659,0),(46481,89660,0),(46482,89661,0),(46483,89662,0),(46484,89663,0),(46485,89664,0),(46486,89665,0),(46487,89666,0),(46488,89667,0),(46489,89668,0),(46490,89669,0),(46491,89670,0),(46492,89671,0),(46493,89672,0),(46494,89673,0),(46495,89684,0),(46496,89685,0),(46497,89687,0),(46498,89688,0),(46499,89689,0),(46500,89690,0),(46501,89691,0),(46502,89692,0),(46503,89693,0),(46504,89694,0),(46505,89695,0),(46506,89696,0),(46507,89698,0),(46508,89699,0),(46509,89700,0),(46510,89701,0),(46511,89702,0),(46512,89703,0),(46513,89704,0),(46514,89705,0),(46515,89706,0),(46516,89707,0),(46517,89708,0),(46518,89709,0),(46519,89710,0),(46520,89711,0),(46521,89712,0),(46522,89713,0),(46523,89714,0),(46524,89715,0),(46525,89716,0),(46526,89718,0),(46527,89719,0),(46528,89720,0),(46529,89721,0),(46530,89723,0),(46531,89724,0),(46532,89725,0),(46533,89726,0),(46534,89727,0),(46535,89728,0),(46536,89729,0),(46537,89730,0),(46538,89731,0),(46539,89732,0),(46540,89733,0),(46541,89734,0),(46542,89735,0),(46543,89741,0),(46544,89742,0),(46545,89743,0),(46546,89744,0),(46547,89745,0),(46548,89748,0),(46549,89749,0),(46550,89750,0),(46551,89751,0),(46552,89752,0),(46553,89753,0),(46554,89754,0),(46555,89755,0),(46556,89756,0),(46557,89757,0),(46558,89758,0),(46559,89759,0),(46560,89760,0),(46561,89761,0),(46562,89762,0),(46563,89763,0),(46564,89764,0),(46565,89765,0),(46566,89766,0),(46567,89767,0),(46568,89768,0),(46569,89774,0),(46570,89775,0),(46571,89776,0),(46572,89777,0),(46573,89778,0),(46574,89779,0),(46575,89780,0),(46576,89781,0),(46577,89784,0),(46578,89787,0),(46579,89788,0),(46580,89789,0),(46581,89790,0),(46582,89791,0),(46583,89792,0),(46584,89793,0),(46585,89794,0),(46586,89795,0),(46587,89796,0),(46588,89797,0),(46589,89798,0),(46590,89799,0),(46591,89800,0),(46592,89801,0),(46593,89805,0),(46594,89806,0),(46595,89809,0),(46596,89811,0),(46597,89816,0),(46598,89817,0),(46599,89818,0),(46600,89819,0),(46601,89820,0),(46602,89821,0),(46603,89822,0),(46604,89823,0),(46605,89825,0),(46606,89826,0),(46607,89828,0),(46608,89829,0),(46609,89830,0),(46610,89831,0),(46611,89832,0),(46612,89833,0),(46613,89834,0),(46614,89835,0),(46615,89836,0),(46616,89837,0),(46617,89839,0),(46618,89841,0),(46619,89842,0),(46620,89843,0),(46621,89861,0),(46622,89862,0),(46623,89863,0),(46624,89864,0),(46625,89870,0),(46626,89871,0),(46627,89872,0),(46628,89874,0),(46629,89875,0),(46630,89876,0),(46631,89877,0),(46632,89883,0),(46633,89884,0),(46634,89885,0),(46635,89886,0),(46636,89887,0),(46637,89894,0),(46638,89895,0),(46639,89896,0),(46640,89897,0),(46641,89898,0),(46642,89899,0),(46643,89900,0),(46644,89901,0),(46645,89908,0),(46646,89909,0),(46647,89910,0),(46648,89916,0),(46649,89918,0),(46650,89919,0),(46651,89920,0),(46652,89921,0),(46653,89922,0),(46654,89923,0),(46655,89924,0),(46656,89925,0),(46657,89926,0),(46658,89927,0),(46659,89928,0),(46660,89929,0),(46661,89930,0),(46662,89931,0),(46663,89934,0),(46664,89935,0),(46665,89936,0),(46666,89938,0),(46667,89939,0),(46668,89940,0),(46669,89941,0),(46670,89942,0),(46671,89943,0),(46672,89944,0),(46673,89945,0),(46674,89946,0),(46675,89947,0),(46676,89948,0),(46677,89949,0),(46678,89950,0),(46679,89951,0),(46680,89953,0),(46681,89954,0),(46682,89955,0),(46683,89956,0),(46684,89957,0),(46685,89958,0),(46686,89959,0),(46687,89960,0),(46688,89961,0),(46689,89962,0),(46690,89963,0),(46691,89964,0),(46692,89965,0),(46693,89966,0),(46694,89969,0),(46695,89970,0),(46696,89971,0),(46697,89973,0),(46698,89974,0),(46699,89975,0),(46700,89976,0),(46701,89977,0),(46702,89978,0),(46703,89979,0),(46704,89980,0),(46705,89981,0),(46706,89982,0),(46707,89983,0),(46708,89984,0),(46709,89985,0),(46710,89986,0),(46711,89987,0),(46712,89988,0),(46713,89989,0),(46714,90001,0),(46715,90002,0),(46716,90003,0),(46717,90007,0),(46718,90008,0),(46719,90009,0),(46720,90010,0),(46721,90011,0),(46722,90012,0),(46723,90013,0),(46724,90014,0),(46725,90015,0),(46726,90016,0),(46727,90017,0),(46728,90018,0),(46729,90019,0),(46730,90020,0),(46731,90021,0),(46732,90022,0),(46733,90023,0),(46734,90024,0),(46735,90025,0),(46736,90026,0),(46737,90027,0),(46738,90028,0),(46739,90029,0),(46740,90030,0),(46741,90031,0),(46742,90032,0),(46743,90033,0),(46744,90034,0),(46745,90035,0),(46746,90036,0),(46747,90037,0),(46748,90038,0),(46749,90042,0),(46750,90049,0),(46751,90050,0),(46752,90051,0),(46753,90052,0),(46754,90053,0),(46755,90054,0),(46756,90055,0),(46757,90056,0),(46758,90059,0),(46759,90060,0),(46760,90061,0),(46761,90062,0),(46762,90063,0),(46763,90064,0),(46764,90065,0),(46765,90066,0),(46766,90068,0),(46767,90069,0),(46768,90070,0),(46769,90071,0),(46770,90072,0),(46771,90073,0),(46772,90074,0),(46773,90075,0),(46774,90076,0),(46775,90077,0),(46776,90079,0),(46777,90080,0),(46778,90081,0),(46779,90082,0),(46780,90083,0),(46781,90084,0),(46782,90085,0),(46783,90086,0),(46784,90087,0),(46785,90088,0),(46786,90089,0),(46787,90090,0),(46788,90091,0),(46789,90092,0),(46790,90093,0),(46791,90094,0),(46792,90095,0),(46793,90096,0),(46794,90097,0),(46795,90098,0),(46796,90099,0),(46797,90100,0),(46798,90101,0),(46799,90102,0),(46800,90103,0),(46801,90104,0),(46802,90105,0),(46803,90106,0),(46804,90107,0),(46805,90108,0),(46806,90109,0),(46807,90110,0),(46808,90111,0),(46809,90112,0),(46810,90113,0),(46811,90114,0),(46812,90115,0),(46813,90116,0),(46814,90117,0),(46815,90118,0),(46816,90119,0),(46817,90120,0),(46818,90121,0),(46819,90122,0),(46820,90123,0),(46821,90124,0),(46822,90125,0),(46823,90126,0),(46824,90127,0),(46825,90128,0),(46826,90129,0),(46827,90130,0),(46828,90131,0),(46829,90132,0),(46830,90133,0),(46831,90134,0),(46832,90136,0),(46833,90137,0),(46834,90138,0),(46835,90139,0),(46836,90140,0),(46837,90141,0),(46838,90142,0),(46839,90143,0),(46840,90144,0),(46841,90145,0),(46842,90147,0),(46843,90148,0),(46844,90149,0),(46845,90150,0),(46846,90151,0),(46847,90152,0),(46848,90153,0),(46849,90154,0),(46850,90176,0),(46851,90188,0),(46852,90189,0),(46853,90190,0),(46854,90191,0),(46855,90192,0),(46856,90193,0),(46857,90194,0),(46858,90195,0),(46859,90196,0),(46860,90197,0),(46861,90198,0),(46862,90199,0),(46863,90201,0),(46864,90202,0),(46865,90250,0),(46866,90261,0),(46867,90273,0),(46868,90285,0),(46869,90286,0),(46870,90287,0),(46871,90288,0),(46872,90289,0),(46873,90290,0),(46874,90292,0),(46875,90293,0),(46876,90294,0),(46877,90295,0),(46878,90296,0),(46879,90297,0),(46880,90298,0),(46881,90299,0),(46882,90300,0),(46883,90301,0),(46884,90302,0),(46885,90303,0),(46886,90304,0),(46887,90305,0),(46888,90306,0),(46889,90307,0),(46890,90308,0),(46891,90309,0),(46892,90310,0),(46893,90311,0),(46894,90312,0),(46895,90313,0),(46896,90314,0),(46897,90315,0),(46898,90316,0),(46899,90317,0),(46900,90318,0),(46901,90319,0),(46902,90320,0),(46903,90321,0),(46904,90322,0),(46905,90323,0),(46906,90324,0),(46907,90325,0),(46908,90326,0),(46909,90327,0),(46910,90328,0),(46911,90329,0),(46912,90330,0),(46913,90331,0),(46914,90332,0),(46915,90333,0),(46916,90334,0),(46917,90335,0),(46918,90336,0),(46919,90337,0),(46920,90338,0),(46921,90339,0),(46922,90340,0),(46923,90341,0),(46924,90342,0),(46925,90343,0),(46926,90344,0),(46927,90345,0),(46928,90346,0),(46929,90347,0),(46930,90348,0),(46931,90349,0),(46932,90350,0),(46933,90351,0),(46934,90352,0),(46935,90353,0),(46936,90354,0),(46937,90355,0),(46938,90356,0),(46939,90357,0),(46940,90358,0),(46941,90359,0),(46942,90360,0),(46943,90361,0),(46944,90362,0),(46945,90363,0),(46946,90364,0),(46947,90365,0),(46948,90366,0),(46949,90367,0),(46950,90368,0),(46951,90369,0),(46952,90370,0),(46953,90371,0),(46954,90372,0),(46955,90373,0),(46956,90374,0),(46957,90375,0),(46958,90376,0),(46959,90377,0),(46960,90378,0),(46961,90379,0),(46962,90380,0),(46963,90381,0),(46964,90382,0),(46965,90383,0),(46966,90384,0),(46967,90385,0),(46968,90386,0),(46969,90387,0),(46970,90388,0),(46971,90389,0),(46972,90402,0),(46973,90403,0),(46974,90404,0),(46975,90405,0),(46976,90408,0),(46977,90409,0),(46978,90410,0),(46979,90411,0),(46980,90412,0),(46981,90413,0),(46982,90414,0),(46983,90415,0),(46984,90416,0),(46985,90417,0),(46986,90418,0),(46987,90419,0),(46988,90420,0),(46989,90421,0),(46990,90422,0),(46991,90423,0),(46992,90424,0),(46993,90425,0),(46994,90439,0),(46995,90440,0),(46996,90441,0),(46997,90442,0),(46998,90443,0),(46999,90444,0),(47000,90445,0),(47001,90446,0),(47002,90447,0),(47003,90448,0),(47004,90449,0),(47005,90450,0),(47006,90451,0),(47007,90452,0),(47008,90453,0),(47009,90454,0),(47010,90455,0),(47011,90456,0),(47012,90459,0),(47013,90460,0),(47014,90461,0),(47015,90462,0),(47016,90463,0),(47017,90464,0),(47018,90465,0),(47019,90466,0),(47020,90467,0),(47021,90468,0),(47022,90472,0),(47023,90473,0),(47024,90474,0),(47025,90475,0),(47026,90476,0),(47027,90477,0),(47028,90478,0),(47029,90479,0),(47030,90480,0),(47031,90481,0),(47032,90482,0),(47033,90483,0),(47034,90484,0),(47035,90485,0),(47036,90486,0),(47037,90487,0),(47038,90488,0),(47039,90489,0),(47040,90490,0),(47041,90491,0),(47042,90492,0),(47043,90493,0),(47044,90494,0),(47045,90495,0),(47046,90496,0),(47047,90497,0),(47048,90504,0),(47049,90505,0),(47050,90506,0),(47051,90507,0),(47052,90510,0),(47053,90512,0),(47054,90513,0),(47055,90514,0),(47056,90515,0),(47057,90516,0),(47058,90518,0),(47059,90519,0),(47060,90520,0),(47061,90521,0),(47062,90524,0),(47063,90526,0),(47064,90527,0),(47065,90528,0),(47066,90529,0),(47067,90530,0),(47068,90533,0),(47069,90534,0),(47070,90535,0),(47071,90536,0),(47072,90542,0),(47073,90545,0),(47074,90546,0),(47075,90547,0),(47076,90549,0),(47077,90570,0),(47078,90571,0),(47079,90572,0),(47080,90573,0),(47081,90574,0),(47082,90575,0),(47083,90576,0),(47084,90577,0),(47085,90578,0),(47086,90579,0),(47087,90580,0),(47088,90585,0),(47089,90586,0),(47090,90587,0),(47091,90588,0),(47092,90589,0),(47093,90597,0),(47094,90598,0),(47095,90599,0),(47096,90600,0),(47097,90601,0),(47098,90602,0),(47099,90603,0),(47100,90604,0),(47101,90605,0),(47102,90606,0),(47103,90607,0),(47104,90608,0),(47105,90609,0),(47106,90610,0),(47107,90611,0),(47108,90612,0),(47109,90613,0),(47110,90663,0),(47111,90666,0),(47112,90668,0),(47113,90669,0),(47114,90671,0),(47115,90672,0),(47116,90673,0),(47117,90674,0),(47118,90675,0),(47119,90677,0),(47120,90678,0),(47121,90679,0),(47122,90680,0),(47123,90682,0),(47124,90683,0),(47125,90685,0),(47126,90686,0),(47127,90688,0),(47128,90691,0),(47129,90693,0),(47130,90694,0),(47131,90698,0),(47132,90699,0),(47133,90701,0),(47134,90703,0),(47135,90704,0),(47136,90705,0),(47137,90717,0),(47138,90718,0),(47139,90719,0),(47140,90720,0),(47141,90721,0),(47142,90722,0),(47143,90723,0),(47144,90724,0),(47145,90725,0),(47146,90730,0),(47147,90733,0),(47148,90736,0),(47149,90737,0),(47150,90738,0),(47151,90739,0),(47152,90740,0),(47153,90741,0),(47154,90742,0),(47155,90743,0),(47156,90744,0),(47157,90745,0),(47158,90746,0),(47159,90747,0),(47160,90748,0),(47161,90749,0),(47162,90750,0),(47163,90751,0),(47164,90752,0),(47165,90753,0),(47166,90754,0),(47167,90755,0),(47168,90756,0),(47169,90757,0),(47170,90758,0),(47171,90759,0),(47172,90760,0),(47173,90761,0),(47174,90762,0),(47175,90763,0),(47176,90764,0),(47177,90765,0),(47178,90766,0),(47179,90767,0),(47180,90768,0),(47181,90769,0),(47182,90770,0),(47183,90771,0),(47184,90772,0),(47185,90773,0),(47186,90774,0),(47187,90775,0),(47188,90776,0),(47189,90777,0),(47190,90778,0),(47191,90779,0),(47192,90780,0),(47193,90781,0),(47194,90782,0),(47195,90783,0),(47196,90784,0),(47197,90785,0),(47198,90786,0),(47199,90787,0),(47200,90788,0),(47201,90789,0),(47202,90790,0),(47203,90791,0),(47204,90792,0),(47205,90793,0),(47206,90794,0),(47207,90795,0),(47208,90796,0),(47209,90797,0),(47210,90798,0),(47211,90799,0),(47212,90800,0),(47213,90801,0),(47214,90802,0),(47215,90803,0),(47216,90804,0),(47217,90805,0),(47218,90806,0),(47219,90807,0),(47220,90808,0),(47221,90809,0),(47222,90810,0),(47223,90811,0),(47224,90812,0),(47225,90813,0),(47226,90814,0),(47227,90819,0),(47228,90844,0),(47229,90845,0),(47230,90846,0),(47231,90847,0),(47232,90848,0),(47233,90849,0),(47234,90850,0),(47235,90851,0),(47236,90852,0),(47237,90853,0),(47238,90854,0),(47239,90855,0),(47240,90856,0),(47241,90857,0),(47242,90864,0),(47243,90865,0),(47244,90866,0),(47245,90867,0),(47246,90870,0),(47247,90871,0),(47248,90872,0),(47249,90873,0),(47250,90874,0),(47251,90875,0),(47252,90876,0),(47253,90877,0),(47254,90878,0),(47255,90879,0),(47256,90880,0),(47257,90881,0),(47258,90882,0),(47259,90891,0),(47260,90893,0),(47261,90894,0),(47262,90895,0),(47263,90896,0),(47264,90906,0),(47265,90907,0),(47266,90908,0),(47267,90909,0),(47268,90910,0),(47269,90911,0),(47270,90912,0),(47271,90913,0),(47272,90914,0),(47273,90927,0),(47274,90928,0),(47275,90929,0),(47276,90930,0),(47277,90931,0),(47278,90932,0),(47279,90933,0),(47280,90934,0),(47281,90935,0),(47282,90936,0),(47283,90937,0),(47284,90938,0),(47285,90939,0),(47286,90940,0),(47287,90941,0),(47288,90942,0),(47289,90943,0),(47290,90944,0),(47291,90945,0),(47292,90946,0),(47293,90947,0),(47294,90948,0),(47295,90949,0),(47296,90950,0),(47297,90951,0),(47298,90952,0),(47299,90954,0),(47300,90955,0),(47301,90956,0),(47302,90957,0),(47303,90958,0),(47304,90959,0),(47305,90960,0),(47306,90961,0),(47307,90962,0),(47308,90963,0),(47309,90964,0),(47310,90965,0),(47311,90966,0),(47312,90967,0),(47313,90968,0),(47314,90969,0),(47315,90970,0),(47316,90971,0),(47317,90972,0),(47318,90973,0),(47319,90974,0),(47320,90975,0),(47321,90976,0),(47322,90977,0),(47323,90978,0),(47324,90979,0),(47325,90980,0),(47326,90981,0),(47327,90982,0),(47328,90983,0),(47329,90984,0),(47330,90985,0),(47331,90986,0),(47332,90987,0),(47333,90988,0),(47334,90989,0),(47335,90990,0),(47336,90991,0),(47337,90992,0),(47338,90993,0),(47339,90994,0),(47340,90995,0),(47341,90996,0),(47342,90997,0),(47343,90998,0),(47344,90999,0),(47345,91000,0),(47346,91001,0),(47347,91002,0),(47348,91017,0),(47349,91018,0),(47350,91019,0),(47351,91020,0),(47352,91021,0),(47353,91022,0),(47354,91023,0),(47355,91024,0),(47356,91032,0),(47357,91033,0),(47358,91034,0),(47359,91035,0),(47360,91036,0),(47361,91037,0),(47362,91038,0),(47363,91039,0),(47364,91047,0),(47365,91048,0),(47366,91049,0),(47367,91050,0),(47368,91051,0),(47369,91052,0),(47370,91053,0),(47371,91054,0),(47372,91055,0),(47373,91056,0),(47374,91057,0),(47375,91058,0),(47376,91061,0),(47377,91062,0),(47378,91065,0),(47379,91066,0),(47380,91067,0),(47381,91068,0),(47382,91069,0),(47383,91070,0),(47384,91071,0),(47385,91072,0),(47386,91073,0),(47387,91074,0),(47388,91075,0),(47389,91076,0),(47390,91077,0),(47391,91078,0),(47392,91079,0),(47393,91080,0),(47394,91081,0),(47395,91082,0),(47396,91083,0),(47397,91087,0),(47398,91088,0),(47399,91089,0),(47400,91090,0),(47401,91091,0),(47402,91092,0),(47403,91093,0),(47404,91094,0),(47405,91095,0),(47406,91096,0),(47407,91097,0),(47408,91098,0),(47409,91100,0),(47410,91101,0),(47411,91107,0),(47412,91108,0),(47413,91109,0),(47414,91110,0),(47415,91111,0),(47416,91112,0),(47417,91113,0),(47418,91114,0),(47419,91115,0),(47420,91116,0),(47421,91117,0),(47422,91118,0),(47423,91119,0),(47424,91120,0),(47425,91121,0),(47426,91122,0),(47427,91123,0),(47428,91124,0),(47429,91125,0),(47430,91126,0),(47431,91127,0),(47432,91128,0),(47433,91129,0),(47434,91130,0),(47435,91131,0),(47436,91132,0),(47437,91133,0),(47438,91134,0),(47439,91141,0),(47440,91142,0),(47441,91143,0),(47442,91144,0),(47443,91145,0),(47444,91146,0),(47445,91147,0),(47446,91148,0),(47447,91149,0),(47448,91150,0),(47449,91151,0),(47450,91152,0),(47451,91153,0),(47452,91154,0),(47453,91155,0),(47454,91156,0),(47455,91157,0),(47456,91158,0),(47457,91159,0),(47458,91160,0),(47459,91161,0),(47460,91162,0),(47461,91163,0),(47462,91164,0),(47463,91165,0),(47464,91166,0),(47465,91167,0),(47466,91168,0),(47467,91169,0),(47468,91170,0),(47469,91171,0),(47470,91172,0),(47471,91173,0),(47472,91174,0),(47473,91175,0),(47474,91176,0),(47475,91177,0),(47476,91178,0),(47477,91179,0),(47478,91180,0),(47479,91181,0),(47480,91182,0),(47481,91183,0),(47482,91184,0),(47483,91185,0),(47484,91186,0),(47485,91187,0),(47486,91188,0),(47487,91189,0),(47488,91190,0),(47489,91191,0),(47490,91192,0),(47491,91193,0),(47492,91194,0),(47493,91195,0),(47494,91196,0),(47495,91197,0),(47496,91198,0),(47497,91199,0),(47498,91200,0),(47499,91201,0),(47500,91202,0),(47501,91203,0),(47502,91204,0),(47503,91205,0),(47504,91206,0),(47505,91207,0),(47506,91208,0),(47507,91212,0),(47508,91213,0),(47509,91214,0),(47510,91215,0),(47511,91216,0),(47512,91217,0),(47513,91218,0),(47514,91219,0),(47515,91220,0),(47516,91221,0),(47517,91222,0),(47518,91223,0),(47519,91224,0),(47520,91225,0),(47521,91226,0),(47522,91227,0),(47523,91228,0),(47524,91229,0),(47525,91230,0),(47526,91231,0),(47527,91232,0),(47528,91233,0),(47529,91234,0),(47530,91235,0),(47531,91236,0),(47532,91237,0),(47533,91238,0),(47534,91239,0),(47535,91240,0),(47536,91241,0),(47537,91242,0),(47538,91243,0),(47539,91244,0),(47540,91245,0),(47541,91246,0),(47542,91247,0),(47543,91248,0),(47544,91249,0),(47545,91250,0),(47546,91251,0),(47547,91252,0),(47548,91253,0),(47549,91254,0),(47550,91255,0),(47551,91256,0),(47552,91257,0),(47553,91258,0),(47554,91259,0),(47555,91260,0),(47556,91261,0),(47557,91262,0),(47558,91263,0),(47559,91264,0),(47560,91265,0),(47561,91266,0),(47562,91267,0),(47563,91268,0),(47564,91269,0),(47565,91270,0),(47566,91271,0),(47567,91272,0),(47568,91273,0),(47569,91274,0),(47570,91275,0),(47571,91276,0),(47572,91277,0),(47573,91278,0),(47574,91279,0),(47575,91280,0),(47576,91281,0),(47577,91282,0),(47578,91283,0),(47579,91284,0),(47580,91285,0),(47581,91286,0),(47582,91287,0),(47583,91288,0),(47584,91289,0),(47585,91290,0),(47586,91291,0),(47587,91292,0),(47588,91293,0),(47589,91294,0),(47590,91295,0),(47591,91296,0),(47592,91297,0),(47593,91298,0),(47594,91299,0),(47595,91300,0),(47596,91301,0),(47597,91302,0),(47598,91303,0),(47599,91304,0),(47600,91305,0),(47601,91306,0),(47602,91307,0),(47603,91308,0),(47604,91309,0),(47605,91310,0),(47606,91311,0),(47607,91312,0),(47608,91313,0),(47609,91314,0),(47610,91315,0),(47611,91316,0),(47612,91317,0),(47613,91318,0),(47614,91319,0),(47615,91320,0),(47616,91321,0),(47617,91322,0),(47618,91323,0),(47619,91324,0),(47620,91325,0),(47621,91326,0),(47622,91327,0),(47623,91328,0),(47624,91335,0),(47625,91336,0),(47626,91337,0),(47627,91338,0),(47628,91339,0),(47629,91340,0),(47630,91341,0),(47631,91342,0),(47632,91343,0),(47633,91344,0),(47634,91345,0),(47635,91346,0),(47636,91347,0),(47637,91348,0),(47638,91349,0),(47639,91350,0),(47640,91351,0),(47641,91352,0),(47642,91353,0),(47643,91354,0),(47644,91355,0),(47645,91356,0),(47646,91357,0),(47647,91358,0),(47648,91359,0),(47649,91360,0),(47650,91361,0),(47651,91362,0),(47652,91363,0),(47653,91364,0),(47654,91365,0),(47655,91366,0),(47656,91367,0),(47657,91368,0),(47658,91369,0),(47659,91370,0),(47660,91371,0),(47661,91372,0),(47662,91373,0),(47663,91374,0),(47664,91375,0),(47665,91376,0),(47666,91377,0),(47667,91378,0),(47668,91379,0),(47669,91380,0),(47670,91381,0),(47671,91382,0),(47672,91383,0),(47673,91384,0),(47674,91385,0),(47675,91386,0),(47676,91387,0),(47677,91388,0),(47678,91389,0),(47679,91390,0),(47680,91391,0),(47681,91392,0),(47682,91393,0),(47683,91394,0),(47684,91395,0),(47685,91396,0),(47686,91397,0),(47687,91398,0),(47688,91399,0),(47689,91402,0),(47690,91403,0),(47691,91404,0),(47692,91405,0),(47693,91406,0),(47694,91407,0),(47695,91408,0),(47696,91409,0),(47697,91411,0),(47698,91412,0),(47699,91418,0),(47700,91419,0),(47701,91420,0),(47702,91421,0),(47703,91422,0),(47704,91423,0),(47705,91424,0),(47706,91425,0),(47707,91426,0),(47708,91427,0),(47709,91428,0),(47710,91429,0),(47711,91430,0),(47712,91431,0),(47713,91432,0),(47714,91433,0),(47715,91434,0),(47716,91435,0),(47717,91436,0),(47718,91437,0),(47719,91438,0),(47720,91439,0),(47721,91440,0),(47722,91442,0),(47723,91444,0),(47724,91446,0),(47725,91448,0),(47726,91450,0),(47727,91453,0),(47728,91454,0),(47729,91460,0),(47730,91462,0),(47731,91464,0),(47732,91466,0),(47733,91468,0),(47734,91470,0),(47735,91472,0),(47736,91474,0),(47737,91475,0),(47738,91476,0),(47739,91477,0),(47740,91478,0),(47741,91479,0),(47742,91480,0),(47743,91482,0),(47744,91484,0),(47745,91486,0),(47746,91494,0),(47747,91496,0),(47748,91498,0),(47749,91500,0),(47750,91502,0),(47751,91504,0),(47752,91506,0),(47753,91508,0),(47754,91510,0),(47755,91512,0),(47756,91514,0),(47757,91516,0),(47758,91518,0),(47759,91520,0),(47760,91522,0),(47761,91524,0),(47762,91525,0),(47763,91527,0),(47764,91529,0),(47765,91531,0),(47766,91533,0),(47767,91535,0),(47768,91537,0),(47769,91539,0),(47770,91541,0),(47771,91542,0),(47772,91544,0),(47773,91546,0),(47774,91548,0),(47775,91550,0),(47776,91552,0),(47777,91554,0),(47778,91556,0),(47779,91558,0),(47780,91560,0),(47781,91565,0),(47782,91567,0),(47783,91569,0),(47784,91571,0),(47785,91573,0),(47786,91574,0),(47787,91575,0),(47788,91577,0),(47789,91579,0),(47790,91581,0),(47791,91583,0),(47792,91585,0),(47793,91587,0),(47794,91589,0),(47795,91591,0),(47796,91593,0),(47797,91595,0),(47798,91597,0),(47799,91599,0),(47800,91600,0),(47801,91602,0),(47802,91604,0),(47803,91606,0),(47804,91608,0),(47805,91610,0),(47806,91612,0),(47807,91614,0),(47808,91616,0),(47809,91618,0),(47810,91620,0),(47811,91622,0),(47812,91624,0),(47813,91626,0),(47814,91628,0),(47815,91630,0),(47816,91632,0),(47817,91634,0),(47818,91636,0),(47819,91638,0),(47820,91639,0),(47821,91640,0),(47822,91642,0),(47823,91644,0),(47824,91646,0),(47825,91648,0),(47826,91650,0),(47827,91652,0),(47828,91654,0),(47829,91656,0),(47830,91658,0),(47831,91659,0),(47832,91660,0),(47833,91662,0),(47834,91664,0),(47835,91666,0),(47836,91668,0),(47837,91670,0),(47838,91672,0),(47839,91674,0),(47840,91676,0),(47841,91678,0),(47842,91680,0),(47843,91688,0),(47844,91690,0),(47845,91692,0),(47846,91693,0),(47847,91695,0),(47848,91697,0),(47849,91699,0),(47850,91701,0),(47851,91703,0),(47852,91705,0),(47853,91707,0),(47854,91709,0),(47855,91710,0),(47856,91711,0),(47857,91713,0),(47858,91715,0),(47859,91717,0),(47860,91719,0),(47861,91721,0),(47862,91723,0),(47863,91725,0),(47864,91727,0),(47865,91729,0),(47866,91731,0),(47867,91733,0),(47868,91735,0),(47869,91737,0),(47870,91739,0),(47871,91741,0),(47872,91743,0),(47873,91745,0),(47874,91747,0),(47875,91749,0),(47876,91751,0),(47877,91755,0),(47878,91757,0),(47879,91759,0),(47880,91761,0),(47881,91764,0),(47882,91765,0),(47883,91771,0),(47884,91773,0),(47885,91775,0),(47886,91777,0),(47887,91779,0),(47888,91781,0),(47889,91783,0),(47890,91785,0),(47891,91787,0),(47892,91789,0),(47893,91791,0),(47894,91793,0),(47895,91794,0),(47896,91795,0),(47897,91799,0),(47898,91801,0),(47899,91811,0),(47900,91812,0),(47901,91813,0),(47902,91840,0),(47903,91841,0),(47904,91842,0),(47905,91849,0),(47906,91879,0),(47907,91880,0),(47908,91881,0),(47909,91882,0),(47910,91883,0),(47911,91884,0),(47912,91885,0),(47913,91886,0),(47914,91888,0),(47915,91889,0),(47916,91890,0),(47917,91891,0),(47918,91892,0),(47919,91893,0),(47920,91894,0),(47921,91895,0),(47922,91897,0),(47923,91898,0),(47924,91899,0),(47925,91900,0),(47926,91901,0),(47927,91909,0),(47928,91910,0),(47929,91911,0),(47930,91912,0),(47931,91913,0),(47932,91914,0),(47933,91915,0),(47934,91916,0),(47935,91917,0),(47936,91918,0),(47937,91919,0),(47938,91920,0),(47939,91921,0),(47940,91922,0),(47941,91923,0),(47942,91924,0),(47943,91925,0),(47944,91926,0),(47945,91927,0),(47946,91928,0),(47947,91929,0),(47948,91930,0),(47949,91931,0),(47950,91932,0),(47951,91933,0),(47952,91934,0),(47953,91935,0),(47954,91944,0),(47955,91945,0),(47956,91946,0),(47957,91947,0),(47958,91948,0),(47959,91949,0),(47960,91950,0),(47961,91951,0),(47962,91952,0),(47963,91953,0),(47964,91954,0),(47965,91955,0),(47966,91956,0),(47967,91957,0),(47968,91958,0),(47969,91959,0),(47970,91960,0),(47971,91961,0),(47972,91962,0),(47973,91963,0),(47974,91964,0),(47975,91965,0),(47976,91966,0),(47977,91967,0),(47978,91968,0),(47979,91969,0),(47980,91970,0),(47981,91978,0),(47982,91979,0),(47983,91980,0),(47984,91981,0),(47985,91982,0),(47986,91983,0),(47987,91984,0),(47988,91985,0),(47989,91986,0),(47990,91987,0),(47991,91988,0),(47992,91989,0),(47993,91990,0),(47994,91991,0),(47995,91992,0),(47996,91993,0),(47997,91994,0),(47998,91995,0),(47999,91996,0),(48000,91997,0),(48001,91998,0),(48002,91999,0),(48003,92000,0),(48004,92001,0),(48005,92002,0),(48006,92003,0),(48007,92004,0),(48008,92005,0),(48009,92006,0),(48010,92007,0),(48011,92008,0),(48012,92009,0),(48013,92010,0),(48014,92011,0),(48015,92012,0),(48016,92013,0),(48017,92014,0),(48018,92015,0),(48019,92017,0),(48020,92018,0),(48021,92026,0),(48022,92027,0),(48023,92028,0),(48024,92029,0),(48025,92037,0),(48026,92038,0),(48027,92039,0),(48028,92040,0),(48029,92041,0),(48030,92042,0),(48031,92043,0),(48032,92044,0),(48033,92046,0),(48034,92062,0),(48035,92063,0),(48036,92064,0),(48037,92065,0),(48038,92066,0),(48039,92067,0),(48040,92068,0),(48041,92069,0),(48042,92074,0),(48043,92075,0),(48044,92076,0),(48045,92077,0),(48046,92078,0),(48047,92079,0),(48048,92080,0),(48049,92081,0),(48050,92082,0),(48051,92083,0),(48052,92084,0),(48053,92085,0),(48054,92086,0),(48055,92087,0),(48056,92088,0),(48057,92089,0),(48058,92090,0),(48059,92091,0),(48060,92092,0),(48061,92093,0),(48062,92094,0),(48063,92095,0),(48064,92096,0),(48065,92097,0),(48066,92098,0),(48067,92099,0),(48068,92100,0),(48069,92101,0),(48070,92102,0),(48071,92103,0),(48072,92104,0),(48073,92105,0),(48074,92106,0),(48075,92107,0),(48076,92108,0),(48077,92109,0),(48078,92110,0),(48079,92111,0),(48080,92112,0),(48081,92130,0),(48082,92131,0),(48083,92132,0),(48084,92152,0),(48085,92153,0),(48086,92154,0),(48087,92155,0),(48088,92156,0),(48089,92157,0),(48090,92158,0),(48091,92159,0),(48092,92160,0),(48093,92161,0),(48094,92162,0),(48095,92163,0),(48096,92164,0),(48097,92165,0),(48098,92166,0),(48099,92169,0),(48100,92170,0),(48101,92171,0),(48102,92172,0),(48103,92173,0),(48104,92174,0),(48105,92175,0),(48106,92176,0),(48107,92177,0),(48108,92178,0),(48109,92179,0),(48110,92180,0),(48111,92181,0),(48112,92192,0),(48113,92193,0),(48114,92194,0),(48115,92195,0),(48116,92196,0),(48117,92197,0),(48118,92198,0),(48119,92199,0),(48120,92200,0),(48121,92201,0),(48122,92202,0),(48123,92203,0),(48124,92204,0),(48125,92205,0),(48126,92206,0),(48127,92216,0),(48128,92217,0),(48129,92218,0),(48130,92219,0),(48131,92220,0),(48132,92221,0),(48133,92222,0),(48134,92223,0),(48135,92224,0),(48136,92225,0),(48137,92226,0),(48138,92227,0),(48139,92228,0),(48140,92229,0),(48141,92230,0),(48142,92231,0),(48143,92232,0),(48144,92233,0),(48145,92234,0),(48146,92235,0),(48147,92236,0),(48148,92237,0),(48149,92238,0),(48150,92239,0),(48151,92240,0),(48152,92241,0),(48153,92242,0),(48154,92243,0),(48155,92244,0),(48156,92245,0),(48157,92246,0),(48158,92247,0),(48159,92248,0),(48160,92249,0),(48161,92250,0),(48162,92251,0),(48163,92252,0),(48164,92253,0),(48165,92254,0),(48166,92262,0),(48167,92263,0),(48168,92264,0),(48169,92265,0),(48170,92266,0),(48171,92267,0),(48172,92268,0),(48173,92269,0),(48174,92270,0),(48175,92271,0),(48176,92272,0),(48177,92273,0),(48178,92274,0),(48179,92294,0),(48180,92295,0),(48181,92296,0),(48182,92297,0),(48183,92298,0),(48184,92299,0),(48185,92300,0),(48186,92301,0),(48187,92314,0),(48188,92315,0),(48189,92316,0),(48190,92317,0),(48191,92318,0),(48192,92319,0),(48193,92320,0),(48194,92321,0),(48195,92322,0),(48196,92323,0),(48197,92324,0),(48198,92325,0),(48199,92326,0),(48200,92327,0),(48201,92328,0),(48202,92329,0),(48203,92330,0),(48204,92331,0),(48205,92332,0),(48206,92333,0),(48207,92334,0),(48208,92335,0),(48209,92336,0),(48210,92337,0),(48211,92338,0),(48212,92339,0),(48213,92340,0),(48214,92341,0),(48215,92342,0),(48216,92343,0),(48217,92344,0),(48218,92345,0),(48219,92346,0),(48220,92347,0),(48221,92348,0),(48222,92349,0),(48223,92350,0),(48224,92351,0),(48225,92352,0),(48226,92353,0),(48227,92354,0),(48228,92355,0),(48229,92356,0),(48230,92357,0),(48231,92358,0),(48232,92359,0),(48233,92360,0),(48234,92361,0),(48235,92362,0),(48236,92363,0),(48237,92364,0),(48238,92365,0),(48239,92366,0),(48240,92367,0),(48241,92368,0),(48242,92369,0),(48243,92370,0),(48244,92371,0),(48245,92372,0),(48246,92373,0),(48247,92374,0),(48248,92375,0),(48249,92376,0),(48250,92377,0),(48251,92378,0),(48252,92379,0),(48253,92386,0),(48254,92387,0),(48255,92388,0),(48256,92389,0),(48257,92390,0),(48258,92391,0),(48259,92395,0),(48260,92396,0),(48261,92403,0),(48262,92404,0),(48263,92405,0),(48264,92406,0),(48265,92407,0),(48266,92408,0),(48267,92409,0),(48268,92410,0),(48269,92411,0),(48270,92412,0),(48271,92413,0),(48272,92414,0),(48273,92415,0),(48274,92445,0),(48275,92446,0),(48276,92447,0),(48277,92448,0),(48278,92449,0),(48279,92450,0),(48280,92451,0),(48281,92452,0),(48282,92453,0),(48283,92454,0),(48284,92455,0),(48285,92456,0),(48286,92457,0),(48287,92458,0),(48288,92459,0),(48289,92460,0),(48290,92461,0),(48291,92462,0),(48292,92463,0),(48293,92464,0),(48294,92465,0),(48295,92466,0),(48296,92467,0),(48297,92468,0),(48298,92469,0),(48299,92476,0),(48300,92477,0),(48301,92478,0),(48302,92479,0),(48303,92480,0),(48304,92481,0),(48305,92482,0),(48306,92483,0),(48307,92485,0),(48308,92486,0),(48309,92487,0),(48310,92488,0),(48311,92489,0),(48312,92490,0),(48313,92491,0),(48314,92492,0),(48315,92498,0),(48316,92502,0),(48317,92503,0),(48318,92504,0),(48319,92505,0),(48320,92506,0),(48321,92507,0),(48322,92508,0),(48323,92509,0),(48324,92518,0),(48325,92519,0),(48326,92520,0),(48327,92540,0),(48328,92541,0),(48329,92542,0),(48330,92543,0),(48331,92544,0),(48332,92545,0),(48333,92546,0),(48334,92547,0),(48335,92548,0),(48336,92553,0),(48337,92666,0),(48338,92667,0),(48339,92668,0),(48340,92669,0),(48341,92670,0),(48342,92671,0),(48343,92672,0),(48344,92673,0),(48345,92674,0),(48346,92726,0),(48347,92762,0),(48348,92777,0),(48349,92795,0),(48350,92805,0),(48351,92806,0),(48352,92807,0),(48353,92808,0),(48354,92809,0),(48355,92810,0),(48356,92811,0),(48357,92812,0),(48358,92814,0),(48359,92815,0),(48360,92816,0),(48361,92817,0),(48362,92818,0),(48363,92819,0),(48364,92820,0),(48365,92821,0),(48366,92822,0),(48367,92823,0),(48368,92824,0),(48369,92825,0),(48370,92826,0),(48371,92827,0),(48372,92828,0),(48373,92829,0),(48374,92830,0),(48375,92831,0),(48376,92832,0),(48377,92833,0),(48378,92834,0),(48379,92835,0),(48380,92836,0),(48381,92837,0),(48382,92838,0),(48383,92839,0),(48384,92840,0),(48385,92841,0),(48386,92842,0),(48387,92843,0),(48388,92844,0),(48389,92845,0),(48390,92846,0),(48391,92847,0),(48392,92848,0),(48393,92849,0),(48394,92850,0),(48395,92851,0),(48396,92852,0),(48397,92853,0),(48398,92854,0),(48399,92855,0),(48400,92856,0),(48401,92857,0),(48402,92858,0),(48403,92859,0),(48404,92860,0),(48405,92861,0),(48406,92862,0),(48407,92863,0),(48408,92864,0),(48409,92865,0),(48410,92866,0),(48411,92867,0),(48412,92868,0),(48413,92869,0),(48414,92870,0),(48415,92871,0),(48416,92872,0),(48417,92873,0),(48418,92874,0),(48419,92875,0),(48420,92876,0),(48421,92877,0),(48422,92878,0),(48423,92879,0),(48424,92880,0),(48425,92881,0),(48426,92890,0),(48427,92891,0),(48428,92892,0),(48429,92893,0),(48430,92894,0),(48431,92895,0),(48432,92948,0),(48433,92961,0),(48434,92991,0),(48435,92992,0),(48436,92993,0),(48437,92994,0),(48438,92995,0),(48439,92996,0),(48440,92997,0),(48441,92998,0),(48442,92999,0),(48443,93000,0),(48444,93001,0),(48445,93002,0),(48446,93003,0),(48447,93004,0),(48448,93005,0),(48449,93006,0),(48450,93007,0),(48451,93008,0),(48452,93010,0),(48453,93011,0),(48454,93012,0),(48455,93013,0),(48456,93014,0),(48457,93015,0),(48458,93016,0),(48459,93017,0),(48460,93018,0),(48461,93023,0),(48462,93024,0),(48463,93027,0),(48464,93048,0),(48465,93049,0),(48466,93050,0),(48467,93051,0),(48468,93052,0),(48469,93053,0),(48470,93054,0),(48471,93055,0),(48472,93056,0),(48473,93057,0),(48474,93058,0),(48475,93059,0),(48476,93060,0),(48477,93061,0),(48478,93062,0),(48479,93063,0),(48480,93064,0),(48481,93067,0),(48482,93068,0),(48483,93069,0),(48484,93070,0),(48485,93071,0),(48486,93072,0),(48487,93073,0),(48488,93074,0),(48489,93075,0),(48490,93078,0),(48491,93079,0),(48492,93080,0),(48493,93081,0),(48494,93082,0),(48495,93083,0),(48496,93084,0),(48497,93085,0),(48498,93086,0),(48499,93087,0),(48500,93088,0),(48501,93089,0),(48502,93090,0),(48503,93091,0),(48504,93092,0),(48505,93093,0),(48506,93094,0),(48507,93095,0),(48508,93096,0),(48509,93097,0),(48510,93098,0),(48511,93099,0),(48512,93100,0),(48513,93101,0),(48514,93102,0),(48515,93103,0),(48516,93104,0),(48517,93105,0),(48518,93106,0),(48519,93107,0),(48520,93108,0),(48521,93109,0),(48522,93110,0),(48523,93113,0),(48524,93115,0),(48525,93116,0),(48526,93117,0),(48527,93118,0),(48528,93119,0),(48529,93120,0),(48530,93121,0),(48531,93122,0),(48532,93125,0),(48533,93126,0),(48534,93127,0),(48535,93128,0),(48536,93129,0),(48537,93130,0),(48538,93131,0),(48539,93132,0),(48540,93133,0),(48541,93134,0),(48542,93135,0),(48543,93136,0),(48544,93137,0),(48545,93138,0),(48546,93139,0),(48547,93140,0),(48548,93141,0),(48549,93142,0),(48550,93143,0),(48551,93144,0),(48552,93145,0),(48553,93150,0),(48554,93151,0),(48555,93152,0),(48556,93153,0),(48557,93154,0),(48558,93155,0),(48559,93156,0),(48560,93157,0),(48561,93160,0),(48562,93161,0),(48563,93162,0),(48564,93163,0),(48565,93164,0),(48566,93165,0),(48567,93166,0),(48568,93167,0),(48569,93170,0),(48570,93171,0),(48571,93172,0),(48572,93173,0),(48573,93174,0),(48574,93175,0),(48575,93176,0),(48576,93177,0),(48577,93182,0),(48578,93192,0),(48579,93216,0),(48580,93217,0),(48581,93218,0),(48582,93219,0),(48583,93233,0),(48584,93234,0),(48585,93235,0),(48586,93236,0),(48587,93237,0),(48588,93238,0),(48589,93239,0),(48590,93240,0),(48591,93241,0),(48592,93242,0),(48593,93263,0),(48594,93264,0),(48595,93265,0),(48596,93266,0),(48597,93267,0),(48598,93268,0),(48599,93269,0),(48600,93270,0),(48601,93271,0),(48602,93272,0),(48603,93273,0),(48604,93274,0),(48605,93275,0),(48606,93276,0),(48607,93277,0),(48608,93278,0),(48609,93279,0),(48610,93280,0),(48611,93281,0),(48612,93282,0),(48613,93283,0),(48614,93284,0),(48615,93285,0),(48616,93286,0),(48617,93287,0),(48618,93288,0),(48619,93289,0),(48620,93290,0),(48621,93291,0),(48622,93292,0),(48623,93293,0),(48624,93294,0),(48625,93295,0),(48626,93296,0),(48627,93297,0),(48628,93298,0),(48629,93299,0),(48630,93300,0),(48631,93301,0),(48632,93302,0),(48633,93303,0),(48634,93304,0),(48635,93305,0),(48636,93306,0),(48637,93307,0),(48638,93308,0),(48639,93309,0),(48640,93310,0),(48641,93311,0),(48642,93323,0),(48643,93324,0),(48644,93325,0),(48645,93326,0),(48646,93327,0),(48647,93328,0),(48648,93329,0),(48649,93330,0),(48650,93331,0),(48651,93332,0),(48652,93333,0),(48653,93334,0),(48654,93335,0),(48655,93336,0),(48656,93337,0),(48657,93338,0),(48658,93339,0),(48659,93340,0),(48660,93368,0),(48661,93371,0),(48662,93372,0),(48663,93376,0),(48664,93377,0),(48665,93390,0),(48666,93413,0),(48667,93414,0),(48668,93415,0),(48669,93416,0),(48670,93417,0),(48671,93418,0),(48672,93420,0),(48673,93421,0),(48674,93427,0),(48675,93428,0),(48676,93429,0),(48677,93430,0),(48678,93431,0),(48679,93432,0),(48680,93433,0),(48681,93434,0),(48682,93435,0),(48683,93436,0),(48684,93437,0),(48685,93438,0),(48686,93439,0),(48687,93440,0),(48688,93441,0),(48689,93442,0),(48690,93443,0),(48691,93450,0),(48692,93451,0),(48693,93452,0),(48694,93453,0),(48695,93454,0),(48696,93455,0),(48697,93456,0),(48698,93457,0),(48699,93458,0),(48700,93459,0),(48701,93460,0),(48702,93461,0),(48703,93462,0),(48704,93463,0),(48705,93464,0),(48706,93465,0),(48707,93466,0),(48708,93467,0),(48709,93468,0),(48710,93469,0),(48711,93470,0),(48712,93471,0),(48713,93472,0),(48714,93473,0),(48715,93474,0),(48716,93475,0),(48717,93476,0),(48718,93477,0),(48719,93478,0),(48720,93479,0),(48721,93480,0),(48722,93481,0),(48723,93482,0),(48724,93483,0),(48725,93484,0),(48726,93488,0),(48727,93489,0),(48728,93490,0),(48729,93491,0),(48730,93492,0),(48731,93493,0),(48732,93494,0),(48733,93495,0),(48734,93496,0),(48735,93497,0),(48736,93498,0),(48737,93499,0),(48738,93500,0),(48739,93501,0),(48740,93502,0),(48741,93503,0),(48742,93504,0),(48743,93505,0),(48744,93506,0),(48745,93507,0),(48746,93508,0),(48747,93509,0),(48748,93510,0),(48749,93511,0),(48750,93512,0),(48751,93513,0),(48752,93514,0),(48753,93515,0),(48754,93516,0),(48755,93517,0),(48756,93518,0),(48757,93519,0),(48758,93520,0),(48759,93521,0),(48760,93522,0),(48761,93523,0),(48762,93524,0),(48763,93525,0),(48764,93526,0),(48765,93527,0),(48766,93528,0),(48767,93529,0),(48768,93530,0),(48769,93531,0),(48770,93532,0),(48771,93533,0),(48772,93534,0),(48773,93535,0),(48774,93536,0),(48775,93537,0),(48776,93538,0),(48777,93539,0),(48778,93540,0),(48779,93541,0),(48780,93542,0),(48781,93543,0),(48782,93544,0),(48783,93545,0),(48784,93546,0),(48785,93547,0),(48786,93548,0),(48787,93549,0),(48788,93550,0),(48789,93551,0),(48790,93552,0),(48791,93553,0),(48792,93554,0),(48793,93555,0),(48794,93556,0),(48795,93557,0),(48796,93558,0),(48797,93559,0),(48798,93566,0),(48799,93567,0),(48800,93568,0),(48801,93569,0),(48802,93570,0),(48803,93571,0),(48804,93572,0),(48805,93573,0),(48806,93574,0),(48807,93575,0),(48808,93576,0),(48809,93577,0),(48810,93578,0),(48811,93579,0),(48812,93580,0),(48813,93581,0),(48814,93582,0),(48815,93583,0),(48816,93584,0),(48817,93585,0),(48818,93586,0),(48819,93587,0),(48820,93588,0),(48821,93589,0),(48822,93590,0),(48823,93591,0),(48824,93592,0),(48825,93593,0),(48826,93594,0),(48827,93595,0),(48828,93596,0),(48829,93597,0),(48830,93598,0),(48831,93599,0),(48832,93602,0),(48833,93603,0),(48834,93604,0),(48835,93605,0),(48836,93607,0),(48837,93608,0),(48838,93614,0),(48839,93615,0),(48840,93616,0),(48841,93617,0),(48842,93618,0),(48843,93619,0),(48844,93620,0),(48845,93621,0),(48846,93622,0),(48847,93623,0),(48848,93624,0),(48849,93625,0),(48850,93638,0),(48851,93639,0),(48852,93640,0),(48853,93641,0),(48854,93642,0),(48855,93643,0),(48856,93644,0),(48857,93645,0),(48858,93646,0),(48859,93647,0),(48860,93648,0),(48861,93657,0),(48862,93658,0),(48863,93659,0),(48864,93661,0),(48865,93667,0),(48866,93673,0),(48867,93674,0),(48868,93675,0),(48869,93676,0),(48870,93677,0),(48871,93678,0),(48872,93679,0),(48873,93680,0),(48874,93681,0),(48875,93682,0),(48876,93683,0),(48877,93684,0),(48878,93685,0),(48879,93686,0),(48880,93687,0),(48881,93688,0),(48882,93689,0),(48883,93690,0),(48884,93691,0),(48885,93692,0),(48886,93693,0),(48887,93694,0),(48888,93695,0),(48889,93696,0),(48890,93697,0),(48891,93698,0),(48892,93699,0),(48893,93700,0),(48894,93701,0),(48895,93702,0),(48896,93703,0),(48897,93704,0),(48898,93709,0),(48899,93710,0),(48900,93711,0),(48901,93712,0),(48902,93713,0),(48903,93714,0),(48904,93715,0),(48905,93716,0),(48906,93720,0),(48907,93721,0),(48908,93722,0),(48909,93723,0),(48910,93725,0),(48911,93726,0),(48912,93727,0),(48913,93728,0),(48914,93732,0),(48915,93743,0),(48916,93744,0),(48917,93745,0),(48918,93746,0),(48919,93747,0),(48920,93748,0),(48921,93749,0),(48922,93750,0),(48923,93755,0),(48924,93756,0),(48925,93757,0),(48926,93758,0),(48927,93762,0),(48928,93763,0),(48929,93764,0),(48930,93765,0),(48931,93766,0),(48932,93767,0),(48933,93768,0),(48934,93769,0),(48935,93770,0),(48936,93771,0),(48937,93772,0),(48938,93773,0),(48939,93774,0),(48940,93775,0),(48941,93776,0),(48942,93777,0),(48943,93778,0),(48944,93779,0),(48945,93780,0),(48946,93781,0),(48947,93782,0),(48948,93783,0),(48949,93784,0),(48950,93785,0),(48951,93786,0),(48952,93787,0),(48953,93788,0),(48954,93789,0),(48955,93790,0),(48956,93797,0),(48957,93798,0),(48958,93799,0),(48959,93800,0),(48960,93807,0),(48961,93808,0),(48962,93809,0),(48963,93810,0),(48964,93811,0),(48965,93812,0),(48966,93813,0),(48967,93814,0),(48968,93815,0),(48969,93816,0),(48970,93817,0),(48971,93818,0),(48972,93819,0),(48973,93820,0),(48974,93821,0),(48975,93822,0),(48976,93825,0),(48977,93826,0),(48978,93827,0),(48979,93828,0),(48980,93829,0),(48981,93830,0),(48982,93831,0),(48983,93832,0),(48984,93833,0),(48985,93834,0),(48986,93835,0),(48987,93836,0),(48988,93837,0),(48989,93838,0),(48990,93839,0),(48991,93840,0),(48992,93841,0),(48993,93843,0),(48994,93844,0),(48995,93845,0),(48996,93846,0),(48997,93847,0),(48998,93848,0),(48999,93849,0),(49000,93850,0),(49001,93851,0),(49002,93852,0),(49003,93853,0),(49004,93854,0),(49005,93855,0),(49006,93856,0),(49007,93857,0),(49008,93858,0),(49009,93859,0),(49010,93860,0),(49011,93861,0),(49012,93862,0),(49013,93863,0),(49014,93864,0),(49015,93865,0),(49016,93866,0),(49017,93867,0),(49018,93868,0),(49019,93869,0),(49020,93870,0),(49021,93871,0),(49022,93872,0),(49023,93873,0),(49024,93874,0),(49025,93875,0),(49026,93876,0),(49027,93877,0),(49028,93878,0),(49029,93879,0),(49030,93880,0),(49031,93881,0),(49032,93882,0),(49033,93883,0),(49034,93884,0),(49035,93885,0),(49036,93886,0),(49037,93887,0),(49038,93888,0),(49039,93889,0),(49040,93890,0),(49041,93891,0),(49042,93892,0),(49043,93893,0),(49044,93894,0),(49045,93895,0),(49046,93902,0),(49047,93903,0),(49048,93904,0),(49049,93905,0),(49050,93906,0),(49051,93907,0),(49052,93908,0),(49053,93909,0),(49054,93910,0),(49055,93911,0),(49056,93912,0),(49057,93913,0),(49058,93914,0),(49059,93915,0),(49060,93916,0),(49061,93917,0),(49062,93918,0),(49063,93919,0),(49064,93920,0),(49065,93921,0),(49066,93922,0),(49067,93923,0),(49068,93924,0),(49069,93925,0),(49070,93926,0),(49071,93927,0),(49072,93928,0),(49073,93929,0),(49074,93930,0),(49075,93931,0),(49076,93932,0),(49077,93933,0),(49078,93934,0),(49079,93935,0),(49080,93936,0),(49081,93937,0),(49082,93938,0),(49083,93939,0),(49084,93940,0),(49085,93941,0),(49086,93942,0),(49087,93943,0),(49088,93944,0),(49089,93946,0),(49090,93947,0),(49091,93948,0),(49092,93971,0),(49093,93972,0),(49094,93973,0),(49095,93974,0),(49096,93975,0),(49097,93976,0),(49098,93977,0),(49099,93978,0),(49100,93979,0),(49101,93980,0),(49102,93981,0),(49103,93982,0),(49104,93983,0),(49105,93984,0),(49106,93985,0),(49107,93986,0),(49108,93987,0),(49109,93988,0),(49110,93989,0),(49111,93990,0),(49112,93991,0),(49113,93992,0),(49114,93993,0),(49115,93994,0),(49116,94028,0),(49117,94029,0),(49118,94030,0),(49119,94031,0),(49120,94032,0),(49121,94033,0),(49122,94034,0),(49123,94035,0),(49124,94036,0),(49125,94037,0),(49126,94038,0),(49127,94039,0),(49128,94040,0),(49129,94041,0),(49130,94042,0),(49131,94043,0),(49132,94044,0),(49133,94045,0),(49134,94046,0),(49135,94047,0),(49136,94048,0),(49137,94049,0),(49138,94050,0),(49139,94051,0),(49140,94052,0),(49141,94053,0),(49142,94054,0),(49143,94055,0),(49144,94056,0),(49145,94057,0),(49146,94058,0),(49147,94059,0),(49148,94060,0),(49149,94061,0),(49150,94062,0),(49151,94063,0),(49152,94064,0),(49153,94065,0),(49154,94066,0),(49155,94067,0),(49156,94068,0),(49157,94069,0),(49158,94070,0),(49159,94071,0),(49160,94072,0),(49161,94073,0),(49162,94074,0),(49163,94075,0),(49164,94076,0),(49165,94077,0),(49166,94078,0),(49167,94079,0),(49168,94080,0),(49169,94081,0),(49170,94082,0),(49171,94083,0),(49172,94084,0),(49173,94085,0),(49174,94086,0),(49175,94087,0),(49176,94088,0),(49177,94089,0),(49178,94090,0),(49179,94091,0),(49180,94092,0),(49181,94093,0),(49182,94094,0),(49183,94095,0),(49184,94096,0),(49185,94097,0),(49186,94098,0),(49187,94099,0),(49188,94100,0),(49189,94101,0),(49190,94102,0),(49191,94103,0),(49192,94104,0),(49193,94105,0),(49194,94106,0),(49195,94107,0),(49196,94108,0),(49197,94109,0),(49198,94110,0),(49199,94118,0),(49200,94119,0),(49201,94120,0),(49202,94121,0),(49203,94122,0),(49204,94131,0),(49205,94132,0),(49206,94133,0),(49207,94134,0),(49208,94135,0),(49209,94136,0),(49210,94137,0),(49211,94138,0),(49212,94139,0),(49213,94140,0),(49214,94141,0),(49215,94142,0),(49216,94143,0),(49217,94144,0),(49218,94145,0),(49219,94146,0),(49220,94147,0),(49221,94148,0),(49222,94149,0),(49223,94150,0),(49224,94151,0),(49225,94156,0),(49226,94157,0),(49227,94192,0),(49228,94193,0),(49229,94194,0),(49230,94195,0),(49231,94196,0),(49232,94211,0),(49233,94212,0),(49234,94213,0),(49235,94214,0),(49236,94215,0),(49237,94216,0),(49238,94217,0),(49239,94218,0),(49240,94244,0),(49241,94245,0),(49242,94246,0),(49243,94247,0),(49244,94248,0),(49245,94250,0),(49246,94251,0),(49247,94252,0),(49248,94253,0),(49249,94254,0),(49250,94255,0),(49251,94256,0),(49252,94257,0),(49253,94261,0),(49254,94262,0),(49255,94263,0),(49256,94264,0),(49257,94265,0),(49258,94266,0),(49259,94267,0),(49260,94268,0),(49261,94269,0),(49262,94270,0),(49263,94271,0),(49264,94272,0),(49265,94273,0),(49266,94274,0),(49267,94275,0),(49268,94276,0),(49269,94277,0),(49270,94278,0),(49271,94279,0),(49272,94280,0),(49273,94284,0),(49274,94285,0),(49275,94286,0),(49276,94294,0),(49277,94297,0),(49278,94298,0),(49279,94299,0),(49280,94300,0),(49281,94301,0),(49282,94302,0),(49283,94303,0),(49284,94304,0),(49285,94305,0),(49286,94306,0),(49287,94307,0),(49288,94308,0),(49289,94309,0),(49290,94310,0),(49291,94311,0),(49292,94312,0),(49293,94313,0),(49294,94314,0),(49295,94315,0),(49296,94316,0),(49297,94317,0),(49298,94318,0),(49299,94319,0),(49300,94320,0),(49301,94321,0),(49302,94322,0),(49303,94323,0),(49304,94324,0),(49305,94325,0),(49306,94326,0),(49307,94327,0),(49308,94328,0),(49309,94330,0),(49310,94331,0),(49311,94332,0),(49312,94333,0),(49313,94334,0),(49314,94335,0),(49315,94336,0),(49316,94337,0),(49317,94339,0),(49318,94340,0),(49319,94341,0),(49320,94342,0),(49321,94343,0),(49322,94344,0),(49323,94345,0),(49324,94347,0),(49325,94348,0),(49326,94350,0),(49327,94351,0),(49328,94352,0),(49329,94353,0),(49330,94355,0),(49331,94358,0),(49332,94359,0),(49333,94360,0),(49334,94362,0),(49335,94364,0),(49336,94365,0),(49337,94366,0),(49338,94367,0),(49339,94368,0),(49340,94369,0),(49341,94370,0),(49342,94371,0),(49343,94372,0),(49344,94374,0),(49345,94375,0),(49346,94376,0),(49347,94377,0),(49348,94378,0),(49349,94379,0),(49350,94380,0),(49351,94381,0),(49352,94382,0),(49353,94383,0),(49354,94384,0),(49355,94385,0),(49356,94389,0),(49357,94391,0),(49358,94392,0),(49359,94393,0),(49360,94397,0),(49361,94398,0),(49362,94400,0),(49363,94401,0),(49364,94402,0),(49365,94403,0),(49366,94404,0),(49367,94405,0),(49368,94406,0),(49369,94407,0),(49370,94408,0),(49371,94409,0),(49372,94410,0),(49373,94411,0),(49374,94412,0),(49375,94413,0),(49376,94414,0),(49377,94416,0),(49378,94418,0),(49379,94419,0),(49380,94420,0),(49381,94421,0),(49382,94423,0),(49383,94424,0),(49384,94425,0),(49385,94426,0),(49386,94427,0),(49387,94428,0),(49388,94429,0),(49389,94430,0),(49390,94431,0),(49391,94432,0),(49392,94433,0),(49393,94434,0),(49394,94435,0),(49395,94436,0),(49396,94437,0),(49397,94438,0),(49398,94439,0),(49399,94440,0),(49400,94441,0),(49401,94442,0),(49402,94443,0),(49403,94444,0),(49404,94445,0),(49405,94446,0),(49406,94447,0),(49407,94448,0),(49408,94449,0),(49409,94450,0),(49410,94451,0),(49411,94453,0),(49412,94455,0),(49413,94456,0),(49414,94457,0),(49415,94458,0),(49416,94459,0),(49417,94460,0),(49418,94461,0),(49419,94463,0),(49420,94464,0),(49421,94466,0),(49422,94467,0),(49423,94468,0),(49424,94469,0),(49425,94470,0),(49426,94471,0),(49427,94472,0),(49428,94475,0),(49429,94476,0),(49430,94477,0),(49431,94478,0),(49432,94479,0),(49433,94480,0),(49434,94481,0),(49435,94483,0),(49436,94484,0),(49437,94485,0),(49438,94486,0),(49439,94487,0),(49440,94488,0),(49441,94490,0),(49442,94491,0),(49443,94492,0),(49444,94493,0),(49445,94494,0),(49446,94495,0),(49447,94496,0),(49448,94497,0),(49449,94498,0),(49450,94499,0),(49451,94500,0),(49452,94501,0),(49453,94502,0),(49454,94503,0),(49455,94504,0),(49456,94505,0),(49457,94506,0),(49458,94542,0),(49459,94564,0),(49460,94565,0),(49461,94575,0),(49462,94576,0),(49463,94577,0),(49464,94578,0),(49465,94579,0),(49466,94580,0),(49467,94581,0),(49468,94582,0),(49469,94583,0),(49470,94584,0),(49471,94585,0),(49472,94586,0),(49473,94587,0),(49474,94588,0),(49475,94589,0),(49476,94590,0),(49477,94591,0),(49478,94592,0),(49479,94596,0),(49480,94597,0),(49481,94598,0),(49482,94599,0),(49483,94600,0),(49484,94601,0),(49485,94602,0),(49486,94603,0),(49487,94606,0),(49488,94607,0),(49489,94608,0),(49490,94609,0),(49491,94610,0),(49492,94611,0),(49493,94612,0),(49494,94613,0),(49495,94614,0),(49496,94615,0),(49497,94616,0),(49498,94617,0),(49499,94618,0),(49500,94619,0),(49501,94620,0),(49502,94621,0),(49503,94622,0),(49504,94623,0),(49505,94624,0),(49506,94625,0),(49507,94626,0),(49508,94627,0),(49509,94628,0),(49510,94629,0),(49511,94630,0),(49512,94631,0),(49513,94632,0),(49514,94647,0),(49515,94648,0),(49516,94649,0),(49517,94650,0),(49518,94651,0),(49519,94652,0),(49520,94653,0),(49521,94654,0),(49522,94655,0),(49523,94656,0),(49524,94657,0),(49525,94658,0),(49526,94659,0),(49527,94660,0),(49528,94661,0),(49529,94662,0),(49530,94663,0),(49531,94664,0),(49532,94665,0),(49533,94666,0),(49534,94667,0),(49535,94668,0),(49536,94677,0),(49537,94678,0),(49538,94679,0),(49539,94680,0),(49540,94681,0),(49541,94682,0),(49542,94683,0),(49543,94684,0),(49544,94685,0),(49545,94686,0),(49546,94687,0),(49547,94688,0),(49548,94689,0),(49549,94690,0),(49550,94691,0),(49551,94692,0),(49552,94693,0),(49553,94694,0),(49554,94695,0),(49555,94696,0),(49556,94697,0),(49557,94698,0),(49558,94699,0),(49559,94700,0),(49560,94701,0),(49561,94702,0),(49562,94703,0),(49563,94704,0),(49564,94705,0),(49565,94706,0),(49566,94707,0),(49567,94708,0),(49568,94709,0),(49569,94710,0),(49570,94711,0),(49571,94712,0),(49572,94713,0),(49573,94714,0),(49574,94715,0),(49575,94716,0),(49576,94717,0),(49577,94718,0),(49578,94719,0),(49579,94720,0),(49580,94722,0),(49581,94723,0),(49582,94724,0),(49583,94725,0),(49584,94726,0),(49585,94727,0),(49586,94728,0),(49587,94730,0),(49588,94731,0),(49589,94732,0),(49590,94733,0),(49591,94734,0),(49592,94735,0),(49593,94736,0),(49594,94737,0),(49595,94739,0),(49596,94740,0),(49597,94741,0),(49598,94742,0),(49599,94743,0),(49600,94744,0),(49601,94745,0),(49602,94747,0),(49603,94748,0),(49604,94749,0),(49605,94750,0),(49606,94751,0),(49607,94752,0),(49608,94753,0),(49609,94755,0),(49610,94756,0),(49611,94757,0),(49612,94758,0),(49613,94759,0),(49614,94760,0),(49615,94761,0),(49616,94762,0),(49617,94763,0),(49618,94764,0),(49619,94765,0),(49620,94767,0),(49621,94768,0),(49622,94769,0),(49623,94770,0),(49624,94771,0),(49625,94772,0),(49626,94773,0),(49627,94774,0),(49628,94775,0),(49629,94777,0),(49630,94778,0),(49631,94779,0),(49632,94780,0),(49633,94781,0),(49634,94782,0),(49635,94783,0),(49636,94784,0),(49637,94785,0),(49638,94786,0),(49639,94787,0),(49640,94788,0),(49641,94789,0),(49642,94790,0),(49643,94791,0),(49644,94792,0),(49645,94796,0),(49646,94797,0),(49647,94798,0),(49648,94799,0),(49649,94800,0),(49650,94801,0),(49651,94802,0),(49652,94804,0),(49653,94805,0),(49654,94806,0),(49655,94807,0),(49656,94808,0),(49657,94809,0),(49658,94810,0),(49659,94811,0),(49660,94812,0),(49661,94813,0),(49662,94814,0),(49663,94815,0),(49664,94816,0),(49665,94817,0),(49666,94818,0),(49667,94819,0),(49668,94820,0),(49669,94821,0),(49670,94822,0),(49671,94823,0),(49672,94824,0),(49673,94825,0),(49674,94826,0),(49675,94827,0),(49676,94828,0),(49677,94829,0),(49678,94830,0),(49679,94831,0),(49680,94832,0),(49681,94833,0),(49682,94834,0),(49683,94836,0),(49684,94837,0),(49685,94838,0),(49686,94839,0),(49687,94840,0),(49688,94841,0),(49689,94842,0),(49690,94843,0),(49691,94844,0),(49692,94845,0),(49693,94846,0),(49694,94848,0),(49695,94849,0),(49696,94850,0),(49697,94851,0),(49698,94852,0),(49699,94853,0),(49700,94854,0),(49701,94855,0),(49702,94856,0),(49703,94858,0),(49704,94859,0),(49705,94860,0),(49706,94861,0),(49707,94863,0),(49708,94864,0),(49709,94865,0),(49710,94866,0),(49711,94869,0),(49712,94870,0),(49713,94871,0),(49714,94872,0),(49715,94873,0),(49716,94874,0),(49717,94875,0),(49718,94876,0),(49719,94895,0),(49720,94896,0),(49721,94897,0),(49722,94898,0),(49723,94899,0),(49724,94900,0),(49725,94901,0),(49726,94902,0),(49727,94906,0),(49728,94907,0),(49729,94908,0),(49730,94909,0),(49731,94910,0),(49732,94911,0),(49733,94912,0),(49734,94913,0),(49735,94914,0),(49736,94915,0),(49737,94916,0),(49738,94917,0),(49739,94922,0),(49740,94923,0),(49741,94924,0),(49742,94925,0),(49743,94926,0),(49744,94927,0),(49745,94928,0),(49746,94929,0),(49747,94930,0),(49748,94937,0),(49749,94938,0),(49750,94939,0),(49751,94940,0),(49752,94941,0),(49753,94942,0),(49754,94943,0),(49755,94944,0),(49756,94945,0),(49757,94946,0),(49758,94947,0),(49759,94948,0),(49760,94949,0),(49761,94950,0),(49762,94951,0),(49763,94952,0),(49764,94953,0),(49765,94954,0),(49766,94955,0),(49767,94956,0),(49768,94957,0),(49769,94958,0),(49770,94959,0),(49771,94960,0),(49772,94962,0),(49773,94963,0),(49774,94964,0),(49775,94965,0),(49776,94966,0),(49777,94967,0),(49778,94968,0),(49779,94969,0),(49780,94970,0),(49781,94971,0),(49782,94972,0),(49783,94973,0),(49784,94974,0),(49785,94975,0),(49786,94976,0),(49787,94977,0),(49788,94978,0),(49789,94979,0),(49790,94982,0),(49791,94983,0),(49792,94984,0),(49793,94985,0),(49794,94986,0),(49795,94987,0),(49796,94988,0),(49797,94989,0),(49798,94990,0),(49799,94991,0),(49800,94992,0),(49801,94993,0),(49802,94995,0),(49803,94996,0),(49804,94997,0),(49805,94998,0),(49806,94999,0),(49807,95000,0),(49808,95001,0),(49809,95002,0),(49810,95003,0),(49811,95004,0),(49812,95005,0),(49813,95006,0),(49814,95007,0),(49815,95008,0),(49816,95009,0),(49817,95010,0),(49818,95011,0),(49819,95012,0),(49820,95013,0),(49821,95014,0),(49822,95015,0),(49823,95016,0),(49824,95017,0),(49825,95023,0),(49826,95024,0),(49827,95025,0),(49828,95026,0),(49829,95027,0),(49830,95028,0),(49831,95029,0),(49832,95030,0),(49833,95031,0),(49834,95032,0),(49835,95033,0),(49836,95034,0),(49837,95035,0),(49838,95036,0),(49839,95037,0),(49840,95038,0),(49841,95039,0),(49842,95040,0),(49843,95042,0),(49844,95043,0),(49845,95044,0),(49846,95045,0),(49847,95049,0),(49848,95060,0),(49849,95061,0),(49850,95062,0),(49851,95063,0),(49852,95064,0),(49853,95065,0),(49854,95066,0),(49855,95067,0),(49856,95068,0),(49857,95069,0),(49858,95070,0),(49859,95071,0),(49860,95072,0),(49861,95073,0),(49862,95074,0),(49863,95075,0),(49864,95076,0),(49865,95077,0),(49866,95078,0),(49867,95079,0),(49868,95080,0),(49869,95081,0),(49870,95082,0),(49871,95083,0),(49872,95084,0),(49873,95085,0),(49874,95086,0),(49875,95087,0),(49876,95088,0),(49877,95089,0),(49878,95090,0),(49879,95091,0),(49880,95095,0),(49881,95096,0),(49882,95097,0),(49883,95098,0),(49884,95099,0),(49885,95100,0),(49886,95101,0),(49887,95102,0),(49888,95103,0),(49889,95104,0),(49890,95105,0),(49891,95106,0),(49892,95107,0),(49893,95108,0),(49894,95109,0),(49895,95110,0),(49896,95111,0),(49897,95112,0),(49898,95113,0),(49899,95114,0),(49900,95115,0),(49901,95116,0),(49902,95117,0),(49903,95118,0),(49904,95119,0),(49905,95120,0),(49906,95121,0),(49907,95122,0),(49908,95123,0),(49909,95124,0),(49910,95125,0),(49911,95126,0),(49912,95127,0),(49913,95128,0),(49914,95129,0),(49915,95130,0),(49916,95131,0),(49917,95132,0),(49918,95133,0),(49919,95134,0),(49920,95135,0),(49921,95136,0),(49922,95147,0),(49923,95148,0),(49924,95149,0),(49925,95150,0),(49926,95151,0),(49927,95152,0),(49928,95153,0),(49929,95182,0),(49930,95183,0),(49931,95184,0),(49932,95185,0),(49933,95186,0),(49934,95187,0),(49935,95188,0),(49936,95189,0),(49937,95190,0),(49938,95191,0),(49939,95192,0),(49940,95193,0),(49941,95194,0),(49942,95195,0),(49943,95196,0),(49944,95197,0),(49945,95198,0),(49946,95199,0),(49947,95200,0),(49948,95201,0),(49949,95207,0),(49950,95208,0),(49951,95209,0),(49952,95210,0),(49953,95211,0),(49954,95212,0),(49955,95213,0),(49956,95214,0),(49957,95215,0),(49958,95216,0),(49959,95217,0),(49960,95218,0),(49961,95219,0),(49962,95220,0),(49963,95221,0),(49964,95222,0),(49965,95223,0),(49966,95224,0),(49967,95225,0),(49968,95226,0),(49969,95227,0),(49970,95228,0),(49971,95229,0),(49972,95230,0),(49973,95231,0),(49974,95232,0),(49975,95233,0),(49976,95234,0),(49977,95235,0),(49978,95236,0),(49979,95237,0),(49980,95238,0),(49981,95239,0),(49982,95240,0),(49983,95241,0),(49984,95242,0),(49985,95243,0),(49986,95244,0),(49987,95245,0),(49988,95246,0),(49989,95247,0),(49990,95248,0),(49991,95249,0),(49992,95250,0),(49993,95251,0),(49994,95252,0),(49995,95253,0),(49996,95254,0),(49997,95255,0),(49998,95256,0),(49999,95257,0),(50000,95258,0),(50001,95259,0),(50002,95260,0),(50003,95261,0),(50004,95262,0),(50005,95263,0),(50006,95264,0),(50007,95265,0),(50008,95266,0),(50009,95267,0),(50010,95268,0),(50011,95269,0),(50012,95270,0),(50013,95271,0),(50014,95272,0),(50015,95273,0),(50016,95274,0),(50017,95275,0),(50018,95276,0),(50019,95277,0),(50020,95278,0),(50021,95279,0),(50022,95280,0),(50023,95281,0),(50024,95282,0),(50025,95283,0),(50026,95284,0),(50027,95285,0),(50028,95286,0),(50029,95287,0),(50030,95288,0),(50031,95289,0),(50032,95290,0),(50033,95291,0),(50034,95292,0),(50035,95293,0),(50036,95294,0),(50037,95295,0),(50038,95296,0),(50039,95297,0),(50040,95298,0),(50041,95299,0),(50042,95300,0),(50043,95301,0),(50044,95302,0),(50045,95303,0),(50046,95304,0),(50047,95305,0),(50048,95306,0),(50049,95307,0),(50050,95308,0),(50051,95309,0),(50052,95310,0),(50053,95311,0),(50054,95312,0),(50055,95313,0),(50056,95314,0),(50057,95315,0),(50058,95316,0),(50059,95317,0),(50060,95318,0),(50061,95319,0),(50062,95320,0),(50063,95321,0),(50064,95322,0),(50065,95323,0),(50066,95324,0),(50067,95325,0),(50068,95326,0),(50069,95327,0),(50070,95328,0),(50071,95329,0),(50072,95330,0),(50073,95331,0),(50074,95332,0),(50075,95333,0),(50076,95334,0),(50077,95335,0),(50078,95336,0),(50079,95337,0),(50080,95338,0),(50081,95339,0),(50082,95391,0),(50083,95392,0),(50084,95413,0),(50085,95414,0),(50086,95415,0),(50087,95417,0),(50088,95418,0),(50089,95419,0),(50090,95420,0),(50091,95425,0),(50092,95426,0),(50093,95427,0),(50094,95428,0),(50095,95429,0),(50096,95430,0),(50097,95453,0),(50098,95455,0),(50099,95459,0),(50100,95460,0),(50101,95461,0),(50102,95462,0),(50103,95463,0),(50104,95464,0),(50105,95465,0),(50106,95472,0),(50107,95473,0),(50108,95474,0),(50109,95475,0),(50110,95477,0),(50111,95495,0),(50112,95498,0),(50113,95499,0),(50114,95500,0),(50115,95501,0),(50116,95502,0),(50117,95503,0),(50118,95504,0),(50119,95505,0),(50120,95506,0),(50121,95507,0),(50122,95515,0),(50123,95516,0),(50124,95517,0),(50125,95518,0),(50126,95519,0),(50127,95520,0),(50128,95521,0),(50129,95522,0),(50130,95523,0),(50131,95524,0),(50132,95525,0),(50133,95526,0),(50134,95527,0),(50135,95528,0),(50136,95529,0),(50137,95530,0),(50138,95531,0),(50139,95532,0),(50140,95533,0),(50141,95534,0),(50142,95535,0),(50143,95547,0),(50144,95549,0),(50145,95584,0),(50146,95591,0),(50147,95592,0),(50148,95593,0),(50149,95594,0),(50150,95604,0),(50151,95605,0),(50152,95606,0),(50153,95607,0),(50154,95609,0),(50155,95610,0),(50156,95611,0),(50157,95612,0),(50158,95613,0),(50159,95614,0),(50160,95615,0),(50161,95616,0),(50162,95626,0),(50163,95627,0),(50164,95628,0),(50165,95629,0),(50166,95630,0),(50167,95631,0),(50168,95632,0),(50169,95634,0),(50170,95635,0),(50171,95636,0),(50172,95637,0),(50173,95639,0),(50174,95640,0),(50175,95642,0),(50176,95643,0),(50177,95644,0),(50178,95645,0),(50179,95647,0),(50180,95648,0),(50181,95649,0),(50182,95650,0),(50183,95651,0),(50184,95652,0),(50185,95653,0),(50186,95655,0),(50187,95656,0),(50188,95657,0),(50189,95660,0),(50190,95661,0),(50191,95662,0),(50192,95663,0),(50193,95664,0),(50194,95666,0),(50195,95667,0),(50196,95668,0),(50197,95670,0),(50198,95671,0),(50199,95672,0),(50200,95673,0),(50201,95674,0),(50202,95675,0),(50203,95678,0),(50204,95679,0),(50205,95680,0),(50206,95681,0),(50207,95682,0),(50208,95683,0),(50209,95684,0),(50210,95686,0),(50211,95687,0),(50212,95688,0),(50213,95689,0),(50214,95690,0),(50215,95691,0),(50216,95692,0),(50217,95693,0),(50218,95694,0),(50219,95695,0),(50220,95696,0),(50221,95697,0),(50222,95698,0),(50223,95700,0),(50224,95701,0),(50225,95702,0),(50226,95703,0),(50227,95706,0),(50228,95707,0),(50229,95708,0),(50230,95710,0),(50231,95713,0),(50232,95714,0),(50233,95715,0),(50234,95716,0),(50235,95717,0),(50236,95718,0),(50237,95719,0),(50238,95720,0),(50239,95721,0),(50240,95722,0),(50241,95723,0),(50242,95724,0),(50243,95725,0),(50244,95728,0),(50245,95729,0),(50246,95730,0),(50247,95731,0),(50248,95732,0),(50249,95733,0),(50250,95734,0),(50251,95735,0),(50252,95736,0),(50253,95738,0),(50254,95739,0),(50255,95740,0),(50256,95741,0),(50257,95743,0),(50258,95744,0),(50259,95745,0),(50260,95746,0),(50261,95747,0),(50262,95749,0),(50263,95750,0),(50264,95751,0),(50265,95752,0),(50266,95753,0),(50267,95754,0),(50268,95755,0),(50269,95758,0),(50270,95759,0),(50271,95760,0),(50272,95761,0),(50273,95762,0),(50274,95764,0),(50275,95765,0),(50276,95766,0),(50277,95767,0),(50278,95768,0),(50279,95770,0),(50280,95771,0),(50281,95773,0),(50282,95774,0),(50283,95775,0),(50284,95776,0),(50285,95777,0),(50286,95778,0),(50287,95780,0),(50288,95781,0),(50289,95782,0),(50290,95783,0),(50291,95784,0),(50292,95786,0),(50293,95787,0),(50294,95788,0),(50295,95789,0),(50296,95790,0),(50297,95791,0),(50298,95792,0),(50299,95794,0),(50300,95795,0),(50301,95796,0),(50302,95797,0),(50303,95798,0),(50304,95801,0),(50305,95803,0),(50306,95804,0),(50307,95805,0),(50308,95806,0),(50309,95807,0),(50310,95808,0),(50311,95809,0),(50312,95810,0),(50313,95812,0),(50314,95813,0),(50315,95815,0),(50316,95818,0),(50317,95819,0),(50318,95820,0),(50319,95821,0),(50320,95825,0),(50321,95826,0),(50322,95827,0),(50323,95828,0),(50324,95829,0),(50325,95830,0),(50326,95831,0),(50327,95832,0),(50328,95833,0),(50329,95834,0),(50330,95835,0),(50331,95836,0),(50332,95837,0),(50333,95838,0),(50334,95839,0),(50335,95840,0),(50336,95841,0),(50337,95842,0),(50338,95843,0),(50339,95844,0),(50340,95845,0),(50341,95846,0),(50342,95847,0),(50343,95848,0),(50344,95849,0),(50345,95850,0),(50346,95851,0),(50347,95852,0),(50348,95853,0),(50349,95854,0),(50350,95858,0),(50351,95859,0),(50352,95860,0),(50353,95861,0),(50354,95862,0),(50355,95863,0),(50356,95864,0),(50357,95865,0),(50358,95866,0),(50359,95867,0),(50360,95868,0),(50361,95869,0),(50362,95870,0),(50363,95871,0),(50364,95872,0),(50365,95873,0),(50366,95874,0),(50367,95875,0),(50368,95876,0),(50369,95877,0),(50370,95878,0),(50371,95882,0),(50372,95883,0),(50373,95884,0),(50374,95885,0),(50375,95886,0),(50376,95890,0),(50377,95891,0),(50378,95892,0),(50379,95893,0),(50380,95894,0),(50381,95895,0),(50382,95896,0),(50383,95897,0),(50384,95898,0),(50385,95899,0),(50386,95900,0),(50387,95901,0),(50388,95902,0),(50389,95903,0),(50390,95904,0),(50391,95905,0),(50392,95906,0),(50393,95907,0),(50394,95908,0),(50395,95909,0),(50396,95910,0),(50397,95911,0),(50398,95912,0),(50399,95913,0),(50400,95914,0),(50401,95915,0),(50402,95916,0),(50403,95917,0),(50404,95918,0),(50405,95919,0),(50406,95920,0),(50407,95921,0),(50408,95922,0),(50409,95923,0),(50410,95924,0),(50411,95925,0),(50412,95926,0),(50413,95927,0),(50414,95928,0),(50415,95929,0),(50416,95930,0),(50417,95931,0),(50418,95932,0),(50419,95933,0),(50420,95934,0),(50421,95935,0),(50422,95936,0),(50423,95937,0),(50424,95938,0),(50425,95939,0),(50426,95940,0),(50427,95941,0),(50428,95942,0),(50429,95943,0),(50430,95944,0),(50431,95945,0),(50432,95946,0),(50433,95947,0),(50434,95948,0),(50435,95949,0),(50436,95950,0),(50437,95951,0),(50438,95952,0),(50439,95953,0),(50440,95954,0),(50441,95959,0),(50442,95960,0),(50443,95961,0),(50444,95962,0),(50445,95963,0),(50446,95965,0),(50447,95966,0),(50448,95967,0),(50449,95968,0),(50450,95970,0),(50451,95971,0),(50452,95972,0),(50453,95973,0),(50454,95974,0),(50455,95975,0),(50456,95976,0),(50457,95978,0),(50458,95979,0),(50459,95981,0),(50460,95982,0),(50461,95983,0),(50462,95984,0),(50463,95985,0),(50464,95986,0),(50465,95987,0),(50466,95988,0),(50467,95989,0),(50468,95990,0),(50469,95991,0),(50470,95992,0),(50471,95993,0),(50472,95994,0),(50473,95995,0),(50474,95998,0),(50475,95999,0),(50476,96000,0),(50477,96001,0),(50478,96002,0),(50479,96003,0),(50480,96004,0),(50481,96006,0),(50482,96007,0),(50483,96008,0),(50484,96009,0),(50485,96011,0),(50486,96012,0),(50487,96014,0),(50488,96015,0),(50489,96016,0),(50490,96017,0),(50491,96019,0),(50492,96020,0),(50493,96021,0),(50494,96022,0),(50495,96023,0),(50496,96024,0),(50497,96025,0),(50498,96027,0),(50499,96028,0),(50500,96029,0),(50501,96032,0),(50502,96033,0),(50503,96034,0),(50504,96035,0),(50505,96036,0),(50506,96038,0),(50507,96039,0),(50508,96040,0),(50509,96042,0),(50510,96043,0),(50511,96044,0),(50512,96045,0),(50513,96046,0),(50514,96047,0),(50515,96050,0),(50516,96051,0),(50517,96052,0),(50518,96053,0),(50519,96054,0),(50520,96055,0),(50521,96056,0),(50522,96058,0),(50523,96059,0),(50524,96060,0),(50525,96061,0),(50526,96062,0),(50527,96063,0),(50528,96064,0),(50529,96065,0),(50530,96066,0),(50531,96067,0),(50532,96068,0),(50533,96069,0),(50534,96070,0),(50535,96072,0),(50536,96073,0),(50537,96074,0),(50538,96075,0),(50539,96078,0),(50540,96079,0),(50541,96080,0),(50542,96082,0),(50543,96085,0),(50544,96086,0),(50545,96087,0),(50546,96088,0),(50547,96089,0),(50548,96090,0),(50549,96091,0),(50550,96092,0),(50551,96093,0),(50552,96094,0),(50553,96095,0),(50554,96096,0),(50555,96097,0),(50556,96100,0),(50557,96101,0),(50558,96102,0),(50559,96103,0),(50560,96104,0),(50561,96105,0),(50562,96106,0),(50563,96107,0),(50564,96108,0),(50565,96110,0),(50566,96111,0),(50567,96112,0),(50568,96113,0),(50569,96115,0),(50570,96116,0),(50571,96117,0),(50572,96118,0),(50573,96119,0),(50574,96121,0),(50575,96122,0),(50576,96123,0),(50577,96124,0),(50578,96125,0),(50579,96126,0),(50580,96127,0),(50581,96130,0),(50582,96131,0),(50583,96132,0),(50584,96133,0),(50585,96134,0),(50586,96136,0),(50587,96137,0),(50588,96138,0),(50589,96139,0),(50590,96140,0),(50591,96142,0),(50592,96143,0),(50593,96145,0),(50594,96146,0),(50595,96147,0),(50596,96148,0),(50597,96149,0),(50598,96150,0),(50599,96152,0),(50600,96153,0),(50601,96154,0),(50602,96155,0),(50603,96156,0),(50604,96158,0),(50605,96159,0),(50606,96160,0),(50607,96161,0),(50608,96162,0),(50609,96163,0),(50610,96164,0),(50611,96166,0),(50612,96167,0),(50613,96168,0),(50614,96169,0),(50615,96170,0),(50616,96173,0),(50617,96175,0),(50618,96176,0),(50619,96177,0),(50620,96178,0),(50621,96179,0),(50622,96180,0),(50623,96181,0),(50624,96182,0),(50625,96184,0),(50626,96185,0),(50627,96187,0),(50628,96190,0),(50629,96191,0),(50630,96192,0),(50631,96193,0),(50632,96197,0),(50633,96198,0),(50634,96199,0),(50635,96200,0),(50636,96201,0),(50637,96202,0),(50638,96203,0),(50639,96204,0),(50640,96205,0),(50641,96206,0),(50642,96207,0),(50643,96208,0),(50644,96209,0),(50645,96210,0),(50646,96211,0),(50647,96212,0),(50648,96213,0),(50649,96214,0),(50650,96215,0),(50651,96216,0),(50652,96217,0),(50653,96218,0),(50654,96219,0),(50655,96220,0),(50656,96221,0),(50657,96222,0),(50658,96223,0),(50659,96224,0),(50660,96225,0),(50661,96226,0),(50662,96230,0),(50663,96231,0),(50664,96232,0),(50665,96233,0),(50666,96234,0),(50667,96235,0),(50668,96236,0),(50669,96237,0),(50670,96238,0),(50671,96239,0),(50672,96240,0),(50673,96241,0),(50674,96242,0),(50675,96243,0),(50676,96244,0),(50677,96245,0),(50678,96246,0),(50679,96247,0),(50680,96248,0),(50681,96249,0),(50682,96250,0),(50683,96254,0),(50684,96255,0),(50685,96256,0),(50686,96257,0),(50687,96258,0),(50688,96262,0),(50689,96263,0),(50690,96264,0),(50691,96265,0),(50692,96266,0),(50693,96267,0),(50694,96268,0),(50695,96269,0),(50696,96270,0),(50697,96271,0),(50698,96272,0),(50699,96273,0),(50700,96274,0),(50701,96275,0),(50702,96276,0),(50703,96277,0),(50704,96278,0),(50705,96279,0),(50706,96280,0),(50707,96281,0),(50708,96282,0),(50709,96283,0),(50710,96284,0),(50711,96285,0),(50712,96286,0),(50713,96287,0),(50714,96288,0),(50715,96289,0),(50716,96290,0),(50717,96291,0),(50718,96292,0),(50719,96293,0),(50720,96294,0),(50721,96295,0),(50722,96296,0),(50723,96297,0),(50724,96298,0),(50725,96299,0),(50726,96300,0),(50727,96301,0),(50728,96302,0),(50729,96303,0),(50730,96304,0),(50731,96305,0),(50732,96306,0),(50733,96307,0),(50734,96308,0),(50735,96309,0),(50736,96310,0),(50737,96311,0),(50738,96312,0),(50739,96313,0),(50740,96314,0),(50741,96315,0),(50742,96316,0),(50743,96317,0),(50744,96318,0),(50745,96319,0),(50746,96320,0),(50747,96321,0),(50748,96322,0),(50749,96323,0),(50750,96324,0),(50751,96325,0),(50752,96326,0),(50753,96331,0),(50754,96332,0),(50755,96333,0),(50756,96334,0),(50757,96335,0),(50758,96337,0),(50759,96338,0),(50760,96339,0),(50761,96340,0),(50762,96342,0),(50763,96343,0),(50764,96344,0),(50765,96345,0),(50766,96346,0),(50767,96347,0),(50768,96348,0),(50769,96350,0),(50770,96351,0),(50771,96353,0),(50772,96354,0),(50773,96355,0),(50774,96356,0),(50775,96357,0),(50776,96358,0),(50777,96359,0),(50778,96360,0),(50779,96361,0),(50780,96362,0),(50781,96363,0),(50782,96364,0),(50783,96365,0),(50784,96366,0),(50785,96367,0),(50786,96370,0),(50787,96371,0),(50788,96372,0),(50789,96373,0),(50790,96374,0),(50791,96375,0),(50792,96376,0),(50793,96378,0),(50794,96379,0),(50795,96380,0),(50796,96381,0),(50797,96383,0),(50798,96384,0),(50799,96386,0),(50800,96387,0),(50801,96388,0),(50802,96389,0),(50803,96391,0),(50804,96392,0),(50805,96393,0),(50806,96394,0),(50807,96395,0),(50808,96396,0),(50809,96397,0),(50810,96399,0),(50811,96400,0),(50812,96401,0),(50813,96404,0),(50814,96405,0),(50815,96406,0),(50816,96407,0),(50817,96408,0),(50818,96410,0),(50819,96411,0),(50820,96412,0),(50821,96414,0),(50822,96415,0),(50823,96416,0),(50824,96417,0),(50825,96418,0),(50826,96419,0),(50827,96422,0),(50828,96423,0),(50829,96424,0),(50830,96425,0),(50831,96426,0),(50832,96427,0),(50833,96428,0),(50834,96430,0),(50835,96431,0),(50836,96432,0),(50837,96433,0),(50838,96434,0),(50839,96435,0),(50840,96436,0),(50841,96437,0),(50842,96438,0),(50843,96439,0),(50844,96440,0),(50845,96441,0),(50846,96442,0),(50847,96444,0),(50848,96445,0),(50849,96446,0),(50850,96447,0),(50851,96450,0),(50852,96451,0),(50853,96452,0),(50854,96454,0),(50855,96457,0),(50856,96458,0),(50857,96459,0),(50858,96460,0),(50859,96461,0),(50860,96462,0),(50861,96463,0),(50862,96464,0),(50863,96465,0),(50864,96466,0),(50865,96467,0),(50866,96468,0),(50867,96469,0),(50868,96472,0),(50869,96473,0),(50870,96474,0),(50871,96475,0),(50872,96476,0),(50873,96477,0),(50874,96478,0),(50875,96479,0),(50876,96480,0),(50877,96482,0),(50878,96483,0),(50879,96484,0),(50880,96485,0),(50881,96487,0),(50882,96488,0),(50883,96489,0),(50884,96490,0),(50885,96491,0),(50886,96493,0),(50887,96494,0),(50888,96495,0),(50889,96496,0),(50890,96497,0),(50891,96498,0),(50892,96499,0),(50893,96502,0),(50894,96503,0),(50895,96504,0),(50896,96505,0),(50897,96506,0),(50898,96508,0),(50899,96509,0),(50900,96510,0),(50901,96511,0),(50902,96512,0),(50903,96514,0),(50904,96515,0),(50905,96517,0),(50906,96518,0),(50907,96519,0),(50908,96520,0),(50909,96521,0),(50910,96522,0),(50911,96524,0),(50912,96525,0),(50913,96526,0),(50914,96527,0),(50915,96528,0),(50916,96530,0),(50917,96531,0),(50918,96532,0),(50919,96533,0),(50920,96534,0),(50921,96535,0),(50922,96536,0),(50923,96538,0),(50924,96539,0),(50925,96540,0),(50926,96541,0),(50927,96542,0),(50928,96545,0),(50929,96547,0),(50930,96548,0),(50931,96549,0),(50932,96550,0),(50933,96551,0),(50934,96552,0),(50935,96553,0),(50936,96554,0),(50937,96556,0),(50938,96557,0),(50939,96559,0),(50940,96562,0),(50941,96563,0),(50942,96564,0),(50943,96565,0),(50944,96569,0),(50945,96570,0),(50946,96571,0),(50947,96572,0),(50948,96573,0),(50949,96574,0),(50950,96575,0),(50951,96576,0),(50952,96577,0),(50953,96578,0),(50954,96579,0),(50955,96580,0),(50956,96581,0),(50957,96582,0),(50958,96583,0),(50959,96584,0),(50960,96585,0),(50961,96586,0),(50962,96587,0),(50963,96588,0),(50964,96589,0),(50965,96590,0),(50966,96591,0),(50967,96592,0),(50968,96593,0),(50969,96594,0),(50970,96595,0),(50971,96596,0),(50972,96597,0),(50973,96598,0),(50974,96602,0),(50975,96603,0),(50976,96604,0),(50977,96605,0),(50978,96606,0),(50979,96607,0),(50980,96608,0),(50981,96609,0),(50982,96610,0),(50983,96611,0),(50984,96612,0),(50985,96613,0),(50986,96614,0),(50987,96615,0),(50988,96616,0),(50989,96617,0),(50990,96618,0),(50991,96619,0),(50992,96620,0),(50993,96621,0),(50994,96622,0),(50995,96626,0),(50996,96627,0),(50997,96628,0),(50998,96629,0),(50999,96630,0),(51000,96634,0),(51001,96635,0),(51002,96636,0),(51003,96637,0),(51004,96638,0),(51005,96639,0),(51006,96640,0),(51007,96641,0),(51008,96642,0),(51009,96643,0),(51010,96644,0),(51011,96645,0),(51012,96646,0),(51013,96647,0),(51014,96648,0),(51015,96649,0),(51016,96650,0),(51017,96651,0),(51018,96652,0),(51019,96653,0),(51020,96654,0),(51021,96655,0),(51022,96656,0),(51023,96657,0),(51024,96658,0),(51025,96659,0),(51026,96660,0),(51027,96661,0),(51028,96662,0),(51029,96663,0),(51030,96664,0),(51031,96665,0),(51032,96666,0),(51033,96667,0),(51034,96668,0),(51035,96669,0),(51036,96670,0),(51037,96671,0),(51038,96672,0),(51039,96673,0),(51040,96674,0),(51041,96675,0),(51042,96676,0),(51043,96677,0),(51044,96678,0),(51045,96679,0),(51046,96680,0),(51047,96681,0),(51048,96682,0),(51049,96683,0),(51050,96684,0),(51051,96685,0),(51052,96686,0),(51053,96687,0),(51054,96688,0),(51055,96689,0),(51056,96690,0),(51057,96691,0),(51058,96692,0),(51059,96693,0),(51060,96694,0),(51061,96695,0),(51062,96696,0),(51063,96697,0),(51064,96698,0),(51065,96703,0),(51066,96704,0),(51067,96705,0),(51068,96706,0),(51069,96707,0),(51070,96709,0),(51071,96710,0),(51072,96711,0),(51073,96712,0),(51074,96714,0),(51075,96715,0),(51076,96716,0),(51077,96717,0),(51078,96718,0),(51079,96719,0),(51080,96720,0),(51081,96722,0),(51082,96723,0),(51083,96725,0),(51084,96726,0),(51085,96727,0),(51086,96728,0),(51087,96729,0),(51088,96730,0),(51089,96731,0),(51090,96732,0),(51091,96733,0),(51092,96734,0),(51093,96735,0),(51094,96736,0),(51095,96737,0),(51096,96738,0),(51097,96739,0),(51098,96742,0),(51099,96743,0),(51100,96744,0),(51101,96745,0),(51102,96746,0),(51103,96747,0),(51104,96748,0),(51105,96750,0),(51106,96751,0),(51107,96752,0),(51108,96753,0),(51109,96755,0),(51110,96756,0),(51111,96758,0),(51112,96759,0),(51113,96760,0),(51114,96761,0),(51115,96763,0),(51116,96764,0),(51117,96765,0),(51118,96766,0),(51119,96767,0),(51120,96768,0),(51121,96769,0),(51122,96771,0),(51123,96772,0),(51124,96773,0),(51125,96776,0),(51126,96777,0),(51127,96778,0),(51128,96779,0),(51129,96780,0),(51130,96782,0),(51131,96783,0),(51132,96784,0),(51133,96786,0),(51134,96787,0),(51135,96788,0),(51136,96789,0),(51137,96790,0),(51138,96791,0),(51139,96794,0),(51140,96795,0),(51141,96796,0),(51142,96797,0),(51143,96798,0),(51144,96799,0),(51145,96800,0),(51146,96802,0),(51147,96803,0),(51148,96804,0),(51149,96805,0),(51150,96806,0),(51151,96807,0),(51152,96808,0),(51153,96809,0),(51154,96810,0),(51155,96811,0),(51156,96812,0),(51157,96813,0),(51158,96814,0),(51159,96816,0),(51160,96817,0),(51161,96818,0),(51162,96819,0),(51163,96822,0),(51164,96823,0),(51165,96824,0),(51166,96826,0),(51167,96829,0),(51168,96830,0),(51169,96831,0),(51170,96832,0),(51171,96833,0),(51172,96834,0),(51173,96835,0),(51174,96836,0),(51175,96837,0),(51176,96838,0),(51177,96839,0),(51178,96840,0),(51179,96841,0),(51180,96844,0),(51181,96845,0),(51182,96846,0),(51183,96847,0),(51184,96848,0),(51185,96849,0),(51186,96850,0),(51187,96851,0),(51188,96852,0),(51189,96854,0),(51190,96855,0),(51191,96856,0),(51192,96857,0),(51193,96859,0),(51194,96860,0),(51195,96861,0),(51196,96862,0),(51197,96863,0),(51198,96865,0),(51199,96866,0),(51200,96867,0),(51201,96868,0),(51202,96869,0),(51203,96870,0),(51204,96871,0),(51205,96874,0),(51206,96875,0),(51207,96876,0),(51208,96877,0),(51209,96878,0),(51210,96880,0),(51211,96881,0),(51212,96882,0),(51213,96883,0),(51214,96884,0),(51215,96886,0),(51216,96887,0),(51217,96889,0),(51218,96890,0),(51219,96891,0),(51220,96892,0),(51221,96893,0),(51222,96894,0),(51223,96896,0),(51224,96897,0),(51225,96898,0),(51226,96899,0),(51227,96900,0),(51228,96902,0),(51229,96903,0),(51230,96904,0),(51231,96905,0),(51232,96906,0),(51233,96907,0),(51234,96908,0),(51235,96910,0),(51236,96911,0),(51237,96912,0),(51238,96913,0),(51239,96914,0),(51240,96917,0),(51241,96919,0),(51242,96920,0),(51243,96921,0),(51244,96922,0),(51245,96923,0),(51246,96924,0),(51247,96925,0),(51248,96926,0),(51249,96928,0),(51250,96929,0),(51251,96931,0),(51252,96934,0),(51253,96935,0),(51254,96936,0),(51255,96937,0),(51256,96941,0),(51257,96942,0),(51258,96943,0),(51259,96944,0),(51260,96945,0),(51261,96946,0),(51262,96947,0),(51263,96948,0),(51264,96949,0),(51265,96950,0),(51266,96951,0),(51267,96952,0),(51268,96953,0),(51269,96954,0),(51270,96955,0),(51271,96956,0),(51272,96957,0),(51273,96958,0),(51274,96959,0),(51275,96960,0),(51276,96961,0),(51277,96962,0),(51278,96963,0),(51279,96964,0),(51280,96965,0),(51281,96966,0),(51282,96967,0),(51283,96968,0),(51284,96969,0),(51285,96970,0),(51286,96974,0),(51287,96975,0),(51288,96976,0),(51289,96977,0),(51290,96978,0),(51291,96979,0),(51292,96980,0),(51293,96981,0),(51294,96982,0),(51295,96983,0),(51296,96984,0),(51297,96985,0),(51298,96986,0),(51299,96987,0),(51300,96988,0),(51301,96989,0),(51302,96990,0),(51303,96991,0),(51304,96992,0),(51305,96993,0),(51306,96994,0),(51307,96998,0),(51308,96999,0),(51309,97000,0),(51310,97001,0),(51311,97002,0),(51312,97006,0),(51313,97007,0),(51314,97008,0),(51315,97009,0),(51316,97010,0),(51317,97011,0),(51318,97012,0),(51319,97013,0),(51320,97014,0),(51321,97015,0),(51322,97016,0),(51323,97017,0),(51324,97018,0),(51325,97019,0),(51326,97020,0),(51327,97021,0),(51328,97022,0),(51329,97023,0),(51330,97024,0),(51331,97025,0),(51332,97026,0),(51333,97027,0),(51334,97028,0),(51335,97029,0),(51336,97030,0),(51337,97031,0),(51338,97032,0),(51339,97033,0),(51340,97034,0),(51341,97035,0),(51342,97036,0),(51343,97037,0),(51344,97038,0),(51345,97039,0),(51346,97040,0),(51347,97041,0),(51348,97042,0),(51349,97043,0),(51350,97044,0),(51351,97045,0),(51352,97046,0),(51353,97047,0),(51354,97048,0),(51355,97049,0),(51356,97050,0),(51357,97051,0),(51358,97052,0),(51359,97053,0),(51360,97054,0),(51361,97055,0),(51362,97056,0),(51363,97057,0),(51364,97058,0),(51365,97059,0),(51366,97060,0),(51367,97061,0),(51368,97062,0),(51369,97063,0),(51370,97064,0),(51371,97065,0),(51372,97066,0),(51373,97067,0),(51374,97068,0),(51375,97069,0),(51376,97070,0),(51377,97075,0),(51378,97076,0),(51379,97077,0),(51380,97078,0),(51381,97079,0),(51382,97081,0),(51383,97082,0),(51384,97083,0),(51385,97084,0),(51386,97086,0),(51387,97087,0),(51388,97088,0),(51389,97089,0),(51390,97090,0),(51391,97091,0),(51392,97092,0),(51393,97094,0),(51394,97095,0),(51395,97097,0),(51396,97098,0),(51397,97099,0),(51398,97100,0),(51399,97101,0),(51400,97102,0),(51401,97103,0),(51402,97104,0),(51403,97105,0),(51404,97106,0),(51405,97107,0),(51406,97108,0),(51407,97109,0),(51408,97110,0),(51409,97111,0),(51410,97112,0),(51411,97125,0),(51412,97126,0),(51413,97127,0),(51414,97128,0),(51415,97129,0),(51416,97130,0),(51417,97131,0),(51418,97136,0),(51419,97137,0),(51420,97138,0),(51421,97139,0),(51422,97162,0),(51423,97203,0),(51424,97204,0),(51425,97205,0),(51426,97206,0),(51427,97207,0),(51428,97208,0),(51429,97209,0),(51430,97210,0),(51431,97211,0),(51432,97212,0),(51433,97213,0),(51434,97214,0),(51435,97215,0),(51436,97216,0),(51437,97217,0),(51438,97218,0),(51439,97219,0),(51440,97220,0),(51441,97221,0),(51442,97222,0),(51443,97223,0),(51444,97224,0),(51445,97225,0),(51446,97226,0),(51447,97227,0),(51448,97228,0),(51449,97229,0),(51450,97235,0),(51451,97236,0),(51452,97237,0),(51453,97238,0),(51454,97240,0),(51455,97241,0),(51456,97242,0),(51457,97243,0),(51458,97257,0),(51459,97259,0),(51460,97260,0),(51461,97261,0),(51462,97262,0),(51463,97263,0),(51464,97264,0),(51465,97265,0),(51466,97266,0),(51467,97290,0),(51468,97292,0),(51469,97293,0),(51470,97294,0),(51471,97295,0),(51472,97296,0),(51473,97297,0),(51474,97298,0),(51475,97299,0),(51476,97300,0),(51477,97301,0),(51478,97314,0),(51479,97315,0),(51480,97316,0),(51481,97317,0),(51482,97446,0),(51483,97447,0),(51484,97448,0),(51485,97449,0),(51486,97457,0),(51487,97459,0),(51488,97460,0),(51489,97461,0),(51490,97462,0),(51491,97463,0),(51492,97464,0),(51493,97465,0),(51494,97466,0),(51495,97467,0),(51496,97468,0),(51497,97469,0),(51498,97470,0),(51499,97471,0),(51500,97472,0),(51501,97473,0),(51502,97474,0),(51503,97478,0),(51504,97479,0),(51505,97480,0),(51506,97481,0),(51507,97482,0),(51508,97483,0),(51509,97484,0),(51510,97485,0),(51511,97486,0),(51512,97487,0),(51513,97488,0),(51514,97489,0),(51515,97490,0),(51516,97491,0),(51517,97492,0),(51518,97493,0),(51519,97494,0),(51520,97495,0),(51521,97496,0),(51522,97497,0),(51523,97498,0),(51524,97499,0),(51525,97500,0),(51526,97501,0),(51527,97502,0),(51528,97503,0),(51529,97504,0),(51530,97505,0),(51531,97506,0),(51532,97507,0),(51533,97508,0),(51534,97509,0),(51535,97510,0),(51536,97515,0),(51537,97517,0),(51538,97518,0),(51539,97520,0),(51540,97521,0),(51541,97522,0),(51542,97523,0),(51543,97525,0),(51544,97526,0),(51545,97562,0),(51546,97567,0),(51547,97568,0),(51548,97569,0),(51549,97570,0),(51550,97571,0),(51551,97572,0),(51552,97573,0),(51553,97574,0),(51554,97575,0),(51555,97576,0),(51556,97577,0),(51557,97578,0),(51558,97579,0),(51559,97580,0),(51560,97581,0),(51561,97582,0),(51562,97583,0),(51563,97584,0),(51564,97585,0),(51565,97586,0),(51566,97587,0),(51567,97588,0),(51568,97589,0),(51569,97590,0),(51570,97591,0),(51571,97592,0),(51572,97593,0),(51573,97594,0),(51574,97595,0),(51575,97596,0),(51576,97597,0),(51577,97598,0),(51578,97599,0),(51579,97600,0),(51580,97601,0),(51581,97602,0),(51582,97603,0),(51583,97604,0),(51584,97605,0),(51585,97606,0),(51586,97607,0),(51587,97608,0),(51588,97609,0),(51589,97610,0),(51590,97611,0),(51591,97612,0),(51592,97613,0),(51593,97614,0),(51594,97615,0),(51595,97616,0),(51596,97617,0),(51597,97618,0),(51598,97625,0),(51599,97626,0),(51600,97627,0),(51601,97628,0),(51602,97629,0),(51603,97630,0),(51604,97631,0),(51605,97632,0),(51606,97633,0),(51607,97634,0),(51608,97635,0),(51609,97636,0),(51610,97637,0),(51611,97638,0),(51612,97639,0),(51613,97640,0),(51614,97641,0),(51615,97642,0),(51616,97643,0),(51617,97644,0),(51618,97645,0),(51619,97646,0),(51620,97647,0),(51621,97648,0),(51622,97649,0),(51623,97650,0),(51624,97651,0),(51625,97652,0),(51626,97653,0),(51627,97654,0),(51628,97655,0),(51629,97656,0),(51630,97657,0),(51631,97658,0),(51632,97659,0),(51633,97660,0),(51634,97661,0),(51635,97662,0),(51636,97663,0),(51637,97664,0),(51638,97665,0),(51639,97666,0),(51640,97667,0),(51641,97668,0),(51642,97669,0),(51643,97670,0),(51644,97671,0),(51645,97672,0),(51646,97673,0),(51647,97674,0),(51648,97675,0),(51649,97676,0),(51650,97677,0),(51651,97678,0),(51652,97679,0),(51653,97680,0),(51654,97681,0),(51655,97682,0),(51656,97683,0),(51657,97684,0),(51658,97685,0),(51659,97686,0),(51660,97687,0),(51661,97688,0),(51662,97689,0),(51663,97690,0),(51664,97691,0),(51665,97692,0),(51666,97693,0),(51667,97695,0),(51668,97696,0),(51669,97698,0),(51670,97699,0),(51671,97700,0),(51672,97701,0),(51673,97702,0),(51674,97703,0),(51675,97704,0),(51676,97705,0),(51677,97706,0),(51678,97707,0),(51679,97708,0),(51680,97709,0),(51681,97710,0),(51682,97711,0),(51683,97712,0),(51684,97713,0),(51685,97714,0),(51686,97715,0),(51687,97716,0),(51688,97717,0),(51689,97718,0),(51690,97719,0),(51691,97720,0),(51692,97721,0),(51693,97722,0),(51694,97723,0),(51695,97724,0),(51696,97725,0),(51697,97726,0),(51698,97727,0),(51699,97728,0),(51700,97733,0),(51701,97734,0),(51702,97735,0),(51703,97736,0),(51704,97737,0),(51705,97738,0),(51706,97739,0),(51707,97740,0),(51708,97741,0),(51709,97742,0),(51710,97743,0),(51711,97744,0),(51712,97745,0),(51713,97746,0),(51714,97747,0),(51715,97748,0),(51716,97749,0),(51717,97750,0),(51718,97751,0),(51719,97752,0),(51720,97753,0),(51721,97754,0),(51722,97755,0),(51723,97756,0),(51724,97757,0),(51725,97758,0),(51726,97759,0),(51727,97760,0),(51728,97761,0),(51729,97762,0),(51730,97763,0),(51731,97764,0),(51732,97765,0),(51733,97766,0),(51734,97767,0),(51735,97768,0),(51736,97769,0),(51737,97770,0),(51738,97771,0),(51739,97772,0),(51740,97773,0),(51741,97774,0),(51742,97775,0),(51743,97776,0),(51744,97777,0),(51745,97778,0),(51746,97779,0),(51747,97780,0),(51748,97781,0),(51749,97782,0),(51750,97783,0),(51751,97784,0),(51752,97785,0),(51753,97786,0),(51754,97787,0),(51755,97788,0),(51756,97789,0),(51757,97790,0),(51758,97791,0),(51759,97792,0),(51760,97793,0),(51761,97794,0),(51762,97795,0),(51763,97796,0),(51764,97797,0),(51765,97798,0),(51766,97799,0),(51767,97800,0),(51768,97801,0),(51769,97802,0),(51770,97803,0),(51771,97804,0),(51772,97805,0),(51773,97806,0),(51774,97807,0),(51775,97808,0),(51776,97809,0),(51777,97810,0),(51778,97811,0),(51779,97812,0),(51780,97813,0),(51781,97814,0),(51782,97815,0),(51783,97816,0),(51784,97817,0),(51785,97818,0),(51786,97819,0),(51787,97820,0),(51788,97822,0),(51789,97823,0),(51790,97824,0),(51791,97825,0),(51792,97833,0),(51793,97835,0),(51794,97836,0),(51795,97837,0),(51796,97838,0),(51797,97839,0),(51798,97840,0),(51799,97841,0),(51800,97842,0),(51801,97846,0),(51802,97847,0),(51803,97851,0),(51804,97852,0),(51805,97853,0),(51806,97855,0),(51807,97856,0),(51808,97858,0),(51809,97860,0),(51810,97865,0),(51811,97866,0),(51812,97867,0),(51813,97868,0),(51814,97869,0),(51815,97870,0),(51816,97871,0),(51817,97872,0),(51818,97873,0),(51819,97875,0),(51820,97901,0),(51821,97922,0),(51822,97923,0),(51823,97925,0),(51824,97926,0),(51825,97927,0),(51826,97928,0),(51827,97929,0),(51828,97930,0),(51829,97931,0),(51830,97932,0),(51831,97944,0),(51832,97945,0),(51833,98000,0),(51834,98006,0),(51835,98008,0),(51836,98009,0),(51837,98010,0),(51838,98011,0),(51839,98012,0),(51840,98013,0),(51841,98014,0),(51842,98015,0),(51843,98016,0),(51844,98030,0),(51845,98042,0),(51846,98043,0),(51847,98044,0),(51848,98045,0),(51849,98046,0),(51850,98047,0),(51851,98052,0),(51852,98053,0),(51853,98054,0),(51854,98055,0),(51855,98064,0),(51856,98066,0),(51857,98067,0),(51858,98068,0),(51859,98069,0),(51860,98070,0),(51861,98071,0),(51862,98072,0),(51863,98073,0),(51864,98079,0),(51865,98080,0),(51866,98081,0),(51867,98082,0),(51868,98083,0),(51869,98084,0),(51870,98085,0),(51871,98086,0),(51872,98087,0),(51873,98091,0),(51874,98092,0),(51875,98093,0),(51876,98105,0),(51877,98106,0),(51878,98107,0),(51879,98108,0),(51880,98109,0),(51881,98110,0),(51882,98129,0),(51883,98130,0),(51884,98137,0),(51885,98138,0),(51886,98139,0),(51887,98140,0),(51888,98141,0),(51889,98142,0),(51890,98143,0),(51891,98144,0),(51892,98145,0),(51893,98146,0),(51894,98147,0),(51895,98148,0),(51896,98149,0),(51897,98150,0),(51898,98155,0),(51899,98162,0),(51900,98165,0),(51901,98166,0),(51902,98167,0),(51903,98168,0),(51904,98169,0),(51905,98172,0),(51906,98173,0),(51907,98174,0),(51908,98175,0),(51909,98176,0),(51910,98177,0),(51911,98178,0),(51912,98179,0),(51913,98180,0),(51914,98181,0),(51915,98182,0),(51916,98183,0),(51917,98184,0),(51918,98185,0),(51919,98186,0),(51920,98187,0),(51921,98188,0),(51922,98191,0),(51923,98192,0),(51924,98193,0),(51925,98194,0),(51926,98195,0),(51927,98196,0),(51928,98197,0),(51929,98198,0),(51930,98199,0),(51931,98202,0),(51932,98203,0),(51933,98204,0),(51934,98205,0),(51935,98206,0),(51936,98207,0),(51937,98208,0),(51938,98209,0),(51939,98210,0),(51940,98211,0),(51941,98212,0),(51942,98213,0),(51943,98214,0),(51944,98215,0),(51945,98216,0),(51946,98217,0),(51947,98218,0),(51948,98219,0),(51949,98220,0),(51950,98221,0),(51951,98222,0),(51952,98223,0),(51953,98224,0),(51954,98225,0),(51955,98226,0),(51956,98227,0),(51957,98228,0),(51958,98229,0),(51959,98230,0),(51960,98231,0),(51961,98232,0),(51962,98233,0),(51963,98234,0),(51964,98237,0),(51965,98239,0),(51966,98240,0),(51967,98241,0),(51968,98242,0),(51969,98243,0),(51970,98244,0),(51971,98245,0),(51972,98246,0),(51973,98248,0),(51974,98250,0),(51975,98251,0),(51976,98252,0),(51977,98253,0),(51978,98254,0),(51979,98255,0),(51980,98256,0),(51981,98257,0),(51982,98260,0),(51983,98261,0),(51984,98262,0),(51985,98263,0),(51986,98264,0),(51987,98265,0),(51988,98266,0),(51989,98267,0),(51990,98268,0),(51991,98269,0),(51992,98270,0),(51993,98271,0),(51994,98272,0),(51995,98273,0),(51996,98274,0),(51997,98275,0),(51998,98276,0),(51999,98277,0),(52000,98278,0),(52001,98279,0),(52002,98280,0),(52003,98312,0),(52004,98313,0),(52005,98314,0),(52006,98315,0),(52007,98316,0),(52008,98317,0),(52009,98318,0),(52010,98319,0),(52011,98320,0),(52012,98321,0),(52013,98322,0),(52014,98323,0),(52015,98324,0),(52016,98325,0),(52017,98335,0),(52018,98336,0),(52019,98358,0),(52020,98359,0),(52021,98360,0),(52022,98361,0),(52023,98538,0),(52024,98539,0),(52025,98540,0),(52026,98541,0),(52027,98543,0),(52028,98545,0),(52029,98547,0),(52030,98548,0),(52031,98566,0),(52032,98567,0),(52033,98568,0),(52034,98569,0),(52035,98570,0),(52036,98571,0),(52037,98572,0),(52038,98573,0),(52039,98574,0),(52040,98575,0),(52041,98576,0),(52042,98577,0),(52043,98579,0),(52044,98580,0),(52045,98581,0),(52046,98582,0),(52047,98583,0),(52048,98584,0),(52049,98585,0),(52050,98586,0),(52051,98587,0),(52052,98588,0),(52053,98589,0),(52054,98590,0),(52055,98591,0),(52056,98592,0),(52057,98593,0),(52058,98594,0),(52059,98595,0),(52060,98596,0),(52061,98597,0),(52062,98599,0),(52063,98600,0),(52064,98601,0),(52065,98602,0),(52066,98603,0),(52067,98604,0),(52068,98605,0),(52069,98606,0),(52070,98607,0),(52071,98608,0),(52072,98609,0),(52073,98610,0),(52074,98611,0),(52075,98612,0),(52076,98613,0),(52077,98614,0),(52078,98615,0),(52079,98616,0),(52080,98620,0),(52081,98705,0),(52082,98706,0),(52083,98707,0),(52084,98708,0),(52085,98709,0),(52086,98710,0),(52087,98711,0),(52088,98712,0),(52089,98713,0),(52090,98714,0),(52091,98718,0),(52092,98719,0),(52093,98720,0),(52094,98721,0),(52095,98722,0),(52096,98723,0),(52097,98724,0),(52098,98725,0),(52099,98726,0),(52100,98727,0),(52101,98736,0),(52102,98737,0),(52103,98738,0),(52104,98739,0),(52105,98740,0),(52106,98741,0),(52107,98742,0),(52108,98743,0),(52109,98744,0),(52110,98745,0),(52111,98756,0),(52112,98757,0),(52113,98763,0),(52114,98764,0),(52115,98765,0),(52116,98766,0),(52117,98767,0),(52118,98768,0),(52119,98769,0),(52120,98770,0),(52121,98771,0),(52122,98772,0),(52123,98773,0),(52124,98774,0),(52125,98775,0),(52126,98776,0),(52127,98783,0),(52128,98784,0),(52129,98785,0),(52130,98786,0),(52131,98787,0),(52132,98788,0),(52133,98789,0),(52134,98790,0),(52135,98791,0),(52136,98792,0),(52137,98793,0),(52138,98794,0),(52139,98795,0),(52140,98796,0),(52141,98797,0),(52142,98798,0),(52143,98799,0),(52144,98800,0),(52145,98801,0),(52146,98802,0),(52147,98803,0),(52148,98804,0),(52149,98805,0),(52150,98806,0),(52151,98807,0),(52152,98808,0),(52153,98809,0),(52154,98810,0),(52155,98814,0),(52156,98815,0),(52157,98816,0),(52158,98817,0),(52159,98818,0),(52160,98819,0),(52161,98820,0),(52162,98821,0),(52163,98822,0),(52164,98823,0),(52165,98824,0),(52166,98825,0),(52167,98826,0),(52168,98827,0),(52169,98828,0),(52170,98829,0),(52171,98830,0),(52172,98831,0),(52173,98832,0),(52174,98833,0),(52175,98834,0),(52176,98835,0),(52177,98836,0),(52178,98837,0),(52179,98838,0),(52180,98839,0),(52181,98840,0),(52182,98841,0),(52183,98842,0),(52184,98843,0),(52185,98844,0),(52186,98845,0),(52187,98846,0),(52188,98847,0),(52189,98848,0),(52190,98849,0),(52191,98850,0),(52192,98851,0),(52193,98852,0),(52194,98853,0),(52195,98854,0),(52196,98855,0),(52197,98856,0),(52198,98857,0),(52199,98858,0),(52200,98859,0),(52201,98860,0),(52202,98861,0),(52203,98862,0),(52204,98863,0),(52205,98864,0),(52206,98865,0),(52207,98866,0),(52208,98867,0),(52209,98868,0),(52210,98869,0),(52211,98870,0),(52212,98871,0),(52213,98872,0),(52214,98873,0),(52215,98874,0),(52216,98881,0),(52217,98882,0),(52218,98883,0),(52219,98884,0),(52220,98885,0),(52221,98886,0),(52222,98887,0),(52223,98888,0),(52224,98889,0),(52225,98890,0),(52226,98891,0),(52227,98892,0),(52228,98893,0),(52229,98894,0),(52230,98895,0),(52231,98896,0),(52232,98897,0),(52233,98898,0),(52234,98899,0),(52235,98900,0),(52236,98901,0),(52237,98902,0),(52238,98903,0),(52239,98904,0),(52240,98905,0),(52241,98906,0),(52242,98907,0),(52243,98908,0),(52244,98909,0),(52245,98913,0),(52246,98914,0),(52247,98920,0),(52248,98921,0),(52249,98922,0),(52250,98923,0),(52251,98924,0),(52252,98925,0),(52253,98926,0),(52254,98927,0),(52255,98928,0),(52256,98929,0),(52257,98930,0),(52258,98977,0),(52259,98978,0),(52260,98979,0),(52261,98980,0),(52262,98981,0),(52263,98982,0),(52264,98983,0),(52265,98984,0),(52266,98985,0),(52267,98986,0),(52268,98987,0),(52269,98988,0),(52270,98989,0),(52271,98990,0),(52272,98991,0),(52273,98992,0),(52274,98993,0),(52275,98994,0),(52276,98995,0),(52277,98996,0),(52278,98997,0),(52279,98998,0),(52280,98999,0),(52281,99000,0),(52282,99001,0),(52283,99002,0),(52284,99003,0),(52285,99004,0),(52286,99005,0),(52287,99006,0),(52288,99007,0),(52289,99008,0),(52290,99009,0),(52291,99010,0),(52292,99011,0),(52293,99012,0),(52294,99013,0),(52295,99014,0),(52296,99015,0),(52297,99016,0),(52298,99017,0),(52299,99018,0),(52300,99019,0),(52301,99020,0),(52302,99021,0),(52303,99022,0),(52304,99023,0),(52305,99024,0),(52306,99025,0),(52307,99026,0),(52308,99027,0),(52309,99028,0),(52310,99029,0),(52311,99030,0),(52312,99031,0),(52313,99032,0),(52314,99033,0),(52315,99034,0),(52316,99035,0),(52317,99036,0),(52318,99037,0),(52319,99038,0),(52320,99039,0),(52321,99040,0),(52322,99041,0),(52323,99042,0),(52324,99043,0),(52325,99044,0),(52326,99045,0),(52327,99046,0),(52328,99047,0),(52329,99048,0),(52330,99049,0),(52331,99050,0),(52332,99051,0),(52333,99052,0),(52334,99053,0),(52335,99054,0),(52336,99055,0),(52337,99056,0),(52338,99057,0),(52339,99058,0),(52340,99059,0),(52341,99060,0),(52342,99061,0),(52343,99062,0),(52344,99063,0),(52345,99064,0),(52346,99065,0),(52347,99066,0),(52348,99067,0),(52349,99068,0),(52350,99069,0),(52351,99070,0),(52352,99071,0),(52353,99072,0),(52354,99073,0),(52355,99074,0),(52356,99075,0),(52357,99076,0),(52358,99077,0),(52359,99078,0),(52360,99079,0),(52361,99080,0),(52362,99081,0),(52363,99082,0),(52364,99083,0),(52365,99084,0),(52366,99085,0),(52367,99086,0),(52368,99087,0),(52369,99088,0),(52370,99089,0),(52371,99090,0),(52372,99091,0),(52373,99092,0),(52374,99093,0),(52375,99094,0),(52376,99095,0),(52377,99096,0),(52378,99097,0),(52379,99098,0),(52380,99099,0),(52381,99100,0),(52382,99101,0),(52383,99102,0),(52384,99103,0),(52385,99104,0),(52386,99105,0),(52387,99106,0),(52388,99107,0),(52389,99108,0),(52390,99109,0),(52391,99110,0),(52392,99111,0),(52393,99112,0),(52394,99113,0),(52395,99114,0),(52396,99115,0),(52397,99116,0),(52398,99117,0),(52399,99118,0),(52400,99119,0),(52401,99120,0),(52402,99121,0),(52403,99122,0),(52404,99123,0),(52405,99124,0),(52406,99125,0),(52407,99126,0),(52408,99127,0),(52409,99128,0),(52410,99129,0),(52411,99130,0),(52412,99131,0),(52413,99132,0),(52414,99133,0),(52415,99134,0),(52416,99135,0),(52417,99136,0),(52418,99137,0),(52419,99138,0),(52420,99139,0),(52421,99140,0),(52422,99141,0),(52423,99142,0),(52424,99143,0),(52425,99144,0),(52426,99145,0),(52427,99146,0),(52428,99147,0),(52429,99148,0),(52430,99149,0),(52431,99150,0),(52432,99151,0),(52433,99152,0),(52434,99153,0),(52435,99154,0),(52436,99155,0),(52437,99156,0),(52438,99157,0),(52439,99158,0),(52440,99159,0),(52441,99160,0),(52442,99161,0),(52443,99162,0),(52444,99163,0),(52445,99164,0),(52446,99165,0),(52447,99166,0),(52448,99167,0),(52449,99168,0),(52450,99169,0),(52451,99170,0),(52452,99171,0),(52453,99172,0),(52454,99173,0),(52455,99174,0),(52456,99175,0),(52457,99176,0),(52458,99177,0),(52459,99178,0),(52460,99179,0),(52461,99180,0),(52462,99181,0),(52463,99182,0),(52464,99183,0),(52465,99184,0),(52466,99185,0),(52467,99186,0),(52468,99187,0),(52469,99188,0),(52470,99189,0),(52471,99190,0),(52472,99191,0),(52473,99192,0),(52474,99193,0),(52475,99194,0),(52476,99195,0),(52477,99196,0),(52478,99197,0),(52479,99198,0),(52480,99199,0),(52481,99200,0),(52482,99201,0),(52483,99202,0),(52484,99203,0),(52485,99204,0),(52486,99205,0),(52487,99206,0),(52488,99207,0),(52489,99208,0),(52490,99209,0),(52491,99210,0),(52492,99211,0),(52493,99212,0),(52494,99213,0),(52495,99214,0),(52496,99215,0),(52497,99216,0),(52498,99217,0),(52499,99218,0),(52500,99219,0),(52501,99220,0),(52502,99221,0),(52503,99222,0),(52504,99223,0),(52505,99224,0),(52506,99225,0),(52507,99226,0),(52508,99227,0),(52509,99228,0),(52510,99229,0),(52511,99230,0),(52512,99231,0),(52513,99232,0),(52514,99233,0),(52515,99234,0),(52516,99235,0),(52517,99236,0),(52518,99237,0),(52519,99238,0),(52520,99239,0),(52521,99240,0),(52522,99241,0),(52523,99242,0),(52524,99243,0),(52525,99244,0),(52526,99245,0),(52527,99246,0),(52528,99247,0),(52529,99248,0),(52530,99249,0),(52531,99250,0),(52532,99251,0),(52533,99252,0),(52534,99253,0),(52535,99254,0),(52536,99255,0),(52537,99256,0),(52538,99257,0),(52539,99258,0),(52540,99259,0),(52541,99260,0),(52542,99261,0),(52543,99262,0),(52544,99263,0),(52545,99264,0),(52546,99265,0),(52547,99266,0),(52548,99267,0),(52549,99268,0),(52550,99269,0),(52551,99270,0),(52552,99271,0),(52553,99272,0),(52554,99273,0),(52555,99274,0),(52556,99275,0),(52557,99276,0),(52558,99277,0),(52559,99278,0),(52560,99279,0),(52561,99280,0),(52562,99281,0),(52563,99282,0),(52564,99283,0),(52565,99284,0),(52566,99285,0),(52567,99286,0),(52568,99287,0),(52569,99288,0),(52570,99289,0),(52571,99290,0),(52572,99291,0),(52573,99292,0),(52574,99293,0),(52575,99294,0),(52576,99295,0),(52577,99296,0),(52578,99297,0),(52579,99298,0),(52580,99299,0),(52581,99300,0),(52582,99301,0),(52583,99302,0),(52584,99303,0),(52585,99304,0),(52586,99305,0),(52587,99306,0),(52588,99307,0),(52589,99308,0),(52590,99309,0),(52591,99310,0),(52592,99311,0),(52593,99312,0),(52594,99313,0),(52595,99314,0),(52596,99315,0),(52597,99316,0),(52598,99317,0),(52599,99318,0),(52600,99319,0),(52601,99320,0),(52602,99321,0),(52603,99322,0),(52604,99323,0),(52605,99324,0),(52606,99325,0),(52607,99326,0),(52608,99327,0),(52609,99328,0),(52610,99329,0),(52611,99330,0),(52612,99331,0),(52613,99332,0),(52614,99333,0),(52615,99334,0),(52616,99335,0),(52617,99336,0),(52618,99337,0),(52619,99338,0),(52620,99339,0),(52621,99340,0),(52622,99341,0),(52623,99342,0),(52624,99343,0),(52625,99344,0),(52626,99345,0),(52627,99346,0),(52628,99347,0),(52629,99348,0),(52630,99349,0),(52631,99350,0),(52632,99351,0),(52633,99352,0),(52634,99353,0),(52635,99354,0),(52636,99355,0),(52637,99356,0),(52638,99357,0),(52639,99358,0),(52640,99359,0),(52641,99360,0),(52642,99361,0),(52643,99362,0),(52644,99363,0),(52645,99364,0),(52646,99365,0),(52647,99366,0),(52648,99367,0),(52649,99368,0),(52650,99369,0),(52651,99370,0),(52652,99371,0),(52653,99372,0),(52654,99373,0),(52655,99374,0),(52656,99375,0),(52657,99376,0),(52658,99377,0),(52659,99378,0),(52660,99379,0),(52661,99380,0),(52662,99381,0),(52663,99382,0),(52664,99383,0),(52665,99384,0),(52666,99385,0),(52667,99386,0),(52668,99387,0),(52669,99388,0),(52670,99389,0),(52671,99390,0),(52672,99391,0),(52673,99392,0),(52674,99393,0),(52675,99394,0),(52676,99395,0),(52677,99396,0),(52678,99397,0),(52679,99398,0),(52680,99399,0),(52681,99400,0),(52682,99401,0),(52683,99402,0),(52684,99403,0),(52685,99404,0),(52686,99405,0),(52687,99406,0),(52688,99407,0),(52689,99408,0),(52690,99409,0),(52691,99410,0),(52692,99411,0),(52693,99412,0),(52694,99413,0),(52695,99414,0),(52696,99415,0),(52697,99416,0),(52698,99417,0),(52699,99418,0),(52700,99419,0),(52701,99420,0),(52702,99421,0),(52703,99422,0),(52704,99423,0),(52705,99424,0),(52706,99425,0),(52707,99426,0),(52708,99427,0),(52709,99428,0),(52710,99429,0),(52711,99430,0),(52712,99431,0),(52713,99432,0),(52714,99433,0),(52715,99434,0),(52716,99435,0),(52717,99436,0),(52718,99437,0),(52719,99438,0),(52720,99439,0),(52721,99440,0),(52722,99441,0),(52723,99442,0),(52724,99443,0),(52725,99444,0),(52726,99445,0),(52727,99446,0),(52728,99447,0),(52729,99448,0),(52730,99449,0),(52731,99450,0),(52732,99451,0),(52733,99452,0),(52734,99453,0),(52735,99454,0),(52736,99455,0),(52737,99456,0),(52738,99457,0),(52739,99458,0),(52740,99459,0),(52741,99460,0),(52742,99461,0),(52743,99462,0),(52744,99463,0),(52745,99464,0),(52746,99465,0),(52747,99466,0),(52748,99467,0),(52749,99468,0),(52750,99469,0),(52751,99470,0),(52752,99471,0),(52753,99472,0),(52754,99473,0),(52755,99474,0),(52756,99475,0),(52757,99476,0),(52758,99477,0),(52759,99478,0),(52760,99479,0),(52761,99480,0),(52762,99481,0),(52763,99482,0),(52764,99483,0),(52765,99484,0),(52766,99485,0),(52767,99486,0),(52768,99487,0),(52769,99488,0),(52770,99489,0),(52771,99490,0),(52772,99491,0),(52773,99492,0),(52774,99493,0),(52775,99494,0),(52776,99495,0),(52777,99496,0),(52778,99497,0),(52779,99498,0),(52780,99499,0),(52781,99500,0),(52782,99501,0),(52783,99502,0),(52784,99503,0),(52785,99504,0),(52786,99505,0),(52787,99506,0),(52788,99507,0),(52789,99508,0),(52790,99509,0),(52791,99510,0),(52792,99511,0),(52793,99512,0),(52794,99513,0),(52795,99514,0),(52796,99515,0),(52797,99516,0),(52798,99517,0),(52799,99518,0),(52800,99519,0),(52801,99520,0),(52802,99521,0),(52803,99522,0),(52804,99523,0),(52805,99524,0),(52806,99525,0),(52807,99526,0),(52808,99527,0),(52809,99528,0),(52810,99529,0),(52811,99530,0),(52812,99531,0),(52813,99532,0),(52814,99533,0),(52815,99534,0),(52816,99535,0),(52817,99536,0),(52818,99537,0),(52819,99538,0),(52820,99539,0),(52821,99540,0),(52822,99541,0),(52823,99542,0),(52824,99543,0),(52825,99544,0),(52826,99545,0),(52827,99546,0),(52828,99547,0),(52829,99548,0),(52830,99549,0),(52831,99550,0),(52832,99551,0),(52833,99552,0),(52834,99553,0),(52835,99554,0),(52836,99555,0),(52837,99556,0),(52838,99557,0),(52839,99558,0),(52840,99559,0),(52841,99560,0),(52842,99561,0),(52843,99562,0),(52844,99563,0),(52845,99564,0),(52846,99565,0),(52847,99566,0),(52848,99567,0),(52849,99568,0),(52850,99569,0),(52851,99570,0),(52852,99571,0),(52853,99572,0),(52854,99573,0),(52855,99574,0),(52856,99575,0),(52857,99576,0),(52858,99577,0),(52859,99578,0),(52860,99579,0),(52861,99580,0),(52862,99581,0),(52863,99582,0),(52864,99583,0),(52865,99584,0),(52866,99585,0),(52867,99586,0),(52868,99587,0),(52869,99588,0),(52870,99589,0),(52871,99590,0),(52872,99591,0),(52873,99592,0),(52874,99593,0),(52875,99594,0),(52876,99595,0),(52877,99596,0),(52878,99597,0),(52879,99598,0),(52880,99599,0),(52881,99600,0),(52882,99601,0),(52883,99602,0),(52884,99603,0),(52885,99604,0),(52886,99605,0),(52887,99606,0),(52888,99607,0),(52889,99608,0),(52890,99609,0),(52891,99610,0),(52892,99611,0),(52893,99612,0),(52894,99613,0),(52895,99614,0),(52896,99615,0),(52897,99616,0),(52898,99617,0),(52899,99618,0),(52900,99619,0),(52901,99620,0),(52902,99621,0),(52903,99622,0),(52904,99623,0),(52905,99624,0),(52906,99625,0),(52907,99626,0),(52908,99627,0),(52909,99628,0),(52910,99629,0),(52911,99630,0),(52912,99631,0),(52913,99632,0),(52914,99633,0),(52915,99634,0),(52916,99635,0),(52917,99636,0),(52918,99637,0),(52919,99638,0),(52920,99639,0),(52921,99640,0),(52922,99641,0),(52923,99642,0),(52924,99643,0),(52925,99644,0),(52926,99645,0),(52927,99646,0),(52928,99647,0),(52929,99648,0),(52930,99649,0),(52931,99650,0),(52932,99651,0),(52933,99652,0),(52934,99653,0),(52935,99654,0),(52936,99655,0),(52937,99656,0),(52938,99657,0),(52939,99658,0),(52940,99659,0),(52941,99660,0),(52942,99661,0),(52943,99662,0),(52944,99663,0),(52945,99664,0),(52946,99665,0),(52947,99666,0),(52948,99757,0),(52949,99758,0),(52950,99759,0),(52951,99760,0),(52952,99761,0),(52953,99762,0),(52954,99763,0),(52955,99764,0),(52956,99765,0),(52957,99766,0),(52958,99767,0),(52959,99768,0),(52960,99769,0),(52961,99770,0),(52962,99771,0),(52963,99773,0),(52964,99774,0),(52965,99780,0),(52966,99781,0),(52967,99782,0),(52968,99783,0),(52969,99784,0),(52970,99785,0),(52971,99786,0),(52972,99787,0),(52973,99788,0),(52974,99789,0),(52975,99790,0),(52976,99791,0),(52977,99792,0),(52978,99793,0),(52979,99794,0),(52980,99795,0),(52981,99796,0),(52982,99803,0),(52983,99804,0),(52984,99805,0),(52985,99806,0),(52986,99807,0),(52987,99808,0),(52988,99809,0),(52989,99810,0),(52990,99811,0),(52991,99812,0),(52992,99813,0),(52993,99814,0),(52994,99815,0),(52995,99816,0),(52996,99817,0),(52997,99818,0),(52998,99819,0),(52999,99820,0),(53000,99821,0),(53001,99822,0),(53002,99823,0),(53003,99824,0),(53004,99825,0),(53005,99826,0),(53006,99827,0),(53007,99828,0),(53008,99829,0),(53009,99830,0),(53010,99831,0),(53011,99832,0),(53012,99833,0),(53013,99834,0),(53014,99835,0),(53015,99836,0),(53016,99837,0),(53017,99841,0),(53018,99842,0),(53019,99843,0),(53020,99844,0),(53021,99845,0),(53022,99846,0),(53023,99847,0),(53024,99848,0),(53025,99849,0),(53026,99850,0),(53027,99851,0),(53028,99852,0),(53029,99853,0),(53030,99854,0),(53031,99855,0),(53032,99856,0),(53033,99857,0),(53034,99858,0),(53035,99859,0),(53036,99860,0),(53037,99861,0),(53038,99862,0),(53039,99863,0),(53040,99864,0),(53041,99865,0),(53042,99866,0),(53043,99867,0),(53044,99868,0),(53045,99869,0),(53046,99870,0),(53047,99871,0),(53048,99872,0),(53049,99873,0),(53050,99874,0),(53051,99875,0),(53052,99876,0),(53053,99877,0),(53054,99878,0),(53055,99879,0),(53056,99880,0),(53057,99881,0),(53058,99882,0),(53059,99883,0),(53060,99884,0),(53061,99885,0),(53062,99886,0),(53063,99887,0),(53064,99888,0),(53065,99889,0),(53066,99890,0),(53067,99891,0),(53068,99892,0),(53069,99893,0),(53070,99894,0),(53071,99895,0),(53072,99896,0),(53073,99897,0),(53074,99898,0),(53075,99899,0),(53076,99900,0),(53077,99901,0),(53078,99902,0),(53079,99903,0),(53080,99904,0),(53081,99905,0),(53082,99906,0),(53083,99907,0),(53084,99908,0),(53085,99909,0),(53086,99910,0),(53087,99911,0),(53088,99912,0),(53089,99913,0),(53090,99914,0),(53091,99915,0),(53092,99916,0),(53093,99917,0),(53094,99918,0),(53095,99919,0),(53096,99920,0),(53097,99921,0),(53098,99922,0),(53099,99923,0),(53100,99924,0),(53101,99925,0),(53102,99926,0),(53103,99927,0),(53104,99928,0),(53105,99929,0),(53106,99930,0),(53107,99931,0),(53108,99932,0),(53109,99933,0),(53110,99934,0),(53111,99935,0),(53112,99936,0),(53113,99939,0),(53114,99940,0),(53115,99941,0),(53116,99942,0),(53117,99944,0),(53118,99945,0),(53119,99951,0),(53120,99952,0),(53121,99953,0),(53122,99954,0),(53123,99955,0),(53124,99956,0),(53125,99957,0),(53126,99958,0),(53127,99959,0),(53128,99960,0),(53129,99961,0),(53130,99962,0),(53131,99963,0),(53132,99964,0),(53133,99965,0),(53134,99966,0),(53135,99967,0),(53136,99968,0),(53137,99969,0),(53138,99970,0),(53139,99971,0),(53140,99972,0),(53141,99973,0),(53142,99974,0),(53143,99975,0),(53144,99976,0),(53145,99977,0),(53146,99978,0),(53147,99979,0),(53148,99980,0),(53149,99981,0),(53150,99982,0),(53151,99983,0),(53152,99984,0),(53153,99985,0),(53154,99986,0),(53155,99987,0),(53156,99988,0),(53157,99989,0),(53158,99991,0),(53159,99992,0),(53160,99993,0),(53161,99994,0),(53162,99995,0),(53163,99996,0),(53164,99997,0),(53165,99998,0),(53166,99999,0),(53167,100000,0),(53168,100001,0),(53169,100002,0),(53170,100003,0),(53171,100004,0),(53172,100005,0),(53173,100007,0),(53174,100008,0),(53175,100009,0),(53176,100010,0),(53177,100011,0),(53178,100012,0),(53179,100013,0),(53180,100014,0),(53181,100015,0),(53182,100017,0),(53183,100018,0),(53184,100020,0),(53185,100021,0),(53186,100022,0),(53187,100023,0),(53188,100025,0),(53189,100028,0),(53190,100029,0),(53191,100030,0),(53192,100032,0),(53193,100034,0),(53194,100035,0),(53195,100036,0),(53196,100037,0),(53197,100038,0),(53198,100039,0),(53199,100040,0),(53200,100041,0),(53201,100042,0),(53202,100044,0),(53203,100045,0),(53204,100046,0),(53205,100047,0),(53206,100048,0),(53207,100049,0),(53208,100050,0),(53209,100051,0),(53210,100052,0),(53211,100053,0),(53212,100054,0),(53213,100055,0),(53214,100059,0),(53215,100061,0),(53216,100062,0),(53217,100063,0),(53218,100067,0),(53219,100068,0),(53220,100070,0),(53221,100071,0),(53222,100072,0),(53223,100073,0),(53224,100074,0),(53225,100075,0),(53226,100076,0),(53227,100077,0),(53228,100078,0),(53229,100079,0),(53230,100080,0),(53231,100081,0),(53232,100082,0),(53233,100083,0),(53234,100084,0),(53235,100086,0),(53236,100088,0),(53237,100089,0),(53238,100090,0),(53239,100091,0),(53240,100093,0),(53241,100094,0),(53242,100095,0),(53243,100096,0),(53244,100097,0),(53245,100098,0),(53246,100099,0),(53247,100100,0),(53248,100101,0),(53249,100102,0),(53250,100103,0),(53251,100104,0),(53252,100105,0),(53253,100106,0),(53254,100107,0),(53255,100108,0),(53256,100109,0),(53257,100110,0),(53258,100111,0),(53259,100112,0),(53260,100113,0),(53261,100114,0),(53262,100115,0),(53263,100116,0),(53264,100117,0),(53265,100118,0),(53266,100119,0),(53267,100120,0),(53268,100121,0),(53269,100123,0),(53270,100125,0),(53271,100126,0),(53272,100127,0),(53273,100128,0),(53274,100129,0),(53275,100130,0),(53276,100131,0),(53277,100133,0),(53278,100134,0),(53279,100136,0),(53280,100137,0),(53281,100138,0),(53282,100139,0),(53283,100140,0),(53284,100141,0),(53285,100142,0),(53286,100145,0),(53287,100146,0),(53288,100147,0),(53289,100148,0),(53290,100149,0),(53291,100150,0),(53292,100151,0),(53293,100153,0),(53294,100154,0),(53295,100155,0),(53296,100156,0),(53297,100157,0),(53298,100158,0),(53299,100160,0),(53300,100161,0),(53301,100162,0),(53302,100163,0),(53303,100164,0),(53304,100165,0),(53305,100166,0),(53306,100167,0),(53307,100168,0),(53308,100169,0),(53309,100170,0),(53310,100171,0),(53311,100172,0),(53312,100173,0),(53313,100174,0),(53314,100175,0),(53315,100176,0),(53316,100177,0),(53317,100178,0),(53318,100179,0),(53319,100180,0),(53320,100181,0),(53321,100182,0),(53322,100183,0),(53323,100184,0),(53324,100185,0),(53325,100186,0),(53326,100187,0),(53327,100188,0),(53328,100189,0),(53329,100190,0),(53330,100191,0),(53331,100192,0),(53332,100193,0),(53333,100194,0),(53334,100196,0),(53335,100197,0),(53336,100203,0),(53337,100204,0),(53338,100205,0),(53339,100206,0),(53340,100207,0),(53341,100208,0),(53342,100209,0),(53343,100210,0),(53344,100211,0),(53345,100212,0),(53346,100213,0),(53347,100214,0),(53348,100215,0),(53349,100216,0),(53350,100217,0),(53351,100218,0),(53352,100219,0),(53353,100220,0),(53354,100221,0),(53355,100222,0),(53356,100223,0),(53357,100224,0),(53358,100225,0),(53359,100226,0),(53360,100227,0),(53361,100228,0),(53362,100229,0),(53363,100230,0),(53364,100237,0),(53365,100238,0),(53366,100239,0),(53367,100240,0),(53368,100241,0),(53369,100242,0),(53370,100243,0),(53371,100244,0),(53372,100245,0),(53373,100246,0),(53374,100247,0),(53375,100248,0),(53376,100249,0),(53377,100250,0),(53378,100251,0),(53379,100252,0),(53380,100253,0),(53381,100254,0),(53382,100255,0),(53383,100256,0),(53384,100257,0),(53385,100258,0),(53386,100259,0),(53387,100260,0),(53388,100261,0),(53389,100262,0),(53390,100263,0),(53391,100264,0),(53392,100265,0),(53393,100266,0),(53394,100267,0),(53395,100268,0),(53396,100269,0),(53397,100270,0),(53398,100271,0),(53399,100272,0),(53400,100273,0),(53401,100274,0),(53402,100275,0),(53403,100276,0),(53404,100277,0),(53405,100278,0),(53406,100279,0),(53407,100280,0),(53408,100281,0),(53409,100282,0),(53410,100283,0),(53411,100284,0),(53412,100285,0),(53413,100286,0),(53414,100287,0),(53415,100288,0),(53416,100289,0),(53417,100290,0),(53418,100291,0),(53419,100292,0),(53420,100293,0),(53421,100294,0),(53422,100295,0),(53423,100296,0),(53424,100297,0),(53425,100298,0),(53426,100299,0),(53427,100300,0),(53428,100301,0),(53429,100302,0),(53430,100303,0),(53431,100304,0),(53432,100308,0),(53433,100309,0),(53434,100310,0),(53435,100311,0),(53436,100312,0),(53437,100313,0),(53438,100314,0),(53439,100315,0),(53440,100316,0),(53441,100317,0),(53442,100318,0),(53443,100319,0),(53444,100320,0),(53445,100321,0),(53446,100322,0),(53447,100323,0),(53448,100324,0),(53449,100325,0),(53450,100326,0),(53451,100327,0),(53452,100328,0),(53453,100329,0),(53454,100330,0),(53455,100331,0),(53456,100332,0),(53457,100333,0),(53458,100334,0),(53459,100335,0),(53460,100336,0),(53461,100337,0),(53462,100338,0),(53463,100339,0),(53464,100340,0),(53465,100341,0),(53466,100342,0),(53467,100343,0),(53468,100344,0),(53469,100345,0),(53470,100346,0),(53471,100347,0),(53472,100348,0),(53473,100349,0),(53474,100350,0),(53475,100351,0),(53476,100352,0),(53477,100353,0),(53478,100354,0),(53479,100355,0),(53480,100356,0),(53481,100357,0),(53482,100358,0),(53483,100359,0),(53484,100360,0),(53485,100361,0),(53486,100362,0),(53487,100363,0),(53488,100364,0),(53489,100365,0),(53490,100366,0),(53491,100367,0),(53492,100368,0),(53493,100369,0),(53494,100370,0),(53495,100371,0),(53496,100372,0),(53497,100373,0),(53498,100374,0),(53499,100375,0),(53500,100376,0),(53501,100377,0),(53502,100378,0),(53503,100379,0),(53504,100380,0),(53505,100381,0),(53506,100382,0),(53507,100383,0),(53508,100384,0),(53509,100385,0),(53510,100386,0),(53511,100387,0),(53512,100388,0),(53513,100389,0),(53514,100390,0),(53515,100391,0),(53516,100392,0),(53517,100393,0),(53518,100394,0),(53519,100395,0),(53520,100396,0),(53521,100397,0),(53522,100398,0),(53523,100399,0),(53524,100400,0),(53525,100401,0),(53526,100402,0),(53527,100403,0),(53528,100404,0),(53529,100405,0),(53530,100406,0),(53531,100407,0),(53532,100408,0),(53533,100409,0),(53534,100410,0),(53535,100411,0),(53536,100412,0),(53537,100413,0),(53538,100414,0),(53539,100415,0),(53540,100416,0),(53541,100417,0),(53542,100418,0),(53543,100419,0),(53544,100420,0),(53545,100421,0),(53546,100422,0),(53547,100423,0),(53548,100424,0),(53549,100425,0),(53550,100426,0),(53551,100427,0),(53552,100428,0),(53553,100429,0),(53554,100430,0),(53555,100431,0),(53556,100432,0),(53557,100433,0),(53558,100434,0),(53559,100435,0),(53560,100436,0),(53561,100437,0),(53562,100438,0),(53563,100439,0),(53564,100440,0),(53565,100441,0),(53566,100442,0),(53567,100443,0),(53568,100444,0),(53569,100445,0),(53570,100446,0),(53571,100447,0),(53572,100448,0),(53573,100449,0),(53574,100450,0),(53575,100451,0),(53576,100452,0),(53577,100453,0),(53578,100454,0),(53579,100455,0),(53580,100456,0),(53581,100457,0),(53582,100458,0),(53583,100459,0),(53584,100460,0),(53585,100461,0),(53586,100462,0),(53587,100463,0),(53588,100464,0),(53589,100465,0),(53590,100466,0),(53591,100467,0),(53592,100468,0),(53593,100469,0),(53594,100470,0),(53595,100471,0),(53596,100472,0),(53597,100473,0),(53598,100474,0),(53599,100475,0),(53600,100476,0),(53601,100477,0),(53602,100478,0),(53603,100479,0),(53604,100480,0),(53605,100481,0),(53606,100482,0),(53607,100483,0),(53608,100484,0),(53609,100485,0),(53610,100486,0),(53611,100487,0),(53612,100488,0),(53613,100489,0),(53614,100492,0),(53615,100493,0),(53616,100494,0),(53617,100495,0),(53618,100496,0),(53619,100497,0),(53620,100498,0),(53621,100499,0),(53622,100501,0),(53623,100502,0),(53624,100508,0),(53625,100509,0),(53626,100510,0),(53627,100511,0),(53628,100512,0),(53629,100513,0),(53630,100514,0),(53631,100515,0),(53632,100516,0),(53633,100517,0),(53634,100518,0),(53635,100519,0),(53636,100520,0),(53637,100521,0),(53638,100522,0),(53639,100523,0),(53640,100524,0),(53641,100525,0),(53642,100526,0),(53643,100527,0),(53644,100528,0),(53645,100529,0),(53646,100530,0),(53647,100531,0),(53648,100532,0),(53649,100533,0),(53650,100534,0),(53651,100535,0),(53652,100536,0),(53653,100537,0),(53654,100538,0),(53655,100539,0),(53656,100540,0),(53657,100541,0),(53658,100542,0),(53659,100543,0),(53660,100544,0),(53661,100545,0),(53662,100546,0),(53663,100547,0),(53664,100548,0),(53665,100549,0),(53666,100550,0),(53667,100551,0),(53668,100552,0),(53669,100553,0),(53670,100554,0),(53671,100555,0),(53672,100556,0),(53673,100557,0),(53674,100558,0),(53675,100560,0),(53676,100561,0),(53677,100562,0),(53678,100563,0),(53679,100564,0),(53680,100565,0),(53681,100566,0),(53682,100567,0),(53683,100569,0),(53684,100570,0),(53685,100571,0),(53686,100572,0),(53687,100573,0),(53688,100574,0),(53689,100575,0),(53690,100577,0),(53691,100578,0),(53692,100580,0),(53693,100581,0),(53694,100582,0),(53695,100583,0),(53696,100585,0),(53697,100588,0),(53698,100589,0),(53699,100590,0),(53700,100592,0),(53701,100594,0),(53702,100595,0),(53703,100596,0),(53704,100597,0),(53705,100598,0),(53706,100599,0),(53707,100600,0),(53708,100601,0),(53709,100602,0),(53710,100604,0),(53711,100605,0),(53712,100606,0),(53713,100607,0),(53714,100608,0),(53715,100609,0),(53716,100610,0),(53717,100611,0),(53718,100612,0),(53719,100613,0),(53720,100614,0),(53721,100615,0),(53722,100619,0),(53723,100621,0),(53724,100622,0),(53725,100623,0),(53726,100627,0),(53727,100628,0),(53728,100630,0),(53729,100631,0),(53730,100632,0),(53731,100633,0),(53732,100634,0),(53733,100635,0),(53734,100636,0),(53735,100637,0),(53736,100638,0),(53737,100639,0),(53738,100640,0),(53739,100641,0),(53740,100642,0),(53741,100643,0),(53742,100644,0),(53743,100646,0),(53744,100648,0),(53745,100649,0),(53746,100650,0),(53747,100651,0),(53748,100653,0),(53749,100654,0),(53750,100655,0),(53751,100656,0),(53752,100657,0),(53753,100658,0),(53754,100659,0),(53755,100660,0),(53756,100661,0),(53757,100662,0),(53758,100663,0),(53759,100664,0),(53760,100665,0),(53761,100666,0),(53762,100667,0),(53763,100668,0),(53764,100669,0),(53765,100670,0),(53766,100671,0),(53767,100672,0),(53768,100673,0),(53769,100674,0),(53770,100675,0),(53771,100676,0),(53772,100677,0),(53773,100678,0),(53774,100679,0),(53775,100680,0),(53776,100681,0),(53777,100683,0),(53778,100685,0),(53779,100686,0),(53780,100687,0),(53781,100688,0),(53782,100689,0),(53783,100690,0),(53784,100691,0),(53785,100693,0),(53786,100694,0),(53787,100696,0),(53788,100697,0),(53789,100698,0),(53790,100699,0),(53791,100700,0),(53792,100701,0),(53793,100702,0),(53794,100705,0),(53795,100706,0),(53796,100707,0),(53797,100708,0),(53798,100709,0),(53799,100710,0),(53800,100711,0),(53801,100713,0),(53802,100714,0),(53803,100715,0),(53804,100716,0),(53805,100717,0),(53806,100718,0),(53807,100720,0),(53808,100721,0),(53809,100722,0),(53810,100723,0),(53811,100724,0),(53812,100725,0),(53813,100726,0),(53814,100727,0),(53815,100728,0),(53816,100729,0),(53817,100730,0),(53818,100731,0),(53819,100732,0),(53820,100733,0),(53821,100740,0),(53822,100741,0),(53823,100742,0),(53824,100743,0),(53825,100744,0),(53826,100745,0),(53827,100746,0),(53828,100747,0),(53829,100814,0),(53830,100815,0),(53831,100816,0),(53832,100817,0),(53833,100836,0),(53834,100895,0),(53835,100896,0),(53836,100906,0),(53837,100944,0),(53838,100945,0),(53839,100952,0),(53840,100953,0),(53841,100954,0),(53842,100955,0),(53843,100956,0),(53844,100957,0),(53845,100958,0),(53846,100959,0),(53847,100960,0),(53848,100961,0),(53849,100962,0),(53850,100964,0),(53851,100965,0),(53852,100966,0),(53853,100967,0),(53854,100968,0),(53855,100969,0),(53856,100970,0),(53857,100971,0),(53858,100972,0),(53859,100973,0),(53860,100974,0),(53861,100975,0),(53862,100976,0),(53863,100977,0),(53864,100978,0),(53865,100979,0),(53866,100980,0),(53867,100981,0),(53868,100982,0),(53869,100983,0),(53870,100984,0),(53871,100985,0),(53872,100986,0),(53873,100992,0),(53874,100993,0),(53875,100994,0),(53876,100995,0),(53877,100996,0),(53878,100997,0),(53879,101003,0),(53880,101004,0),(53881,101005,0),(53882,101006,0),(53883,101007,0),(53884,101013,0),(53885,101014,0),(53886,101015,0),(53887,101016,0),(53888,101017,0),(53889,101018,0),(53890,101019,0),(53891,101020,0),(53892,101021,0),(53893,101027,0),(53894,101028,0),(53895,101029,0),(53896,101030,0),(53897,101031,0),(53898,101032,0),(53899,101033,0),(53900,101034,0),(53901,101035,0),(53902,101036,0),(53903,101042,0),(53904,101043,0),(53905,101044,0),(53906,101045,0),(53907,101046,0),(53908,101047,0),(53909,101048,0),(53910,101049,0),(53911,101050,0),(53912,101051,0),(53913,101052,0),(53914,101058,0),(53915,101059,0),(53916,101060,0),(53917,101061,0),(53918,101062,0),(53919,101063,0),(53920,101064,0),(53921,101065,0),(53922,101066,0),(53923,101067,0),(53924,101073,0),(53925,101074,0),(53926,101075,0),(53927,101076,0),(53928,101077,0),(53929,101078,0),(53930,101079,0),(53931,101080,0),(53932,101081,0),(53933,101082,0),(53934,101083,0),(53935,101088,0),(53936,101090,0),(53937,101091,0),(53938,101092,0),(53939,101093,0),(53940,101094,0),(53941,101095,0),(53942,101096,0),(53943,101097,0),(53944,101098,0),(53945,101099,0),(53946,101100,0),(53947,101101,0),(53948,101103,0),(53949,101108,0),(53950,101109,0),(53951,101110,0),(53952,101111,0),(53953,101112,0),(53954,101118,0),(53955,101119,0),(53956,101120,0),(53957,101121,0),(53958,101122,0),(53959,101123,0),(53960,101124,0),(53961,101125,0),(53962,101126,0),(53963,101127,0),(53964,101128,0),(53965,101129,0),(53966,101130,0),(53967,101131,0),(53968,101132,0),(53969,101133,0),(53970,101139,0),(53971,101140,0),(53972,101141,0),(53973,101142,0),(53974,101143,0),(53975,101144,0),(53976,101145,0),(53977,101146,0),(53978,101147,0),(53979,101153,0),(53980,101154,0),(53981,101155,0),(53982,101156,0),(53983,101157,0),(53984,101158,0),(53985,101164,0),(53986,101165,0),(53987,101166,0),(53988,101172,0),(53989,101173,0),(53990,101174,0),(53991,101175,0),(53992,101176,0),(53993,101177,0),(53994,101182,0),(53995,101184,0),(53996,101185,0),(53997,101186,0),(53998,101187,0),(53999,101188,0),(54000,101189,0),(54001,101190,0),(54002,101191,0),(54003,101192,0),(54004,101193,0),(54005,101194,0),(54006,101195,0),(54007,101196,0),(54008,101197,0),(54009,101198,0),(54010,101204,0),(54011,101205,0),(54012,101206,0),(54013,101207,0),(54014,101208,0),(54015,101209,0),(54016,101210,0),(54017,101211,0),(54018,101212,0),(54019,101213,0),(54020,101214,0),(54021,101215,0),(54022,101226,0),(54023,101227,0),(54024,101228,0),(54025,101229,0),(54026,101230,0),(54027,101231,0),(54028,101232,0),(54029,101233,0),(54030,101234,0),(54031,101235,0),(54032,101236,0),(54033,101237,0),(54034,101238,0),(54035,101239,0),(54036,101240,0),(54037,101241,0),(54038,101242,0),(54039,101243,0),(54040,101244,0),(54041,101245,0),(54042,101251,0),(54043,101252,0),(54044,101253,0),(54045,101254,0),(54046,101255,0),(54047,101256,0),(54048,101257,0),(54049,101258,0),(54050,101259,0),(54051,101260,0),(54052,101261,0),(54053,101267,0),(54054,101268,0),(54055,101269,0),(54056,101270,0),(54057,101271,0),(54058,101272,0),(54059,101273,0),(54060,101274,0),(54061,101275,0),(54062,101276,0),(54063,101277,0),(54064,101278,0),(54065,101279,0),(54066,101280,0),(54067,101281,0),(54068,101282,0),(54069,101283,0),(54070,101284,0),(54071,101285,0),(54072,101286,0),(54073,101287,0),(54074,101288,0),(54075,101289,0),(54076,101290,0),(54077,101296,0),(54078,101297,0),(54079,101298,0),(54080,101299,0),(54081,101300,0),(54082,101301,0),(54083,101307,0),(54084,101308,0),(54085,101309,0),(54086,101316,0),(54087,101317,0),(54088,101318,0),(54089,101319,0),(54090,101320,0),(54091,101321,0),(54092,101322,0),(54093,101323,0),(54094,101324,0),(54095,101325,0),(54096,101326,0),(54097,101327,0),(54098,101328,0),(54099,101329,0),(54100,101330,0),(54101,101331,0),(54102,101332,0),(54103,101333,0),(54104,101334,0),(54105,101335,0),(54106,101356,0),(54107,101357,0),(54108,101358,0),(54109,101359,0),(54110,101360,0),(54111,101361,0),(54112,101362,0),(54113,101363,0),(54114,101364,0),(54115,101365,0),(54116,101366,0),(54117,101367,0),(54118,101368,0),(54119,101369,0),(54120,101370,0),(54121,101371,0),(54122,101372,0),(54123,101373,0),(54124,101374,0),(54125,101375,0),(54126,101376,0),(54127,101377,0),(54128,101378,0),(54129,101379,0),(54130,101382,0),(54131,101383,0),(54132,101384,0),(54133,101385,0),(54134,101386,0),(54135,101387,0),(54136,101388,0),(54137,101389,0),(54138,101390,0),(54139,101402,0),(54140,101403,0),(54141,101404,0),(54142,101405,0),(54143,101408,0),(54144,101409,0),(54145,101410,0),(54146,101411,0),(54147,101412,0),(54148,101413,0),(54149,101414,0),(54150,101415,0),(54151,101416,0),(54152,101417,0),(54153,101418,0),(54154,101419,0),(54155,101420,0),(54156,101421,0),(54157,101422,0),(54158,101423,0),(54159,101424,0),(54160,101425,0),(54161,101427,0),(54162,101428,0),(54163,101429,0),(54164,101430,0),(54165,101431,0),(54166,101432,0),(54167,101433,0),(54168,101434,0),(54169,101435,0),(54170,101437,0),(54171,101438,0),(54172,101439,0),(54173,101440,0),(54174,101441,0),(54175,101442,0),(54176,101443,0),(54177,101444,0),(54178,101445,0),(54179,101446,0),(54180,101447,0),(54181,101448,0),(54182,101449,0),(54183,101451,0),(54184,101454,0),(54185,101455,0),(54186,101456,0),(54187,101457,0),(54188,101458,0),(54189,101459,0),(54190,101460,0),(54191,101461,0),(54192,101482,0),(54193,101483,0),(54194,101484,0),(54195,101485,0),(54196,101486,0),(54197,101487,0),(54198,101488,0),(54199,101489,0),(54200,101490,0),(54201,101491,0),(54202,101493,0),(54203,101494,0),(54204,101495,0),(54205,101496,0),(54206,101497,0),(54207,101498,0),(54208,101499,0),(54209,101500,0),(54210,101501,0),(54211,101502,0),(54212,101503,0),(54213,101504,0),(54214,101505,0),(54215,101506,0),(54216,101507,0),(54217,101508,0),(54218,101509,0),(54219,101510,0),(54220,101511,0),(54221,101512,0),(54222,101513,0),(54223,101514,0),(54224,101515,0),(54225,101516,0),(54226,101517,0),(54227,101518,0),(54228,101519,0),(54229,101520,0),(54230,101521,0),(54231,101528,0),(54232,101572,0),(54233,101612,0),(54234,101613,0),(54235,101614,0),(54236,101615,0),(54237,101621,0),(54238,101622,0),(54239,101623,0),(54240,101624,0),(54241,101625,0),(54242,101626,0),(54243,101627,0),(54244,101632,0),(54245,101633,0),(54246,101634,0),(54247,101635,0),(54248,101636,0),(54249,101637,0),(54250,101638,0),(54251,101639,0),(54252,101640,0),(54253,101641,0),(54254,101642,0),(54255,101643,0),(54256,101644,0),(54257,101645,0),(54258,101646,0),(54259,101647,0),(54260,101648,0),(54261,101649,0),(54262,101650,0),(54263,101651,0),(54264,101652,0),(54265,101653,0),(54266,101654,0),(54267,101655,0),(54268,101656,0),(54269,101657,0),(54270,101658,0),(54271,101659,0),(54272,101660,0),(54273,101669,0),(54274,101670,0),(54275,101671,0),(54276,101672,0),(54277,101678,0),(54278,101679,0),(54279,101680,0),(54280,101681,0),(54281,101682,0),(54282,101683,0),(54283,101684,0),(54284,101685,0),(54285,101686,0),(54286,101687,0),(54287,101688,0),(54288,101689,0),(54289,101696,0),(54290,101697,0),(54291,101698,0),(54292,101699,0),(54293,101700,0),(54294,101701,0),(54295,101702,0),(54296,101703,0),(54297,101704,0),(54298,101705,0),(54299,101706,0),(54300,101707,0),(54301,101708,0),(54302,101709,0),(54303,101710,0),(54304,101711,0),(54305,101712,0),(54306,101713,0),(54307,101714,0),(54308,101715,0),(54309,101716,0),(54310,101717,0),(54311,101718,0),(54312,101719,0),(54313,101720,0),(54314,101721,0),(54315,101722,0),(54316,101723,0),(54317,101724,0),(54318,101725,0),(54319,101726,0),(54320,101730,0),(54321,101731,0),(54322,101732,0),(54323,101733,0),(54324,101734,0),(54325,101735,0),(54326,101736,0),(54327,101737,0),(54328,101738,0),(54329,101742,0),(54330,101743,0),(54331,101744,0),(54332,101751,0),(54333,101777,0),(54334,101778,0),(54335,101779,0),(54336,101780,0),(54337,101781,0),(54338,101782,0),(54339,101783,0),(54340,101784,0),(54341,101785,0),(54342,101786,0),(54343,101787,0),(54344,101788,0),(54345,101789,0),(54346,101790,0),(54347,101791,0),(54348,101792,0),(54349,101793,0),(54350,101794,0),(54351,101796,0),(54352,101797,0),(54353,101799,0),(54354,101800,0),(54355,101801,0),(54356,101802,0),(54357,101803,0),(54358,101804,0),(54359,101806,0),(54360,101807,0),(54361,101808,0),(54362,101810,0),(54363,101811,0),(54364,101812,0),(54365,101813,0),(54366,101814,0),(54367,101815,0),(54368,101816,0),(54369,101817,0),(54370,101818,0),(54371,101819,0),(54372,101820,0),(54373,101821,0),(54374,101822,0),(54375,101823,0),(54376,101824,0),(54377,101825,0),(54378,101826,0),(54379,101828,0),(54380,101830,0),(54381,101831,0),(54382,101832,0),(54383,101833,0),(54384,101834,0),(54385,101835,0),(54386,101836,0),(54387,101837,0),(54388,101838,0),(54389,101839,0),(54390,101840,0),(54391,101841,0),(54392,101842,0),(54393,101843,0),(54394,101844,0),(54395,101845,0),(54396,101848,0),(54397,101851,0),(54398,101852,0),(54399,101853,0),(54400,101854,0),(54401,101855,0),(54402,101856,0),(54403,101858,0),(54404,101859,0),(54405,101861,0),(54406,101862,0),(54407,101863,0),(54408,101864,0),(54409,101865,0),(54410,101866,0),(54411,101867,0),(54412,101868,0),(54413,101869,0),(54414,101870,0),(54415,101871,0),(54416,101872,0),(54417,101873,0),(54418,101874,0),(54419,101875,0),(54420,101876,0),(54421,101877,0),(54422,101878,0),(54423,101879,0),(54424,101880,0),(54425,101881,0),(54426,101882,0),(54427,101883,0),(54428,101885,0),(54429,101886,0),(54430,101888,0),(54431,101889,0),(54432,101890,0),(54433,101891,0),(54434,101892,0),(54435,101893,0),(54436,101895,0),(54437,101896,0),(54438,101897,0),(54439,101899,0),(54440,101900,0),(54441,101901,0),(54442,101902,0),(54443,101903,0),(54444,101904,0),(54445,101905,0),(54446,101906,0),(54447,101907,0),(54448,101908,0),(54449,101909,0),(54450,101910,0),(54451,101911,0),(54452,101912,0),(54453,101913,0),(54454,101914,0),(54455,101915,0),(54456,101917,0),(54457,101919,0),(54458,101920,0),(54459,101921,0),(54460,101922,0),(54461,101923,0),(54462,101924,0),(54463,101925,0),(54464,101926,0),(54465,101927,0),(54466,101928,0),(54467,101929,0),(54468,101930,0),(54469,101931,0),(54470,101932,0),(54471,101933,0),(54472,101934,0),(54473,101935,0),(54474,101938,0),(54475,101939,0),(54476,101940,0),(54477,101941,0),(54478,101942,0),(54479,101943,0),(54480,101945,0),(54481,101946,0),(54482,101948,0),(54483,101949,0),(54484,101950,0),(54485,101951,0),(54486,101952,0),(54487,101953,0),(54488,101954,0),(54489,101955,0),(54490,101956,0),(54491,101957,0),(54492,101958,0),(54493,101959,0),(54494,101960,0),(54495,101961,0),(54496,101962,0),(54497,101963,0),(54498,101964,0),(54499,101965,0),(54500,101966,0),(54501,101967,0),(54502,101968,0),(54503,101969,0),(54504,101970,0),(54505,101972,0),(54506,101973,0),(54507,101975,0),(54508,101976,0),(54509,101977,0),(54510,101978,0),(54511,101979,0),(54512,101980,0),(54513,101982,0),(54514,101983,0),(54515,101984,0),(54516,101986,0),(54517,101987,0),(54518,101988,0),(54519,101989,0),(54520,101990,0),(54521,101991,0),(54522,101992,0),(54523,101993,0),(54524,101994,0),(54525,101995,0),(54526,101996,0),(54527,101997,0),(54528,101998,0),(54529,101999,0),(54530,102000,0),(54531,102001,0),(54532,102002,0),(54533,102004,0),(54534,102006,0),(54535,102007,0),(54536,102008,0),(54537,102009,0),(54538,102010,0),(54539,102011,0),(54540,102012,0),(54541,102013,0),(54542,102014,0),(54543,102015,0),(54544,102016,0),(54545,102017,0),(54546,102018,0),(54547,102019,0),(54548,102020,0),(54549,102021,0),(54550,102022,0),(54551,102025,0),(54552,102026,0),(54553,102027,0),(54554,102028,0),(54555,102029,0),(54556,102030,0),(54557,102032,0),(54558,102033,0),(54559,102035,0),(54560,102036,0),(54561,102037,0),(54562,102038,0),(54563,102039,0),(54564,102040,0),(54565,102041,0),(54566,102042,0),(54567,102043,0),(54568,102044,0),(54569,102045,0),(54570,102046,0),(54571,102047,0),(54572,102100,0),(54573,102101,0),(54574,102102,0),(54575,102103,0),(54576,102120,0),(54577,102121,0),(54578,102122,0),(54579,102123,0),(54580,102124,0),(54581,102125,0),(54582,102126,0),(54583,102127,0),(54584,102138,0),(54585,102139,0),(54586,102140,0),(54587,102141,0),(54588,102142,0),(54589,102143,0),(54590,102150,0),(54591,102151,0),(54592,102152,0),(54593,102154,0),(54594,102155,0),(54595,102157,0),(54596,102158,0),(54597,102159,0),(54598,102160,0),(54599,102163,0),(54600,102164,0),(54601,102165,0),(54602,102166,0),(54603,102175,0),(54604,102176,0),(54605,102178,0),(54606,102179,0),(54607,102219,0),(54608,102220,0),(54609,102221,0),(54610,102222,0),(54611,102227,0),(54612,102228,0),(54613,102229,0),(54614,102230,0),(54615,102240,0),(54616,102245,0),(54617,102246,0),(54618,102247,0),(54619,102248,0),(54620,102249,0),(54621,102250,0),(54622,102255,0),(54623,102256,0),(54624,102257,0),(54625,102258,0),(54626,102259,0),(54627,102260,0),(54628,102317,0),(54629,102319,0),(54630,102324,0),(54631,102325,0),(54632,102326,0),(54633,102327,0),(54634,102328,0),(54635,102329,0),(54636,102330,0),(54637,102331,0),(54638,102332,0),(54639,102333,0),(54640,102334,0),(54641,102335,0),(54642,102336,0),(54643,102337,0),(54644,102338,0),(54645,102339,0),(54646,102340,0),(54647,102341,0),(54648,102342,0),(54649,102343,0),(54650,102344,0),(54651,102345,0),(54652,102346,0),(54653,102347,0),(54654,102348,0),(54655,102373,0),(54656,102374,0),(54657,102375,0),(54658,102376,0),(54659,102377,0),(54660,102378,0),(54661,102379,0),(54662,102380,0),(54663,102381,0),(54664,102382,0),(54665,102383,0),(54666,102384,0),(54667,102385,0),(54668,102386,0),(54669,102387,0),(54670,102388,0),(54671,102389,0),(54672,102390,0),(54673,102427,0),(54674,102428,0),(54675,102429,0),(54676,102430,0),(54677,102431,0),(54678,102432,0),(54679,102433,0),(54680,102434,0),(54681,102435,0),(54682,102454,0),(54683,102455,0),(54684,102459,0),(54685,102460,0),(54686,102461,0),(54687,102462,0),(54688,102469,0),(54689,102470,0),(54690,102471,0),(54691,102472,0),(54692,102473,0),(54693,102475,0),(54694,102476,0),(54695,102477,0),(54696,102478,0),(54697,102479,0),(54698,102492,0),(54699,102493,0),(54700,102494,0),(54701,102496,0),(54702,102497,0),(54703,102498,0),(54704,102499,0),(54705,102500,0),(54706,102501,0),(54707,102502,0),(54708,102503,0),(54709,102504,0),(54710,102505,0),(54711,102506,0),(54712,102507,0),(54713,102508,0),(54714,102509,0),(54715,102510,0),(54716,102511,0),(54717,102512,0),(54718,102515,0),(54719,102516,0),(54720,102517,0),(54721,102518,0),(54722,102519,0),(54723,102520,0),(54724,102521,0),(54725,102522,0),(54726,102523,0),(54727,102524,0),(54728,102525,0),(54729,102526,0),(54730,102527,0),(54731,102528,0),(54732,102529,0),(54733,102530,0),(54734,102531,0),(54735,102532,0),(54736,102544,0),(54737,102545,0),(54738,102546,0),(54739,102547,0),(54740,102548,0),(54741,102549,0),(54742,102550,0),(54743,102551,0),(54744,102552,0),(54745,102553,0),(54746,102554,0),(54747,102555,0),(54748,102556,0),(54749,102557,0),(54750,102558,0),(54751,102559,0),(54752,102560,0),(54753,102561,0),(54754,102562,0),(54755,102563,0),(54756,102564,0),(54757,102565,0),(54758,102566,0),(54759,102567,0),(54760,102568,0),(54761,102569,0),(54762,102570,0),(54763,102571,0),(54764,102573,0),(54765,102574,0),(54766,102575,0),(54767,102576,0),(54768,102577,0),(54769,102578,0),(54770,102579,0),(54771,102580,0),(54772,102581,0),(54773,102582,0),(54774,102583,0),(54775,102584,0),(54776,102585,0),(54777,102586,0),(54778,102587,0),(54779,102588,0),(54780,102589,0),(54781,102590,0),(54782,102591,0),(54783,102592,0),(54784,102593,0),(54785,102594,0),(54786,102595,0),(54787,102596,0),(54788,102597,0),(54789,102598,0),(54790,102599,0),(54791,102600,0),(54792,102601,0),(54793,102602,0),(54794,102603,0),(54795,102604,0),(54796,102605,0),(54797,102606,0),(54798,102607,0),(54799,102608,0),(54800,102609,0),(54801,102610,0),(54802,102611,0),(54803,102612,0),(54804,102613,0),(54805,102614,0),(54806,102615,0),(54807,102617,0),(54808,102618,0),(54809,102619,0),(54810,102620,0),(54811,102621,0),(54812,102622,0),(54813,102623,0),(54814,102624,0),(54815,102626,0),(54816,102627,0),(54817,102628,0),(54818,102629,0),(54819,102630,0),(54820,102631,0),(54821,102632,0),(54822,102634,0),(54823,102635,0),(54824,102637,0),(54825,102638,0),(54826,102639,0),(54827,102640,0),(54828,102642,0),(54829,102645,0),(54830,102646,0),(54831,102647,0),(54832,102648,0),(54833,102650,0),(54834,102651,0),(54835,102652,0),(54836,102653,0),(54837,102654,0),(54838,102655,0),(54839,102656,0),(54840,102657,0),(54841,102658,0),(54842,102660,0),(54843,102661,0),(54844,102662,0),(54845,102663,0),(54846,102664,0),(54847,102665,0),(54848,102666,0),(54849,102667,0),(54850,102668,0),(54851,102669,0),(54852,102670,0),(54853,102671,0),(54854,102673,0),(54855,102675,0),(54856,102676,0),(54857,102677,0),(54858,102681,0),(54859,102682,0),(54860,102684,0),(54861,102685,0),(54862,102686,0),(54863,102687,0),(54864,102688,0),(54865,102689,0),(54866,102690,0),(54867,102691,0),(54868,102692,0),(54869,102693,0),(54870,102694,0),(54871,102695,0),(54872,102696,0),(54873,102697,0),(54874,102698,0),(54875,102700,0),(54876,102702,0),(54877,102703,0),(54878,102704,0),(54879,102705,0),(54880,102707,0),(54881,102708,0),(54882,102709,0),(54883,102710,0),(54884,102711,0),(54885,102712,0),(54886,102713,0),(54887,102714,0),(54888,102715,0),(54889,102716,0),(54890,102717,0),(54891,102718,0),(54892,102719,0),(54893,102720,0),(54894,102721,0),(54895,102722,0),(54896,102723,0),(54897,102724,0),(54898,102725,0),(54899,102726,0),(54900,102727,0),(54901,102728,0),(54902,102729,0),(54903,102730,0),(54904,102731,0),(54905,102732,0),(54906,102733,0),(54907,102734,0),(54908,102735,0),(54909,102737,0),(54910,102739,0),(54911,102740,0),(54912,102741,0),(54913,102742,0),(54914,102743,0),(54915,102744,0),(54916,102745,0),(54917,102747,0),(54918,102748,0),(54919,102750,0),(54920,102751,0),(54921,102752,0),(54922,102753,0),(54923,102754,0),(54924,102755,0),(54925,102756,0),(54926,102759,0),(54927,102760,0),(54928,102761,0),(54929,102762,0),(54930,102763,0),(54931,102764,0),(54932,102765,0),(54933,102767,0),(54934,102768,0),(54935,102769,0),(54936,102770,0),(54937,102771,0),(54938,102772,0),(54939,102774,0),(54940,102775,0),(54941,102776,0),(54942,102777,0),(54943,102778,0),(54944,102779,0),(54945,102780,0),(54946,102781,0),(54947,102782,0),(54948,102783,0),(54949,102784,0),(54950,102785,0),(54951,102786,0),(54952,102787,0),(54953,102788,0),(54954,102789,0),(54955,102790,0),(54956,102791,0),(54957,102792,0),(54958,102793,0),(54959,102794,0),(54960,102795,0),(54961,102796,0),(54962,102797,0),(54963,102798,0),(54964,102799,0),(54965,102800,0),(54966,102801,0),(54967,102802,0),(54968,102803,0),(54969,102804,0),(54970,102805,0),(54971,102806,0),(54972,102807,0),(54973,102808,0),(54974,102809,0),(54975,102810,0),(54976,102811,0),(54977,102812,0),(54978,102814,0),(54979,102815,0),(54980,102816,0),(54981,102817,0),(54982,102818,0),(54983,102819,0),(54984,102820,0),(54985,102821,0),(54986,102823,0),(54987,102824,0),(54988,102825,0),(54989,102826,0),(54990,102827,0),(54991,102828,0),(54992,102829,0),(54993,102831,0),(54994,102832,0),(54995,102834,0),(54996,102835,0),(54997,102836,0),(54998,102837,0),(54999,102839,0),(55000,102842,0),(55001,102843,0),(55002,102844,0),(55003,102845,0),(55004,102847,0),(55005,102848,0),(55006,102849,0),(55007,102850,0),(55008,102851,0),(55009,102852,0),(55010,102853,0),(55011,102854,0),(55012,102855,0),(55013,102857,0),(55014,102858,0),(55015,102859,0),(55016,102860,0),(55017,102861,0),(55018,102862,0),(55019,102863,0),(55020,102864,0),(55021,102865,0),(55022,102866,0),(55023,102867,0),(55024,102868,0),(55025,102870,0),(55026,102872,0),(55027,102873,0),(55028,102874,0),(55029,102878,0),(55030,102879,0),(55031,102881,0),(55032,102882,0),(55033,102883,0),(55034,102884,0),(55035,102885,0),(55036,102886,0),(55037,102887,0),(55038,102888,0),(55039,102889,0),(55040,102890,0),(55041,102891,0),(55042,102892,0),(55043,102893,0),(55044,102894,0),(55045,102895,0),(55046,102897,0),(55047,102899,0),(55048,102900,0),(55049,102901,0),(55050,102902,0),(55051,102904,0),(55052,102905,0),(55053,102906,0),(55054,102907,0),(55055,102908,0),(55056,102909,0),(55057,102910,0),(55058,102911,0),(55059,102912,0),(55060,102913,0),(55061,102914,0),(55062,102915,0),(55063,102916,0),(55064,102917,0),(55065,102918,0),(55066,102919,0),(55067,102920,0),(55068,102921,0),(55069,102922,0),(55070,102923,0),(55071,102924,0),(55072,102925,0),(55073,102926,0),(55074,102927,0),(55075,102928,0),(55076,102929,0),(55077,102930,0),(55078,102931,0),(55079,102932,0),(55080,102934,0),(55081,102936,0),(55082,102937,0),(55083,102938,0),(55084,102939,0),(55085,102940,0),(55086,102941,0),(55087,102942,0),(55088,102944,0),(55089,102945,0),(55090,102947,0),(55091,102948,0),(55092,102949,0),(55093,102950,0),(55094,102951,0),(55095,102952,0),(55096,102953,0),(55097,102956,0),(55098,102957,0),(55099,102958,0),(55100,102959,0),(55101,102960,0),(55102,102961,0),(55103,102962,0),(55104,102964,0),(55105,102965,0),(55106,102966,0),(55107,102967,0),(55108,102968,0),(55109,102969,0),(55110,102971,0),(55111,102972,0),(55112,102973,0),(55113,102974,0),(55114,102975,0),(55115,102976,0),(55116,102977,0),(55117,102978,0),(55118,102979,0),(55119,102980,0),(55120,102981,0),(55121,102982,0),(55122,102983,0),(55123,102984,0),(55124,102985,0),(55125,102986,0),(55126,102987,0),(55127,102988,0),(55128,102989,0),(55129,102990,0),(55130,102991,0),(55131,102992,0),(55132,102993,0),(55133,102994,0),(55134,102995,0),(55135,102996,0),(55136,102997,0),(55137,102998,0),(55138,102999,0),(55139,103000,0),(55140,103001,0),(55141,103002,0),(55142,103003,0),(55143,103004,0),(55144,103005,0),(55145,103006,0),(55146,103007,0),(55147,103008,0),(55148,103009,0),(55149,103010,0),(55150,103011,0),(55151,103012,0),(55152,103013,0),(55153,103014,0),(55154,103015,0),(55155,103016,0),(55156,103017,0),(55157,103018,0),(55158,103019,0),(55159,103020,0),(55160,103021,0),(55161,103022,0),(55162,103023,0),(55163,103024,0),(55164,103025,0),(55165,103026,0),(55166,103027,0),(55167,103028,0),(55168,103029,0),(55169,103030,0),(55170,103031,0),(55171,103032,0),(55172,103033,0),(55173,103034,0),(55174,103035,0),(55175,103036,0),(55176,103037,0),(55177,103038,0),(55178,103039,0),(55179,103040,0),(55180,103041,0),(55181,103042,0),(55182,103043,0),(55183,103044,0),(55184,103045,0),(55185,103046,0),(55186,103047,0),(55187,103048,0),(55188,103049,0),(55189,103050,0),(55190,103051,0),(55191,103052,0),(55192,103053,0),(55193,103054,0),(55194,103055,0),(55195,103056,0),(55196,103057,0),(55197,103058,0),(55198,103059,0),(55199,103060,0),(55200,103061,0),(55201,103062,0),(55202,103063,0),(55203,103064,0),(55204,103065,0),(55205,103066,0),(55206,103067,0),(55207,103068,0),(55208,103069,0),(55209,103070,0),(55210,103071,0),(55211,103072,0),(55212,103073,0),(55213,103074,0),(55214,103075,0),(55215,103076,0),(55216,103077,0),(55217,103078,0),(55218,103079,0),(55219,103080,0),(55220,103081,0),(55221,103082,0),(55222,103083,0),(55223,103084,0),(55224,103085,0),(55225,103086,0),(55226,103087,0),(55227,103088,0),(55228,103089,0),(55229,103090,0),(55230,103091,0),(55231,103092,0),(55232,103093,0),(55233,103094,0),(55234,103095,0),(55235,103096,0),(55236,103097,0),(55237,103098,0),(55238,103099,0),(55239,103100,0),(55240,103101,0),(55241,103102,0),(55242,103103,0),(55243,103104,0),(55244,103105,0),(55245,103106,0),(55246,103107,0),(55247,103108,0),(55248,103109,0),(55249,103110,0),(55250,103111,0),(55251,103112,0),(55252,103113,0),(55253,103114,0),(55254,103115,0),(55255,103116,0),(55256,103117,0),(55257,103118,0),(55258,103119,0),(55259,103120,0),(55260,103121,0),(55261,103122,0),(55262,103123,0),(55263,103124,0),(55264,103125,0),(55265,103126,0),(55266,103127,0),(55267,103128,0),(55268,103129,0),(55269,103130,0),(55270,103131,0),(55271,103132,0),(55272,103133,0),(55273,103134,0),(55274,103135,0),(55275,103136,0),(55276,103137,0),(55277,103138,0),(55278,103139,0),(55279,103140,0),(55280,103141,0),(55281,103142,0),(55282,103143,0),(55283,103144,0),(55284,103146,0),(55285,103147,0),(55286,103153,0),(55287,103154,0),(55288,103155,0),(55289,103156,0),(55290,103157,0),(55291,103158,0),(55292,103159,0),(55293,103160,0),(55294,103161,0),(55295,103162,0),(55296,103163,0),(55297,103164,0),(55298,103165,0),(55299,103166,0),(55300,103167,0),(55301,103168,0),(55302,103169,0),(55303,103176,0),(55304,103177,0),(55305,103178,0),(55306,103179,0),(55307,103180,0),(55308,103181,0),(55309,103182,0),(55310,103183,0),(55311,103184,0),(55312,103185,0),(55313,103186,0),(55314,103187,0),(55315,103188,0),(55316,103189,0),(55317,103190,0),(55318,103191,0),(55319,103192,0),(55320,103193,0),(55321,103194,0),(55322,103195,0),(55323,103196,0),(55324,103197,0),(55325,103198,0),(55326,103199,0),(55327,103200,0),(55328,103201,0),(55329,103202,0),(55330,103203,0),(55331,103204,0),(55332,103205,0),(55333,103206,0),(55334,103207,0),(55335,103208,0),(55336,103209,0),(55337,103213,0),(55338,103214,0),(55339,103215,0),(55340,103216,0),(55341,103217,0),(55342,103218,0),(55343,103219,0),(55344,103220,0),(55345,103221,0),(55346,103222,0),(55347,103223,0),(55348,103224,0),(55349,103225,0),(55350,103226,0),(55351,103227,0),(55352,103228,0),(55353,103229,0),(55354,103230,0),(55355,103231,0),(55356,103232,0),(55357,103233,0),(55358,103234,0),(55359,103235,0),(55360,103236,0),(55361,103237,0),(55362,103238,0),(55363,103239,0),(55364,103240,0),(55365,103241,0),(55366,103242,0),(55367,103243,0),(55368,103244,0),(55369,103245,0),(55370,103246,0),(55371,103247,0),(55372,103248,0),(55373,103249,0),(55374,103250,0),(55375,103251,0),(55376,103252,0),(55377,103253,0),(55378,103254,0),(55379,103255,0),(55380,103256,0),(55381,103257,0),(55382,103258,0),(55383,103259,0),(55384,103260,0),(55385,103261,0),(55386,103262,0),(55387,103263,0),(55388,103264,0),(55389,103265,0),(55390,103266,0),(55391,103267,0),(55392,103268,0),(55393,103269,0),(55394,103270,0),(55395,103271,0),(55396,103272,0),(55397,103273,0),(55398,103274,0),(55399,103275,0),(55400,103276,0),(55401,103277,0),(55402,103278,0),(55403,103279,0),(55404,103280,0),(55405,103281,0),(55406,103282,0),(55407,103283,0),(55408,103284,0),(55409,103285,0),(55410,103286,0),(55411,103287,0),(55412,103288,0),(55413,103289,0),(55414,103290,0),(55415,103291,0),(55416,103292,0),(55417,103293,0),(55418,103294,0),(55419,103295,0),(55420,103296,0),(55421,103297,0),(55422,103298,0),(55423,103299,0),(55424,103300,0),(55425,103301,0),(55426,103302,0),(55427,103303,0),(55428,103304,0),(55429,103305,0),(55430,103306,0),(55431,103307,0),(55432,103310,0),(55433,103311,0),(55434,103312,0),(55435,103313,0),(55436,103315,0),(55437,103316,0),(55438,103322,0),(55439,103323,0),(55440,103324,0),(55441,103325,0),(55442,103326,0),(55443,103327,0),(55444,103328,0),(55445,103329,0),(55446,103330,0),(55447,103331,0),(55448,103332,0),(55449,103336,0),(55450,103337,0),(55451,103338,0),(55452,103339,0),(55453,103340,0),(55454,103341,0),(55455,103343,0),(55456,103344,0),(55457,103350,0),(55458,103351,0),(55459,103352,0),(55460,103353,0),(55461,103354,0),(55462,103355,0),(55463,103356,0),(55464,103357,0),(55465,103358,0),(55466,103359,0),(55467,103360,0),(55468,103361,0),(55469,103362,0),(55470,103363,0),(55471,103364,0),(55472,103365,0),(55473,103366,0),(55474,103373,0),(55475,103374,0),(55476,103375,0),(55477,103376,0),(55478,103377,0),(55479,103378,0),(55480,103379,0),(55481,103380,0),(55482,103381,0),(55483,103382,0),(55484,103383,0),(55485,103384,0),(55486,103385,0),(55487,103386,0),(55488,103387,0),(55489,103388,0),(55490,103389,0),(55491,103390,0),(55492,103391,0),(55493,103392,0),(55494,103393,0),(55495,103394,0),(55496,103395,0),(55497,103396,0),(55498,103397,0),(55499,103398,0),(55500,103399,0),(55501,103400,0),(55502,103401,0),(55503,103402,0),(55504,103403,0),(55505,103404,0),(55506,103405,0),(55507,103406,0),(55508,103410,0),(55509,103411,0),(55510,103412,0),(55511,103413,0),(55512,103414,0),(55513,103415,0),(55514,103416,0),(55515,103417,0),(55516,103418,0),(55517,103419,0),(55518,103420,0),(55519,103421,0),(55520,103422,0),(55521,103423,0),(55522,103424,0),(55523,103425,0),(55524,103426,0),(55525,103427,0),(55526,103428,0),(55527,103429,0),(55528,103430,0),(55529,103431,0),(55530,103432,0),(55531,103433,0),(55532,103434,0),(55533,103435,0),(55534,103436,0),(55535,103437,0),(55536,103438,0),(55537,103439,0),(55538,103440,0),(55539,103441,0),(55540,103442,0),(55541,103443,0),(55542,103444,0),(55543,103445,0),(55544,103446,0),(55545,103447,0),(55546,103448,0),(55547,103449,0),(55548,103450,0),(55549,103451,0),(55550,103452,0),(55551,103453,0),(55552,103454,0),(55553,103455,0),(55554,103456,0),(55555,103457,0),(55556,103458,0),(55557,103459,0),(55558,103460,0),(55559,103461,0),(55560,103462,0),(55561,103463,0),(55562,103464,0),(55563,103465,0),(55564,103466,0),(55565,103467,0),(55566,103468,0),(55567,103469,0),(55568,103470,0),(55569,103471,0),(55570,103472,0),(55571,103473,0),(55572,103474,0),(55573,103475,0),(55574,103476,0),(55575,103477,0),(55576,103478,0),(55577,103479,0),(55578,103480,0),(55579,103481,0),(55580,103482,0),(55581,103483,0),(55582,103484,0),(55583,103485,0),(55584,103486,0),(55585,103487,0),(55586,103488,0),(55587,103489,0),(55588,103490,0),(55589,103491,0),(55590,103492,0),(55591,103493,0),(55592,103494,0),(55593,103495,0),(55594,103496,0),(55595,103497,0),(55596,103498,0),(55597,103499,0),(55598,103500,0),(55599,103501,0),(55600,103502,0),(55601,103503,0),(55602,103504,0),(55603,103507,0),(55604,103508,0),(55605,103509,0),(55606,103510,0),(55607,103512,0),(55608,103513,0),(55609,103519,0),(55610,103520,0),(55611,103521,0),(55612,103522,0),(55613,103523,0),(55614,103524,0),(55615,103525,0),(55616,103526,0),(55617,103527,0),(55618,103528,0),(55619,103529,0),(55620,103536,0),(55621,103537,0),(55622,103538,0),(55623,103539,0),(55624,103540,0),(55625,103549,0),(55626,103550,0),(55627,103551,0),(55628,103552,0),(55629,103553,0),(55630,103554,0),(55631,103555,0),(55632,103556,0),(55633,103558,0),(55634,103559,0),(55635,103560,0),(55636,103561,0),(55637,103562,0),(55638,103563,0),(55639,103564,0),(55640,103565,0),(55641,103566,0),(55642,103567,0),(55643,103568,0),(55644,103569,0),(55645,103570,0),(55646,103571,0),(55647,103572,0),(55648,103573,0),(55649,103574,0),(55650,103575,0),(55651,103576,0),(55652,103578,0),(55653,103579,0),(55654,103580,0),(55655,103581,0),(55656,103582,0),(55657,103583,0),(55658,103584,0),(55659,103585,0),(55660,103600,0),(55661,103604,0),(55662,103605,0),(55663,103606,0),(55664,103607,0),(55665,103608,0),(55666,103609,0),(55667,103610,0),(55668,103611,0),(55669,103612,0),(55670,103615,0),(55671,103616,0),(55672,103617,0),(55673,103618,0),(55674,103619,0),(55675,103620,0),(55676,103621,0),(55677,103622,0),(55678,103623,0),(55679,103625,0),(55680,103626,0),(55681,103627,0),(55682,103628,0),(55683,103635,0),(55684,103636,0),(55685,103649,0),(55686,103667,0),(55687,103691,0),(55688,103692,0),(55689,103693,0),(55690,103694,0),(55691,103695,0),(55692,103696,0),(55693,103697,0),(55694,103698,0),(55695,103699,0),(55696,103700,0),(55697,103701,0),(55698,103702,0),(55699,103703,0),(55700,103704,0),(55701,103705,0),(55702,103706,0),(55703,103707,0),(55704,103708,0),(55705,103709,0),(55706,103710,0),(55707,103711,0),(55708,103712,0),(55709,103713,0),(55710,103714,0),(55711,103715,0),(55712,103716,0),(55713,103717,0),(55714,103718,0),(55715,103719,0),(55716,103720,0),(55717,103721,0),(55718,103722,0),(55719,103723,0),(55720,103724,0),(55721,103725,0),(55722,103726,0),(55723,103727,0),(55724,103728,0),(55725,103729,0),(55726,103730,0),(55727,103731,0),(55728,103732,0),(55729,103733,0),(55730,103734,0),(55731,103735,0),(55732,103736,0),(55733,103737,0),(55734,103738,0),(55735,103739,0),(55736,103740,0),(55737,103741,0),(55738,103742,0),(55739,103743,0),(55740,103744,0),(55741,103745,0),(55742,103746,0),(55743,103747,0),(55744,103748,0),(55745,103751,0),(55746,103752,0),(55747,103753,0),(55748,103754,0),(55749,103755,0),(55750,103756,0),(55751,103757,0),(55752,103758,0),(55753,103759,0),(55754,103760,0),(55755,103761,0),(55756,103762,0),(55757,103763,0),(55758,103764,0),(55759,103765,0),(55760,103766,0),(55761,103767,0),(55762,103768,0),(55763,103769,0),(55764,103770,0),(55765,103775,0),(55766,103776,0),(55767,103777,0),(55768,103778,0),(55769,103779,0),(55770,103780,0),(55771,103781,0),(55772,103782,0),(55773,103783,0),(55774,103784,0),(55775,103785,0),(55776,103787,0),(55777,103788,0),(55778,103790,0),(55779,103791,0),(55780,103792,0),(55781,103799,0),(55782,103800,0),(55783,103801,0),(55784,103802,0),(55785,103803,0),(55786,103804,0),(55787,103805,0),(55788,103806,0),(55789,103807,0),(55790,103808,0),(55791,103809,0),(55792,103810,0),(55793,103811,0),(55794,103812,0),(55795,103813,0),(55796,103814,0),(55797,103815,0),(55798,103816,0),(55799,103817,0),(55800,103818,0),(55801,103819,0),(55802,103820,0),(55803,103821,0),(55804,103826,0),(55805,103827,0),(55806,103828,0),(55807,103829,0),(55808,103830,0),(55809,103831,0),(55810,103832,0),(55811,103834,0),(55812,103835,0),(55813,103836,0),(55814,103837,0),(55815,103838,0),(55816,103839,0),(55817,103840,0),(55818,103845,0),(55819,103846,0),(55820,103847,0),(55821,103848,0),(55822,103849,0),(55823,103850,0),(55824,103851,0),(55825,103852,0),(55826,103853,0),(55827,103854,0),(55828,103855,0),(55829,103856,0),(55830,103857,0),(55831,103858,0),(55832,103859,0),(55833,103860,0),(55834,103861,0),(55835,103862,0),(55836,103863,0),(55837,103864,0),(55838,103865,0),(55839,103866,0),(55840,103869,0),(55841,103870,0),(55842,103871,0),(55843,103872,0),(55844,103873,0),(55845,103874,0),(55846,103875,0),(55847,103876,0),(55848,103877,0),(55849,103878,0),(55850,103879,0),(55851,103880,0),(55852,103885,0),(55853,103886,0),(55854,103887,0),(55855,103888,0),(55856,103889,0),(55857,103890,0),(55858,103891,0),(55859,103892,0),(55860,103893,0),(55861,103898,0),(55862,103899,0),(55863,103900,0),(55864,103901,0),(55865,103902,0),(55866,103903,0),(55867,103904,0),(55868,103905,0),(55869,103906,0),(55870,103907,0),(55871,103908,0),(55872,103909,0),(55873,103910,0),(55874,103911,0),(55875,103912,0),(55876,103913,0),(55877,103914,0),(55878,103915,0),(55879,103918,0),(55880,103919,0),(55881,103920,0),(55882,103921,0),(55883,103922,0),(55884,103923,0),(55885,103924,0),(55886,103925,0),(55887,103926,0),(55888,103927,0),(55889,103928,0),(55890,103929,0),(55891,103930,0),(55892,103931,0),(55893,103932,0),(55894,103933,0),(55895,103934,0),(55896,103935,0),(55897,103936,0),(55898,103937,0),(55899,103938,0),(55900,103939,0),(55901,103940,0),(55902,103941,0),(55903,103942,0),(55904,103943,0),(55905,103944,0),(55906,103945,0),(55907,103946,0),(55908,103947,0),(55909,103948,0),(55910,103949,0),(55911,103950,0),(55912,103951,0),(55913,103952,0),(55914,103953,0),(55915,103954,0),(55916,103955,0),(55917,103956,0),(55918,103957,0),(55919,103958,0),(55920,103959,0),(55921,103960,0),(55922,103961,0),(55923,103962,0),(55924,103963,0),(55925,103964,0),(55926,103965,0),(55927,103966,0),(55928,103967,0),(55929,103968,0),(55930,103969,0),(55931,103970,0),(55932,103971,0),(55933,103972,0),(55934,103973,0),(55935,103974,0),(55936,103978,0),(55937,103979,0),(55938,103980,0),(55939,103981,0),(55940,103983,0),(55941,103984,0),(55942,103985,0),(55943,104000,0),(55944,104001,0),(55945,104002,0),(55946,104003,0),(55947,104004,0),(55948,104005,0),(55949,104006,0),(55950,104007,0),(55951,104008,0),(55952,104016,0),(55953,104017,0),(55954,104018,0),(55955,104019,0),(55956,104020,0),(55957,104021,0),(55958,104022,0),(55959,104023,0),(55960,104026,0),(55961,104027,0),(55962,104028,0),(55963,104029,0),(55964,104030,0),(55965,104031,0),(55966,104032,0),(55967,104033,0),(55968,104040,0),(55969,104044,0),(55970,104045,0),(55971,104057,0),(55972,104058,0),(55973,104059,0),(55974,104060,0),(55975,104061,0),(55976,104062,0),(55977,104063,0),(55978,104064,0),(55979,104065,0),(55980,104066,0),(55981,104067,0),(55982,104068,0),(55983,104069,0),(55984,104070,0),(55985,104071,0),(55986,104072,0),(55987,104073,0),(55988,104074,0),(55989,104075,0),(55990,104076,0),(55991,104077,0),(55992,104078,0),(55993,104079,0),(55994,104080,0),(55995,104081,0),(55996,104082,0),(55997,104083,0),(55998,104084,0),(55999,104085,0),(56000,104086,0),(56001,104087,0),(56002,104088,0),(56003,104089,0),(56004,104090,0),(56005,104091,0),(56006,104092,0),(56007,104093,0),(56008,104094,0),(56009,104095,0),(56010,104096,0),(56011,104097,0),(56012,104098,0),(56013,104100,0),(56014,104139,0),(56015,104147,0),(56016,104200,0),(56017,104247,0),(56018,104248,0),(56019,104249,0),(56020,104250,0),(56021,104251,0),(56022,104252,0),(56023,104259,0),(56024,104283,0),(56025,104284,0),(56026,104285,0),(56027,104300,0),(56028,104301,0),(56029,104308,0),(56030,104311,0),(56031,104354,0),(56032,104355,0),(56033,104399,0),(56034,104400,0),(56035,104401,0),(56036,104402,0),(56037,104403,0),(56038,104404,0),(56039,104405,0),(56040,104406,0),(56041,104407,0),(56042,104408,0),(56043,104409,0),(56044,104410,0),(56045,104412,0),(56046,104413,0),(56047,104414,0),(56048,104415,0),(56049,104416,0),(56050,104417,0),(56051,104418,0),(56052,104419,0),(56053,104420,0),(56054,104421,0),(56055,104422,0),(56056,104423,0),(56057,104424,0),(56058,104425,0),(56059,104428,0),(56060,104429,0),(56061,104430,0),(56062,104431,0),(56063,104432,0),(56064,104433,0),(56065,104434,0),(56066,104435,0),(56067,104436,0),(56068,104437,0),(56069,104438,0),(56070,104439,0),(56071,104441,0),(56072,104443,0),(56073,104444,0),(56074,104445,0),(56075,104446,0),(56076,104448,0),(56077,104449,0),(56078,104450,0),(56079,104451,0),(56080,104452,0),(56081,104453,0),(56082,104454,0),(56083,104456,0),(56084,104457,0),(56085,104458,0),(56086,104459,0),(56087,104460,0),(56088,104461,0),(56089,104462,0),(56090,104464,0),(56091,104465,0),(56092,104466,0),(56093,104467,0),(56094,104468,0),(56095,104470,0),(56096,104471,0),(56097,104472,0),(56098,104473,0),(56099,104474,0),(56100,104475,0),(56101,104479,0),(56102,104480,0),(56103,104481,0),(56104,104482,0),(56105,104483,0),(56106,104485,0),(56107,104486,0),(56108,104488,0),(56109,104489,0),(56110,104490,0),(56111,104491,0),(56112,104492,0),(56113,104493,0),(56114,104494,0),(56115,104497,0),(56116,104498,0),(56117,104499,0),(56118,104500,0),(56119,104501,0),(56120,104503,0),(56121,104504,0),(56122,104505,0),(56123,104506,0),(56124,104507,0),(56125,104508,0),(56126,104509,0),(56127,104510,0),(56128,104511,0),(56129,104512,0),(56130,104513,0),(56131,104514,0),(56132,104515,0),(56133,104516,0),(56134,104519,0),(56135,104520,0),(56136,104521,0),(56137,104522,0),(56138,104523,0),(56139,104525,0),(56140,104526,0),(56141,104527,0),(56142,104528,0),(56143,104529,0),(56144,104530,0),(56145,104532,0),(56146,104533,0),(56147,104534,0),(56148,104535,0),(56149,104536,0),(56150,104537,0),(56151,104539,0),(56152,104541,0),(56153,104542,0),(56154,104545,0),(56155,104546,0),(56156,104547,0),(56157,104548,0),(56158,104549,0),(56159,104550,0),(56160,104551,0),(56161,104552,0),(56162,104554,0),(56163,104555,0),(56164,104556,0),(56165,104557,0),(56166,104558,0),(56167,104559,0),(56168,104560,0),(56169,104561,0),(56170,104563,0),(56171,104564,0),(56172,104565,0),(56173,104566,0),(56174,104567,0),(56175,104568,0),(56176,104569,0),(56177,104571,0),(56178,104573,0),(56179,104574,0),(56180,104575,0),(56181,104577,0),(56182,104579,0),(56183,104580,0),(56184,104581,0),(56185,104582,0),(56186,104583,0),(56187,104585,0),(56188,104586,0),(56189,104587,0),(56190,104588,0),(56191,104589,0),(56192,104590,0),(56193,104591,0),(56194,104592,0),(56195,104594,0),(56196,104595,0),(56197,104596,0),(56198,104598,0),(56199,104599,0),(56200,104600,0),(56201,104601,0),(56202,104602,0),(56203,104603,0),(56204,104604,0),(56205,104605,0),(56206,104607,0),(56207,104608,0),(56208,104609,0),(56209,104612,0),(56210,104614,0),(56211,104617,0),(56212,104618,0),(56213,104620,0),(56214,104621,0),(56215,104622,0),(56216,104623,0),(56217,104625,0),(56218,104627,0),(56219,104629,0),(56220,104630,0),(56221,104631,0),(56222,104633,0),(56223,104634,0),(56224,104635,0),(56225,104637,0),(56226,104638,0),(56227,104639,0),(56228,104640,0),(56229,104641,0),(56230,104642,0),(56231,104643,0),(56232,104644,0),(56233,104645,0),(56234,104646,0),(56235,104647,0),(56236,104648,0),(56237,104650,0),(56238,104651,0),(56239,104653,0),(56240,104654,0),(56241,104655,0),(56242,104656,0),(56243,104657,0),(56244,104658,0),(56245,104659,0),(56246,104661,0),(56247,104662,0),(56248,104663,0),(56249,104664,0),(56250,104665,0),(56251,104666,0),(56252,104667,0),(56253,104668,0),(56254,104669,0),(56255,104670,0),(56256,104671,0),(56257,104672,0),(56258,104673,0),(56259,104674,0),(56260,104677,0),(56261,104678,0),(56262,104679,0),(56263,104680,0),(56264,104681,0),(56265,104682,0),(56266,104683,0),(56267,104684,0),(56268,104685,0),(56269,104686,0),(56270,104687,0),(56271,104688,0),(56272,104690,0),(56273,104692,0),(56274,104693,0),(56275,104694,0),(56276,104695,0),(56277,104697,0),(56278,104698,0),(56279,104699,0),(56280,104700,0),(56281,104701,0),(56282,104702,0),(56283,104703,0),(56284,104705,0),(56285,104706,0),(56286,104707,0),(56287,104708,0),(56288,104709,0),(56289,104710,0),(56290,104711,0),(56291,104713,0),(56292,104714,0),(56293,104715,0),(56294,104716,0),(56295,104717,0),(56296,104719,0),(56297,104720,0),(56298,104721,0),(56299,104722,0),(56300,104723,0),(56301,104724,0),(56302,104728,0),(56303,104729,0),(56304,104730,0),(56305,104731,0),(56306,104732,0),(56307,104734,0),(56308,104735,0),(56309,104737,0),(56310,104738,0),(56311,104739,0),(56312,104740,0),(56313,104741,0),(56314,104742,0),(56315,104743,0),(56316,104746,0),(56317,104747,0),(56318,104748,0),(56319,104749,0),(56320,104750,0),(56321,104752,0),(56322,104753,0),(56323,104754,0),(56324,104755,0),(56325,104756,0),(56326,104757,0),(56327,104758,0),(56328,104759,0),(56329,104760,0),(56330,104761,0),(56331,104762,0),(56332,104763,0),(56333,104764,0),(56334,104765,0),(56335,104768,0),(56336,104769,0),(56337,104770,0),(56338,104771,0),(56339,104772,0),(56340,104774,0),(56341,104775,0),(56342,104776,0),(56343,104777,0),(56344,104778,0),(56345,104779,0),(56346,104781,0),(56347,104782,0),(56348,104783,0),(56349,104784,0),(56350,104785,0),(56351,104786,0),(56352,104788,0),(56353,104790,0),(56354,104791,0),(56355,104794,0),(56356,104795,0),(56357,104796,0),(56358,104797,0),(56359,104798,0),(56360,104799,0),(56361,104800,0),(56362,104801,0),(56363,104803,0),(56364,104804,0),(56365,104805,0),(56366,104806,0),(56367,104807,0),(56368,104808,0),(56369,104809,0),(56370,104810,0),(56371,104812,0),(56372,104813,0),(56373,104814,0),(56374,104815,0),(56375,104816,0),(56376,104817,0),(56377,104818,0),(56378,104820,0),(56379,104822,0),(56380,104823,0),(56381,104824,0),(56382,104826,0),(56383,104828,0),(56384,104829,0),(56385,104830,0),(56386,104831,0),(56387,104832,0),(56388,104834,0),(56389,104835,0),(56390,104836,0),(56391,104837,0),(56392,104838,0),(56393,104839,0),(56394,104840,0),(56395,104841,0),(56396,104843,0),(56397,104844,0),(56398,104845,0),(56399,104847,0),(56400,104848,0),(56401,104849,0),(56402,104850,0),(56403,104851,0),(56404,104852,0),(56405,104853,0),(56406,104854,0),(56407,104856,0),(56408,104857,0),(56409,104858,0),(56410,104861,0),(56411,104863,0),(56412,104866,0),(56413,104867,0),(56414,104869,0),(56415,104870,0),(56416,104871,0),(56417,104872,0),(56418,104874,0),(56419,104876,0),(56420,104878,0),(56421,104879,0),(56422,104880,0),(56423,104882,0),(56424,104883,0),(56425,104884,0),(56426,104886,0),(56427,104887,0),(56428,104888,0),(56429,104889,0),(56430,104890,0),(56431,104891,0),(56432,104892,0),(56433,104893,0),(56434,104894,0),(56435,104895,0),(56436,104896,0),(56437,104897,0),(56438,104899,0),(56439,104900,0),(56440,104902,0),(56441,104903,0),(56442,104904,0),(56443,104905,0),(56444,104906,0),(56445,104907,0),(56446,104908,0),(56447,104910,0),(56448,104911,0),(56449,104912,0),(56450,104913,0),(56451,104914,0),(56452,104915,0),(56453,104916,0),(56454,104917,0),(56455,104918,0),(56456,104919,0),(56457,104920,0),(56458,104921,0),(56459,104922,0),(56460,104923,0),(56461,104926,0),(56462,104927,0),(56463,104928,0),(56464,104929,0),(56465,104930,0),(56466,104931,0),(56467,104932,0),(56468,104933,0),(56469,104934,0),(56470,104935,0),(56471,104936,0),(56472,104937,0),(56473,104939,0),(56474,104941,0),(56475,104942,0),(56476,104943,0),(56477,104944,0),(56478,104946,0),(56479,104947,0),(56480,104948,0),(56481,104949,0),(56482,104950,0),(56483,104951,0),(56484,104952,0),(56485,104954,0),(56486,104955,0),(56487,104956,0),(56488,104957,0),(56489,104958,0),(56490,104959,0),(56491,104960,0),(56492,104962,0),(56493,104963,0),(56494,104964,0),(56495,104965,0),(56496,104966,0),(56497,104968,0),(56498,104969,0),(56499,104970,0),(56500,104971,0),(56501,104972,0),(56502,104973,0),(56503,104977,0),(56504,104978,0),(56505,104979,0),(56506,104980,0),(56507,104981,0),(56508,104983,0),(56509,104984,0),(56510,104986,0),(56511,104987,0),(56512,104988,0),(56513,104989,0),(56514,104990,0),(56515,104991,0),(56516,104992,0),(56517,104995,0),(56518,104996,0),(56519,104997,0),(56520,104998,0),(56521,104999,0),(56522,105001,0),(56523,105002,0),(56524,105003,0),(56525,105004,0),(56526,105005,0),(56527,105006,0),(56528,105007,0),(56529,105008,0),(56530,105009,0),(56531,105010,0),(56532,105011,0),(56533,105012,0),(56534,105013,0),(56535,105014,0),(56536,105017,0),(56537,105018,0),(56538,105019,0),(56539,105020,0),(56540,105021,0),(56541,105023,0),(56542,105024,0),(56543,105025,0),(56544,105026,0),(56545,105027,0),(56546,105028,0),(56547,105030,0),(56548,105031,0),(56549,105032,0),(56550,105033,0),(56551,105034,0),(56552,105035,0),(56553,105037,0),(56554,105039,0),(56555,105040,0),(56556,105043,0),(56557,105044,0),(56558,105045,0),(56559,105046,0),(56560,105047,0),(56561,105048,0),(56562,105049,0),(56563,105050,0),(56564,105052,0),(56565,105053,0),(56566,105054,0),(56567,105055,0),(56568,105056,0),(56569,105057,0),(56570,105058,0),(56571,105059,0),(56572,105061,0),(56573,105062,0),(56574,105063,0),(56575,105064,0),(56576,105065,0),(56577,105066,0),(56578,105067,0),(56579,105069,0),(56580,105071,0),(56581,105072,0),(56582,105073,0),(56583,105075,0),(56584,105077,0),(56585,105078,0),(56586,105079,0),(56587,105080,0),(56588,105081,0),(56589,105083,0),(56590,105084,0),(56591,105085,0),(56592,105086,0),(56593,105087,0),(56594,105088,0),(56595,105089,0),(56596,105090,0),(56597,105092,0),(56598,105093,0),(56599,105094,0),(56600,105096,0),(56601,105097,0),(56602,105098,0),(56603,105099,0),(56604,105100,0),(56605,105101,0),(56606,105102,0),(56607,105103,0),(56608,105105,0),(56609,105106,0),(56610,105107,0),(56611,105110,0),(56612,105112,0),(56613,105115,0),(56614,105116,0),(56615,105118,0),(56616,105119,0),(56617,105120,0),(56618,105121,0),(56619,105123,0),(56620,105125,0),(56621,105127,0),(56622,105128,0),(56623,105129,0),(56624,105131,0),(56625,105132,0),(56626,105133,0),(56627,105135,0),(56628,105136,0),(56629,105137,0),(56630,105138,0),(56631,105139,0),(56632,105140,0),(56633,105141,0),(56634,105142,0),(56635,105143,0),(56636,105144,0),(56637,105145,0),(56638,105146,0),(56639,105148,0),(56640,105149,0),(56641,105151,0),(56642,105152,0),(56643,105153,0),(56644,105154,0),(56645,105155,0),(56646,105156,0),(56647,105157,0),(56648,105159,0),(56649,105160,0),(56650,105161,0),(56651,105162,0),(56652,105163,0),(56653,105164,0),(56654,105165,0),(56655,105166,0),(56656,105167,0),(56657,105168,0),(56658,105169,0),(56659,105170,0),(56660,105171,0),(56661,105172,0),(56662,105175,0),(56663,105176,0),(56664,105177,0),(56665,105178,0),(56666,105179,0),(56667,105180,0),(56668,105181,0),(56669,105182,0),(56670,105183,0),(56671,105184,0),(56672,105185,0),(56673,105186,0),(56674,105188,0),(56675,105190,0),(56676,105191,0),(56677,105192,0),(56678,105193,0),(56679,105195,0),(56680,105196,0),(56681,105197,0),(56682,105198,0),(56683,105199,0),(56684,105200,0),(56685,105201,0),(56686,105203,0),(56687,105204,0),(56688,105205,0),(56689,105206,0),(56690,105207,0),(56691,105208,0),(56692,105209,0),(56693,105211,0),(56694,105212,0),(56695,105213,0),(56696,105214,0),(56697,105215,0),(56698,105217,0),(56699,105218,0),(56700,105219,0),(56701,105220,0),(56702,105221,0),(56703,105222,0),(56704,105226,0),(56705,105227,0),(56706,105228,0),(56707,105229,0),(56708,105230,0),(56709,105232,0),(56710,105233,0),(56711,105235,0),(56712,105236,0),(56713,105237,0),(56714,105238,0),(56715,105239,0),(56716,105240,0),(56717,105241,0),(56718,105244,0),(56719,105245,0),(56720,105246,0),(56721,105247,0),(56722,105248,0),(56723,105250,0),(56724,105251,0),(56725,105252,0),(56726,105253,0),(56727,105254,0),(56728,105255,0),(56729,105256,0),(56730,105257,0),(56731,105258,0),(56732,105259,0),(56733,105260,0),(56734,105261,0),(56735,105262,0),(56736,105263,0),(56737,105266,0),(56738,105267,0),(56739,105268,0),(56740,105269,0),(56741,105270,0),(56742,105272,0),(56743,105273,0),(56744,105274,0),(56745,105275,0),(56746,105276,0),(56747,105277,0),(56748,105279,0),(56749,105280,0),(56750,105281,0),(56751,105282,0),(56752,105283,0),(56753,105284,0),(56754,105286,0),(56755,105288,0),(56756,105289,0),(56757,105292,0),(56758,105293,0),(56759,105294,0),(56760,105295,0),(56761,105296,0),(56762,105297,0),(56763,105298,0),(56764,105299,0),(56765,105301,0),(56766,105302,0),(56767,105303,0),(56768,105304,0),(56769,105305,0),(56770,105306,0),(56771,105307,0),(56772,105308,0),(56773,105310,0),(56774,105311,0),(56775,105312,0),(56776,105313,0),(56777,105314,0),(56778,105315,0),(56779,105316,0),(56780,105318,0),(56781,105320,0),(56782,105321,0),(56783,105322,0),(56784,105324,0),(56785,105326,0),(56786,105327,0),(56787,105328,0),(56788,105329,0),(56789,105330,0),(56790,105332,0),(56791,105333,0),(56792,105334,0),(56793,105335,0),(56794,105336,0),(56795,105337,0),(56796,105338,0),(56797,105339,0),(56798,105341,0),(56799,105342,0),(56800,105343,0),(56801,105345,0),(56802,105346,0),(56803,105347,0),(56804,105348,0),(56805,105349,0),(56806,105350,0),(56807,105351,0),(56808,105352,0),(56809,105354,0),(56810,105355,0),(56811,105356,0),(56812,105359,0),(56813,105361,0),(56814,105364,0),(56815,105365,0),(56816,105367,0),(56817,105368,0),(56818,105369,0),(56819,105370,0),(56820,105372,0),(56821,105374,0),(56822,105376,0),(56823,105377,0),(56824,105378,0),(56825,105380,0),(56826,105381,0),(56827,105382,0),(56828,105384,0),(56829,105385,0),(56830,105386,0),(56831,105387,0),(56832,105388,0),(56833,105389,0),(56834,105390,0),(56835,105391,0),(56836,105392,0),(56837,105393,0),(56838,105394,0),(56839,105395,0),(56840,105397,0),(56841,105398,0),(56842,105400,0),(56843,105401,0),(56844,105402,0),(56845,105403,0),(56846,105404,0),(56847,105405,0),(56848,105406,0),(56849,105408,0),(56850,105409,0),(56851,105410,0),(56852,105411,0),(56853,105412,0),(56854,105413,0),(56855,105414,0),(56856,105415,0),(56857,105416,0),(56858,105417,0),(56859,105418,0),(56860,105419,0),(56861,105420,0),(56862,105421,0),(56863,105424,0),(56864,105425,0),(56865,105426,0),(56866,105427,0),(56867,105428,0),(56868,105429,0),(56869,105430,0),(56870,105431,0),(56871,105432,0),(56872,105433,0),(56873,105434,0),(56874,105435,0),(56875,105437,0),(56876,105439,0),(56877,105440,0),(56878,105441,0),(56879,105442,0),(56880,105444,0),(56881,105445,0),(56882,105446,0),(56883,105447,0),(56884,105448,0),(56885,105449,0),(56886,105450,0),(56887,105452,0),(56888,105453,0),(56889,105454,0),(56890,105455,0),(56891,105456,0),(56892,105457,0),(56893,105458,0),(56894,105460,0),(56895,105461,0),(56896,105462,0),(56897,105463,0),(56898,105464,0),(56899,105466,0),(56900,105467,0),(56901,105468,0),(56902,105469,0),(56903,105470,0),(56904,105471,0),(56905,105475,0),(56906,105476,0),(56907,105477,0),(56908,105478,0),(56909,105479,0),(56910,105481,0),(56911,105482,0),(56912,105484,0),(56913,105485,0),(56914,105486,0),(56915,105487,0),(56916,105488,0),(56917,105489,0),(56918,105490,0),(56919,105493,0),(56920,105494,0),(56921,105495,0),(56922,105496,0),(56923,105497,0),(56924,105499,0),(56925,105500,0),(56926,105501,0),(56927,105502,0),(56928,105503,0),(56929,105504,0),(56930,105505,0),(56931,105506,0),(56932,105507,0),(56933,105508,0),(56934,105509,0),(56935,105510,0),(56936,105511,0),(56937,105512,0),(56938,105515,0),(56939,105516,0),(56940,105517,0),(56941,105518,0),(56942,105519,0),(56943,105521,0),(56944,105522,0),(56945,105523,0),(56946,105524,0),(56947,105525,0),(56948,105526,0),(56949,105528,0),(56950,105529,0),(56951,105530,0),(56952,105531,0),(56953,105532,0),(56954,105533,0),(56955,105535,0),(56956,105537,0),(56957,105538,0),(56958,105541,0),(56959,105542,0),(56960,105543,0),(56961,105544,0),(56962,105545,0),(56963,105546,0),(56964,105547,0),(56965,105548,0),(56966,105550,0),(56967,105551,0),(56968,105552,0),(56969,105553,0),(56970,105554,0),(56971,105555,0),(56972,105556,0),(56973,105557,0),(56974,105559,0),(56975,105560,0),(56976,105561,0),(56977,105562,0),(56978,105563,0),(56979,105564,0),(56980,105565,0),(56981,105567,0),(56982,105569,0),(56983,105570,0),(56984,105571,0),(56985,105573,0),(56986,105575,0),(56987,105576,0),(56988,105577,0),(56989,105578,0),(56990,105579,0),(56991,105581,0),(56992,105582,0),(56993,105583,0),(56994,105584,0),(56995,105585,0),(56996,105586,0),(56997,105587,0),(56998,105588,0),(56999,105590,0),(57000,105591,0),(57001,105592,0),(57002,105594,0),(57003,105595,0),(57004,105596,0),(57005,105597,0),(57006,105598,0),(57007,105599,0),(57008,105600,0),(57009,105601,0),(57010,105603,0),(57011,105604,0),(57012,105605,0),(57013,105608,0),(57014,105610,0),(57015,105613,0),(57016,105614,0),(57017,105616,0),(57018,105617,0),(57019,105618,0),(57020,105619,0),(57021,105621,0),(57022,105623,0),(57023,105625,0),(57024,105626,0),(57025,105627,0),(57026,105629,0),(57027,105630,0),(57028,105631,0),(57029,105633,0),(57030,105634,0),(57031,105635,0),(57032,105636,0),(57033,105637,0),(57034,105638,0),(57035,105639,0),(57036,105640,0),(57037,105641,0),(57038,105642,0),(57039,105643,0),(57040,105644,0),(57041,105646,0),(57042,105647,0),(57043,105649,0),(57044,105650,0),(57045,105651,0),(57046,105652,0),(57047,105653,0),(57048,105654,0),(57049,105655,0),(57050,105670,0),(57051,105671,0),(57052,105672,0),(57053,105673,0),(57054,105674,0),(57055,105675,0),(57056,105676,0),(57057,105677,0),(57058,105678,0),(57059,105679,0),(57060,105680,0),(57061,105683,0),(57062,105684,0),(57063,105685,0),(57064,105686,0),(57065,105687,0),(57066,105688,0),(57067,105689,0),(57068,105690,0),(57069,105691,0),(57070,105692,0),(57071,105693,0),(57072,105710,0),(57073,105741,0),(57074,105742,0),(57075,105743,0),(57076,105744,0),(57077,105745,0),(57078,105746,0),(57079,105747,0),(57080,105748,0),(57081,105754,0),(57082,105755,0),(57083,105756,0),(57084,105757,0),(57085,105758,0),(57086,105759,0),(57087,105760,0),(57088,105761,0),(57089,105767,0),(57090,105768,0),(57091,105769,0),(57092,105770,0),(57093,105771,0),(57094,105772,0),(57095,105773,0),(57096,105774,0),(57097,105775,0),(57098,105776,0),(57099,105777,0),(57100,105778,0),(57101,105779,0),(57102,105780,0),(57103,105781,0),(57104,105782,0),(57105,105783,0),(57106,105784,0),(57107,105785,0),(57108,105786,0),(57109,105787,0),(57110,105788,0),(57111,105789,0),(57112,105790,0),(57113,105791,0),(57114,105792,0),(57115,105793,0),(57116,105794,0),(57117,105795,0),(57118,105796,0),(57119,105797,0),(57120,105798,0),(57121,105799,0),(57122,105800,0),(57123,105801,0),(57124,105802,0),(57125,105803,0),(57126,105804,0),(57127,105805,0),(57128,105806,0),(57129,105807,0),(57130,105808,0),(57131,105809,0),(57132,105810,0),(57133,105811,0),(57134,105812,0),(57135,105813,0),(57136,105814,0),(57137,105815,0),(57138,105816,0),(57139,105817,0),(57140,105818,0),(57141,105819,0),(57142,105820,0),(57143,105821,0),(57144,105822,0),(57145,105823,0),(57146,105824,0),(57147,105825,0),(57148,105826,0),(57149,105827,0),(57150,105828,0),(57151,105829,0),(57152,105830,0),(57153,105831,0),(57154,105832,0),(57155,105833,0),(57156,105834,0),(57157,105835,0),(57158,105836,0),(57159,105837,0),(57160,105838,0),(57161,105839,0),(57162,105840,0),(57163,105841,0),(57164,105842,0),(57165,105843,0),(57166,105844,0),(57167,105845,0),(57168,105846,0),(57169,105847,0),(57170,105848,0),(57171,105849,0),(57172,105850,0),(57173,105851,0),(57174,105852,0),(57175,105853,0),(57176,105907,0),(57177,105908,0),(57178,105909,0),(57179,105910,0),(57180,105914,0),(57181,105915,0),(57182,105916,0),(57183,105919,0),(57184,105920,0),(57185,105921,0),(57186,105922,0),(57187,105923,0),(57188,105924,0),(57189,105925,0),(57190,105926,0),(57191,105927,0),(57192,105928,0),(57193,105929,0),(57194,105938,0),(57195,105939,0),(57196,105940,0),(57197,105941,0),(57198,105942,0),(57199,105945,0),(57200,105953,0),(57201,105954,0),(57202,105955,0),(57203,105956,0),(57204,105957,0),(57205,106044,0),(57206,106045,0),(57207,106102,0),(57208,106104,0),(57209,106105,0),(57210,106106,0),(57211,106107,0),(57212,106108,0),(57213,106109,0),(57214,106110,0),(57215,106111,0),(57216,106112,0),(57217,106113,0),(57218,106114,0),(57219,106115,0),(57220,106116,0),(57221,106117,0),(57222,106118,0),(57223,106119,0),(57224,106120,0),(57225,106121,0),(57226,106122,0),(57227,106123,0),(57228,106124,0),(57229,106125,0),(57230,106126,0),(57231,106127,0),(57232,106128,0),(57233,106134,0),(57234,106135,0),(57235,106136,0),(57236,106137,0),(57237,106138,0),(57238,106139,0),(57239,106140,0),(57240,106141,0),(57241,106142,0),(57242,106143,0),(57243,106144,0),(57244,106145,0),(57245,106146,0),(57246,106147,0),(57247,106148,0),(57248,106149,0),(57249,106150,0),(57250,106151,0),(57251,106152,0),(57252,106153,0),(57253,106154,0),(57254,106155,0),(57255,106156,0),(57256,106157,0),(57257,106158,0),(57258,106159,0),(57259,106160,0),(57260,106161,0),(57261,106162,0),(57262,106163,0),(57263,106164,0),(57264,106165,0),(57265,106166,0),(57266,106167,0),(57267,106168,0),(57268,106169,0),(57269,106170,0),(57270,106171,0),(57271,106172,0),(57272,106173,0),(57273,106174,0),(57274,106175,0),(57275,106176,0),(57276,106177,0),(57277,106178,0),(57278,106202,0),(57279,106203,0),(57280,106204,0),(57281,106205,0),(57282,106206,0),(57283,106207,0),(57284,106208,0),(57285,106209,0),(57286,106214,0),(57287,106215,0),(57288,106216,0),(57289,106217,0),(57290,106222,0),(57291,106223,0),(57292,106224,0),(57293,106225,0),(57294,106227,0),(57295,106228,0),(57296,106229,0),(57297,106230,0),(57298,106231,0),(57299,106232,0),(57300,106233,0),(57301,106234,0),(57302,106247,0),(57303,106248,0),(57304,106249,0),(57305,106250,0),(57306,106252,0),(57307,106253,0),(57308,106254,0),(57309,106255,0),(57310,106258,0),(57311,106259,0),(57312,106260,0),(57313,106261,0),(57314,106262,0),(57315,106263,0),(57316,106264,0),(57317,106265,0),(57318,106266,0),(57319,106267,0),(57320,106268,0),(57321,106269,0),(57322,106270,0),(57323,106271,0),(57324,106272,0),(57325,106273,0),(57326,106274,0),(57327,106275,0),(57328,106276,0),(57329,106277,0),(57330,106278,0),(57331,106279,0),(57332,106280,0),(57333,106281,0),(57334,106283,0),(57335,106284,0),(57336,106285,0),(57337,106286,0),(57338,106287,0),(57339,106288,0),(57340,106289,0),(57341,106290,0),(57342,106291,0),(57343,106292,0),(57344,106293,0),(57345,106294,0),(57346,106295,0),(57347,106296,0),(57348,106297,0),(57349,106298,0),(57350,106299,0),(57351,106300,0),(57352,106301,0),(57353,106302,0),(57354,106303,0),(57355,106304,0),(57356,106305,0),(57357,106306,0),(57358,106307,0),(57359,106308,0),(57360,106309,0),(57361,106310,0),(57362,106311,0),(57363,106312,0),(57364,106313,0),(57365,106314,0),(57366,106315,0),(57367,106316,0),(57368,106317,0),(57369,106318,0),(57370,106319,0),(57371,106320,0),(57372,106321,0),(57373,106322,0),(57374,106323,0),(57375,106324,0),(57376,106325,0),(57377,106326,0),(57378,106327,0),(57379,106328,0),(57380,106329,0),(57381,106330,0),(57382,106331,0),(57383,106332,0),(57384,106333,0),(57385,106334,0),(57386,106335,0),(57387,106336,0),(57388,106337,0),(57389,106338,0),(57390,106339,0),(57391,106340,0),(57392,106341,0),(57393,106342,0),(57394,106343,0),(57395,106344,0),(57396,106345,0),(57397,106346,0),(57398,106347,0),(57399,106348,0),(57400,106349,0),(57401,106350,0),(57402,106351,0),(57403,106352,0),(57404,106353,0),(57405,106354,0),(57406,106355,0),(57407,106356,0),(57408,106357,0),(57409,106358,0),(57410,106359,0),(57411,106360,0),(57412,106361,0),(57413,106362,0),(57414,106363,0),(57415,106364,0),(57416,106365,0),(57417,106366,0),(57418,106367,0),(57419,106368,0),(57420,106369,0),(57421,106370,0),(57422,106371,0),(57423,106372,0),(57424,106373,0),(57425,106374,0),(57426,106375,0),(57427,106376,0),(57428,106377,0),(57429,106378,0),(57430,106379,0),(57431,106380,0),(57432,106381,0),(57433,106382,0),(57434,106383,0),(57435,106384,0),(57436,106385,0),(57437,106386,0),(57438,106387,0),(57439,106388,0),(57440,106389,0),(57441,106390,0),(57442,106391,0),(57443,106392,0),(57444,106393,0),(57445,106394,0),(57446,106395,0),(57447,106396,0),(57448,106397,0),(57449,106398,0),(57450,106399,0),(57451,106400,0),(57452,106401,0),(57453,106402,0),(57454,106403,0),(57455,106404,0),(57456,106405,0),(57457,106406,0),(57458,106407,0),(57459,106408,0),(57460,106409,0),(57461,106410,0),(57462,106411,0),(57463,106412,0),(57464,106413,0),(57465,106414,0),(57466,106415,0),(57467,106416,0),(57468,106417,0),(57469,106418,0),(57470,106419,0),(57471,106420,0),(57472,106421,0),(57473,106422,0),(57474,106423,0),(57475,106424,0),(57476,106425,0),(57477,106426,0),(57478,106427,0),(57479,106428,0),(57480,106429,0),(57481,106430,0),(57482,106431,0),(57483,106432,0),(57484,106433,0),(57485,106434,0),(57486,106435,0),(57487,106436,0),(57488,106437,0),(57489,106438,0),(57490,106439,0),(57491,106440,0),(57492,106441,0),(57493,106442,0),(57494,106443,0),(57495,106444,0),(57496,106445,0),(57497,106446,0),(57498,106447,0),(57499,106448,0),(57500,106449,0),(57501,106450,0),(57502,106451,0),(57503,106452,0),(57504,106453,0),(57505,106454,0),(57506,106455,0),(57507,106456,0),(57508,106457,0),(57509,106458,0),(57510,106459,0),(57511,106460,0),(57512,106461,0),(57513,106462,0),(57514,106463,0),(57515,106464,0),(57516,106465,0),(57517,106466,0),(57518,106467,0),(57519,106468,0),(57520,106469,0),(57521,106470,0),(57522,106471,0),(57523,106472,0),(57524,106473,0),(57525,106474,0),(57526,106475,0),(57527,106476,0),(57528,106477,0),(57529,106478,0),(57530,106479,0),(57531,106480,0),(57532,106481,0),(57533,106482,0),(57534,106483,0),(57535,106484,0),(57536,106485,0),(57537,106486,0),(57538,106487,0),(57539,106488,0),(57540,106489,0),(57541,106490,0),(57542,106491,0),(57543,106492,0),(57544,106493,0),(57545,106494,0),(57546,106495,0),(57547,106496,0),(57548,106497,0),(57549,106498,0),(57550,106499,0),(57551,106500,0),(57552,106501,0),(57553,106502,0),(57554,106503,0),(57555,106504,0),(57556,106505,0),(57557,106506,0),(57558,106507,0),(57559,106508,0),(57560,106509,0),(57561,106510,0),(57562,106511,0),(57563,106512,0),(57564,106513,0),(57565,106514,0),(57566,106515,0),(57567,106516,0),(57568,106517,0),(57569,106518,0),(57570,106519,0),(57571,106520,0),(57572,106521,0),(57573,106522,0),(57574,106523,0),(57575,106524,0),(57576,106525,0),(57577,106526,0),(57578,106527,0),(57579,106528,0),(57580,106529,0),(57581,106530,0),(57582,106531,0),(57583,106532,0),(57584,106533,0),(57585,106534,0),(57586,106535,0),(57587,106536,0),(57588,106537,0),(57589,106538,0),(57590,106539,0),(57591,106540,0),(57592,106541,0),(57593,106542,0),(57594,106543,0),(57595,106544,0),(57596,106545,0),(57597,106546,0),(57598,106547,0),(57599,106548,0),(57600,106549,0),(57601,106550,0),(57602,106551,0),(57603,106552,0),(57604,106553,0),(57605,106554,0),(57606,106555,0),(57607,106556,0),(57608,106557,0),(57609,106558,0),(57610,106559,0),(57611,106560,0),(57612,106561,0),(57613,106562,0),(57614,106563,0),(57615,106564,0),(57616,106565,0),(57617,106566,0),(57618,106567,0),(57619,106568,0),(57620,106569,0),(57621,106570,0),(57622,106571,0),(57623,106572,0),(57624,106573,0),(57625,106574,0),(57626,106575,0),(57627,106576,0),(57628,106577,0),(57629,106578,0),(57630,106579,0),(57631,106580,0),(57632,106581,0),(57633,106582,0),(57634,106583,0),(57635,106584,0),(57636,106585,0),(57637,106586,0),(57638,106587,0),(57639,106588,0),(57640,106589,0),(57641,106590,0),(57642,106591,0),(57643,106592,0),(57644,106593,0),(57645,106594,0),(57646,106595,0),(57647,106596,0),(57648,106597,0),(57649,106598,0),(57650,106599,0),(57651,106600,0),(57652,106601,0),(57653,106602,0),(57654,106603,0),(57655,106604,0),(57656,106605,0),(57657,106606,0),(57658,106607,0),(57659,106608,0),(57660,106609,0),(57661,106610,0),(57662,106611,0),(57663,106612,0),(57664,106613,0),(57665,106614,0),(57666,106615,0),(57667,106616,0),(57668,106617,0),(57669,106618,0),(57670,106619,0),(57671,106620,0),(57672,106621,0),(57673,106622,0),(57674,106623,0),(57675,106624,0),(57676,106625,0),(57677,106626,0),(57678,106627,0),(57679,106628,0),(57680,106629,0),(57681,106630,0),(57682,106631,0),(57683,106632,0),(57684,106633,0),(57685,106634,0),(57686,106635,0),(57687,106636,0),(57688,106637,0),(57689,106638,0),(57690,106639,0),(57691,106640,0),(57692,106641,0),(57693,106642,0),(57694,106643,0),(57695,106644,0),(57696,106645,0),(57697,106646,0),(57698,106647,0),(57699,106648,0),(57700,106649,0),(57701,106650,0),(57702,106651,0),(57703,106652,0),(57704,106653,0),(57705,106654,0),(57706,106655,0),(57707,106656,0),(57708,106657,0),(57709,106658,0),(57710,106659,0),(57711,106660,0),(57712,106661,0),(57713,106662,0),(57714,106663,0),(57715,106664,0),(57716,106665,0),(57717,106666,0),(57718,106667,0),(57719,106668,0),(57720,106669,0),(57721,106670,0),(57722,106671,0),(57723,106672,0),(57724,106673,0),(57725,106674,0),(57726,106675,0),(57727,106676,0),(57728,106677,0),(57729,106678,0),(57730,106679,0),(57731,106680,0),(57732,106681,0),(57733,106682,0),(57734,106683,0),(57735,106684,0),(57736,106685,0),(57737,106686,0),(57738,106687,0),(57739,106688,0),(57740,106689,0),(57741,106690,0),(57742,106691,0),(57743,106692,0),(57744,106693,0),(57745,106694,0),(57746,106695,0),(57747,106696,0),(57748,106697,0),(57749,106698,0),(57750,106699,0),(57751,106700,0),(57752,106701,0),(57753,106702,0),(57754,106703,0),(57755,106704,0),(57756,106705,0),(57757,106706,0),(57758,106707,0),(57759,106708,0),(57760,106709,0),(57761,106710,0),(57762,106711,0),(57763,106712,0),(57764,106713,0),(57765,106714,0),(57766,106715,0),(57767,106716,0),(57768,106717,0),(57769,106718,0),(57770,106719,0),(57771,106720,0),(57772,106721,0),(57773,106722,0),(57774,106723,0),(57775,106724,0),(57776,106725,0),(57777,106726,0),(57778,106727,0),(57779,106728,0),(57780,106729,0),(57781,106730,0),(57782,106731,0),(57783,106732,0),(57784,106733,0),(57785,106734,0),(57786,106735,0),(57787,106736,0),(57788,106737,0),(57789,106738,0),(57790,106739,0),(57791,106740,0),(57792,106741,0),(57793,106742,0),(57794,106743,0),(57795,106744,0),(57796,106745,0),(57797,106746,0),(57798,106747,0),(57799,106748,0),(57800,106749,0),(57801,106750,0),(57802,106751,0),(57803,106752,0),(57804,106753,0),(57805,106754,0),(57806,106755,0),(57807,106756,0),(57808,106757,0),(57809,106758,0),(57810,106759,0),(57811,106760,0),(57812,106761,0),(57813,106762,0),(57814,106763,0),(57815,106764,0),(57816,106765,0),(57817,106766,0),(57818,106767,0),(57819,106768,0),(57820,106769,0),(57821,106770,0),(57822,106771,0),(57823,106772,0),(57824,106773,0),(57825,106774,0),(57826,106775,0),(57827,106776,0),(57828,106777,0),(57829,106778,0),(57830,106779,0),(57831,106780,0),(57832,106781,0),(57833,106782,0),(57834,106783,0),(57835,106784,0),(57836,106785,0),(57837,106786,0),(57838,106787,0),(57839,106788,0),(57840,106789,0),(57841,106790,0),(57842,106791,0),(57843,106792,0),(57844,106793,0),(57845,106794,0),(57846,106795,0),(57847,106796,0),(57848,106797,0),(57849,106798,0),(57850,106799,0),(57851,106800,0),(57852,106801,0),(57853,106802,0),(57854,106803,0),(57855,106804,0),(57856,106805,0),(57857,106806,0),(57858,106807,0),(57859,106808,0),(57860,106809,0),(57861,106810,0),(57862,106811,0),(57863,106812,0),(57864,106813,0),(57865,106814,0),(57866,106815,0),(57867,106816,0),(57868,106817,0),(57869,106818,0),(57870,106819,0),(57871,106822,0),(57872,106823,0),(57873,106827,0),(57874,106828,0),(57875,106829,0),(57876,106830,0),(57877,106831,0),(57878,106832,0),(57879,106833,0),(57880,106834,0),(57881,106835,0),(57882,106836,0),(57883,106837,0),(57884,106839,0),(57885,106840,0),(57886,106860,0),(57887,106861,0),(57888,106862,0),(57889,106863,0),(57890,106864,0),(57891,106865,0),(57892,106872,0),(57893,106878,0),(57894,106879,0),(57895,106880,0),(57896,106881,0),(57897,106882,0),(57898,106883,0),(57899,106885,0),(57900,106892,0),(57901,106903,0),(57902,106940,0),(57903,106945,0),(57904,106956,0),(57905,107055,0),(57906,107056,0),(57907,107057,0),(57908,107058,0),(57909,107059,0),(57910,107060,0),(57911,107061,0),(57912,107062,0),(57913,107067,0),(57914,107068,0),(57915,107069,0),(57916,107070,0),(57917,107071,0),(57918,107072,0),(57919,107073,0),(57920,107074,0),(57921,107078,0),(57922,107079,0),(57923,107080,0),(57924,107081,0),(57925,107082,0),(57926,107083,0),(57927,107084,0),(57928,107085,0),(57929,107112,0),(57930,107113,0),(57931,107114,0),(57932,107115,0),(57933,107116,0),(57934,107117,0),(57935,107118,0),(57936,107119,0),(57937,107131,0),(57938,107132,0),(57939,107133,0),(57940,107134,0),(57941,107156,0),(57942,107158,0),(57943,107159,0),(57944,107160,0),(57945,107161,0),(57946,107162,0),(57947,107163,0),(57948,107164,0),(57949,107165,0),(57950,107166,0),(57951,107167,0),(57952,107168,0),(57953,107169,0),(57954,107170,0),(57955,107171,0),(57956,107172,0),(57957,107173,0),(57958,107174,0),(57959,107175,0),(57960,107176,0),(57961,107177,0),(57962,107178,0),(57963,107179,0),(57964,107180,0),(57965,107181,0),(57966,107182,0),(57967,107183,0),(57968,107184,0),(57969,107185,0),(57970,107186,0),(57971,107187,0),(57972,107188,0),(57973,107189,0),(57974,107190,0),(57975,107201,0),(57976,107203,0),(57977,107209,0),(57978,107210,0),(57979,107211,0),(57980,107212,0),(57981,107213,0),(57982,107214,0),(57983,107215,0),(57984,107216,0),(57985,107217,0),(57986,107218,0),(57987,107219,0),(57988,107220,0),(57989,107221,0),(57990,107246,0),(57991,107247,0),(57992,107248,0),(57993,107249,0),(57994,107250,0),(57995,107251,0),(57996,107252,0),(57997,107253,0),(57998,107254,0),(57999,107256,0),(58000,107257,0),(58001,107258,0),(58002,107259,0),(58003,107260,0),(58004,107261,0),(58005,107262,0),(58006,107263,0),(58007,107264,0),(58008,107265,0),(58009,107266,0),(58010,107267,0),(58012,107282,0),(58013,107283,0),(58014,107284,0),(58015,107286,0),(58016,107287,0),(58017,107288,0),(58018,107289,0),(58019,107290,0),(58020,107291,0),(58021,107292,0),(58022,107293,0),(58023,107297,0),(58024,107298,0),(58025,107299,0),(58026,107300,0),(58027,107301,0),(58028,107302,0),(58029,107303,0),(58030,107304,0),(58031,107305,0),(58032,107306,0),(58033,107307,0),(58034,107308,0),(58035,107309,0),(58036,107310,0),(58037,107311,0),(58038,107312,0),(58039,107313,0),(58040,107314,0),(58041,107315,0),(58042,107316,0),(58043,107317,0),(58044,107318,0),(58045,107319,0),(58046,107320,0),(58047,107321,0),(58048,107322,0),(58049,107323,0),(58050,107324,0),(58051,107326,0),(58052,107327,0),(58053,107328,0),(58054,107329,0),(58055,107330,0),(58056,107331,0),(58057,107332,0),(58058,107333,0),(58059,107337,0),(58060,107339,0),(58061,107347,0),(58062,107348,0),(58063,107349,0),(58064,107350,0),(58065,107351,0),(58066,107365,0),(58067,107366,0),(58068,107367,0),(58069,107368,0),(58070,107374,0),(58071,107375,0),(58072,107376,0),(58073,107377,0),(58074,107378,0),(58075,107380,0),(58076,107390,0),(58077,107397,0),(58078,107402,0),(58079,107403,0),(58080,107404,0),(58081,107405,0),(58082,107406,0),(58083,107407,0),(58084,107408,0),(58085,107409,0),(58086,107410,0),(58087,107411,0),(58088,107412,0),(58089,107413,0),(58090,107414,0),(58091,107415,0),(58092,107416,0),(58093,107417,0),(58094,107418,0),(58095,107419,0),(58096,107420,0),(58097,107421,0),(58098,107422,0),(58099,107423,0),(58100,107424,0),(58101,107429,0),(58102,107430,0),(58103,107431,0),(58104,107432,0),(58105,107433,0),(58106,107434,0),(58107,107435,0),(58108,107436,0),(58113,107460,0),(58114,107464,0),(58115,107465,0),(58116,107466,0),(58117,107467,0),(58118,107468,0),(58119,107506,0),(58120,107507,0),(58121,107513,0),(58122,107514,0),(58123,107515,0),(58124,107516,0),(58125,107519,0),(58126,107520,0),(58127,107521,0),(58128,107522,0),(58129,107527,0),(58130,107529,0),(58131,107530,0),(58132,107531,0),(58133,107549,0),(58134,107550,0),(58135,107551,0),(58136,107552,0),(58137,107556,0),(58138,107611,0),(58139,107612,0),(58140,107613,0),(58141,107614,0),(58142,107615,0),(58143,107616,0),(58144,107617,0),(58145,107618,0),(58146,107619,0),(58147,107620,0),(58148,107621,0),(58149,107622,0),(58150,107623,0),(58151,107624,0),(58152,107625,0),(58153,107626,0),(58154,107627,0),(58155,107628,0),(58156,107629,0),(58157,107630,0),(58158,107631,0),(58159,107632,0),(58160,107633,0),(58161,107634,0),(58162,107635,0),(58163,107636,0),(58164,107637,0),(58165,107638,0),(58166,107644,0),(58167,107646,0),(58168,107651,0),(58169,107652,0),(58170,107658,0),(58171,107660,0),(58172,107661,0),(58173,107666,0),(58174,107667,0),(58175,107668,0),(58176,107669,0),(58177,107670,0),(58178,107671,0),(58179,107672,0),(58180,107673,0),(58181,107674,0),(58182,107675,0),(58183,107676,0),(58184,107677,0),(58186,107696,0),(58187,107697,0),(58188,107698,0),(58189,107699,0),(58190,107700,0),(58191,107701,0),(58192,107702,0),(58193,107703,0),(58194,107704,0),(58195,107708,0),(58196,107709,0),(58197,107711,0),(58198,107713,0),(58199,107735,0),(58200,107736,0),(58201,107737,0),(58202,107738,0),(58203,107739,0),(58204,107741,0),(58205,107742,0),(58206,107743,0),(58207,107744,0),(58208,107745,0),(58209,107746,0),(58210,107747,0),(58211,107762,0),(58212,107763,0),(58213,107764,0),(58214,107765,0),(58215,107766,0),(58216,107767,0),(58217,107768,0),(58218,107769,0),(58219,107770,0),(58220,107771,0),(58221,107772,0),(58222,107773,0),(58223,107774,0),(58224,107775,0),(58225,107776,0),(58226,107777,0),(58227,107778,0),(58228,107779,0),(58229,107781,0),(58230,107782,0),(58231,107783,0),(58232,107784,0),(58233,107785,0),(58234,107786,0),(58235,107787,0),(58236,107788,0),(58237,107789,0),(58238,107793,0),(58239,107794,0),(58240,107798,0),(58241,107800,0),(58242,107801,0),(58243,107802,0),(58244,107804,0),(58245,107811,0),(58246,107812,0),(58247,107813,0),(58248,107814,0),(58249,107816,0),(58250,107818,0),(58251,107819,0),(58252,107820,0),(58253,107821,0),(58254,107822,0),(58255,107823,0),(58256,107824,0),(58257,107825,0),(58258,107826,0),(58259,107827,0),(58260,107828,0),(58261,107830,0),(58262,107838,0),(58263,107839,0),(58264,107840,0),(58265,107841,0),(58266,107849,0),(58267,107850,0),(58268,107861,0),(58269,107862,0),(58270,107863,0),(58271,107864,0),(58272,107865,0),(58273,107866,0),(58274,107867,0),(58275,107868,0),(58276,107869,0),(58277,107870,0),(58278,107871,0),(58279,107872,0),(58280,107873,0),(58281,107874,0),(58282,107875,0),(58283,107876,0),(58284,107877,0),(58285,107878,0),(58286,107879,0),(58287,107880,0),(58288,107881,0),(58289,107882,0),(58290,107883,0),(58291,107884,0),(58292,107885,0),(58293,107886,0),(58294,107887,0),(58295,107888,0),(58296,107889,0),(58297,107890,0),(58298,107891,0),(58299,107892,0),(58300,107893,0),(58301,107896,0),(58302,107897,0),(58303,107898,0),(58304,107912,0),(58305,107913,0),(58306,107918,0),(58307,107919,0),(58308,107929,0),(58309,107948,0),(58310,107952,0),(58311,107953,0),(58312,107954,0),(58313,107955,0),(58314,107956,0),(58315,107961,0),(58316,107962,0),(58317,107963,0),(58318,107964,0),(58319,107968,0),(58320,107969,0),(58321,107970,0),(58322,107971,0),(58323,107972,0),(58324,107973,0),(58325,107974,0),(58326,107975,0),(58327,107976,0),(58328,107977,0),(58329,107978,0),(58330,107979,0),(58331,107980,0),(58332,107981,0),(58333,107982,0),(58334,107983,0),(58335,107984,0),(58336,107985,0),(58337,107986,0),(58338,107987,0),(58339,107988,0),(58340,107989,0),(58341,107990,0),(58342,107991,0),(58343,107992,0),(58344,107993,0),(58345,107994,0),(58346,107995,0),(58347,107996,0),(58348,107997,0),(58349,107998,0),(58350,107999,0),(58351,108000,0),(58352,108001,0),(58353,108002,0),(58354,108003,0),(58355,108004,0),(58356,108005,0),(58357,108006,0),(58358,108007,0),(58359,108008,0),(58360,108009,0),(58361,108010,0),(58362,108011,0),(58363,108012,0),(58364,108013,0),(58365,108014,0),(58366,108015,0),(58367,108016,0),(58368,108017,0),(58369,108018,0),(58370,108019,0),(58371,108020,0),(58372,108021,0),(58373,108022,0),(58374,108023,0),(58375,108024,0),(58376,108025,0),(58377,108026,0),(58378,108027,0),(58379,108028,0),(58380,108029,0),(58381,108030,0),(58382,108031,0),(58383,108032,0),(58384,108033,0),(58385,108034,0),(58386,108035,0),(58387,108036,0),(58388,108037,0),(58389,108038,0),(58390,108039,0),(58391,108041,0),(58392,108046,0),(58393,108047,0),(58394,108048,0),(58395,108049,0),(58396,108050,0),(58397,108051,0),(58398,108052,0),(58399,108053,0),(58400,108054,0),(58401,108055,0),(58402,108056,0),(58403,108057,0),(58404,108058,0),(58405,108059,0),(58406,108060,0),(58407,108061,0),(58408,108062,0),(58409,108063,0),(58410,108064,0),(58411,108065,0),(58412,108066,0),(58413,108067,0),(58414,108068,0),(58415,108069,0),(58416,108070,0),(58417,108071,0),(58418,108072,0),(58419,108073,0),(58420,108075,0),(58421,108077,0),(58422,108078,0),(58423,108079,0),(58424,108080,0),(58425,108081,0),(58426,108082,0),(58427,108083,0),(58428,108084,0),(58429,108085,0),(58430,108086,0),(58431,108087,0),(58432,108088,0),(58433,108089,0),(58434,108090,0),(58435,108091,0),(58436,108092,0),(58437,108093,0),(58438,108094,0),(58439,108095,0),(58440,108096,0),(58441,108097,0),(58442,108098,0),(58443,108099,0),(58444,108100,0),(58445,108101,0),(58446,108102,0),(58447,108103,0),(58448,108104,0),(58449,108105,0),(58450,108106,0),(58451,108107,0),(58452,108108,0),(58453,108109,0),(58454,108110,0),(58455,108111,0),(58456,108112,0),(58457,108113,0),(58458,108114,0),(58459,108115,0),(58460,108116,0),(58461,108117,0),(58462,108118,0),(58463,108119,0),(58464,108120,0),(58465,108121,0),(58466,108122,0),(58467,108123,0),(58468,108124,0),(58469,108125,0),(58470,108126,0),(58471,108127,0),(58472,108128,0),(58473,108129,0),(58474,108130,0),(58475,108131,0),(58476,108132,0),(58477,108133,0),(58478,108134,0),(58479,108135,0),(58480,108136,0),(58481,108137,0),(58482,108138,0),(58483,108139,0),(58484,108140,0),(58485,108141,0),(58486,108142,0),(58487,108143,0),(58488,108144,0),(58489,108145,0),(58490,108146,0),(58491,108147,0),(58492,108148,0),(58493,108149,0),(58494,108150,0),(58495,108151,0),(58496,108152,0),(58497,108153,0),(58498,108154,0),(58499,108155,0),(58500,108156,0),(58501,108157,0),(58502,108158,0),(58503,108159,0),(58504,108160,0),(58505,108161,0),(58506,108162,0),(58507,108163,0),(58508,108164,0),(58509,108165,0),(58510,108166,0),(58511,108167,0),(58512,108168,0),(58513,108169,0),(58514,108170,0),(58515,108171,0),(58516,108172,0),(58517,108173,0),(58518,108174,0),(58519,108175,0),(58520,108176,0),(58521,108177,0),(58522,108178,0),(58523,108179,0),(58524,108180,0),(58525,108181,0),(58526,108182,0),(58527,108183,0),(58528,108184,0),(58529,108185,0),(58530,108186,0),(58531,108187,0),(58532,108188,0),(58533,108189,0),(58534,108190,0),(58535,108191,0),(58536,108192,0),(58537,108193,0),(58538,108194,0),(58539,108195,0),(58540,108196,0),(58541,108197,0),(58542,108198,0),(58543,108199,0),(58544,108200,0),(58545,108201,0),(58546,108202,0),(58547,108203,0),(58548,108204,0),(58549,108205,0),(58550,108206,0),(58551,108207,0),(58552,108208,0),(58553,108209,0),(58554,108210,0),(58555,108211,0),(58556,108212,0),(58557,108213,0),(58558,108214,0),(58559,108215,0),(58560,108216,0),(58561,108217,0),(58562,108218,0),(58563,108219,0),(58564,108220,0),(58565,108221,0),(58566,108222,0),(58567,108223,0),(58568,108224,0),(58569,108225,0),(58570,108226,0),(58571,108227,0),(58572,108228,0),(58573,108229,0),(58574,108230,0),(58575,108231,0),(58576,108232,0),(58577,108233,0),(58578,108234,0),(58579,108235,0),(58580,108236,0),(58581,108237,0),(58582,108238,0),(58583,108239,0),(58584,108240,0),(58585,108241,0),(58586,108242,0),(58587,108243,0),(58588,108244,0),(58589,108245,0),(58590,108246,0),(58591,108247,0),(58592,108248,0),(58593,108249,0),(58594,108250,0),(58595,108251,0),(58596,108252,0),(58597,108253,0),(58598,108254,0),(58599,108258,0),(58600,108259,0),(58601,108260,0),(58602,108261,0),(58603,108262,0),(58604,108263,0),(58605,108264,0),(58606,108265,0),(58607,108266,0),(58608,108267,0),(58609,108268,0),(58610,108269,0),(58611,108270,0),(58612,108271,0),(58613,108272,0),(58614,108273,0),(58615,108274,0),(58616,108275,0),(58617,108277,0),(58618,108278,0),(58619,108279,0),(58620,108282,0),(58621,108283,0),(58622,108284,0),(58623,108285,0),(58624,108286,0),(58625,108310,0),(58626,108311,0),(58627,108312,0),(58628,108313,0),(58629,108314,0),(58630,108315,0),(58631,108316,0),(58632,108317,0),(58633,108374,0),(58634,108375,0),(58635,108376,0),(58636,108377,0),(58637,108378,0),(58638,108379,0),(58639,108380,0),(58640,108381,0),(58641,108382,0),(58642,108383,0),(58643,108384,0),(58644,108385,0),(58645,108386,0),(58646,108387,0),(58647,108388,0),(58648,108389,0),(58649,108424,0),(58650,108426,0),(58651,108427,0),(58652,108428,0),(58653,108429,0),(58654,108430,0),(58655,108431,0),(58656,108432,0),(58657,108433,0),(58658,108434,0),(58659,108435,0),(58660,108436,0),(58661,108437,0),(58662,108459,0),(58663,108460,0),(58664,108461,0),(58665,108462,0),(58666,108465,0),(58667,108466,0),(58668,108467,0),(58669,108468,0),(58670,108469,0),(58671,108470,0),(58672,108471,0),(58673,108472,0),(58674,108473,0),(58675,108474,0),(58676,108475,0),(58677,108476,0),(58678,108477,0),(58679,108478,0),(58680,108479,0),(58681,108480,0),(58682,108491,0),(58683,108493,0),(58684,108504,0),(58685,108505,0),(58686,108506,0),(58687,108507,0),(58688,108508,0),(58689,108509,0),(58690,108510,0),(58691,108511,0),(58692,108512,0),(58693,108513,0),(58694,108514,0),(58695,108515,0),(58696,108516,0),(58697,108517,0),(58698,108518,0),(58699,108519,0),(58700,108520,0),(58701,108521,0),(58702,108522,0),(58703,108523,0),(58704,108524,0),(58705,108525,0),(58706,108526,0),(58707,108527,0),(58708,108528,0),(58709,108529,0),(58710,108530,0),(58711,108531,0),(58712,108536,0),(58713,108537,0),(58714,108538,0),(58715,108539,0),(58716,108540,0),(58717,108541,0),(58718,108542,0),(58719,108543,0),(58720,108558,0),(58721,108559,0),(58722,108560,0),(58723,108561,0),(58724,108562,0),(58725,108563,0),(58726,108564,0),(58727,108565,0),(58728,108566,0),(58729,108567,0),(58730,108568,0),(58731,108569,0),(58732,108570,0),(58733,108571,0),(58734,108572,0),(58735,108573,0),(58736,108574,0),(58737,108575,0),(58738,108576,0),(58739,108577,0),(58740,108582,0),(58741,108583,0),(58742,108584,0),(58743,108585,0),(58744,108587,0),(58745,108588,0),(58746,108589,0),(58747,108590,0),(58748,108591,0),(58749,108592,0),(58750,108593,0),(58751,108594,0),(58752,108596,0),(58753,108598,0),(58754,108599,0),(58755,108600,0),(58756,108601,0),(58757,108602,0),(58758,108603,0),(58759,108604,0),(58760,108605,0),(58761,108606,0),(58762,108607,0),(58763,108612,0),(58764,108613,0),(58765,108614,0),(58766,108615,0),(58767,108622,0),(58768,108623,0),(58769,108624,0),(58770,108625,0),(58771,108626,0),(58772,108627,0),(58773,108628,0),(58774,108629,0),(58775,108630,0),(58776,108641,0),(58777,108642,0),(58778,108643,0),(58779,108644,0),(58780,108647,0),(58781,108650,0),(58782,108651,0),(58783,108652,0),(58784,108653,0),(58785,108654,0),(58786,108660,0),(58787,108661,0),(58788,108662,0),(58789,108663,0),(58790,108666,0),(58791,108667,0),(58792,108668,0),(58793,108669,0),(58794,108672,0),(58795,108673,0),(58796,108674,0),(58797,108675,0),(58798,108679,0),(58799,108680,0),(58800,108681,0),(58801,108682,0),(58802,108684,0),(58803,108685,0),(58804,108686,0),(58805,108687,0),(58806,108688,0),(58807,108689,0),(58808,108690,0),(58809,108691,0),(58810,108692,0),(58811,108693,0),(58812,108694,0),(58813,108695,0),(58814,108696,0),(58815,108697,0),(58816,108698,0),(58817,108699,0),(58818,108700,0),(58819,108701,0),(58820,108702,0),(58821,108703,0),(58822,108704,0),(58823,108705,0),(58824,108706,0),(58825,108707,0),(58826,108708,0),(58827,108709,0),(58828,108710,0),(58829,108711,0),(58830,108712,0),(58831,108713,0),(58832,108714,0),(58833,108715,0),(58834,108717,0),(58835,108718,0),(58836,108719,0),(58837,108720,0),(58838,108725,0),(58839,108726,0),(58840,108729,0),(58841,108730,0),(58842,108731,0),(58843,108732,0),(58844,108736,0),(58845,108753,0),(58846,108754,0),(58847,108755,0),(58848,108756,0),(58849,108757,0),(58850,108758,0),(58851,108759,0),(58852,108760,0),(58853,108761,0),(58854,108762,0),(58855,108763,0),(58856,108764,0),(58857,108765,0),(58858,108766,0),(58859,108767,0),(58860,108768,0),(58861,108769,0),(58862,108770,0),(58863,108771,0),(58864,108772,0),(58865,108773,0),(58866,108779,0),(58867,108780,0),(58868,108781,0),(58869,108782,0),(58870,108783,0),(58871,108784,0),(58872,108785,0),(58873,108786,0),(58874,108787,0),(58875,108788,0),(58876,108789,0),(58877,108790,0),(58878,108791,0),(58879,108792,0),(58880,108793,0),(58881,108794,0),(58882,108795,0),(58883,108796,0),(58884,108797,0),(58885,108798,0),(58886,108799,0),(58887,108800,0),(58888,108801,0),(58889,108802,0),(58890,108803,0),(58891,108804,0),(58892,108805,0),(58893,108806,0),(58894,108807,0),(58895,108808,0),(58896,108809,0),(58897,108810,0),(58898,108811,0),(58899,108814,0),(58900,108815,0),(58901,108822,0),(58902,108823,0),(58903,108827,0),(58904,108828,0),(58905,108829,0),(58906,108830,0),(58907,108831,0),(58908,108832,0),(58909,108833,0),(58910,108834,0),(58911,108835,0),(58912,108836,0),(58913,108837,0),(58914,108838,0),(58915,108839,0),(58916,108840,0),(58917,108841,0),(58918,108842,0),(58919,108843,0),(58920,108844,0),(58921,108845,0),(58922,108846,0),(58923,108847,0),(58924,108848,0),(58925,108849,0),(58926,108850,0),(58927,108851,0),(58928,108852,0),(58929,108853,0),(58930,108854,0),(58931,108855,0),(58932,108856,0),(58933,108857,0),(58934,108858,0),(58935,108861,0),(58936,108866,0),(58937,108867,0),(58938,108868,0),(58939,108869,0),(58940,108870,0),(58941,108871,0),(58942,108872,0),(58943,108873,0),(58944,108874,0),(58945,108875,0),(58946,108900,0),(58947,108901,0),(58948,108905,0),(58949,108908,0),(58950,108909,0),(58951,108910,0),(58952,108912,0),(58953,108913,0),(58954,108914,0),(58955,108918,0),(58956,108919,0),(58957,108921,0),(58958,108922,0),(58959,108923,0),(58960,108924,0),(58961,108925,0),(58962,108926,0),(58963,108931,0),(58964,108932,0),(58965,108933,0),(58966,108934,0),(58967,108935,0),(58968,108936,0),(58969,108937,0),(58970,108938,0),(58971,108939,0),(58972,108940,0),(58973,108941,0),(58974,108942,0),(58975,108945,0),(58976,108953,0),(58977,108954,0),(58978,108955,0),(58979,108956,0),(58980,108957,0),(58981,108958,0),(58982,108959,0),(58983,108960,0),(58984,108961,0),(58985,108963,0),(58986,108969,0),(58987,108970,0),(58988,108971,0),(58989,108974,0),(58990,108981,0),(58991,108982,0),(58992,108983,0),(58993,108984,0),(58994,108985,0),(58995,108986,0),(58996,108994,0),(58999,109027,0),(59000,109028,0),(59001,109029,0),(59002,109030,0),(59003,109031,0),(59004,109032,0),(59005,109033,0),(59006,109034,0),(59007,109035,0),(59008,109036,0),(59009,109037,0),(59010,109038,0),(59011,109039,0),(59012,109040,0),(59013,109041,0),(59014,109042,0),(59015,109043,0),(59016,109044,0),(59017,109045,0),(59018,109046,0),(59019,109047,0),(59020,109048,0),(59021,109049,0),(59022,109050,0),(59023,109057,0),(59024,109059,0),(59025,109060,0),(59026,109061,0),(59030,109068,0),(59031,109074,0),(59032,109075,0),(59033,109077,0),(59034,109078,0),(59035,109081,0),(59036,109083,0),(59049,109107,0),(59050,109108,0),(59051,109109,0),(59052,109110,0),(59053,109111,0),(59054,109112,0),(59055,109113,0),(59056,109114,0),(59057,109115,0),(59059,109117,0),(59098,109165,0),(59099,109166,0),(59100,109168,0),(59101,109169,0),(59102,109170,0),(59103,109171,0),(59104,109172,0),(59105,109173,0),(59106,109174,0),(59115,109185,0),(59116,109188,0),(59117,109189,0),(59118,109190,0),(59119,109191,0),(59129,109228,0),(59130,109229,0),(59131,109230,0),(59132,109231,0),(59133,109232,0),(59134,109233,0),(59135,109234,0),(59136,109235,0),(59137,109236,0),(59138,109237,0),(59139,109238,0),(59140,109239,0),(59141,109240,0),(59142,109241,0),(59143,109242,0),(59144,109243,0),(59145,109244,0),(59146,109245,0),(59147,109249,0),(59155,109264,0),(59156,109265,0),(59157,109268,0),(59158,109269,0),(59159,109270,0),(59160,109271,0),(59161,109272,0),(59162,109273,0),(59163,109275,0),(59164,109276,0),(59165,109278,0),(59166,109279,0),(59167,109280,0),(59168,109281,0),(59169,109282,0),(59170,109283,0),(59171,109284,0),(59172,109287,0),(59173,109288,0),(59174,109289,0),(59175,109290,0),(59176,109291,0),(59177,109292,0),(59178,109294,0),(59179,109296,0),(59180,109297,0),(59181,109298,0),(59182,109299,0),(59183,109301,0),(59184,109302,0),(59185,109303,0),(59186,109304,0),(59187,109305,0),(59188,109306,0),(59189,109307,0),(59190,109308,0),(59191,109309,0),(59192,109311,0),(59193,109312,0),(59194,109313,0),(59195,109314,0),(59196,109315,0),(59197,109316,0),(59198,109317,0),(59199,109318,0),(59200,109319,0),(59201,109320,0),(59202,109321,0),(59203,109322,0),(59204,109323,0),(59205,109324,0),(59206,109325,0),(59207,109326,0),(59208,109327,0),(59209,109328,0),(59210,109329,0),(59211,109330,0),(59212,109331,0),(59213,109332,0),(59214,109333,0),(59215,109334,0),(59216,109335,0),(59217,109336,0),(59218,109337,0),(59219,109338,0),(59220,109339,0),(59221,109340,0),(59222,109341,0),(59223,109342,0),(59224,109343,0),(59225,109344,0),(59226,109345,0),(59227,109346,0),(59228,109347,0),(59229,109348,0),(59230,109349,0),(59231,109350,0),(59232,109351,0),(59233,109352,0),(59234,109353,0),(59235,109354,0),(59236,109357,0),(59237,109358,0),(59238,109359,0),(59239,109361,0),(59240,109362,0),(59241,109363,0),(59242,109366,0),(59243,109367,0),(59244,109368,0),(59245,109371,0),(59246,109372,0),(59247,109373,0),(59248,109374,0),(59249,109375,0),(59250,109377,0),(59251,109379,0),(59252,109380,0),(59253,109382,0),(59254,109383,0),(59255,109384,0),(59256,109385,0),(59257,109387,0),(59258,109388,0),(59259,109389,0),(59260,109392,0),(59261,109393,0),(59262,109395,0),(59263,109396,0),(59264,109397,0),(59265,109398,0),(59266,109399,0),(59267,109400,0),(59268,109401,0),(59269,109404,0),(59270,109405,0),(59271,109406,0),(59272,109409,0),(59273,109411,0),(59274,109412,0),(59275,109414,0),(59276,109415,0),(59277,109416,0),(59278,109419,0),(59279,109422,0),(59280,109423,0),(59281,109425,0),(59282,109428,0),(59283,109429,0),(59284,109430,0),(59285,109431,0),(59286,109432,0),(59287,109433,0),(59288,109434,0),(59289,109435,0),(59290,109436,0),(59291,109437,0),(59292,109438,0),(59293,109439,0),(59294,109440,0),(59295,109441,0),(59296,109443,0),(59297,109444,0),(59298,109445,0),(59299,109448,0),(59300,109449,0),(59301,109450,0),(59302,109451,0),(59303,109453,0),(59304,109455,0),(59305,109456,0),(59306,109457,0),(59307,109458,0),(59308,109460,0),(59309,109461,0),(59310,109463,0),(59311,109464,0),(59312,109466,0),(59313,109469,0),(59314,109470,0),(59315,109471,0),(59316,109473,0),(59317,109475,0),(59318,109476,0),(59319,109477,0),(59320,109479,0),(59321,109481,0),(59322,109482,0),(59323,109483,0),(59324,109484,0),(59325,109486,0),(59326,109488,0),(59327,109489,0),(59328,109491,0),(59329,109492,0),(59330,109493,0),(59331,109494,0),(59332,109496,0),(59333,109498,0),(59334,109499,0),(59335,109501,0),(59336,109502,0),(59337,109503,0),(59338,109504,0),(59339,109505,0),(59340,109507,0),(59341,109508,0),(59342,109509,0),(59343,109510,0),(59344,109511,0),(59345,109513,0),(59346,109514,0),(59347,109517,0),(59348,109518,0),(59349,109519,0),(59350,109521,0),(59351,109523,0),(59352,109525,0),(59353,109528,0),(59354,109529,0),(59355,109530,0),(59356,109531,0),(59357,109532,0),(59358,109533,0),(59359,109534,0),(59360,109535,0),(59361,109536,0),(59362,109537,0),(59363,109538,0),(59364,109539,0),(59365,109540,0),(59366,109541,0),(59367,109542,0),(59368,109543,0),(59369,109544,0),(59370,109545,0),(59371,109546,0),(59372,109547,0),(59373,109548,0),(59374,109549,0),(59375,109550,0),(59376,109552,0),(59377,109553,0),(59378,109554,0),(59382,109579,0),(59383,109580,0),(59384,109581,0),(59385,109582,0),(59386,109583,0),(59387,109593,0),(59388,109594,0),(59389,109595,0),(59390,109596,0),(59391,109597,0),(59392,109598,0),(59393,109600,0),(59394,109606,0),(59395,109607,0),(59396,109608,0),(59397,109609,0),(59398,109610,0),(59399,109611,0),(59400,109612,0),(59401,109613,0),(59402,109614,0),(59403,109615,0),(59404,109621,0),(59411,109630,0),(59412,109631,0),(59413,109632,0),(59414,109633,0),(59415,109634,0),(59416,109635,0),(59417,109636,0),(59418,109637,0),(59419,109638,0),(59420,109639,0),(59421,109640,0),(59422,109641,0),(59423,109642,0),(59424,109643,0),(59425,109646,0),(59426,109647,0),(59435,109669,0),(59436,109670,0),(59437,109674,0),(59438,109675,0),(59439,109676,0),(59440,109677,0),(59441,109678,0),(59442,109679,0),(59443,109680,0),(59444,109681,0),(59445,109682,0),(59446,109694,0),(59447,109695,0),(59448,109696,0),(59449,109697,0),(59450,109698,0),(59451,109699,0),(59452,109784,0),(59453,109785,0),(59454,109786,0),(59455,109787,0),(59456,109788,0),(59457,109789,0),(59458,109790,0),(59459,109791,0),(59460,109792,0),(59461,109793,0),(59462,109794,0),(59463,109795,0),(59464,109796,0),(59465,109797,0),(59466,109798,0),(59467,109799,0),(59468,109800,0),(59469,109801,0),(59470,109802,0),(59471,109803,0),(59472,109804,0),(59473,109805,0),(59474,109806,0),(59475,109807,0),(59476,109808,0),(59477,109809,0),(59478,109810,0),(59479,109811,0),(59480,109812,0),(59481,109813,0),(59482,109814,0),(59483,109815,0),(59484,109816,0),(59485,109817,0),(59486,109818,0),(59487,109819,0),(59488,109820,0),(59489,109821,0),(59490,109822,0),(59491,109823,0),(59492,109824,0),(59493,109825,0),(59494,109826,0),(59495,109827,0),(59496,109828,0),(59497,109829,0),(59498,109830,0),(59499,109831,0),(59500,109832,0),(59501,109833,0),(59502,109834,0),(59503,109835,0),(59504,109836,0),(59505,109837,0),(59506,109838,0),(59507,109839,0),(59508,109840,1),(59509,109841,0),(59510,109842,0),(59511,109843,0),(59512,109844,0),(59513,109845,0),(59514,109846,0),(59515,109847,0),(59516,109848,0),(59517,109849,0),(59518,109850,0),(59519,109851,0),(59520,109852,0),(59521,109853,0),(59522,109854,0),(59523,109855,0),(59524,109856,0),(59525,109857,0),(59526,109858,0),(59527,109859,0),(59528,109860,0),(59529,109861,0),(59530,109862,0),(59531,109863,0),(59532,109864,0),(59533,109865,0),(59534,109866,0),(59535,109867,0),(59536,109868,0),(59537,109869,0),(59538,109870,0),(59539,109871,0),(59540,109872,0),(59541,109873,0),(59542,109874,0),(59543,109875,0),(59544,109876,0),(59545,109877,0),(59546,109878,0),(59547,109879,0),(59548,109880,0),(59549,109881,0),(59550,109882,0),(59551,109883,0),(59552,109884,0),(59553,109885,0),(59554,109886,0),(59555,109887,0),(59556,109888,0),(59557,109889,0),(59558,109890,0),(59559,109891,0),(59560,109892,0),(59561,109893,0),(59562,109894,0),(59563,109895,0),(59564,109896,0),(59565,109897,0),(59566,109898,0),(59567,109899,0),(59568,109900,0),(59569,109901,0),(59570,109902,0),(59571,109903,0),(59572,109904,0),(59573,109905,0),(59574,109906,0),(59575,109907,0),(59576,109908,0),(59577,109909,0),(59578,109910,0),(59579,109911,0),(59580,109912,0),(59581,109913,0),(59582,109914,0),(59583,109915,0),(59584,109916,0),(59585,109917,0),(59586,109918,0),(59587,109925,0),(59588,109926,0),(59589,109927,0),(59590,109928,0),(59591,109929,0),(59592,109930,0),(59593,109931,0),(59594,109932,0),(59595,109933,0),(59596,109934,0),(59597,109935,0),(59598,109936,0),(59599,109937,0),(59600,109938,0),(59601,109939,0),(59602,109940,0),(59603,109941,0),(59604,109942,0),(59605,109943,0),(59606,109944,0),(59607,109945,0),(59608,109946,0),(59609,109947,0),(59610,109948,0),(59611,109949,0),(59612,109970,0),(59613,109971,0),(59614,109972,0),(59615,109973,0),(59616,109974,0),(59617,109975,0),(59618,109976,0),(59619,109977,0),(59620,109978,0),(59621,109979,0),(59622,109980,0),(59623,109981,0),(59624,109982,0),(59625,109983,0),(59626,109984,0),(59627,109985,0),(59628,109986,0),(59629,109987,0),(59630,109988,0),(59631,109989,0),(59634,110030,0),(59635,110031,0),(59636,110032,0),(59637,110033,0),(59638,110034,0),(59639,110035,0),(59640,110036,0),(59641,110037,0),(59642,110038,0),(59643,110039,0),(59644,110040,0),(59645,110041,0),(59646,110042,0),(59647,110043,0),(59648,110044,0),(59649,110045,0),(59650,110046,0),(59651,110047,0),(59652,110048,0),(59653,110049,0),(59654,110050,0),(59655,110051,0),(59656,110052,0),(59657,110053,0),(59658,110054,0),(59659,110055,0),(59660,110056,0),(59661,110057,0),(59662,110058,0),(59663,110059,0),(59664,110060,0),(59665,110061,0),(59666,110062,0),(59667,110063,0),(59668,110064,0),(59669,110065,0),(59670,110066,0),(59671,110067,0),(59672,110068,0),(59673,110069,0),(59674,110070,0),(59675,110071,0),(59676,110072,0),(59677,110073,0),(59678,110074,0),(59679,110075,0),(59680,110076,0),(59681,110077,0),(59682,110078,0),(59683,110079,0),(59684,110080,0),(59685,110081,0),(59686,110082,0),(59687,110083,0),(59688,110084,0),(59689,110092,0),(59690,110093,0),(59691,110094,0),(59692,110095,0),(59693,110096,0),(59694,110097,0),(59695,110098,0),(59696,110099,0),(59697,110100,0),(59698,110101,0),(59699,110102,0),(59700,110103,0),(59701,110104,0),(59702,110105,0),(59703,110106,0),(59704,110107,0),(59705,110108,0),(59706,110109,0),(59707,110110,0),(59708,110111,0),(59709,110112,0),(59710,110113,0),(59711,110114,0),(59712,110115,0),(59713,110117,0),(59714,110118,0),(59715,110119,0),(59716,110120,0),(59717,110121,0),(59718,110122,0),(59719,110123,0),(59720,110124,0),(59721,110125,0),(59722,110126,0),(59723,110127,0),(59724,110128,0),(59725,110129,0),(59726,110130,0),(59727,110131,0),(59728,110132,0),(59729,110133,0),(59730,110134,0),(59731,110135,0),(59732,110136,0),(59733,110137,0),(59734,110138,0),(59735,110139,0),(59736,110140,0),(59737,110141,0),(59738,110142,0),(59739,110143,0),(59740,110144,0),(59741,110151,0),(59742,110152,0),(59743,110153,0),(59744,110154,0),(59745,110155,0),(59746,110156,0),(59747,110157,0),(59748,110158,0),(59749,110159,0),(59750,110160,0),(59751,110161,0),(59752,110162,0),(59753,110163,0),(59754,110164,0),(59755,110165,0),(59756,110166,0),(59757,110170,0),(59758,110171,0),(59759,110172,0),(59760,110173,0),(59761,110174,0),(59762,110175,0),(59763,110176,0),(59764,110177,0),(59765,110178,0),(59766,110179,0),(59767,110180,0),(59768,110181,0),(59769,110182,0),(59770,110183,0),(59771,110184,0),(59772,110185,0),(59773,110186,0),(59774,110187,0),(59775,110188,0),(59776,110189,0),(59777,110190,0),(59778,110191,0),(59795,110233,0),(59796,110234,0),(59797,110235,0),(59798,110236,0),(59799,110237,0),(59800,110241,0),(59801,110242,0),(59802,110243,0),(59803,110244,0),(59804,110245,0),(59805,110246,0),(59806,110247,0),(59807,110248,0),(59808,110251,0),(59809,110259,0),(59810,110260,0),(59811,110261,0),(59812,110262,0),(59814,110275,0),(59815,110276,0),(59816,110277,0),(59817,110279,0),(59818,110280,0),(59819,110281,0),(59820,110282,0),(59827,110314,0),(59828,110315,0),(59829,110332,0),(59830,110334,0),(59831,110335,0),(59832,110336,0),(59833,110339,0),(59834,110340,0),(59835,110341,0),(59836,110342,0),(59837,110357,0),(59838,110358,0),(59839,110359,0),(59840,110360,0),(59841,110361,0),(59842,110362,0),(59843,110367,0),(59844,110368,0),(59845,110370,0),(59846,110371,0),(59847,110372,0),(59848,110386,0),(59849,110387,0),(59850,110389,0),(59851,110396,0),(59852,110399,0),(59853,110403,0),(59854,110404,0),(59855,110405,0),(59856,110406,0),(59857,110407,0),(59858,110408,0),(59859,110409,0),(59860,110410,0),(59861,110411,0),(59862,110412,0),(59863,110413,0),(59864,110414,0),(59865,110415,0),(59866,110416,0),(59867,110417,0),(59868,110427,0),(59869,110435,0),(59870,110439,0),(59871,110440,0),(59872,110448,0),(59873,110449,0),(59874,110450,0),(59875,110451,0),(59876,110454,0),(59877,110455,0),(59878,110456,0),(59879,110457,0),(59880,110458,0),(59881,110460,0),(59882,110461,0),(59883,110462,0),(59884,110463,0),(59885,110464,0),(59886,110465,0),(59887,110466,0),(59888,110467,0),(59889,110472,0),(59890,110473,0),(59891,110474,0),(59892,110475,0),(59893,110476,0),(59894,110477,0),(59895,110478,0),(59896,110479,0),(59897,110480,0),(59898,110481,0),(59899,110482,0),(59900,110483,0),(59901,110484,0),(59902,110485,0),(59903,110486,0),(59904,110487,0),(59905,110494,0),(59906,110495,0),(59907,110496,0),(59908,110497,0),(59909,110498,0),(59910,110499,0),(59911,110500,0),(59912,110501,0),(59913,110502,0),(59914,110503,0),(59915,110509,0),(59916,110510,0),(59917,110511,0),(59918,110512,0),(59919,110513,0),(59920,110514,0),(59921,110515,0),(59922,110516,0),(59923,110517,0),(59924,110518,0),(59925,110519,0),(59926,110520,0),(59927,110521,0),(59928,110522,0),(59929,110523,0),(59930,110524,0),(59931,110525,0),(59932,110526,0),(59933,110528,0),(59934,110529,0),(59935,110530,0),(59936,110531,0),(59937,110532,0),(59938,110533,0),(59939,110534,0),(59940,110535,0),(59941,110537,0),(59942,110538,0),(59943,110539,0),(59944,110540,0),(59945,110541,0),(59946,110542,0),(59947,110543,0),(59948,110544,0),(59949,110546,0),(59950,110547,0),(59951,110548,0),(59952,110549,0),(59953,110550,0),(59954,110551,0),(59955,110552,0),(59956,110553,0),(59957,110564,0),(59958,110565,0),(59959,110571,0),(59960,110572,0),(59961,110573,0),(59962,110574,0),(59963,110575,0),(59964,110576,0),(59965,110577,0),(59966,110590,0),(59967,110591,0),(59968,110594,0),(59969,110595,0),(59970,110596,0),(59971,110597,0),(59972,110598,0),(59973,110599,0),(59974,110600,0),(59975,110601,0),(59976,110602,0),(59977,110603,0),(59978,110604,0),(59979,110605,0),(59984,110662,0),(59985,110663,0),(59986,110665,0),(59987,110666,0),(59988,110674,0),(59989,110675,0),(59990,110676,0),(59991,110677,0),(59992,110689,0),(59993,110707,0),(59994,110708,0),(59995,110730,0),(59996,110731,0),(59997,110745,0),(59998,110746,0),(59999,110747,0),(60000,110748,0),(60001,110749,0),(60002,110750,0),(60003,110751,0),(60004,110752,0),(60005,110753,0),(60006,110754,0),(60007,110755,0),(60008,110756,0),(60009,110757,0),(60010,110758,0),(60011,110759,0),(60012,110760,0),(60013,110771,0),(60014,110772,0),(60015,110773,0),(60016,110774,0),(60017,110775,0),(60018,110776,0),(60019,110777,0),(60020,110778,0),(60021,110779,0),(60022,110780,0),(60023,110781,0),(60024,110784,0),(60025,110785,0),(60026,110786,0),(60027,110787,0),(60028,110788,0),(60029,110791,0),(60030,110792,0),(60031,110793,0),(60032,110794,0),(60033,110795,0),(60034,110796,0),(60035,110797,0),(60036,110798,0),(60037,110884,0),(60038,110885,0),(60039,110886,0),(60040,110887,0),(60041,110888,0),(60042,110889,0),(60043,110890,0),(60044,110891,0),(60045,110892,0),(60046,110893,0),(60047,110894,0),(60048,110895,0),(60049,110899,0),(60050,110900,0),(60051,110901,0),(60052,110902,0),(60053,110958,0),(60054,110959,0),(60055,110960,0),(60056,110961,0),(60057,110962,0),(60058,110963,0),(60059,110964,0),(60060,110965,0),(60061,110966,0),(60062,110967,0),(60063,110968,0),(60064,110969,0),(60065,110970,0),(60066,110971,0),(60067,110972,0),(60068,110973,0),(60069,110974,0),(60070,110975,0),(60071,110976,0),(60072,110977,0),(60073,110978,0),(60074,110979,0),(60075,110990,0),(60076,111003,0),(60077,111004,0),(60078,111005,0),(60079,111006,0),(60080,111007,0),(60081,111008,0),(60082,111009,0),(60083,111010,0),(60084,111011,0),(60085,111012,0),(60086,111013,0),(60087,111014,0),(60088,111015,0),(60089,111016,0),(60090,111017,0),(60091,111018,0),(60092,111019,0),(60093,111020,0),(60094,111021,0),(60095,111022,0),(60096,111023,0),(60097,111025,0),(60098,111026,0),(60099,111027,0),(60100,111028,0),(60101,111029,0),(60102,111030,0),(60103,111031,0),(60104,111032,0),(60105,111033,0),(60106,111034,0),(60107,111035,0),(60108,111036,0),(60109,111037,0),(60110,111038,0),(60111,111039,0),(60112,111040,0),(60113,111041,0),(60114,111042,0),(60115,111044,0),(60116,111045,0),(60117,111046,0),(60118,111047,0),(60119,111048,0),(60120,111049,0),(60121,111050,0),(60122,111051,0),(60123,111052,0),(60124,111053,0),(60125,111054,0),(60126,111055,0),(60127,111056,0),(60128,111057,0),(60129,111058,0),(60130,111059,0),(60131,111060,0),(60132,111061,0),(60133,111062,0),(60134,111063,0),(60135,111067,0),(60136,111068,0),(60137,111069,0),(60138,111070,0),(60139,111071,0),(60140,111072,0),(60141,111073,0),(60142,111074,0),(60143,111075,0),(60144,111076,0),(60145,111077,0),(60146,111078,0),(60147,111083,0),(60148,111084,0),(60149,111085,0),(60150,111086,0),(60151,111087,0),(60152,111088,0),(60153,111089,0),(60154,111090,0),(60155,111091,0),(60156,111092,0),(60157,111093,0),(60158,111094,0),(60159,111095,0),(60160,111096,0),(60161,111097,0),(60162,111098,0),(60163,111099,0),(60164,111100,0),(60165,111101,0),(60166,111102,0),(60167,111103,0),(60168,111104,0),(60169,111105,0),(60170,111106,0),(60171,111107,0),(60172,111108,0),(60173,111109,0),(60174,111110,0),(60175,111111,0),(60176,111112,0),(60177,111113,0),(60178,111114,0),(60179,111115,0),(60180,111116,0),(60181,111117,0),(60182,111118,0),(60183,111119,0),(60184,111120,0),(60185,111121,0),(60186,111122,0),(60187,111123,0),(60188,111124,0),(60189,111125,0),(60190,111126,0),(60191,111127,0),(60192,111132,0),(60193,111133,0),(60194,111139,0),(60195,111140,0),(60196,111141,0),(60197,111142,0),(60198,111143,0),(60199,111144,0),(60200,111145,0),(60201,111146,0),(60202,111147,0),(60203,111148,0),(60204,111149,0),(60205,111150,0),(60206,111151,0),(60207,111152,0),(60208,111153,0),(60209,111154,0),(60210,111155,0),(60211,111156,0),(60212,111157,0),(60213,111158,0),(60214,111159,0),(60215,111160,0),(60216,111161,0),(60217,111162,0),(60218,111163,0),(60219,111164,0),(60220,111165,0),(60221,111166,0),(60222,111167,0),(60223,111168,0),(60224,111169,0),(60225,111170,0),(60226,111171,0),(60227,111172,0),(60228,111173,0),(60229,111174,0),(60230,111175,0),(60231,111176,0),(60232,111177,0),(60233,111178,0),(60234,111179,0),(60235,111180,0),(60236,111181,0),(60237,111182,0),(60238,111183,0),(60239,111184,0),(60240,111185,0),(60241,111186,0),(60242,111187,0),(60243,111188,0),(60244,111189,0),(60245,111190,0),(60246,111191,0),(60247,111192,0),(60248,111193,0),(60249,111194,0),(60250,111195,0),(60251,111196,0),(60252,111197,0),(60253,111198,0),(60254,111199,0),(60255,111200,0),(60256,111201,0),(60257,111202,0),(60258,111203,0),(60259,111204,0),(60260,111205,0),(60261,111206,0),(60262,111209,0),(60263,111210,0),(60264,111211,0),(60265,111212,0),(60266,111213,0),(60267,111214,0),(60268,111215,0),(60269,111216,0),(60270,111217,0),(60271,111218,0),(60272,111221,0),(60273,111234,0),(60274,111235,0),(60275,111236,0),(60276,111237,0),(60277,111238,0),(60278,111239,0),(60279,111240,0),(60280,111241,0),(60281,111242,0),(60282,111243,0),(60283,111254,0),(60284,111255,0),(60285,111256,0),(60286,111257,0),(60287,111258,0),(60288,111259,0),(60289,111260,0),(60290,111261,0),(60291,111273,0),(60292,111274,0),(60293,111275,0),(60294,111276,0),(60295,111277,0),(60296,111278,0),(60297,111279,0),(60298,111280,0),(60299,111281,0),(60300,111282,0),(60301,111283,0),(60302,111284,0),(60303,111285,0),(60304,111286,0),(60305,111287,0),(60306,111288,0),(60307,111289,0),(60308,111290,0),(60309,111291,0),(60310,111292,0),(60311,111295,0),(60312,111296,0),(60313,111297,0),(60314,111298,0),(60315,111299,0),(60316,111300,0),(60317,111301,0),(60318,111302,0),(60319,111303,0),(60320,111304,0),(60321,111347,0),(60322,111352,0),(60323,111353,0),(60324,111354,0),(60325,111355,0),(60326,111367,0),(60327,111368,0),(60328,111373,0),(60329,111374,0),(60330,111375,0),(60331,111376,0),(60332,111377,0),(60333,111378,0),(60334,111379,0),(60335,111380,0),(60336,111381,0),(60337,111382,0),(60338,111405,0),(60339,111415,0),(60340,111419,0),(60341,111420,0),(60342,111421,0),(60343,111422,0),(60344,111423,0),(60345,111424,0),(60346,111425,0),(60347,111426,0),(60348,111427,0),(60349,111428,0),(60350,111429,0),(60351,111430,0),(60380,111461,0),(60381,111462,0),(60382,111463,0),(60383,111464,0),(60384,111465,0),(60385,111466,0),(60386,111467,0),(60387,111468,0),(60388,111469,0),(60389,111470,0),(60390,111471,0),(60391,111472,0),(60392,111475,0),(60393,111477,0),(60394,111484,0),(60395,111486,0),(60396,111487,0),(60397,111488,0),(60398,111489,0),(60399,111490,0),(60400,111491,0),(60401,111492,0),(60402,111493,0),(60403,111494,0),(60404,111495,0),(60405,111496,0),(60406,111497,0),(60407,111498,0),(60408,111499,0),(60409,111500,0),(60410,111501,0),(60411,111502,0),(60412,111503,0),(60413,111504,0),(60414,111505,0),(60415,111506,0),(60416,111507,0),(60417,111508,0),(60418,111509,0),(60419,111510,0),(60420,111511,0),(60421,111512,0),(60422,111513,0),(60423,111514,0),(60424,111515,0),(60425,111516,0),(60426,111517,0),(60427,111518,0),(60428,111519,0),(60429,111520,0),(60430,111521,0),(60431,111523,0),(60432,111525,0),(60433,111526,0),(60434,111531,0),(60435,111532,0),(60436,111534,0),(60437,111535,0),(60438,111536,0),(60439,111537,0),(60440,111538,0),(60441,111539,0),(60442,111540,0),(60443,111541,0),(60444,111542,0),(60445,111545,0),(60449,111560,0),(60450,111561,0),(60451,111562,0),(60452,111563,0),(60453,111567,0),(60454,111568,0),(60455,111569,0),(60456,111570,0),(60457,111571,0),(60458,111572,0),(60459,111573,0),(60460,111574,0),(60461,111576,0),(60462,111578,0),(60463,111579,0),(60464,111580,0),(60465,111581,0),(60466,111582,0),(60467,111583,0),(60468,111584,0),(60469,111585,0),(60470,111586,0),(60471,111587,0),(60473,111625,0),(60474,111638,0),(60475,111639,0),(60476,111640,0),(60477,111641,0),(60478,111642,0),(60479,111643,0),(60480,111644,0),(60481,111645,0),(60482,111646,0),(60483,111647,0),(60484,111648,0),(60485,111649,0),(60486,111677,0),(60487,111678,0),(60488,111679,0),(60489,111680,0),(60490,111681,0),(60491,111682,0),(60492,111683,0),(60493,111684,0),(60494,111685,0),(60495,111686,0),(60496,111687,0),(60497,111688,0),(60498,111689,0),(60499,111690,0),(60500,111691,0),(60501,111692,0),(60502,111693,0),(60503,111694,0),(60504,111695,0),(60505,111696,0),(60506,111697,0),(60507,111698,0),(60508,111699,0),(60509,111700,0),(60510,111701,0),(60511,111702,0),(60512,111703,0),(60513,111704,0),(60514,111705,0),(60515,111706,0),(60516,111707,0),(60517,111708,0),(60518,111709,0),(60519,111710,0),(60520,111711,0),(60521,111712,0),(60522,111713,0),(60523,111714,0),(60524,111715,0),(60525,111716,0),(60526,111717,0),(60527,111718,0),(60528,111719,0),(60529,111720,0),(60530,111721,0),(60531,111722,0),(60532,111723,0),(60533,111724,0),(60534,111725,0),(60535,111726,0),(60536,111727,0),(60537,111728,0),(60538,111729,0),(60539,111730,0),(60540,111731,0),(60541,111732,0),(60542,111733,0),(60543,111734,0),(60544,111737,0),(60545,111738,0),(60546,111740,0),(60547,111741,0),(60548,111742,0),(60549,111743,0),(60550,111744,0),(60551,111745,0),(60552,111746,0),(60553,111747,0),(60554,111748,0),(60555,111749,0),(60556,111750,0),(60557,111751,0),(60558,111752,0),(60559,111753,0),(60560,111754,0),(60561,111755,0),(60562,111756,0),(60563,111758,0),(60564,111759,0),(60565,111760,0),(60566,111761,0),(60567,111762,0),(60568,111763,0),(60569,111764,0),(60570,111765,0),(60571,111766,0),(60572,111772,0),(60573,111773,0),(60574,111774,0),(60575,111775,0),(60576,111776,0),(60577,111777,0),(60578,111778,0),(60579,111779,0),(60580,111780,0),(60581,111783,0),(60582,111784,0),(60583,111785,0),(60584,111786,0),(60585,111787,0),(60586,111788,0),(60587,111789,0),(60588,111790,0),(60589,111791,0),(60590,111792,0),(60591,111793,0),(60592,111794,0),(60593,111795,0),(60594,111796,0),(60595,111797,0),(60596,111798,0),(60597,111799,0),(60598,111807,0),(60600,111811,0),(60608,111824,0),(60609,111825,0),(60610,111826,0),(60611,111827,0),(60612,111828,0),(60613,111829,0),(60614,111830,0),(60615,111831,0),(60624,111840,0),(60625,111841,0),(60626,111854,0),(60627,111862,0),(60628,111868,0),(60629,111893,0),(60630,111909,0),(60631,111911,0),(60632,111912,0),(60633,111913,0),(60634,111914,0),(60635,111915,0),(60636,111916,0),(60637,111917,0),(60638,111918,0),(60639,111919,0),(60640,111920,0),(60647,111935,0),(60648,111949,0),(60649,111950,0),(60650,111953,0),(60651,111954,0),(60652,111955,0),(60698,112004,0),(60700,112010,0),(60701,112011,0),(60702,112012,0),(60703,112013,0),(60704,112016,0),(60737,112068,0),(60738,112069,0),(60739,112070,0),(60740,112072,0),(60741,112073,0),(60742,112074,0),(60743,112075,0),(60744,112076,0),(60745,112077,0),(60746,112078,0),(60747,112086,0),(60748,112092,0),(60749,112094,0),(60750,112096,0),(60751,112097,0),(60752,112109,0),(60753,112110,0),(60754,112134,0),(60755,112140,0),(60756,112141,0),(60757,112143,0),(60758,112144,0),(60759,112145,0),(60761,112187,0),(60762,112210,0),(60763,112211,0),(60764,112212,0),(60765,112213,0),(60766,112214,0),(60767,112215,0),(60768,112216,0),(60769,112217,0),(60770,112218,0),(60771,112219,0),(60772,112220,0),(60773,112221,0),(60774,112222,0),(60775,112223,0),(60776,112224,0),(60777,112225,0),(60778,112226,0),(60779,112227,0),(60780,112230,0),(60781,112231,0),(60782,112232,0),(60783,112233,0),(60784,112245,0),(60785,112246,0),(60786,112247,0),(60787,112248,0),(60788,112249,0),(60789,112250,0),(60790,112251,0),(60791,112252,0),(60792,112253,0),(60793,112254,0),(60794,112255,0),(60795,112256,0),(60796,112257,0),(60797,112258,0),(60798,112259,0),(60799,112260,0),(60800,112261,0),(60801,112262,0),(60802,112263,0),(60803,112268,0),(60812,112279,0),(60813,112280,0),(60814,112281,0),(60815,112282,0),(60816,112283,0),(60817,112284,0),(60818,112285,0),(60819,112286,0),(60820,112287,0),(60821,112288,0),(60822,112289,0),(60823,112290,0),(60824,112291,0),(60825,112292,0),(60826,112293,0),(60827,112294,0),(60828,112295,0),(60829,112296,0),(60830,112297,0),(60831,112298,0),(60832,112299,0),(60833,112300,0),(60834,112301,0),(60835,112302,0),(60836,112309,0),(60837,112310,0),(60838,112311,0),(60839,112312,0),(60840,112313,0),(60841,112314,0),(60842,112315,0),(60843,112316,0),(60844,109188,1),(60846,109784,5),(60847,112324,0),(60848,112326,0),(60849,112327,0),(60850,112339,0),(60851,112340,0),(60852,112341,0),(60853,112342,0),(60854,112344,0),(60855,112345,0),(60856,112346,0),(60857,112347,0),(60858,112348,0),(60859,112349,0),(60860,112350,0),(60861,112351,0),(60862,112352,0),(60863,112353,0),(60864,112354,0),(60865,112355,0),(60866,112356,0),(60867,112357,0),(60868,112358,0),(60869,112359,0),(60870,112360,0),(60871,112361,0),(60872,112362,0),(60873,112363,0),(60874,112364,0),(60875,112365,0),(60876,112366,0),(60877,112367,0),(60878,112369,0),(60879,112370,0),(60880,112371,0),(60881,112373,0),(60882,109784,1),(60883,109785,5),(60884,109785,1),(60885,109786,5),(60886,109786,1),(60887,109796,5),(60888,109796,1),(60889,109797,5),(60890,109797,1),(60891,112382,0),(60892,112382,4),(60893,112382,3),(60895,112383,0),(60896,112383,4),(60897,112383,3),(60898,112387,0),(60899,112388,0),(60900,112389,0),(60901,112390,0),(60902,112391,0),(60903,112392,0),(60904,112393,0),(60905,112395,0),(60906,112397,0),(60907,112416,0),(60908,112416,4),(60909,112416,3),(60910,112417,0),(60911,112417,4),(60912,112417,3),(60913,112418,0),(60914,112418,4),(60915,112418,3),(60916,112419,0),(60917,112419,4),(60918,112419,3),(60919,112420,0),(60920,112420,4),(60921,112420,3),(60922,112421,0),(60923,112421,4),(60924,112421,3),(60925,110785,4),(60926,110785,3),(60927,112422,0),(60928,112422,4),(60929,112422,3),(60930,112423,0),(60931,112423,4),(60932,112423,3),(60933,112424,0),(60934,112424,4),(60935,112424,3),(60936,112425,0),(60937,112428,0),(60938,112428,4),(60939,112428,3),(60940,112429,0),(60941,112429,4),(60942,112429,3),(60944,112431,0),(60945,112432,0),(60946,112433,0),(60947,112434,0),(60948,112435,0),(60949,112436,0),(60950,112437,0),(60951,112438,0),(60953,112440,0),(60954,112441,0),(60955,112442,0),(60956,112443,0),(60957,112445,0),(60958,112445,4),(60959,112445,3),(60960,112447,0),(60961,112447,4),(60962,112447,3),(60963,112448,0),(60964,112448,4),(60965,112448,3),(60975,112468,0),(60976,112469,0),(60977,112470,0),(60978,112471,0),(60979,110784,3),(60980,110784,4),(60981,112477,0),(60982,112477,4),(60983,112477,3),(60984,112478,0),(60985,112478,4),(60986,112478,3),(60987,112479,0),(60988,112479,4),(60989,112479,3),(60990,112480,0),(60991,112480,4),(60992,112480,3),(60993,112481,0),(60994,112481,4),(60995,112481,3),(60996,112482,0),(60997,112482,4),(60998,112482,3),(60999,112483,0),(61000,112483,4),(61001,112483,3),(61002,112485,0),(61003,112486,0),(61004,112486,4),(61005,112486,3),(61006,112487,0),(61007,112487,4),(61008,112487,3),(61009,112488,0),(61010,112488,4),(61011,112488,3),(61012,112489,0),(61013,112489,4),(61014,112489,3),(61015,112491,0),(61016,112491,4),(61017,112491,3),(61018,112492,0),(61019,112492,4),(61020,112492,3),(61021,112493,0),(61022,112493,4),(61023,112493,3),(61024,112494,0),(61025,112494,4),(61026,112494,3),(61027,112495,0),(61028,112495,4),(61029,112495,3),(61030,112496,0),(61031,112496,4),(61032,112496,3),(61042,110030,1),(61043,110030,5),(61045,112544,0),(61046,112545,0),(61047,112545,4),(61048,112545,3),(61049,112546,0),(61050,112546,4),(61051,112546,3),(61052,112547,0),(61053,112547,4),(61054,112547,3),(61055,112548,0),(61056,112548,4),(61057,112548,3),(61058,112549,0),(61059,112549,4),(61060,112549,3),(61061,112550,0),(61062,112550,4),(61063,112550,3),(61064,112551,0),(61065,112551,4),(61066,112551,3),(61067,112552,0),(61068,112552,4),(61069,112552,3),(61070,112554,0),(61071,112555,0),(61072,112555,4),(61073,112555,3),(61074,112556,0),(61075,112556,4),(61076,112556,3),(61077,112557,0),(61078,112557,4),(61079,112557,3),(61080,112558,0),(61081,112558,4),(61082,112558,3),(61083,112560,0),(61084,112560,4),(61085,112560,3),(61086,112561,0),(61087,112561,4),(61088,112561,3),(61089,112562,0),(61090,112562,4),(61091,112562,3),(61092,112563,0),(61093,112563,4),(61094,112563,3),(61095,112564,0),(61096,112564,4),(61097,112564,3),(61098,112565,0),(61099,112565,4),(61100,112565,3),(61103,110031,5),(61104,110031,1),(61105,110032,5),(61106,110032,1),(61107,110033,5),(61108,110033,1),(61109,110034,5),(61110,110034,1),(61111,110045,5),(61112,110045,1),(61113,110047,5),(61114,110047,1),(61115,110046,5),(61116,110046,1),(61117,110048,5),(61118,110048,1),(61119,110049,5),(61120,110049,1),(61121,110050,5),(61122,110050,1),(61124,112574,0),(61125,112575,0),(61126,112582,0),(61127,112586,0),(61128,112587,0),(61129,112621,0),(61130,112624,0),(61131,110040,5),(61132,110040,1),(61133,110041,5),(61134,110041,1),(61135,110042,5),(61136,110042,1),(61137,110043,5),(61138,110043,1),(61139,110044,5),(61140,110044,1),(61141,110055,5),(61142,110055,1),(61143,110056,5),(61144,110056,1),(61145,110057,5),(61146,110057,1),(61147,110058,5),(61148,110058,1),(61149,110059,5),(61150,110059,1),(61152,110052,5),(61153,110052,1),(61154,110054,5),(61155,110054,1),(61156,110053,5),(61157,110053,1),(61158,112666,0),(61159,112663,0),(61160,112665,0),(61161,112664,0),(61162,112668,0),(61163,112669,0),(61164,112670,0),(61165,112671,0),(61169,110035,5),(61170,110035,1),(61171,110036,5),(61172,110036,1),(61173,110037,5),(61174,110037,1),(61175,110039,5),(61176,110039,1),(61177,110038,5),(61178,110038,1),(61180,109824,5),(61181,109824,1),(61182,109864,5),(61183,109864,1),(61184,109844,5),(61185,109844,1),(61186,109970,5),(61187,109970,1),(61188,109804,5),(61189,109804,1),(61190,109930,5),(61191,109930,1),(61192,109899,5),(61193,109899,1),(61194,109825,5),(61195,109825,1),(61196,109865,5),(61197,109865,1),(61198,109845,5),(61199,109845,1),(61200,109971,5),(61201,109971,1),(61202,109805,5),(61203,109805,1),(61204,109931,5),(61205,109931,1),(61206,109900,5),(61207,109900,1),(61208,109826,5),(61209,109826,1),(61210,109866,5),(61211,109866,1),(61212,109846,5),(61213,109846,1),(61214,109972,5),(61215,109972,1),(61216,109806,5),(61217,109806,1),(61218,109932,5),(61219,109932,1),(61220,109901,5),(61221,109901,1),(61222,109827,5),(61223,109827,1),(61224,109867,5),(61225,109867,1),(61226,109847,5),(61227,109847,1),(61228,109973,5),(61229,109973,1),(61230,109807,5),(61231,109807,1),(61232,109933,5),(61233,109933,1),(61234,109902,5),(61235,109902,1),(61236,109828,5),(61237,109828,1),(61238,109881,5),(61239,109881,1),(61240,109861,5),(61241,109861,1),(61242,109974,5),(61243,109974,1),(61244,109808,5),(61245,109808,1),(61246,109948,5),(61247,109948,1),(61248,109903,5),(61249,109903,1),(61250,109829,5),(61251,109829,1),(61252,109787,5),(61253,109787,1),(61254,109868,5),(61255,109868,1),(61256,109884,5),(61257,109884,1),(61258,109848,5),(61259,109848,1),(61260,109975,5),(61261,109975,1),(61262,109809,5),(61263,109809,1),(61264,109934,5),(61265,109934,1),(61266,109830,5),(61267,109830,1),(61268,109788,5),(61269,109788,1),(61270,109869,1),(61271,109869,5),(61272,109885,5),(61273,109885,1),(61274,109849,5),(61275,109849,1),(61276,109976,5),(61277,109976,1),(61278,109810,5),(61279,109810,1),(61280,109935,5),(61281,109935,1),(61282,109831,5),(61283,109831,1),(61284,109789,5),(61285,109789,1),(61286,109870,5),(61287,109870,1),(61288,109886,5),(61289,109886,1),(61290,109850,5),(61291,109850,1),(61292,109977,5),(61293,109977,1),(61294,109811,5),(61295,109811,1),(61296,109936,5),(61297,109936,1),(61298,109832,5),(61299,109832,1),(61300,109798,5),(61301,109798,1),(61302,109871,5),(61303,109871,1),(61304,109897,5),(61305,109897,1),(61306,109851,5),(61307,109851,1),(61308,109978,5),(61309,109978,1),(61310,109812,5),(61311,109812,1),(61312,109937,5),(61313,109937,1),(61314,109842,5),(61315,109842,1),(61316,109799,5),(61317,109799,1),(61318,109882,5),(61319,109882,1),(61320,109898,5),(61321,109898,1),(61322,109862,5),(61323,109862,1),(61324,109979,5),(61325,109979,1),(61326,109823,5),(61327,109823,1),(61328,109938,5),(61329,109938,1),(61331,109833,5),(61332,109833,1),(61333,109834,5),(61334,109834,1),(61335,109835,5),(61336,109835,1),(61337,109836,5),(61338,109836,1),(61339,109843,5),(61340,109843,1),(61341,109790,5),(61342,109790,1),(61343,109791,5),(61344,109791,1),(61345,109792,5),(61346,109792,1),(61347,109800,5),(61348,109800,1),(61349,109801,5),(61350,109801,1),(61351,109872,5),(61352,109872,1),(61353,109873,5),(61354,109873,1),(61355,109874,5),(61356,109874,1),(61357,109875,5),(61358,109875,1),(61359,109883,5),(61360,109883,1),(61361,109887,5),(61362,109887,1),(61363,109888,5),(61364,109888,1),(61365,109889,5),(61366,109889,1),(61367,109890,5),(61368,109890,1),(61369,109891,5),(61370,109891,1),(61371,109852,5),(61372,109852,1),(61373,109853,5),(61374,109853,1),(61375,109854,5),(61376,109854,1),(61377,109855,5),(61378,109855,1),(61379,109863,5),(61380,109863,1),(61381,109980,5),(61382,109980,1),(61383,109981,5),(61384,109981,1),(61385,109982,5),(61386,109982,1),(61387,109983,5),(61388,109983,1),(61389,109984,5),(61390,109984,1),(61391,109813,5),(61392,109813,1),(61393,109814,5),(61394,109814,1),(61395,109815,5),(61396,109815,1),(61397,109816,5),(61398,109816,1),(61399,109817,5),(61400,109817,1),(61401,109939,5),(61402,109939,1),(61403,109940,5),(61404,109940,1),(61405,109941,5),(61406,109941,1),(61407,109942,5),(61408,109942,1),(61409,109949,5),(61410,109949,1),(61411,109837,5),(61412,109793,5),(61413,109876,5),(61414,109892,5),(61415,109856,5),(61416,109985,5),(61417,109818,5),(61418,109943,5),(61419,109838,1),(61420,109794,1),(61421,109877,1),(61422,109893,1),(61423,109857,1),(61424,109986,1),(61425,109819,1),(61426,109944,1),(61427,109839,5),(61428,109795,5),(61429,109878,5),(61430,109894,5),(61431,109858,5),(61432,109987,5),(61433,109820,5),(61434,109945,5),(61435,109802,1),(61436,109879,1),(61437,109895,1),(61438,109859,1),(61439,109988,1),(61440,109821,1),(61441,109946,1),(61442,109841,5),(61443,109803,5),(61444,109880,5),(61445,109896,5),(61446,109860,5),(61447,109989,5),(61448,109822,5),(61449,109947,5),(61450,109838,5),(61451,109794,5),(61452,109877,5),(61453,109893,5),(61454,109857,5),(61455,109986,5),(61456,109819,5),(61457,109944,5),(61458,109840,5),(61459,109840,0),(61460,109802,5),(61461,109879,5),(61462,109895,5),(61463,109859,5),(61464,109988,5),(61465,109821,5),(61466,109946,5),(61467,109841,1),(61468,109803,1),(61469,109880,1),(61470,109896,1),(61471,109860,1),(61472,109989,1),(61473,109822,1),(61474,109947,1),(61475,109837,1),(61476,109793,1),(61477,109876,1),(61478,109892,1),(61479,109856,1),(61480,109985,1),(61481,109818,1),(61482,109943,1),(61483,109839,1),(61484,109795,1),(61485,109878,1),(61486,109894,1),(61487,109858,1),(61488,109987,1),(61489,109820,1),(61490,109945,1),(61491,112685,0),(61492,112686,0),(61511,112702,0),(61512,112702,4),(61513,112702,3),(61514,112704,0),(61515,112704,4),(61516,112704,3),(61517,112705,0),(61518,112705,4),(61519,112705,3),(61520,112706,0),(61521,112706,4),(61522,112706,3),(61523,112707,0),(61524,112707,4),(61525,112707,3),(61526,112710,0),(61527,112710,4),(61528,112710,3),(61529,112711,0),(61530,112711,4),(61531,112711,3),(61532,112712,0),(61533,112712,4),(61534,112712,3),(61535,112713,0),(61536,112713,4),(61537,112713,3),(61538,112715,0),(61539,112715,4),(61540,112715,3),(61541,112716,0),(61542,112716,4),(61543,112716,3),(61544,112717,0),(61545,112717,4),(61546,112717,3),(61547,112718,0),(61548,112718,4),(61549,112718,3),(61550,112719,0),(61551,112719,4),(61552,112719,3),(61553,112723,0),(61554,112723,4),(61555,112723,3),(61556,112725,0),(61557,112725,4),(61558,112725,3),(61559,112726,0),(61560,112726,4),(61561,112726,3),(61562,112727,0),(61563,112727,4),(61564,112727,3),(61565,112728,0),(61566,112728,4),(61567,112728,3),(61568,112731,0),(61569,112731,4),(61570,112731,3),(61571,112732,0),(61572,112732,4),(61573,112732,3),(61574,112733,0),(61575,112733,4),(61576,112733,3),(61577,112734,0),(61578,112734,4),(61579,112734,3),(61580,112735,0),(61581,112735,4),(61582,112735,3),(61583,112736,0),(61584,112736,4),(61585,112736,3),(61588,112739,0),(61589,112739,4),(61590,112739,3),(61591,112740,0),(61592,112740,4),(61593,112740,3),(61594,112741,0),(61595,112741,4),(61596,112741,3),(61597,112743,0),(61598,112743,4),(61599,112743,3),(61600,112744,0),(61601,112744,4),(61602,112744,3),(61603,112745,0),(61604,112745,4),(61605,112745,3),(61608,112746,0),(61609,112746,4),(61610,112746,3),(61611,112748,0),(61612,112748,4),(61613,112748,3),(61614,112749,0),(61615,112749,4),(61616,112749,3),(61617,112750,0),(61618,112750,4),(61619,112750,3),(61620,112751,0),(61621,112751,4),(61622,112751,3),(61623,112752,0),(61624,112752,4),(61625,112752,3),(61626,112755,0),(61627,112755,4),(61628,112755,3),(61629,112757,0),(61630,112757,4),(61631,112757,3),(61632,112759,0),(61633,112759,4),(61634,112759,3),(61635,112760,0),(61636,112760,4),(61637,112760,3),(61638,112761,0),(61639,112761,4),(61640,112761,3),(61641,112762,0),(61642,112762,4),(61643,112762,3),(61644,112763,0),(61645,112763,4),(61646,112763,3),(61647,112764,0),(61648,112764,4),(61649,112764,3),(61650,112765,0),(61651,112765,4),(61652,112765,3),(61653,112766,0),(61654,112766,4),(61655,112766,3),(61656,112769,0),(61657,112769,4),(61658,112769,3),(61659,112770,0),(61660,112770,4),(61661,112770,3),(61662,112771,0),(61663,112771,4),(61664,112771,3),(61665,112772,0),(61666,112772,4),(61667,112772,3),(61668,112773,0),(61669,112773,4),(61670,112773,3),(61671,112774,0),(61672,112774,4),(61673,112774,3),(61679,112779,0),(61680,112779,4),(61681,112779,3),(61682,112780,0),(61683,112780,4),(61684,112780,3),(61685,112781,0),(61686,112781,4),(61687,112781,3),(61688,112782,0),(61689,112782,4),(61690,112782,3),(61691,112783,0),(61692,112783,4),(61693,112783,3),(61694,112785,0),(61695,112785,4),(61696,112785,3),(61697,112787,0),(61698,112787,4),(61699,112787,3),(61701,112788,0),(61702,112788,4),(61703,112788,3),(61704,112789,0),(61705,112789,4),(61706,112789,3),(61707,112790,0),(61708,112790,4),(61709,112790,3),(61711,112793,0),(61712,112793,4),(61713,112793,3),(61714,112794,0),(61715,112794,4),(61716,112794,3),(61717,112796,0),(61718,112796,4),(61719,112796,3),(61720,112797,0),(61721,112797,4),(61722,112797,3),(61723,112804,0),(61724,112804,4),(61725,112804,3),(61726,112805,0),(61727,112805,4),(61728,112805,3),(61729,112806,0),(61730,112806,4),(61731,112806,3),(61732,112807,0),(61733,112807,4),(61734,112807,3),(61735,112808,0),(61736,112808,4),(61737,112808,3),(61738,112812,0),(61739,112811,0),(61740,112810,0),(61741,112809,0),(61743,112813,0),(61744,112813,4),(61745,112813,3),(61746,112814,0),(61747,112814,4),(61748,112814,3),(61750,112816,0),(61751,112816,4),(61752,112816,3),(61753,112818,0),(61754,112818,4),(61755,112818,3),(61756,112819,0),(61757,112819,4),(61758,112819,3),(61759,112820,0),(61760,112820,4),(61761,112820,3),(61762,112821,0),(61763,112821,4),(61764,112821,3),(61766,112823,0),(61767,112823,4),(61768,112823,3),(61773,112826,0),(61774,112826,4),(61775,112826,3),(61776,112827,0),(61777,112827,4),(61778,112827,3),(61779,112829,0),(61780,112829,4),(61781,112829,3),(61787,112831,0),(61788,112831,4),(61789,112831,3),(61790,112832,0),(61791,112832,4),(61792,112832,3),(61793,112833,0),(61794,112833,4),(61795,112833,3),(61796,112834,0),(61797,112834,4),(61798,112834,3),(61799,112835,0),(61800,112835,4),(61801,112835,3),(61802,112836,0),(61803,112836,4),(61804,112836,3),(61805,112837,0),(61806,112837,4),(61807,112837,3),(61808,112838,0),(61809,112838,4),(61810,112838,3),(61817,112841,0),(61818,112841,4),(61819,112841,3),(61820,112842,0),(61821,112842,4),(61822,112842,3),(61823,112843,0),(61824,112843,4),(61825,112843,3),(61826,112844,0),(61827,112844,4),(61828,112844,3),(61829,112845,0),(61830,112845,4),(61831,112845,3),(61832,112846,0),(61833,112846,4),(61834,112846,3),(61835,112847,0),(61836,112847,4),(61837,112847,3),(61838,112853,0),(61839,112853,4),(61840,112853,3),(61841,112854,0),(61842,112854,4),(61843,112854,3),(61844,112856,0),(61845,112856,4),(61846,112856,3),(61847,112861,0),(61848,112861,4),(61849,112861,3),(61850,112862,0),(61851,112862,4),(61852,112862,3),(61853,112866,0),(61854,112866,4),(61855,112866,3),(61856,112867,0),(61857,112868,0),(61858,112869,0),(61859,112870,0),(61860,112871,0),(61861,112872,0),(61862,112873,0),(61863,112874,0),(61864,112875,0),(61865,112882,0),(61866,112882,4),(61867,112882,3),(61868,112890,0),(61869,112890,4),(61870,112890,3),(61871,112892,0),(61872,112892,4),(61873,112892,3),(61874,112895,0),(61875,112895,4),(61876,112895,3),(61877,112896,0),(61878,112896,4),(61879,112896,3),(61880,112897,0),(61881,112897,4),(61882,112897,3),(61883,112898,0),(61884,112898,4),(61885,112898,3),(61887,112914,0),(61888,112914,4),(61889,112914,3),(61890,112915,0),(61891,112915,4),(61892,112915,3),(61893,112918,0),(61894,112918,4),(61895,112918,3),(61896,112919,0),(61897,112919,4),(61898,112919,3),(61899,112920,0),(61900,112920,4),(61901,112920,3),(61902,112921,0),(61903,112921,4),(61904,112921,3),(61905,112922,0),(61906,112922,4),(61907,112922,3),(61908,112923,0),(61909,112923,4),(61910,112923,3),(61911,112925,0),(61912,112925,4),(61913,112925,3),(61914,112926,0),(61915,112926,4),(61916,112926,3),(61917,112927,0),(61918,112927,4),(61919,112927,3),(61920,112928,0),(61921,112928,4),(61922,112928,3),(61923,112929,0),(61924,112929,4),(61925,112929,3),(61926,112930,0),(61927,112930,4),(61928,112930,3),(61929,112931,0),(61930,112931,4),(61931,112931,3),(61932,112932,0),(61933,112932,4),(61934,112932,3),(61935,112933,0),(61936,112933,4),(61937,112933,3),(61938,112934,0),(61939,112934,4),(61940,112934,3),(61941,112935,0),(61942,112935,4),(61943,112935,3),(61944,112936,0),(61945,112936,4),(61946,112936,3),(61947,112937,0),(61948,112937,4),(61949,112937,3),(61950,112939,0),(61951,112939,4),(61952,112939,3),(61953,112940,0),(61954,112940,4),(61955,112940,3),(61956,112941,0),(61957,112941,4),(61958,112941,3),(61959,112942,0),(61960,112942,4),(61961,112942,3),(61963,112943,0),(61964,112943,4),(61965,112943,3),(61966,112944,0),(61967,112944,4),(61968,112944,3),(61969,112945,0),(61970,112945,4),(61971,112945,3),(61972,112946,0),(61973,112946,4),(61974,112946,3),(61975,112949,0),(61976,112949,4),(61977,112949,3),(61978,112950,0),(61979,112950,4),(61980,112950,3),(61981,112951,0),(61982,112951,4),(61983,112951,3),(61984,112952,0),(61985,112952,4),(61986,112952,3),(61987,112953,0),(61988,112953,4),(61989,112953,3),(61991,112959,0),(61992,112960,0),(61993,112961,0),(62014,113011,0),(62015,113012,0),(62016,113013,0),(62021,113042,0),(62022,113043,0),(62023,113044,0),(62024,113045,0),(62025,113046,0),(62026,113047,0),(62027,113048,0),(62028,113049,0),(62029,113050,0),(62030,113051,0),(62031,113052,0),(62032,113053,0),(62033,113054,0),(62034,113055,0),(62035,113056,0),(62036,113057,0),(62037,113058,0),(62038,113059,0),(62039,113060,0),(62040,113061,0),(62041,113062,0),(62042,113063,0),(62043,113064,0),(62044,113065,0),(62045,113066,0),(62046,113067,0),(62047,113068,0),(62048,113069,0),(62049,113070,0),(62050,113071,0),(62051,113072,0),(62052,113073,0),(62053,113074,0),(62054,113075,0),(62055,113076,0),(62056,112521,0),(62057,112523,0),(62058,112522,0),(62059,112520,0),(62060,112398,0),(62061,112406,0),(62062,112407,0),(62064,112588,0),(62065,112589,0),(62066,112590,0),(62067,112591,0),(62068,112592,0),(62069,112593,0),(62070,112594,0),(62071,112595,0),(62072,112596,0),(62073,112597,0),(62074,112598,0),(62075,112599,0),(62076,112600,0),(62077,112601,0),(62078,112604,0),(62079,112607,0),(62080,112610,0),(62081,112613,0),(62082,112616,0),(62083,112602,0),(62084,112606,0),(62085,112608,0),(62086,112615,0),(62087,112619,0),(62088,112605,0),(62089,112611,0),(62090,112614,0),(62091,112618,0),(62092,112603,0),(62093,112609,0),(62094,112612,0),(62095,112617,0),(62100,112577,0),(62101,112576,0),(62102,112578,0),(62103,112579,0),(62104,112580,0),(62105,113093,0),(62107,113110,0),(62108,113113,0),(62109,113114,0),(62110,113115,5),(62111,113116,0),(62112,113117,0),(62113,113118,0),(62114,113119,0),(62115,113120,0),(62121,112648,0),(62122,113125,0),(62123,113126,0),(62129,113128,0),(62131,113131,0),(62134,113134,0),(62135,113131,6),(62136,113131,7),(62137,113131,8),(62139,113148,0),(62140,113149,0),(62141,113150,0),(62142,113151,0),(62143,113152,0),(62144,113153,0),(62145,113154,0),(62146,113169,0),(62147,113170,0),(62148,113171,0),(62149,113172,0),(62150,113173,0),(62151,113174,0),(62152,113175,0),(62153,113176,0),(62154,113177,0),(62155,113178,0),(62156,113179,0),(62157,113180,0),(62158,113181,0),(62159,113182,0),(62160,111526,6),(62161,111526,7),(62162,111526,8),(62163,113134,6),(62164,113134,7),(62165,113134,8),(62167,113184,0),(62168,113185,0),(62169,113218,0),(62170,113218,4),(62171,113218,3),(62172,113219,0),(62173,113219,4),(62174,113219,3),(62175,113220,0),(62176,113220,4),(62177,113220,3),(62178,113221,0),(62179,113221,4),(62180,113221,3),(62181,113222,0),(62182,113222,4),(62183,113222,3),(62184,113223,0),(62185,113224,0),(62186,113225,0),(62187,113225,4),(62188,113225,3),(62189,113226,0),(62190,113227,0),(62191,113227,4),(62192,113227,3),(62193,113228,0),(62194,113228,4),(62195,113228,3),(62196,113229,0),(62197,113229,4),(62198,113229,3),(62199,113230,0),(62200,113231,0),(62201,113232,0),(62202,113233,0),(62203,113234,0),(62204,113235,0),(62206,113237,0),(62207,113238,0),(62208,113239,0),(62209,113240,0),(62210,113249,0),(62211,113250,0),(62212,113251,0),(62213,113252,0),(62218,113270,0),(62219,113270,6),(62220,113270,7),(62221,113270,8),(62222,113280,0),(62223,113281,0),(62228,113287,0),(62229,113288,0),(62257,113362,0),(62258,113372,0),(62259,113378,0),(62260,113402,0),(62261,113403,0),(62262,110051,5),(62263,110051,1),(62267,112399,0),(62268,112408,0),(62269,112400,0),(62270,112409,0),(62271,112411,0),(62272,112412,0),(62273,112401,0),(62274,112404,0),(62275,113432,0),(62276,113433,0),(62277,112415,0),(62278,112414,0),(62279,112403,0),(62280,112402,0),(62281,112413,0),(62282,112410,0),(62283,113434,0),(62284,113435,0),(62285,113440,0),(62286,113443,0),(62287,113450,0),(62288,113451,0),(62289,113474,0),(62290,113475,0),(62291,113476,0),(62292,113477,0),(62293,113479,0),(62294,113482,0),(62295,113486,0),(62296,113487,0),(62297,113488,0),(62298,113490,0),(62301,113491,0),(62306,113503,0),(62312,113512,0),(62313,113513,0),(62315,113514,0),(62316,113515,0),(62317,113516,0),(62318,113517,0),(62319,113518,0),(62320,113519,0),(62321,113520,0),(62322,113521,0),(62323,113522,0),(62324,113523,0),(62325,113524,0),(62326,113525,0),(62337,113541,0),(62338,113544,0),(62340,113546,0),(62341,113547,0),(62342,113548,0),(62343,113553,0),(62344,113557,0),(62345,113559,0),(62346,113560,0),(62347,113561,0),(62348,113562,0),(62349,113563,0),(62350,113571,0),(62355,113591,0),(62356,113591,1),(62357,113591,3),(62358,113592,0),(62359,113592,1),(62360,113592,3),(62361,113593,0),(62362,113593,1),(62363,113593,3),(62364,113595,0),(62365,113595,1),(62366,113595,3),(62367,113596,0),(62368,113596,1),(62369,113596,3),(62370,113600,0),(62371,113600,5),(62372,113600,1),(62373,113601,0),(62374,113601,1),(62375,113601,3),(62376,113602,0),(62377,113602,5),(62378,113602,1),(62379,113605,0),(62380,113606,0),(62381,113606,1),(62382,113606,3),(62383,113607,0),(62384,113607,1),(62385,113607,3),(62386,113608,0),(62387,113608,5),(62388,113608,1),(62389,113609,0),(62390,113609,5),(62391,113609,1),(62392,113610,0),(62393,113610,5),(62394,113610,1),(62397,113621,0),(62398,113622,0); +INSERT INTO `dbc_itemmodifiedappearance` (`Id`, `ItemId`, `AppearanceModID`) VALUES (62399,113624,0),(62402,113632,0),(62403,113632,5),(62404,113632,1),(62405,113633,0),(62406,113633,5),(62407,113633,1),(62408,113634,0),(62409,113634,5),(62410,113634,1),(62411,113636,0),(62412,113636,5),(62413,113636,1),(62414,113637,0),(62415,113639,0),(62416,113639,1),(62417,113639,3),(62418,113640,0),(62419,113640,1),(62420,113640,3),(62422,113641,0),(62423,113641,5),(62424,113641,1),(62425,113642,0),(62426,113642,5),(62427,113642,1),(62428,113648,0),(62429,113648,5),(62430,113648,1),(62431,113649,0),(62432,113649,5),(62433,113649,1),(62434,113652,0),(62435,113652,1),(62436,113652,3),(62437,113653,0),(62438,113653,1),(62439,113653,3),(62440,113654,0),(62441,113654,5),(62442,113654,1),(62443,113655,0),(62444,113655,5),(62445,113655,1),(62446,113656,0),(62447,113656,5),(62448,113656,1),(62449,113657,0),(62450,113659,0),(62451,113659,5),(62452,113659,1),(62453,113660,0),(62454,113660,5),(62455,113660,1),(62456,113661,0),(62457,113661,5),(62458,113661,1),(62459,113664,0),(62460,113664,5),(62461,113664,1),(62463,113666,0),(62464,113666,1),(62465,113666,3),(62466,113667,0),(62467,113667,1),(62468,113667,3),(62472,113683,0),(62473,113684,0),(62474,113685,0),(62475,113689,0),(62476,113690,0),(62477,113691,0),(62478,113692,0),(62479,113693,0),(62480,113694,0),(62481,113695,0),(62482,113696,0),(62483,113697,0),(62484,113698,0),(62485,113699,0),(62486,113700,0),(62487,113701,0),(62488,113702,0),(62489,113703,0),(62490,113704,0),(62491,113705,0),(62492,113706,0),(62493,113707,0),(62494,113708,0),(62495,113709,0),(62496,113710,0),(62497,113711,0),(62498,113712,0),(62499,113713,0),(62500,113714,0),(62501,113715,0),(62502,113716,0),(62503,113717,0),(62504,113718,0),(62505,113719,0),(62506,113720,0),(62507,113721,0),(62508,113722,0),(62509,113723,0),(62510,113724,0),(62511,113728,0),(62512,113729,0),(62513,113730,0),(62514,113731,0),(62515,113732,0),(62516,113733,0),(62517,113737,0),(62518,113738,0),(62519,113739,0),(62520,113740,0),(62521,113741,0),(62522,113742,0),(62523,113743,0),(62524,113744,0),(62525,113745,0),(62526,113746,0),(62527,113747,0),(62528,113748,0),(62529,113749,0),(62530,113750,0),(62531,113751,0),(62532,113752,0),(62533,113753,0),(62534,113754,0),(62535,113758,0),(62536,113759,0),(62537,113760,0),(62538,113761,0),(62539,113762,0),(62540,113763,0),(62541,113764,0),(62542,113765,0),(62543,113766,0),(62544,113767,0),(62545,113768,0),(62546,113769,0),(62547,113770,0),(62548,113771,0),(62549,113772,0),(62550,113773,0),(62551,113774,0),(62552,113775,0),(62553,113776,0),(62554,113777,0),(62555,113778,0),(62556,113779,0),(62557,113780,0),(62558,113781,0),(62559,113782,0),(62560,113783,0),(62561,113784,0),(62562,113785,0),(62563,113786,0),(62564,113787,0),(62565,113788,0),(62566,113789,0),(62567,113790,0),(62568,113791,0),(62569,113792,0),(62570,113793,0),(62571,113794,0),(62572,113795,0),(62573,113796,0),(62574,113797,0),(62575,113798,0),(62576,113799,0),(62577,113800,0),(62578,113801,0),(62579,113802,0),(62580,113803,0),(62581,113804,0),(62582,113805,0),(62583,113806,0),(62584,113807,0),(62585,113808,0),(62586,113809,0),(62587,113810,0),(62588,113811,0),(62589,113812,0),(62590,113813,0),(62591,113814,0),(62592,113815,0),(62593,113816,0),(62594,113817,0),(62595,113818,0),(62596,113819,0),(62597,113820,0),(62598,113826,0),(62599,113826,5),(62600,113826,1),(62601,113827,0),(62602,113827,5),(62603,113827,1),(62604,113828,0),(62605,113828,5),(62606,113828,1),(62607,113830,0),(62608,113831,0),(62609,113831,5),(62610,113831,1),(62611,113832,0),(62612,113832,5),(62613,113832,1),(62614,113836,0),(62615,113836,1),(62616,113836,3),(62617,113837,0),(62618,113838,0),(62619,113838,1),(62620,113838,3),(62621,113839,0),(62622,113839,5),(62623,113839,1),(62624,113840,0),(62625,113840,5),(62626,113840,1),(62627,113844,0),(62628,113844,5),(62629,113844,1),(62630,113845,0),(62631,113845,5),(62632,113845,1),(62633,113847,0),(62634,113848,0),(62635,113848,1),(62636,113848,3),(62637,113849,0),(62638,113849,5),(62639,113849,1),(62640,113850,0),(62641,113850,5),(62642,113850,1),(62643,113852,0),(62644,113855,0),(62645,113855,5),(62646,113855,1),(62647,113856,0),(62648,113856,5),(62649,113856,1),(62650,113857,0),(62651,113857,1),(62652,113857,3),(62653,113862,0),(62654,113862,1),(62655,113862,3),(62656,113863,0),(62657,113863,5),(62658,113863,1),(62659,113864,0),(62660,113864,5),(62661,113864,1),(62662,113867,0),(62663,113867,5),(62664,113867,1),(62665,113868,0),(62666,113868,1),(62667,113868,3),(62668,113869,0),(62669,113869,1),(62670,113869,3),(62671,113870,0),(62672,113870,5),(62673,113870,1),(62674,113871,0),(62675,113871,5),(62676,113871,1),(62677,113873,0),(62678,113874,0),(62679,113874,1),(62680,113874,3),(62681,113875,0),(62682,113875,5),(62683,113875,1),(62684,113876,0),(62685,113876,5),(62686,113876,1),(62687,113878,0),(62688,113879,0),(62689,113879,1),(62690,113879,3),(62691,113880,0),(62692,113880,5),(62693,113880,1),(62694,113881,0),(62695,113881,5),(62696,113881,1),(62697,113883,0),(62698,113884,0),(62699,113884,5),(62700,113884,1),(62701,113885,0),(62702,113885,1),(62703,113885,3),(62704,113886,0),(62705,113886,1),(62706,113886,3),(62707,113887,0),(62708,113887,5),(62709,113887,1),(62710,113888,0),(62711,113888,5),(62712,113888,1),(62713,113891,0),(62714,113891,5),(62715,113891,1),(62716,113894,0),(62717,113894,5),(62718,113894,1),(62719,113895,0),(62720,113895,5),(62721,113895,1),(62722,113896,0),(62723,113896,5),(62724,113896,1),(62725,113897,0),(62726,113897,1),(62727,113897,3),(62728,113898,0),(62729,113898,1),(62730,113898,3),(62731,113899,0),(62732,113899,5),(62733,113899,1),(62734,113902,0),(62735,113902,5),(62736,113902,1),(62737,113903,0),(62738,113903,5),(62739,113903,1),(62740,113904,0),(62741,113904,1),(62742,113904,3),(62743,113906,0),(62744,113906,5),(62745,113906,1),(62746,113907,0),(62747,113907,5),(62748,113907,1),(62749,113910,0),(62750,113910,5),(62751,113910,1),(62752,113913,0),(62753,113913,1),(62754,113913,3),(62755,113914,0),(62756,113914,1),(62757,113914,3),(62758,113915,0),(62759,113915,5),(62760,113915,1),(62761,113916,0),(62762,113918,0),(62763,113918,1),(62764,113918,3),(62765,113919,0),(62766,113919,5),(62767,113919,1),(62768,113920,0),(62769,113920,1),(62770,113920,3),(62771,113921,0),(62772,113921,5),(62773,113921,1),(62774,113924,0),(62775,113924,5),(62776,113924,1),(62777,113925,0),(62778,113925,5),(62779,113925,1),(62780,113926,0),(62781,113926,1),(62782,113926,3),(62783,113927,0),(62784,113927,1),(62785,113927,3),(62786,113928,0),(62787,113928,5),(62788,113928,1),(62789,113929,0),(62790,113930,0),(62791,113930,5),(62792,113930,1),(62793,113933,0),(62794,113933,1),(62795,113933,3),(62796,113934,0),(62797,113934,1),(62798,113934,3),(62799,113935,0),(62800,113935,5),(62801,113935,1),(62802,113936,0),(62803,113936,5),(62804,113936,1),(62805,113937,0),(62806,113939,0),(62807,113939,1),(62808,113939,3),(62809,113941,0),(62810,113941,5),(62811,113941,1),(62812,113942,0),(62813,113942,1),(62814,113942,3),(62815,113943,0),(62816,113943,5),(62817,113943,1),(62818,113944,0),(62819,113944,5),(62820,113944,1),(62821,113945,0),(62822,113946,0),(62823,113946,1),(62824,113946,3),(62825,113949,0),(62826,113949,5),(62827,113949,1),(62828,113950,0),(62829,113950,5),(62830,113950,1),(62831,113951,0),(62832,113951,5),(62833,113951,1),(62834,113953,0),(62835,113953,1),(62836,113953,3),(62837,113954,0),(62838,113954,5),(62839,113954,1),(62840,113955,0),(62841,113955,5),(62842,113955,1),(62843,113956,0),(62844,113956,5),(62845,113956,1),(62846,113958,0),(62847,113958,5),(62848,113958,1),(62849,113960,0),(62850,113960,1),(62851,113960,3),(62852,113961,0),(62853,113961,5),(62854,113961,1),(62855,113962,0),(62856,113962,1),(62858,113964,0),(62859,113964,5),(62860,113964,1),(62861,113965,0),(62862,113965,1),(62863,113965,3),(62864,113966,0),(62865,113966,1),(62866,113966,3),(62867,113967,0),(62868,113967,1),(62869,113967,3),(62870,113968,0),(62871,113968,5),(62872,113968,1),(62873,113970,0),(62874,113970,5),(62875,113970,1),(62876,113971,0),(62877,113972,0),(62878,113973,0),(62879,113973,1),(62880,113973,3),(62881,113974,0),(62882,113974,5),(62883,113974,1),(62884,113976,0),(62885,113976,5),(62886,113976,1),(62887,113977,0),(62888,113977,5),(62889,113977,1),(62890,113978,0),(62891,113978,5),(62892,113978,1),(62893,113979,0),(62894,113979,5),(62895,113979,1),(62896,113980,0),(62897,113980,1),(62898,113980,3),(62899,113981,0),(62900,113981,5),(62901,113981,1),(62902,113982,0),(62903,113982,5),(62904,113982,1),(62905,113988,0),(62906,113988,1),(62907,113988,3),(62908,113989,0),(62909,113989,5),(62910,113989,1),(62911,113990,0),(62912,113990,5),(62913,113990,1),(62914,113993,0),(62916,109168,6),(62917,109168,7),(62918,109168,8),(62923,112516,0),(62924,112517,0),(62925,112518,0),(62926,112519,0),(62930,114230,6),(62931,114231,6),(62932,114232,6),(62933,114233,6),(62934,114234,6),(62935,114235,6),(62936,114236,6),(62937,114237,6),(62938,114239,0),(62939,114247,0),(62942,114248,0),(62945,114249,0),(62948,114250,0),(62949,114250,5),(62950,114250,1),(62951,114251,0),(62954,114252,0),(62957,114253,0),(62958,114253,5),(62959,114253,1),(62960,114254,0),(62963,114255,0),(62966,114256,0),(62969,114257,0),(62972,114258,0),(62973,114258,5),(62974,114258,1),(62975,114259,0),(62978,114260,0),(62981,114261,0),(62984,114262,0),(62985,114262,5),(62986,114262,1),(62987,114263,0),(62990,114264,0),(62993,114265,0),(62996,114266,0),(62997,114266,5),(62998,114266,1),(62999,114267,0),(63002,114268,0),(63005,114269,0),(63008,114270,0),(63009,114270,5),(63010,114270,1),(63011,114271,0),(63014,114272,0),(63017,114273,0),(63020,114274,0),(63021,114274,5),(63022,114274,1),(63023,114275,0),(63026,114276,0),(63029,114277,0),(63032,114278,0),(63033,114278,5),(63034,114278,1),(63035,114297,0),(63036,114298,0),(63037,114299,0),(63038,114300,0),(63039,114301,0),(63040,114302,0),(63041,114310,0),(63042,114310,5),(63043,114310,1),(63044,114311,0),(63045,114311,5),(63046,114311,1),(63047,114312,0),(63048,114312,5),(63049,114312,1),(63050,114313,0),(63051,114313,5),(63052,114313,1),(63053,114314,0),(63054,114314,5),(63055,114314,1),(63056,114315,0),(63057,114315,5),(63058,114315,1),(63059,114316,0),(63060,114316,5),(63061,114316,1),(63062,114317,0),(63063,114317,5),(63064,114317,1),(63065,114318,0),(63066,114318,5),(63067,114318,1),(63068,114319,0),(63069,114319,5),(63070,114319,1),(63071,114320,0),(63072,114320,5),(63073,114320,1),(63074,114321,0),(63075,114321,5),(63076,114321,1),(63077,114322,0),(63078,114322,5),(63079,114322,1),(63080,114323,0),(63081,114323,5),(63082,114323,1),(63083,114324,0),(63084,114324,5),(63085,114324,1),(63086,114325,0),(63087,114325,5),(63088,114325,1),(63089,114326,0),(63090,114326,5),(63091,114326,1),(63092,114327,0),(63093,114327,5),(63094,114327,1),(63095,114328,0),(63096,114328,5),(63097,114328,1),(63098,114329,0),(63099,114329,5),(63100,114329,1),(63101,114330,0),(63102,114330,5),(63103,114330,1),(63104,114331,0),(63105,114331,5),(63106,114331,1),(63107,114332,0),(63108,114332,5),(63109,114332,1),(63110,114333,0),(63111,114333,5),(63112,114333,1),(63113,114334,0),(63114,114334,5),(63115,114334,1),(63116,114335,0),(63117,114335,5),(63118,114335,1),(63119,114336,0),(63120,114336,5),(63121,114336,1),(63122,114337,0),(63123,114337,5),(63124,114337,1),(63125,114338,0),(63126,114338,5),(63127,114338,1),(63128,114339,0),(63129,114339,5),(63130,114339,1),(63131,114340,0),(63132,114340,5),(63133,114340,1),(63134,114341,0),(63135,114341,5),(63136,114341,1),(63137,114360,0),(63138,114361,0),(63139,114362,0),(63140,114363,0),(63141,114364,0),(63142,114365,0),(63143,114371,0),(63144,114371,5),(63145,114371,1),(63146,114372,0),(63147,114372,5),(63148,114372,1),(63149,114373,0),(63150,114373,5),(63151,114373,1),(63152,114374,0),(63153,114374,5),(63154,114374,1),(63155,114375,0),(63156,114375,5),(63157,114375,1),(63158,114376,0),(63159,114376,5),(63160,114376,1),(63161,114377,0),(63162,114377,5),(63163,114377,1),(63164,114378,0),(63165,114378,5),(63166,114378,1),(63167,114379,0),(63168,114379,5),(63169,114379,1),(63170,114380,0),(63171,114380,5),(63172,114380,1),(63173,114381,0),(63174,114381,5),(63175,114381,1),(63176,114382,0),(63177,114382,5),(63178,114382,1),(63179,114383,0),(63180,114383,5),(63181,114383,1),(63182,114384,0),(63183,114384,5),(63184,114384,1),(63185,114385,0),(63186,114385,5),(63187,114385,1),(63188,114386,0),(63189,114386,5),(63190,114386,1),(63191,114387,0),(63192,114387,5),(63193,114387,1),(63194,114388,0),(63195,114388,5),(63196,114388,1),(63197,114389,0),(63198,114389,5),(63199,114389,1),(63200,114390,0),(63201,114390,5),(63202,114390,1),(63203,114391,0),(63204,114391,5),(63205,114391,1),(63206,114392,0),(63207,114392,5),(63208,114392,1),(63209,114393,0),(63210,114393,5),(63211,114393,1),(63212,114394,0),(63213,114394,5),(63214,114394,1),(63215,114395,0),(63216,114395,5),(63217,114395,1),(63218,114396,0),(63219,114396,5),(63220,114396,1),(63221,114397,0),(63222,114397,5),(63223,114397,1),(63224,114398,0),(63225,114398,5),(63226,114398,1),(63227,114399,0),(63228,114399,5),(63229,114399,1),(63230,114400,0),(63231,114400,5),(63232,114400,1),(63233,114401,0),(63234,114401,5),(63235,114401,1),(63236,114402,0),(63237,114402,5),(63238,114402,1),(63239,114421,0),(63240,114422,0),(63241,114423,0),(63242,114424,0),(63243,114425,0),(63244,114426,0),(63245,114432,0),(63246,114432,5),(63247,114432,1),(63248,114433,0),(63249,114433,5),(63250,114433,1),(63251,114434,0),(63252,114434,5),(63253,114434,1),(63254,114435,0),(63255,114435,5),(63256,114435,1),(63257,114436,0),(63258,114436,5),(63259,114436,1),(63260,114437,0),(63261,114437,5),(63262,114437,1),(63263,114438,0),(63264,114438,5),(63265,114438,1),(63266,114439,0),(63267,114439,5),(63268,114439,1),(63269,114440,0),(63270,114440,5),(63271,114440,1),(63272,114441,0),(63273,114441,5),(63274,114441,1),(63275,114442,0),(63276,114442,5),(63277,114442,1),(63278,114443,0),(63279,114443,5),(63280,114443,1),(63281,114444,0),(63282,114444,5),(63283,114444,1),(63284,114445,0),(63285,114445,5),(63286,114445,1),(63287,114446,0),(63288,114446,5),(63289,114446,1),(63290,114447,0),(63291,114447,5),(63292,114447,1),(63293,114448,0),(63294,114448,5),(63295,114448,1),(63296,114449,0),(63297,114449,5),(63298,114449,1),(63299,114450,0),(63300,114450,5),(63301,114450,1),(63302,114451,0),(63303,114451,5),(63304,114451,1),(63305,114452,0),(63306,114452,5),(63307,114452,1),(63308,114453,0),(63309,114453,5),(63310,114453,1),(63311,114454,0),(63312,114454,5),(63313,114454,1),(63314,114455,0),(63315,114455,5),(63316,114455,1),(63317,114456,0),(63318,114456,5),(63319,114456,1),(63320,114457,0),(63321,114457,5),(63322,114457,1),(63323,114458,0),(63324,114458,5),(63325,114458,1),(63326,114459,0),(63327,114459,5),(63328,114459,1),(63329,114460,0),(63330,114460,5),(63331,114460,1),(63332,114461,0),(63333,114461,5),(63334,114461,1),(63335,114462,0),(63336,114462,5),(63337,114462,1),(63338,114463,0),(63339,114463,5),(63340,114463,1),(63341,114482,0),(63342,114483,0),(63343,114484,0),(63344,114485,0),(63345,114486,0),(63346,114487,0),(63347,114493,0),(63348,114493,5),(63349,114493,1),(63350,114494,0),(63351,114494,5),(63352,114494,1),(63353,114495,0),(63354,114495,5),(63355,114495,1),(63356,114496,0),(63357,114496,5),(63358,114496,1),(63359,114497,0),(63360,114497,5),(63361,114497,1),(63362,114498,0),(63363,114498,5),(63364,114498,1),(63365,114499,0),(63366,114499,5),(63367,114499,1),(63368,114500,0),(63369,114500,5),(63370,114500,1),(63371,114501,0),(63372,114501,5),(63373,114501,1),(63374,114502,0),(63375,114502,5),(63376,114502,1),(63377,114503,0),(63378,114503,5),(63379,114503,1),(63380,114504,0),(63381,114504,5),(63382,114504,1),(63383,114505,0),(63384,114505,5),(63385,114505,1),(63386,114506,0),(63387,114506,5),(63388,114506,1),(63389,114507,0),(63390,114507,5),(63391,114507,1),(63392,114508,0),(63393,114508,5),(63394,114508,1),(63395,114509,0),(63396,114509,5),(63397,114509,1),(63398,114510,0),(63399,114510,5),(63400,114510,1),(63401,114511,0),(63402,114511,5),(63403,114511,1),(63404,114512,0),(63405,114512,5),(63406,114512,1),(63407,114513,0),(63408,114513,5),(63409,114513,1),(63410,114514,0),(63411,114514,5),(63412,114514,1),(63413,114515,0),(63414,114515,5),(63415,114515,1),(63416,114516,0),(63417,114516,5),(63418,114516,1),(63419,114517,0),(63420,114517,5),(63421,114517,1),(63422,114518,0),(63423,114518,5),(63424,114518,1),(63425,114519,0),(63426,114519,5),(63427,114519,1),(63428,114520,0),(63429,114520,5),(63430,114520,1),(63431,114521,0),(63432,114521,5),(63433,114521,1),(63434,114522,0),(63435,114522,5),(63436,114522,1),(63437,114523,0),(63438,114523,5),(63439,114523,1),(63440,114524,0),(63441,114524,5),(63442,114524,1),(63443,114543,0),(63444,114544,0),(63445,114545,0),(63446,114546,0),(63447,114547,0),(63448,114548,0),(63449,114554,0),(63450,114554,5),(63451,114554,1),(63452,114555,0),(63453,114555,5),(63454,114555,1),(63455,114556,0),(63456,114556,5),(63457,114556,1),(63458,114557,0),(63459,114557,5),(63460,114557,1),(63461,114558,0),(63462,114558,5),(63463,114558,1),(63464,114559,0),(63465,114559,5),(63466,114559,1),(63467,114560,0),(63468,114560,5),(63469,114560,1),(63470,114561,0),(63471,114561,5),(63472,114561,1),(63473,114562,0),(63474,114562,5),(63475,114562,1),(63476,114563,0),(63477,114563,5),(63478,114563,1),(63479,114564,0),(63480,114564,5),(63481,114564,1),(63482,114565,0),(63483,114565,5),(63484,114565,1),(63485,114566,0),(63486,114566,5),(63487,114566,1),(63488,114567,0),(63489,114567,5),(63490,114567,1),(63491,114568,0),(63492,114568,5),(63493,114568,1),(63494,114569,0),(63495,114569,5),(63496,114569,1),(63497,114570,0),(63498,114570,5),(63499,114570,1),(63500,114571,0),(63501,114571,5),(63502,114571,1),(63503,114572,0),(63504,114572,5),(63505,114572,1),(63506,114573,0),(63507,114573,5),(63508,114573,1),(63509,114574,0),(63510,114574,5),(63511,114574,1),(63512,114575,0),(63513,114575,5),(63514,114575,1),(63515,114576,0),(63516,114576,5),(63517,114576,1),(63518,114577,0),(63519,114577,5),(63520,114577,1),(63521,114578,0),(63522,114578,5),(63523,114578,1),(63524,114579,0),(63525,114579,5),(63526,114579,1),(63527,114580,0),(63528,114580,5),(63529,114580,1),(63530,114581,0),(63531,114581,5),(63532,114581,1),(63533,114582,0),(63534,114582,5),(63535,114582,1),(63536,114583,0),(63537,114583,5),(63538,114583,1),(63539,114584,0),(63540,114584,5),(63541,114584,1),(63542,114585,0),(63543,114585,5),(63544,114585,1),(63545,114604,0),(63546,114605,0),(63547,114606,0),(63548,114607,0),(63549,114608,0),(63550,114609,0),(63554,114676,0),(63555,112649,0),(63556,112647,0),(63557,112646,0),(63558,112645,0),(63559,112644,0),(63560,112643,0),(63561,112642,0),(63562,114680,0),(63563,114681,0),(63564,114682,0),(63565,114683,0),(63566,114684,0),(63567,114685,0),(63568,114686,0),(63569,114687,0),(63570,114688,0),(63571,114689,0),(63572,114690,0),(63573,114691,0),(63574,114692,0),(63575,114693,0),(63576,114694,0),(63577,114695,0),(63578,114696,0),(63579,114697,0),(63580,114698,0),(63581,114699,0),(63582,114700,0),(63583,114701,0),(63584,114702,0),(63585,114703,0),(63586,114704,0),(63587,114705,0),(63588,114706,0),(63589,114707,0),(63590,114708,0),(63591,114709,0),(63592,114710,0),(63593,114711,0),(63594,114712,0),(63595,114713,0),(63596,114714,0),(63597,114715,0),(63598,114716,0),(63599,114717,0),(63600,114718,0),(63601,114719,0),(63602,114720,0),(63603,114721,0),(63604,114722,0),(63605,114723,0),(63606,114724,0),(63607,114725,0),(63608,114726,0),(63609,114727,0),(63610,114728,0),(63611,114729,0),(63612,114730,0),(63613,114731,0),(63614,114732,0),(63615,114733,0),(63616,114734,0),(63617,114735,0),(63618,114736,0),(63619,114737,0),(63620,114738,0),(63621,114739,0),(63622,114740,0),(63623,114741,0),(63624,114742,0),(63625,114743,0),(63626,114747,0),(63627,114748,0),(63628,114749,0),(63629,114750,0),(63630,114751,0),(63631,114752,0),(63632,114753,0),(63633,114754,0),(63634,114755,0),(63635,114756,0),(63636,114757,0),(63637,114758,0),(63638,114759,0),(63639,114760,0),(63640,114761,0),(63641,114762,0),(63642,114763,0),(63643,114764,0),(63644,114765,0),(63645,114766,0),(63646,114767,0),(63647,114768,0),(63648,114769,0),(63649,114770,0),(63650,114771,0),(63651,114772,0),(63652,114773,0),(63653,114774,0),(63654,114775,0),(63655,114776,0),(63656,114777,0),(63657,114778,0),(63658,114782,0),(63659,114783,0),(63660,114784,0),(63661,114785,0),(63662,114786,0),(63663,114787,0),(63664,114788,0),(63665,114789,0),(63666,114790,0),(63667,114791,0),(63668,114792,0),(63669,114793,0),(63670,114794,0),(63671,114795,0),(63672,114796,0),(63673,114797,0),(63674,114798,0),(63675,114799,0),(63676,114800,0),(63677,114801,0),(63678,114802,0),(63679,114803,0),(63680,114804,0),(63681,114805,0),(63682,114809,6),(63683,114810,6),(63684,114811,6),(63685,114812,6),(63686,114813,6),(63687,114814,6),(63688,114815,6),(63689,114816,6),(63690,114809,7),(63691,114809,8),(63693,114810,7),(63694,114810,8),(63696,114811,7),(63697,114811,8),(63699,114812,7),(63700,114812,8),(63702,114813,7),(63703,114813,8),(63705,114814,7),(63706,114814,8),(63708,114815,7),(63709,114815,8),(63711,114816,7),(63712,114816,8),(63714,114817,6),(63715,114818,6),(63716,114819,6),(63717,114817,7),(63718,114817,8),(63720,114818,7),(63721,114818,8),(63723,114819,7),(63724,114819,8),(63726,114823,0),(63727,114824,0),(63728,114828,0),(63731,114829,0),(63737,114831,0),(63740,114841,0),(63742,114879,0),(63743,114883,0),(63744,114884,0),(63745,114885,0),(63748,114894,0),(63749,114895,0),(63750,114896,0),(63751,114897,0),(63752,114903,0),(63753,114904,0),(63754,114905,0),(63755,114906,0),(63756,114907,0),(63757,114908,0),(63758,114909,0),(63759,114910,0),(63760,114911,0),(63761,114912,0),(63762,114913,0),(63763,114914,0),(63764,114915,0),(63765,114916,0),(63766,114917,0),(63767,114918,0),(63768,114920,0),(63769,114921,0),(63770,114922,0),(63771,114923,0),(63780,114310,6),(63781,114317,6),(63782,114318,6),(63783,114322,6),(63784,114326,6),(63785,114330,6),(63786,114334,6),(63787,114338,6),(63788,114371,6),(63789,114378,6),(63790,114379,6),(63791,114383,6),(63792,114387,6),(63793,114391,6),(63794,114395,6),(63795,114399,6),(63796,114432,6),(63797,114439,6),(63798,114440,6),(63799,114444,6),(63800,114448,6),(63801,114452,6),(63802,114456,6),(63803,114460,6),(63804,114493,6),(63805,114500,6),(63806,114501,6),(63807,114505,6),(63808,114509,6),(63809,114513,6),(63810,114517,6),(63811,114521,6),(63820,114311,6),(63821,114314,6),(63822,114319,6),(63823,114323,6),(63824,114327,6),(63825,114331,6),(63826,114335,6),(63827,114339,6),(63828,114372,6),(63829,114375,6),(63830,114380,6),(63831,114384,6),(63832,114388,6),(63833,114392,6),(63834,114396,6),(63835,114400,6),(63836,114433,6),(63837,114436,6),(63838,114441,6),(63839,114445,6),(63840,114449,6),(63841,114453,6),(63842,114457,6),(63843,114461,6),(63844,114494,6),(63845,114497,6),(63846,114502,6),(63847,114506,6),(63848,114510,6),(63849,114514,6),(63850,114518,6),(63851,114522,6),(63860,114312,6),(63861,114315,6),(63862,114320,6),(63863,114324,6),(63864,114328,6),(63865,114332,6),(63866,114336,6),(63867,114340,6),(63868,114373,6),(63869,114376,6),(63870,114381,6),(63871,114385,6),(63872,114389,6),(63873,114393,6),(63874,114397,6),(63875,114401,6),(63876,114434,6),(63877,114437,6),(63878,114442,6),(63879,114446,6),(63880,114450,6),(63881,114454,6),(63882,114458,6),(63883,114462,6),(63884,114495,6),(63885,114498,6),(63886,114503,6),(63887,114507,6),(63888,114511,6),(63889,114515,6),(63890,114519,6),(63891,114523,6),(63892,114250,6),(63893,114253,6),(63894,114258,6),(63895,114262,6),(63896,114266,6),(63897,114270,6),(63898,114274,6),(63899,114278,6),(63900,114313,6),(63901,114316,6),(63902,114321,6),(63903,114325,6),(63904,114329,6),(63905,114333,6),(63906,114337,6),(63907,114341,6),(63908,114374,6),(63909,114377,6),(63910,114382,6),(63911,114386,6),(63912,114390,6),(63913,114394,6),(63914,114398,6),(63915,114402,6),(63916,114435,6),(63917,114438,6),(63918,114443,6),(63919,114447,6),(63920,114451,6),(63921,114455,6),(63922,114459,6),(63923,114463,6),(63924,114496,6),(63925,114499,6),(63926,114504,6),(63927,114508,6),(63928,114512,6),(63929,114516,6),(63930,114520,6),(63931,114524,6),(63933,114945,0),(63934,114946,0),(63935,114949,0),(63936,114954,0),(63937,114955,0),(63938,114962,0),(63939,114966,0),(63940,112659,0),(63941,112660,0),(63942,112661,0),(63943,112662,0),(63944,114971,0),(63945,114978,0),(63946,114979,0),(63947,114980,0),(63948,114985,0),(63949,114991,0),(63950,114992,0),(63951,114993,0),(63952,114994,0),(63953,114995,0),(63955,115014,0),(63956,115015,0),(63957,115016,0),(63958,115017,0),(63963,115024,0),(63964,115025,0),(63965,115026,0),(63966,115027,0),(63967,115028,0),(63968,115029,0),(63969,115030,0),(63970,115031,0),(63971,115032,0),(63972,115033,0),(63973,115038,0),(63974,115039,0),(63975,115040,0),(63976,115041,0),(63977,115042,0),(63978,115043,0),(63979,115044,0),(63980,115045,0),(63981,115046,0),(63982,115047,0),(63983,115048,0),(63984,115049,0),(63985,115050,0),(63986,115051,0),(63987,115052,0),(63988,115053,0),(63989,115054,0),(63990,115055,0),(63991,115056,0),(63992,115057,0),(63993,115058,0),(63994,115059,0),(63995,115060,0),(63996,115061,0),(63997,115062,0),(63998,115063,0),(63999,115064,0),(64000,115065,0),(64001,115066,0),(64002,115067,0),(64003,115068,0),(64004,115069,0),(64005,115070,0),(64006,115075,0),(64007,115076,0),(64008,115082,0),(64009,115083,0),(64010,115084,0),(64011,115085,0),(64012,115086,0),(64013,115087,0),(64014,115088,0),(64015,115089,0),(64016,115090,0),(64017,115091,0),(64018,115092,0),(64019,115093,0),(64020,115094,0),(64021,115095,0),(64022,115096,0),(64023,115097,0),(64024,115098,0),(64025,115099,0),(64026,115100,0),(64027,115101,0),(64028,115102,0),(64029,115103,0),(64030,115104,0),(64031,115105,0),(64032,115106,0),(64033,115107,0),(64034,115108,0),(64035,115109,0),(64036,115110,0),(64037,115111,0),(64038,115112,0),(64039,115113,0),(64040,115114,0),(64041,115115,0),(64042,115116,0),(64043,115117,0),(64044,115118,0),(64045,115119,0),(64046,115120,0),(64047,115121,0),(64048,115122,0),(64049,115123,0),(64050,115124,0),(64051,115125,0),(64052,115126,0),(64053,115127,0),(64054,115128,0),(64055,115129,0),(64056,115130,0),(64057,115131,0),(64058,115132,0),(64059,115133,0),(64060,115134,0),(64061,115135,0),(64062,115136,0),(64063,115137,0),(64064,115138,0),(64065,115141,0),(64066,115142,0),(64067,115143,0),(64068,115144,0),(64069,115145,0),(64070,115148,0),(64071,115161,0),(64072,115162,0),(64073,115163,0),(64074,115164,0),(64075,115165,0),(64076,115166,0),(64077,115167,0),(64078,115168,0),(64079,115169,0),(64080,115170,0),(64081,115173,0),(64082,115174,0),(64083,115175,0),(64084,115176,0),(64085,115177,0),(64086,115178,0),(64087,115179,0),(64088,115180,0),(64089,115181,0),(64090,115182,0),(64091,115183,0),(64092,115184,0),(64093,115185,0),(64094,115186,0),(64095,115187,0),(64096,115188,0),(64097,115189,0),(64098,115190,0),(64099,115194,0),(64100,115195,0),(64101,115196,0),(64102,115197,0),(64103,115198,0),(64104,115199,0),(64105,115200,0),(64106,115201,0),(64107,115202,0),(64108,115203,0),(64109,115204,0),(64110,115205,0),(64111,115206,0),(64112,115207,0),(64113,115208,0),(64114,115209,0),(64115,115210,0),(64116,115211,0),(64117,115217,0),(64118,115218,0),(64119,115219,0),(64120,115220,0),(64121,115221,0),(64122,115222,0),(64123,115223,0),(64124,115224,0),(64125,115225,0),(64126,115226,0),(64127,115227,0),(64128,115228,0),(64129,115229,0),(64130,115230,0),(64131,115231,0),(64132,115232,0),(64133,115233,0),(64134,115234,0),(64135,115235,0),(64136,115236,0),(64137,115237,0),(64138,115238,0),(64139,115239,0),(64140,115240,0),(64141,115241,0),(64142,115242,0),(64143,115243,0),(64144,115244,0),(64145,115245,0),(64146,115246,0),(64147,115247,0),(64148,115248,0),(64149,115249,0),(64150,115250,0),(64151,115251,0),(64152,115252,0),(64153,115253,0),(64154,115254,0),(64155,115255,0),(64156,115258,0),(64157,115259,0),(64158,115260,0),(64159,115261,0),(64160,115262,0),(64161,115263,0),(64162,115264,0),(64163,115265,0),(64164,115266,0),(64165,115267,0),(64166,115268,0),(64167,115269,0),(64168,115270,0),(64169,115271,0),(64170,115283,0),(64171,115284,0),(64172,115285,0),(64173,115286,0),(64174,115292,0),(64175,115293,0),(64176,115294,0),(64177,115295,0),(64178,115296,0),(64179,115297,0),(64180,115298,0),(64181,115299,0),(64182,115303,0),(64183,115304,0),(64184,115305,0),(64185,115306,0),(64186,115307,0),(64187,115308,0),(64188,115309,0),(64189,115310,0),(64190,115311,0),(64191,115312,0),(64192,115313,0),(64193,115314,0),(64194,115315,0),(64195,115316,0),(64196,115317,0),(64197,115318,0),(64198,115319,0),(64199,115320,0),(64200,115321,0),(64201,115322,0),(64202,115323,0),(64203,115324,0),(64204,115325,0),(64205,115326,0),(64206,115327,0),(64207,115328,0),(64208,115329,0),(64209,115330,0),(64210,115331,0),(64211,115332,0),(64212,115333,0),(64213,115334,0),(64214,115335,0),(64215,115336,0),(64216,115337,0),(64217,115338,0),(64218,115339,0),(64219,115340,0),(64220,115341,0),(64221,115342,0),(64222,115347,0),(64223,115348,0),(64224,115349,0),(64233,112529,0),(64234,112530,0),(64235,112531,0),(64236,112532,0),(64237,112509,0),(64238,112510,0),(64239,112511,0),(64240,112528,0),(64241,112524,0),(64242,112525,0),(64243,112526,0),(64244,112527,0),(64245,112512,0),(64246,112513,0),(64247,112514,0),(64248,112515,0),(64249,112534,0),(64250,112537,0),(64251,113033,0),(64252,112536,0),(64253,112540,0),(64254,113035,0),(64255,112535,0),(64256,112539,0),(64257,113032,0),(64258,115374,0),(64259,115374,5),(64260,115374,1),(64261,115375,0),(64262,115375,5),(64263,115375,1),(64264,115376,0),(64265,115376,5),(64266,115376,1),(64267,115377,0),(64268,115377,5),(64269,115377,1),(64270,112533,0),(64271,112538,0),(64272,113034,0),(64273,115378,0),(64274,115378,5),(64275,115378,1),(64276,115379,0),(64277,115379,5),(64278,115379,1),(64279,115380,0),(64280,115380,5),(64281,115380,1),(64282,115381,0),(64283,115381,5),(64284,115381,1),(64285,115387,0),(64286,115387,5),(64287,115387,1),(64288,115388,0),(64289,115388,5),(64290,115388,1),(64291,115389,0),(64292,115389,5),(64293,115389,1),(64294,115390,0),(64295,115390,5),(64296,115390,1),(64297,115391,0),(64298,115392,0),(64299,115393,0),(64300,115394,0),(64301,115395,0),(64302,115396,0),(64303,115396,5),(64304,115396,1),(64305,115397,0),(64306,115397,5),(64307,115397,1),(64308,115398,0),(64309,115398,5),(64310,115398,1),(64311,115399,0),(64312,115399,5),(64313,115399,1),(64314,115400,0),(64315,115400,5),(64316,115400,1),(64317,115401,0),(64318,115401,5),(64319,115401,1),(64320,115402,0),(64321,115402,5),(64322,115402,1),(64323,115403,0),(64324,115403,5),(64325,115403,1),(64326,115404,0),(64327,115404,5),(64328,115404,1),(64329,115405,0),(64330,115405,5),(64331,115405,1),(64332,115406,0),(64333,115406,5),(64334,115406,1),(64335,115407,0),(64336,115407,5),(64337,115407,1),(64338,115408,0),(64339,115408,5),(64340,115408,1),(64341,115409,0),(64342,115409,5),(64343,115409,1),(64344,115410,0),(64345,115410,5),(64346,115410,1),(64347,115411,0),(64348,115411,5),(64349,115411,1),(64350,115412,0),(64351,115412,5),(64352,115412,1),(64353,115413,0),(64354,115413,5),(64355,115413,1),(64356,115414,0),(64357,115414,5),(64358,115414,1),(64359,115415,0),(64360,115415,5),(64361,115415,1),(64362,115417,0),(64363,115418,0),(64364,115419,0),(64365,115420,0),(64366,115421,0),(64367,115422,0),(64368,115423,0),(64369,115424,0),(64370,115425,0),(64371,115425,5),(64372,115425,1),(64373,115426,0),(64374,115426,5),(64375,115426,1),(64376,115427,0),(64377,115427,5),(64378,115427,1),(64379,115428,0),(64380,115428,5),(64381,115428,1),(64382,115429,0),(64383,115429,5),(64384,115429,1),(64385,115430,0),(64386,115430,5),(64387,115430,1),(64388,115431,0),(64389,115431,5),(64390,115431,1),(64391,115432,0),(64392,115432,5),(64393,115432,1),(64394,115433,0),(64395,115433,5),(64396,115433,1),(64397,115434,0),(64398,115434,5),(64399,115434,1),(64400,115435,0),(64401,115435,5),(64402,115435,1),(64403,115436,0),(64404,115436,5),(64405,115436,1),(64406,112581,0),(64419,115490,0),(64421,115492,0),(64422,115515,0),(64423,115517,0),(64424,115518,0),(64425,115535,0),(64426,115536,0),(64427,115537,0),(64428,115538,0),(64429,115539,0),(64430,115540,0),(64431,115541,0),(64432,115542,0),(64433,115543,0),(64434,115544,0),(64435,115545,0),(64436,115546,0),(64437,115547,0),(64438,115548,0),(64439,115549,0),(64440,115550,0),(64441,115551,0),(64442,115552,0),(64443,115553,0),(64444,115554,0),(64445,115555,0),(64446,115556,0),(64447,115557,0),(64448,115558,0),(64449,115559,0),(64450,115560,0),(64451,115561,0),(64452,115562,0),(64453,115563,0),(64454,115564,0),(64455,115565,0),(64456,115566,0),(64457,115567,0),(64458,115568,0),(64459,115569,0),(64460,115570,0),(64461,115571,0),(64462,115572,0),(64463,115573,0),(64464,115574,0),(64465,115575,0),(64466,115576,0),(64467,115577,0),(64468,115578,0),(64469,115579,0),(64470,115580,0),(64471,115581,0),(64472,115582,0),(64473,115583,0),(64474,115584,0),(64475,115585,0),(64476,115586,0),(64477,115587,0),(64478,115588,0),(64479,115589,0),(64480,115594,0),(64481,115595,0),(64482,115596,0),(64483,115597,0),(64484,115598,0),(64485,115599,0),(64486,115600,0),(64487,115601,0),(64488,115602,0),(64489,115603,0),(64490,115610,0),(64491,115611,0),(64492,115612,0),(64493,115613,0),(64494,115614,0),(64495,115615,0),(64496,115616,0),(64497,115617,0),(64498,115618,0),(64499,115619,0),(64500,115620,0),(64501,115621,0),(64502,115622,0),(64503,115623,0),(64504,115624,0),(64505,115625,0),(64506,115626,0),(64507,115627,0),(64508,115628,0),(64509,115629,0),(64510,115630,0),(64511,115631,0),(64512,115632,0),(64513,115633,0),(64514,115634,0),(64515,115635,0),(64516,115636,0),(64517,115637,0),(64518,115638,0),(64519,115639,0),(64520,115640,0),(64521,115641,0),(64522,115642,0),(64523,115643,0),(64524,115644,0),(64525,115645,0),(64526,115646,0),(64527,115647,0),(64528,115648,0),(64529,115649,0),(64530,115650,0),(64531,115659,0),(64532,115660,0),(64533,115666,0),(64534,115667,0),(64535,115668,0),(64536,115669,0),(64537,115670,0),(64538,115671,0),(64539,115672,0),(64540,115673,0),(64541,115674,0),(64542,115675,0),(64543,115676,0),(64544,115677,0),(64545,115678,0),(64546,115679,0),(64547,115680,0),(64548,115681,0),(64549,115682,0),(64550,115683,0),(64551,115684,0),(64552,115685,0),(64553,115686,0),(64554,115687,0),(64555,115688,0),(64556,115689,0),(64557,115690,0),(64558,115691,0),(64559,115692,0),(64560,115693,0),(64561,115694,0),(64562,115695,0),(64563,115696,0),(64564,115697,0),(64565,115698,0),(64566,115699,0),(64567,115700,0),(64568,115701,0),(64569,115702,0),(64570,115703,0),(64571,115704,0),(64572,115705,0),(64573,115706,0),(64574,115707,0),(64575,115708,0),(64576,115709,0),(64577,115710,0),(64578,115711,0),(64579,115712,0),(64580,115713,0),(64581,115714,0),(64582,115715,0),(64583,115716,0),(64584,115717,0),(64585,115718,0),(64586,115719,0),(64587,115720,0),(64588,115721,0),(64589,115722,0),(64590,115723,0),(64591,115724,0),(64592,115725,0),(64593,115726,0),(64594,115727,0),(64595,115728,0),(64596,115729,0),(64597,115730,0),(64598,115731,0),(64599,115736,0),(64600,115737,0),(64601,115738,0),(64602,115739,0),(64603,115740,0),(64604,115741,0),(64605,115742,0),(64606,115743,0),(64607,115744,0),(64608,115745,0),(64609,115748,0),(64610,115761,0),(64611,115762,0),(64612,115763,0),(64613,115764,0),(64614,115765,0),(64615,115766,0),(64616,115767,0),(64617,115768,0),(64618,115769,0),(64619,115770,0),(64620,115773,0),(64621,115774,0),(64622,115775,0),(64623,115776,0),(64624,115777,0),(64625,115778,0),(64626,115779,0),(64627,115780,0),(64628,115781,0),(64629,115782,0),(64630,115783,0),(64631,115784,0),(64632,115785,0),(64633,115786,0),(64634,115787,0),(64635,115788,0),(64636,115789,0),(64637,115790,0),(64638,115791,0),(64639,115792,0),(64641,115802,0),(64642,115817,0),(64643,115818,0),(64644,115819,0),(64645,115820,0),(64646,115821,0),(64647,115822,0),(64648,115823,0),(64649,115824,0),(64650,115825,0),(64651,115826,0),(64652,115827,0),(64653,115828,0),(64654,115829,0),(64655,115830,0),(64656,115831,0),(64657,115832,0),(64658,115833,0),(64659,115834,0),(64660,115835,0),(64661,115836,0),(64662,115837,0),(64663,115838,0),(64664,115839,0),(64665,115840,0),(64666,115841,0),(64667,115842,0),(64668,115843,0),(64669,115844,0),(64670,115845,0),(64671,115846,0),(64672,115847,0),(64673,115848,0),(64674,115849,0),(64675,115850,0),(64676,115851,0),(64677,115852,0),(64678,115853,0),(64679,115854,0),(64680,115855,0),(64681,115856,0),(64682,115857,0),(64683,115858,0),(64684,115859,0),(64685,115860,0),(64686,115861,0),(64687,115862,0),(64688,115863,0),(64689,115864,0),(64690,115865,0),(64691,115866,0),(64692,115867,0),(64693,115868,0),(64694,115869,0),(64695,115870,0),(64696,115871,0),(64697,115872,0),(64698,115873,0),(64699,115874,0),(64700,115875,0),(64701,115876,0),(64702,115877,0),(64703,115878,0),(64704,115879,0),(64705,115880,0),(64706,115881,0),(64707,115882,0),(64708,115883,0),(64709,115884,0),(64710,115885,0),(64711,115886,0),(64712,115887,0),(64713,115888,0),(64714,115889,0),(64715,115890,0),(64716,115891,0),(64717,115892,0),(64718,115893,0),(64719,115894,0),(64720,115895,0),(64721,115896,0),(64722,115897,0),(64723,115898,0),(64724,115899,0),(64725,115900,0),(64726,115901,0),(64727,115902,0),(64728,115903,0),(64729,115904,0),(64730,115905,0),(64731,115906,0),(64732,115907,0),(64733,115908,0),(64734,115909,0),(64735,115910,0),(64736,115911,0),(64737,115912,0),(64738,115913,0),(64739,115914,0),(64740,115915,0),(64741,115916,0),(64742,115917,0),(64743,115918,0),(64744,115919,0),(64745,115920,0),(64746,115921,0),(64747,115922,0),(64748,115923,0),(64749,115924,0),(64750,115925,0),(64751,115926,0),(64752,115927,0),(64753,115928,0),(64754,115929,0),(64755,115930,0),(64756,115931,0),(64757,115932,0),(64758,115933,0),(64759,115934,0),(64760,115935,0),(64761,115936,0),(64762,115937,0),(64763,115938,0),(64764,115939,0),(64765,115940,0),(64766,115941,0),(64767,115942,0),(64768,115943,0),(64769,115944,0),(64770,115945,0),(64771,115946,0),(64772,115947,0),(64773,115948,0),(64774,115949,0),(64775,115950,0),(64776,115951,0),(64777,115952,0),(64778,115953,0),(64779,115954,0),(64780,115955,0),(64781,115956,0),(64782,115957,0),(64783,115958,0),(64784,115959,0),(64785,115960,0),(64786,115961,0),(64787,115962,0),(64788,115963,0),(64789,115964,0),(64790,115965,0),(64791,115966,0),(64792,115967,0),(64793,115968,0),(64794,115969,0),(64795,115970,0),(64796,115971,0),(64797,115972,0),(64798,115979,0),(64799,115996,0),(64800,115996,5),(64801,115996,1),(64802,115997,0),(64803,115997,5),(64804,115997,1),(64805,115998,0),(64806,115998,5),(64807,115998,1),(64808,115999,0),(64809,115999,5),(64810,115999,1),(64811,116000,0),(64812,116000,5),(64813,116000,1),(64814,116001,0),(64815,116001,5),(64816,116001,1),(64817,116002,0),(64818,116002,5),(64819,116002,1),(64820,116003,0),(64821,116003,5),(64822,116003,1),(64823,116004,0),(64824,116004,5),(64825,116004,1),(64826,116005,0),(64827,116005,5),(64828,116005,1),(64829,116006,0),(64830,116006,5),(64831,116006,1),(64832,116007,0),(64833,116007,5),(64834,116007,1),(64835,116008,0),(64836,116008,5),(64837,116008,1),(64838,116009,0),(64839,116009,5),(64840,116009,1),(64841,116010,0),(64842,116010,5),(64843,116010,1),(64844,116011,0),(64845,116011,5),(64846,116011,1),(64847,116012,0),(64848,116012,5),(64849,116012,1),(64850,116013,0),(64851,116013,5),(64852,116013,1),(64853,116014,0),(64854,116014,5),(64855,116014,1),(64856,116015,0),(64857,116015,5),(64858,116015,1),(64859,116016,0),(64860,116016,5),(64861,116016,1),(64862,116017,0),(64863,116017,5),(64864,116017,1),(64865,116018,0),(64866,116018,5),(64867,116018,1),(64868,116019,0),(64869,116019,5),(64870,116019,1),(64871,116021,0),(64872,116021,1),(64873,116021,4),(64874,116022,0),(64875,116022,5),(64876,116022,1),(64877,116023,0),(64878,116025,0),(64879,116025,5),(64880,116025,1),(64881,116026,0),(64882,116026,5),(64883,116026,1),(64884,116027,0),(64885,116027,5),(64886,116027,1),(64887,116028,0),(64888,116028,5),(64889,116028,1),(64890,116029,0),(64891,116029,5),(64892,116029,1),(64893,116030,0),(64894,116030,5),(64895,116030,1),(64896,116031,0),(64897,116031,5),(64898,116031,1),(64899,116032,0),(64900,116032,5),(64901,116032,1),(64902,116033,0),(64903,116033,5),(64904,116033,1),(64905,116034,0),(64906,116034,5),(64907,116034,1),(64908,116035,0),(64909,116035,5),(64910,116035,1),(64911,116036,0),(64912,116036,5),(64913,116036,1),(64914,116037,0),(64915,116037,5),(64916,116037,1),(64917,116038,0),(64918,116038,5),(64919,116038,1),(64920,116039,0),(64921,116039,5),(64922,116039,1),(64923,116040,0),(64924,116040,5),(64925,116040,1),(64926,116041,0),(64927,116041,5),(64928,116041,1),(64929,116042,0),(64930,116042,5),(64931,116042,1),(64935,116044,0),(64936,116044,5),(64937,116044,1),(64938,116045,0),(64939,116045,5),(64940,116045,1),(64941,116046,0),(64942,116046,5),(64943,116046,1),(64944,116047,0),(64945,116047,5),(64946,116047,1),(64947,116048,0),(64948,116048,5),(64949,116048,1),(64950,116049,0),(64951,116049,5),(64952,116049,1),(64953,116050,0),(64954,116050,5),(64955,116050,1),(64956,116051,0),(64957,116051,5),(64958,116051,1),(64962,116110,0),(64963,116112,0),(64964,116116,0),(64965,116123,0),(64966,116124,0),(64967,116126,0),(64968,116052,0),(64969,116133,0),(64970,116134,0),(64972,116136,0),(64973,116137,0),(64974,116164,0),(64975,116165,0),(64976,116166,0),(64977,116167,0),(64978,116168,0),(64979,116169,0),(64980,116171,6),(64981,116171,7),(64982,116171,8),(64983,116174,6),(64984,116174,7),(64985,116174,8),(64986,116175,6),(64987,116175,7),(64988,116175,8),(64989,116176,6),(64990,116176,7),(64991,116176,8),(64992,116177,6),(64993,116177,7),(64994,116177,8),(64995,116178,6),(64996,116178,7),(64997,116178,8),(64998,116179,6),(64999,116179,7),(65000,116179,8),(65001,116180,6),(65002,116180,7),(65003,116180,8),(65004,116181,6),(65005,116181,7),(65006,116181,8),(65007,116182,6),(65008,116182,7),(65009,116182,8),(65010,116183,6),(65011,116183,7),(65012,116183,8),(65015,116187,6),(65016,116187,7),(65017,116187,8),(65018,116188,6),(65019,116188,7),(65020,116188,8),(65021,116189,6),(65022,116189,7),(65023,116189,8),(65024,116190,6),(65025,116190,7),(65026,116190,8),(65027,116191,6),(65028,116191,7),(65029,116191,8),(65030,116192,6),(65031,116192,7),(65032,116192,8),(65033,116193,6),(65034,116193,7),(65035,116193,8),(65036,116194,6),(65037,116194,7),(65038,116194,8),(65043,116205,0),(65044,116205,5),(65045,116205,1),(65046,116206,0),(65047,116206,5),(65048,116206,1),(65049,116207,0),(65050,116207,5),(65051,116207,1),(65052,116208,0),(65053,116208,5),(65054,116208,1),(65055,116209,0),(65056,116209,5),(65057,116209,1),(65058,116210,0),(65059,116210,5),(65060,116210,1),(65061,116211,0),(65062,116211,5),(65063,116211,1),(65064,116212,0),(65065,116212,5),(65066,116212,1),(65067,116213,0),(65068,116213,5),(65069,116213,1),(65070,116214,0),(65071,116214,5),(65072,116214,1),(65073,116215,0),(65074,116215,5),(65075,116215,1),(65076,116216,0),(65077,116216,5),(65078,116216,1),(65079,116217,0),(65080,116217,5),(65081,116217,1),(65082,116218,0),(65083,116218,5),(65084,116218,1),(65085,116219,0),(65086,116219,5),(65087,116219,1),(65088,116220,0),(65089,116220,5),(65090,116220,1),(65091,116222,0),(65092,116222,5),(65093,116222,1),(65094,116223,0),(65095,116223,5),(65096,116223,1),(65097,116224,0),(65098,116224,5),(65099,116224,1),(65100,116225,0),(65101,116225,5),(65102,116225,1),(65103,116226,0),(65104,116226,5),(65105,116226,1),(65106,116227,0),(65107,116227,5),(65108,116227,1),(65109,116228,0),(65110,116228,5),(65111,116228,1),(65112,116229,0),(65113,116229,5),(65114,116229,1),(65115,116230,0),(65116,116230,5),(65117,116230,1),(65118,116231,0),(65119,116231,5),(65120,116231,1),(65121,116232,0),(65122,116232,5),(65123,116232,1),(65124,116233,0),(65125,116233,5),(65126,116233,1),(65127,116234,0),(65128,116234,5),(65129,116234,1),(65130,116235,0),(65131,116235,5),(65132,116235,1),(65133,116236,0),(65134,116236,5),(65135,116236,1),(65136,116237,0),(65137,116237,5),(65138,116237,1),(65139,116238,0),(65140,116238,5),(65141,116238,1),(65142,116239,0),(65143,116239,5),(65144,116239,1),(65145,116240,0),(65146,116240,5),(65147,116240,1),(65148,116241,0),(65149,116241,5),(65150,116241,1),(65151,116242,0),(65152,116242,5),(65153,116242,1),(65154,116243,0),(65155,116243,5),(65156,116243,1),(65157,116244,0),(65158,116244,5),(65159,116244,1),(65160,116245,0),(65161,116245,5),(65162,116245,1),(65163,116250,0),(65164,116250,5),(65165,116250,1),(65166,116251,0),(65167,116251,5),(65168,116251,1),(65169,116252,0),(65170,116252,5),(65171,116252,1),(65172,116253,0),(65173,116253,5),(65174,116253,1),(65175,116254,0),(65176,116254,5),(65177,116254,1),(65178,116255,0),(65179,116255,5),(65180,116255,1),(65181,116256,0),(65182,116256,5),(65183,116256,1),(65184,116257,0),(65185,116257,5),(65186,116257,1),(65187,116262,0),(65188,116262,5),(65189,116262,1),(65190,116263,0),(65191,116263,5),(65192,116263,1),(65193,116264,0),(65194,116264,5),(65195,116264,1),(65196,116265,0),(65197,116265,5),(65198,116265,1),(65199,116294,0),(65200,116295,0),(65201,116296,0),(65202,116297,0),(65203,116298,0),(65204,116304,0),(65205,116305,0),(65206,116306,0),(65207,116307,0),(65208,116308,0),(65210,116360,0),(65211,116360,4),(65213,116361,0),(65214,116361,4),(65216,116362,0),(65217,116362,4),(65219,116363,0),(65220,116363,4),(65222,116364,0),(65223,116364,5),(65225,116365,0),(65226,116365,4),(65228,116366,0),(65229,116366,4),(65231,116367,0),(65232,116367,4),(65234,116368,0),(65235,116368,4),(65237,116372,0),(65238,116372,4),(65240,116373,0),(65241,116373,4),(65243,116375,0),(65244,116377,0),(65245,116379,0),(65246,116379,4),(65248,116380,0),(65249,116380,4),(65251,116381,0),(65252,116381,4),(65254,116382,0),(65255,116382,4),(65257,116384,0),(65258,116384,4),(65260,116385,0),(65261,116385,4),(65263,116386,0),(65264,116386,4),(65266,116387,0),(65267,116387,4),(65269,116388,0),(65270,116388,4),(65272,116389,0),(65273,116389,4),(65275,116390,0),(65276,116391,0),(65277,116391,5),(65279,116393,0),(65280,116393,5),(65282,116399,0),(65283,116401,0),(65284,114237,7),(65285,114237,8),(65286,114236,7),(65287,114235,7),(65288,114234,7),(65289,114233,7),(65290,114232,7),(65291,114231,7),(65292,114230,7),(65293,114236,8),(65294,114235,8),(65295,114234,8),(65296,114233,8),(65297,114232,8),(65298,114231,8),(65299,114230,8),(65300,116425,0),(65301,116426,0),(65302,116427,0),(65307,116446,0),(65308,116447,0),(65309,116448,0),(65311,116450,0),(65312,116451,0),(65313,116453,6),(65314,116453,7),(65315,116453,8),(65316,116454,6),(65317,116454,7),(65318,116454,8),(65319,116457,0),(65320,116458,0),(65321,116459,0),(65322,116460,0),(65323,116461,0),(65324,116462,0),(65325,116463,0),(65326,116464,0),(65327,116465,0),(65328,116466,0),(65329,116467,0),(65330,116468,0),(65331,116469,0),(65332,116470,0),(65333,116471,0),(65334,116472,0),(65335,116473,0),(65336,116474,0),(65337,116475,0),(65338,116476,0),(65339,116477,0),(65340,116478,0),(65341,116479,0),(65342,116480,0),(65343,116481,0),(65344,116482,0),(65345,116483,0),(65346,116484,0),(65347,116485,0),(65348,116486,0),(65349,116487,0),(65350,116488,0),(65351,116489,0),(65352,116490,0),(65353,116491,0),(65354,116492,0),(65355,116493,0),(65356,116494,0),(65357,116495,0),(65358,116496,0),(65359,116497,0),(65360,116498,0),(65361,116499,0),(65362,116500,0),(65363,116501,0),(65364,116502,0),(65365,116503,0),(65366,116504,0),(65367,116505,0),(65368,116506,0),(65369,116507,0),(65370,116508,0),(65371,116509,0),(65372,116510,0),(65373,116511,0),(65374,116512,0),(65375,116513,0),(65376,116514,0),(65377,116515,0),(65378,116516,0),(65379,116517,0),(65380,116518,0),(65381,116519,0),(65382,116520,0),(65383,116521,0),(65384,116522,0),(65385,116523,0),(65386,116524,0),(65387,116525,0),(65388,116526,0),(65389,116527,0),(65390,116528,0),(65391,116529,0),(65392,116530,0),(65393,116531,0),(65394,116532,0),(65395,116533,0),(65396,116534,0),(65397,116535,0),(65398,116536,0),(65399,116537,0),(65400,116538,0),(65401,116539,0),(65402,116540,0),(65403,116541,0),(65404,116542,0),(65405,116543,0),(65406,116544,0),(65407,116545,0),(65408,116546,0),(65409,116547,0),(65410,116548,0),(65411,116549,0),(65412,116550,0),(65413,116551,0),(65414,116552,0),(65415,116553,0),(65416,116554,0),(65417,116555,0),(65418,116556,0),(65419,116557,0),(65420,116558,0),(65421,116559,0),(65422,116560,0),(65423,116561,0),(65424,116562,0),(65425,116563,0),(65426,116564,0),(65427,116565,0),(65428,116566,0),(65429,116567,0),(65430,116568,0),(65431,116569,0),(65432,116570,0),(65433,116571,0),(65434,116572,0),(65435,116573,0),(65436,116574,0),(65437,116575,0),(65438,116576,0),(65439,116577,0),(65440,116578,0),(65441,116579,0),(65442,116580,0),(65443,116581,0),(65444,116582,0),(65445,116583,0),(65446,116584,0),(65447,116585,0),(65448,116586,0),(65449,116587,0),(65450,116588,0),(65451,116589,0),(65452,116590,0),(65453,116591,0),(65454,116592,0),(65455,116593,0),(65456,116594,0),(65457,116595,0),(65458,116596,0),(65459,116597,0),(65460,116598,0),(65461,116599,0),(65462,116600,0),(65463,116601,0),(65464,116602,0),(65465,116603,0),(65466,116604,0),(65467,116605,0),(65468,116606,0),(65469,116607,0),(65470,116608,0),(65471,116609,0),(65472,116610,0),(65473,116611,0),(65474,116612,0),(65475,116613,0),(65476,116614,0),(65477,116615,0),(65478,116616,0),(65479,116617,0),(65480,116618,0),(65481,116619,0),(65482,116620,0),(65483,116621,0),(65484,116622,0),(65485,116623,0),(65486,116624,0),(65487,116625,0),(65488,116626,0),(65489,116627,0),(65490,116628,0),(65491,116629,0),(65492,116630,0),(65493,116631,0),(65494,116632,0),(65495,116633,0),(65496,116634,0),(65497,116635,0),(65498,116636,0),(65499,116637,0),(65500,116638,0),(65501,116639,0),(65502,116640,0),(65503,116641,0),(65504,116642,0),(65505,116643,0),(65506,116644,6),(65507,116644,7),(65508,116644,8),(65509,116646,6),(65510,116646,7),(65511,116646,8),(65512,116647,6),(65513,116647,7),(65514,116647,8),(65515,116688,0),(65516,116693,0),(65517,116694,0),(65518,116696,0),(65519,116697,0),(65520,116699,0),(65521,116700,0),(65522,116702,0),(65523,116703,0),(65524,116705,0),(65525,116706,0),(65526,116708,0),(65527,116709,0),(65528,116711,0),(65529,116712,0),(65530,116714,0),(65531,116715,0),(65532,116717,0),(65533,116718,0),(65534,116720,0),(65535,116721,0),(65536,116723,0),(65537,116724,0),(65538,116760,0),(65539,116765,0),(65540,116795,0),(65541,116796,0),(65542,116797,0),(65543,116800,0),(65549,116805,0),(65550,116806,0),(65551,116807,0),(65552,116808,0),(65553,116809,0),(65554,116813,0),(65555,116814,0),(65556,116816,0),(65557,116825,0),(65558,116826,0),(65559,116834,0),(65560,116835,0),(65561,116837,0),(65562,116847,0),(65563,116855,0),(65565,116857,0),(65566,116858,0),(65567,116861,0),(65568,116862,0),(65569,116863,0),(65570,116864,0),(65571,116865,0),(65572,116866,0),(65573,116867,0),(65574,116868,0),(65575,116869,0),(65576,116870,0),(65577,116871,0),(65578,116872,0),(65579,116873,0),(65580,116874,0),(65581,116876,0),(65582,116877,0),(65583,116878,0),(65584,116879,0),(65585,116880,0),(65586,116881,0),(65587,116882,0),(65588,116883,0),(65589,116884,0),(65590,116885,0),(65591,116886,0),(65592,116907,0),(65594,116913,0),(65595,116914,0),(65596,116916,0),(65597,116918,0),(65598,116922,0),(65599,116926,0),(65600,116927,0),(65601,116927,5),(65602,116927,1),(65603,116928,0),(65604,116928,5),(65605,116928,1),(65606,116929,0),(65607,116929,5),(65608,116929,1),(65609,116930,0),(65610,116930,5),(65611,116930,1),(65612,116931,0),(65613,116931,5),(65614,116931,1),(65615,116932,0),(65616,116932,5),(65617,116932,1),(65618,116933,0),(65619,116933,5),(65620,116933,1),(65621,116934,0),(65622,116934,5),(65623,116934,1),(65624,116935,0),(65625,116935,5),(65626,116935,1),(65627,116936,0),(65628,116936,5),(65629,116936,1),(65630,116937,0),(65631,116937,5),(65632,116937,1),(65633,116938,0),(65634,116938,5),(65635,116938,1),(65636,116939,0),(65637,116939,5),(65638,116939,1),(65639,116940,0),(65640,116940,5),(65641,116940,1),(65642,116941,0),(65643,116941,5),(65644,116941,1),(65645,116942,0),(65646,116942,5),(65647,116942,1),(65648,116943,0),(65649,116943,5),(65650,116943,1),(65651,116944,0),(65652,116944,5),(65653,116944,1),(65654,116945,0),(65655,116945,5),(65656,116945,1),(65657,116946,0),(65658,116946,5),(65659,116946,1),(65660,116947,0),(65661,116947,5),(65662,116947,1),(65663,116948,0),(65664,116948,5),(65665,116948,1),(65666,116949,0),(65667,116949,5),(65668,116949,1),(65669,116950,0),(65670,116950,5),(65671,116950,1),(65672,116951,0),(65673,116952,0),(65674,116953,0),(65675,116953,5),(65676,116953,1),(65677,116954,0),(65678,116954,5),(65679,116954,1),(65680,116955,0),(65681,116955,5),(65682,116955,1),(65683,116956,0),(65684,116956,5),(65685,116956,1),(65686,116957,0),(65687,116957,5),(65688,116957,1),(65689,116958,0),(65690,116958,5),(65691,116958,1),(65692,116959,0),(65693,116959,5),(65694,116959,1),(65695,116960,0),(65696,116960,5),(65697,116960,1),(65698,116961,0),(65699,116961,5),(65700,116961,1),(65701,116962,0),(65702,116962,5),(65703,116962,1),(65704,116963,0),(65705,116963,5),(65706,116963,1),(65707,116964,0),(65708,116964,5),(65709,116964,1),(65710,116965,0),(65711,116965,5),(65712,116965,1),(65713,116966,0),(65714,116966,5),(65715,116966,1),(65716,116967,0),(65717,116967,5),(65718,116967,1),(65719,116968,0),(65720,116968,5),(65721,116968,1),(65722,116985,0),(65723,117010,0),(65724,117018,0),(65725,117019,0),(65726,117020,0),(65727,117021,0),(65728,117022,0),(65729,117023,0),(65730,117024,0),(65731,117025,0),(65732,117026,0),(65733,117027,0),(65734,117028,0),(65735,117029,0),(65736,117035,0),(65737,117036,0),(65738,117037,0),(65739,117038,0),(65740,117039,0),(65741,117040,0),(65742,117046,0),(65743,117047,0),(65744,117048,0),(65745,117049,0),(65746,117050,0),(65747,117056,0),(65748,117057,0),(65749,117058,0),(65750,117059,0),(65751,117060,0),(65752,117061,0),(65753,117062,0),(65754,117063,0),(65755,117064,0),(65756,117070,0),(65757,117071,0),(65758,117072,0),(65759,117073,0),(65760,117074,0),(65761,117075,0),(65762,117076,0),(65763,117077,0),(65764,117078,0),(65765,117079,0),(65766,117085,0),(65767,117086,0),(65768,117087,0),(65769,117088,0),(65770,117089,0),(65771,117090,0),(65772,117091,0),(65773,117092,0),(65774,117093,0),(65775,117094,0),(65776,117095,0),(65777,117101,0),(65778,117102,0),(65779,117103,0),(65780,117104,0),(65781,117105,0),(65782,117106,0),(65783,117107,0),(65784,117108,0),(65785,117109,0),(65786,117110,0),(65787,117116,0),(65788,117117,0),(65789,117118,0),(65790,117119,0),(65791,117120,0),(65792,117121,0),(65793,117122,0),(65794,117123,0),(65795,117124,0),(65796,117125,0),(65797,117126,0),(65798,117131,0),(65799,117133,0),(65800,117134,0),(65801,117135,0),(65802,117136,0),(65803,117137,0),(65804,117138,0),(65805,117139,0),(65806,117140,0),(65807,117141,0),(65808,117142,0),(65809,117143,0),(65810,117144,0),(65811,117146,0),(65812,117151,0),(65813,117152,0),(65814,117153,0),(65815,117154,0),(65816,117155,0),(65817,117161,0),(65818,117162,0),(65819,117163,0),(65820,117164,0),(65821,117165,0),(65822,117166,0),(65823,117167,0),(65824,117168,0),(65825,117169,0),(65826,117170,0),(65827,117171,0),(65828,117172,0),(65829,117173,0),(65830,117174,0),(65831,117175,0),(65832,117176,0),(65833,117182,0),(65834,117183,0),(65835,117184,0),(65836,117185,0),(65837,117186,0),(65838,117187,0),(65839,117188,0),(65840,117189,0),(65841,117190,0),(65842,117196,0),(65843,117197,0),(65844,117198,0),(65845,117199,0),(65846,117200,0),(65847,117201,0),(65848,117207,0),(65849,117208,0),(65850,117209,0),(65851,117215,0),(65852,117216,0),(65853,117217,0),(65854,117218,0),(65855,117219,0),(65856,117220,0),(65857,117225,0),(65858,117227,0),(65859,117228,0),(65860,117229,0),(65861,117230,0),(65862,117231,0),(65863,117232,0),(65864,117233,0),(65865,117234,0),(65866,117235,0),(65867,117236,0),(65868,117237,0),(65869,117238,0),(65870,117239,0),(65871,117240,0),(65872,117241,0),(65873,117247,0),(65874,117248,0),(65875,117249,0),(65876,117250,0),(65877,117251,0),(65878,117252,0),(65879,117253,0),(65880,117254,0),(65881,117255,0),(65882,117256,0),(65883,117257,0),(65884,117258,0),(65885,117269,0),(65886,117270,0),(65887,117271,0),(65888,117272,0),(65889,117273,0),(65890,117274,0),(65891,117275,0),(65892,117276,0),(65893,117277,0),(65894,117278,0),(65895,117279,0),(65896,117280,0),(65897,117281,0),(65898,117282,0),(65899,117283,0),(65900,117284,0),(65901,117285,0),(65902,117286,0),(65903,117287,0),(65904,117288,0),(65905,117294,0),(65906,117295,0),(65907,117296,0),(65908,117297,0),(65909,117298,0),(65910,117299,0),(65911,117300,0),(65912,117301,0),(65913,117302,0),(65914,117303,0),(65915,117304,0),(65916,117310,0),(65917,117311,0),(65918,117312,0),(65919,117313,0),(65920,117314,0),(65921,117315,0),(65922,117316,0),(65923,117317,0),(65924,117318,0),(65925,117319,0),(65926,117320,0),(65927,117321,0),(65928,117322,0),(65929,117323,0),(65930,117324,0),(65931,117325,0),(65932,117326,0),(65933,117327,0),(65934,117328,0),(65935,117329,0),(65936,117330,0),(65937,117331,0),(65938,117332,0),(65939,117333,0),(65940,117339,0),(65941,117340,0),(65942,117341,0),(65943,117342,0),(65944,117343,0),(65945,117344,0),(65946,117350,0),(65947,117351,0),(65948,117352,0),(65951,117355,0),(65952,117356,0),(65953,117371,0),(65954,117372,0),(65955,117373,0),(65956,117374,0),(65957,117375,0),(65958,117376,0),(65959,117377,0),(65960,117378,0),(65961,117379,0),(65962,117382,0),(65965,117384,0),(65966,117405,0),(65967,117406,0),(65968,117407,0),(65969,117408,0),(65970,117409,0),(65971,117410,0),(65972,117411,0),(65973,117412,0),(65974,117413,0),(65985,117483,0),(65986,117484,0),(65987,117494,0),(65988,117495,0),(65989,117496,0),(65990,117497,0),(65991,117498,0),(65992,117499,0),(65993,117500,0),(65994,117501,0),(65995,117502,0),(65996,117503,0),(65997,117504,0),(65998,117505,0),(65999,117506,0),(66000,117507,0),(66001,117508,0),(66002,117509,0),(66003,117510,0),(66004,117511,0),(66005,117512,0),(66006,117513,0),(66007,117514,0),(66008,117515,0),(66009,117516,0),(66011,117530,0),(66012,117531,0),(66013,117532,0),(66014,117533,0),(66015,117534,0),(66016,117535,0),(66017,117551,0),(66024,117562,0),(66025,117566,0),(66026,117567,0),(66027,117571,0),(66028,117574,0),(66029,117575,0),(66030,117576,0),(66031,117577,0),(66032,117578,0),(66033,117579,0),(66034,117580,0),(66035,117581,0),(66036,117582,0),(66037,117583,0),(66038,117584,0),(66039,117585,0),(66040,117590,0),(66041,117591,0),(66042,117592,0),(66043,117593,0),(66044,117594,0),(66045,117595,0),(66046,117596,0),(66047,117597,0),(66048,117598,0),(66049,117599,0),(66050,117600,0),(66051,117601,0),(66052,117602,0),(66053,117603,0),(66054,117604,0),(66055,117605,0),(66056,117606,0),(66057,117607,0),(66058,117608,0),(66059,117609,0),(66060,117610,0),(66061,117611,0),(66062,117612,0),(66063,117613,0),(66064,117614,0),(66065,117615,0),(66066,117616,0),(66067,117617,0),(66068,117618,0),(66069,117619,0),(66070,117620,0),(66071,117621,0),(66072,117622,0),(66073,117623,0),(66074,117624,0),(66075,117625,0),(66076,117626,0),(66077,117627,0),(66078,117628,0),(66079,117629,0),(66080,117630,0),(66081,117631,0),(66082,117632,0),(66083,117633,0),(66084,117634,0),(66085,117639,0),(66086,117640,0),(66087,117646,0),(66088,117647,0),(66089,117648,0),(66090,117649,0),(66091,117650,0),(66092,117651,0),(66093,117652,0),(66094,117653,0),(66095,117654,0),(66096,117655,0),(66097,117656,0),(66098,117657,0),(66099,117658,0),(66100,117659,0),(66101,117660,0),(66102,117661,0),(66103,117662,0),(66104,117663,0),(66105,117664,0),(66106,117665,0),(66107,117666,0),(66108,117667,0),(66109,117668,0),(66110,117669,0),(66111,117670,0),(66112,117671,0),(66113,117672,0),(66114,117673,0),(66115,117674,0),(66116,117675,0),(66117,117676,0),(66118,117677,0),(66119,117678,0),(66120,117679,0),(66121,117680,0),(66122,117681,0),(66123,117682,0),(66124,117683,0),(66125,117684,0),(66126,117685,0),(66127,117686,0),(66128,117687,0),(66129,117688,0),(66130,117689,0),(66131,117690,0),(66132,117691,0),(66133,117692,0),(66134,117693,0),(66135,117694,0),(66136,117695,0),(66137,117696,0),(66138,117697,0),(66139,117698,0),(66140,117699,0),(66141,117700,0),(66142,117701,0),(66143,117702,0),(66144,117703,0),(66145,117704,0),(66146,117705,0),(66147,117706,0),(66148,117707,0),(66149,117708,0),(66150,117709,0),(66151,117710,0),(66152,117711,0),(66153,117712,0),(66154,117713,0),(66155,117716,0),(66156,117717,0),(66157,117718,0),(66158,117719,0),(66159,117720,0),(66160,117721,0),(66161,117722,0),(66162,117723,0),(66163,117724,0),(66164,117725,0),(66165,117728,0),(66166,117741,0),(66167,117742,0),(66168,117743,0),(66169,117744,0),(66170,117745,0),(66171,117746,0),(66172,117747,0),(66173,117748,0),(66174,117749,0),(66175,117750,0),(66176,117753,0),(66177,117754,0),(66178,117755,0),(66179,117756,0),(66180,117757,0),(66181,117758,0),(66182,117759,0),(66183,117760,0),(66184,117761,0),(66185,117762,0),(66186,117763,0),(66187,117764,0),(66188,117765,0),(66189,117766,0),(66190,117767,0),(66191,117768,0),(66192,117769,0),(66193,117770,0),(66194,117771,0),(66195,117772,0),(66196,117775,0),(66197,117776,0),(66198,117777,0),(66199,117778,0),(66200,117779,0),(66201,117780,0),(66202,117781,0),(66203,117782,0),(66204,117783,0),(66205,117784,0),(66206,117791,0),(66207,117792,0),(66208,117793,0),(66209,117794,0),(66210,117795,0),(66211,117796,0),(66212,117797,0),(66213,117798,0),(66214,117799,0),(66215,117800,0),(66216,117801,0),(66217,117802,0),(66218,117803,0),(66219,117804,0),(66220,117805,0),(66221,117806,0),(66222,117807,0),(66223,117808,0),(66224,117809,0),(66225,117810,0),(66226,117811,0),(66227,117812,0),(66228,117813,0),(66229,117814,0),(66230,117815,0),(66231,117816,0),(66232,117817,0),(66233,117818,0),(66234,117819,0),(66235,117820,0),(66236,117821,0),(66237,117822,0),(66238,117823,0),(66239,117824,0),(66240,117825,0),(66241,117826,0),(66242,117827,0),(66243,117828,0),(66244,117829,0),(66245,117830,0),(66246,117831,0),(66247,117840,0),(66248,117841,0),(66249,117847,0),(66250,117848,0),(66251,117849,0),(66252,117850,0),(66253,117851,0),(66254,117852,0),(66255,117853,0),(66256,117854,0),(66257,117855,0),(66258,117856,0),(66259,117857,0),(66260,117858,0),(66261,117859,0),(66262,117860,0),(66263,117861,0),(66264,117862,0),(66265,117863,0),(66266,117864,0),(66267,117865,0),(66268,117866,0),(66269,117867,0),(66270,117868,0),(66271,117869,0),(66272,117870,0),(66273,117871,0),(66274,117872,0),(66275,117873,0),(66276,117874,0),(66277,117875,0),(66278,117876,0),(66279,117877,0),(66280,117878,0),(66281,117879,0),(66282,117880,0),(66283,117881,0),(66284,117882,0),(66285,117883,0),(66286,117884,0),(66287,117885,0),(66288,117886,0),(66289,117887,0),(66290,117888,0),(66291,117889,0),(66292,117890,0),(66293,117891,0),(66294,117892,0),(66295,117893,0),(66296,117894,0),(66297,117895,0),(66298,117896,0),(66299,117897,0),(66300,117898,0),(66301,117899,0),(66302,117900,0),(66303,117901,0),(66304,117902,0),(66305,117903,0),(66306,117904,0),(66307,117905,0),(66308,117906,0),(66309,117907,0),(66310,117908,0),(66311,117909,0),(66312,117910,0),(66313,117911,0),(66314,117912,0),(66315,117917,0),(66316,117918,0),(66317,117919,0),(66318,117920,0),(66319,117921,0),(66320,117922,0),(66321,117923,0),(66322,117924,0),(66323,117925,0),(66324,117926,0),(66325,117929,0),(66326,117942,0),(66327,117943,0),(66328,117944,0),(66329,117945,0),(66330,117946,0),(66331,117947,0),(66332,117948,0),(66333,117949,0),(66334,117950,0),(66335,117951,0),(66336,117954,0),(66337,117955,0),(66338,117956,0),(66339,117957,0),(66340,117958,0),(66341,117959,0),(66342,117960,0),(66343,117961,0),(66344,117962,0),(66345,117963,0),(66346,117964,0),(66347,117965,0),(66348,117966,0),(66349,117967,0),(66350,117968,0),(66351,117969,0),(66352,117970,0),(66353,117971,0),(66354,117972,0),(66355,117973,0),(66359,117981,0),(66360,117985,0),(66361,117986,0),(66362,117987,0),(66363,117988,0),(66364,117992,0),(66365,117993,0),(66366,117994,0),(66367,117995,0),(66368,117996,0),(66370,117998,0),(66371,117999,0),(66372,118000,0),(66373,118001,0),(66374,118002,0),(66375,118003,0),(66376,118004,0),(66377,118005,0),(66378,118012,0),(66379,118013,0),(66380,118014,0),(66381,118022,0),(66382,118023,0),(66383,118024,0),(66384,118025,0),(66385,118026,0),(66386,118027,0),(66387,118028,0),(66388,118029,0),(66389,118030,0),(66390,118031,0),(66391,118032,0),(66392,118033,0),(66393,118034,0),(66394,118035,0),(66395,118036,0),(66396,118037,0),(66404,118055,0),(66405,118056,0),(66406,118057,0),(66407,118058,0),(66408,118059,0),(66409,118071,0),(66410,118072,0),(66411,118073,0),(66412,118074,0),(66413,118075,0),(66414,118076,0),(66415,118077,0),(66416,118078,0),(66417,118079,0),(66418,118080,0),(66419,118081,0),(66420,118082,0),(66421,118083,0),(66422,118084,0),(66423,118085,0),(66424,118086,0),(66425,118087,0),(66426,118088,0),(66427,118089,0),(66428,118090,0),(66440,111848,0),(66441,118102,0),(66444,118108,0),(66446,118112,0),(66450,118124,0),(66451,118125,0),(66452,118126,0),(66453,118127,0),(66454,118128,0),(66455,118129,0),(66456,118130,0),(66457,118131,0),(66458,118135,0),(66459,118136,0),(66460,118137,0),(66461,118138,0),(66462,118139,0),(66463,118140,0),(66464,118141,0),(66465,118142,0),(66466,118143,0),(66467,118144,0),(66468,118145,0),(66469,118146,0),(66470,118147,0),(66471,118148,0),(66472,118149,0),(66473,118150,0),(66474,118154,0),(66475,118155,0),(66476,118156,0),(66477,118157,0),(66481,118186,0),(66482,118187,0),(66483,118188,0),(66484,118189,0),(66487,118198,0),(66488,118200,0),(66489,118201,0),(66490,118203,0),(66491,118204,0),(66492,118205,0),(66493,118206,0),(66494,118208,0),(66495,118209,0),(66496,118210,0),(66497,118212,0),(66498,118213,0),(66499,118214,0),(66500,118217,0),(66501,118218,0),(66502,118219,0),(66503,118223,0),(66505,118228,0),(66506,118231,0),(66507,118232,0),(66508,118237,0),(66509,118238,0),(66510,118239,0),(66511,118240,0),(66512,118241,0),(66513,118242,0),(66514,118243,0),(66515,118245,0),(66516,118247,0),(66517,118248,0),(66518,118249,0),(66519,118250,0),(66520,118258,0),(66521,118259,0),(66522,118260,0),(66523,118261,0),(66524,118263,0),(66525,118264,0),(66526,118279,0),(66527,118289,0),(66528,118355,0),(66529,118363,0),(66531,118366,0),(66532,118367,0),(66533,118368,0),(66534,118369,0),(66535,118370,0),(66536,118371,0),(66537,118372,0),(66538,118365,0),(66539,118374,0),(66540,118380,0),(66541,118381,0),(66542,118393,0),(66543,118395,0),(66544,118396,0),(66545,118397,0),(66546,118398,0),(66547,118399,0),(66548,118400,0),(66549,118401,0),(66550,118402,0),(66551,118403,0),(66552,118404,0),(66553,118405,0),(66554,118406,0),(66555,118407,0),(66556,118408,0),(66557,118409,0),(66558,118410,0),(66559,118411,0),(66560,118412,0),(66561,118413,0),(66562,115801,6),(66563,115801,7),(66564,115801,8),(66565,115800,6),(66566,115800,7),(66567,115800,8),(66568,115799,6),(66569,115799,7),(66570,115799,8),(66571,115798,6),(66572,115798,7),(66573,115798,8),(66574,115796,6),(66575,115796,7),(66576,115796,8),(66577,115794,6),(66578,115794,7),(66579,115794,8),(66591,118532,0),(66592,118533,0),(66593,118535,0),(66594,118536,0),(66595,118540,0),(66598,118547,0),(66599,118554,0),(66600,118555,0),(66601,118558,0),(66602,118559,0),(66603,118560,0),(66605,118562,0),(66606,118563,0),(66607,118568,0),(66609,118671,0),(66610,118672,0),(66611,118673,0),(66612,118674,0),(66613,118687,0),(66614,118688,0),(66615,118689,0),(66616,118702,0),(66617,118712,0),(66618,118713,0),(66619,118717,0),(66620,118718,0),(66621,118719,0),(66622,118724,0),(66623,118725,0),(66624,118726,0),(66625,118734,0),(66626,118735,0),(66627,118737,0),(66628,118738,0),(66629,118739,0),(66630,118740,0),(66631,118747,0),(66634,118748,0),(66637,118749,0),(66640,118750,0),(66643,118751,0),(66646,118752,0),(66649,118753,0),(66652,118754,0),(66655,118755,0),(66656,118756,0),(66657,118757,0),(66658,118758,0),(66660,118771,0),(66661,118772,0),(66662,118773,0),(66663,118774,0),(66664,118775,0),(66666,118918,0),(66667,118920,0),(66675,109909,5),(66676,109909,1),(66677,109910,5),(66678,109910,1),(66679,109927,5),(66680,109927,1),(66681,109911,5),(66682,109911,1),(66683,109917,5),(66684,109917,1),(66685,109915,5),(66686,109915,1),(66687,109916,5),(66688,109916,1),(66689,109929,5),(66690,109929,1),(66691,109912,5),(66692,109912,1),(66693,118939,0),(66694,118940,0),(66695,118941,0),(66696,118942,0),(66697,118946,0),(66698,118947,0),(66699,118948,0),(66700,118949,0),(66701,118950,0),(66702,118951,0),(66703,118952,0),(66704,118953,0),(66705,118954,0),(66706,118955,0),(66707,118956,0),(66708,118957,0),(66709,118958,0),(66710,118959,0),(66711,118960,0),(66712,118961,0),(66713,118962,0),(66714,118963,0),(66715,118964,0),(66716,118965,0),(66717,118966,0),(66718,118967,0),(66719,118968,0),(66720,118969,0),(66721,118970,0),(66722,118971,0),(66723,118972,0),(66724,118973,0),(66725,118974,0),(66726,118975,0),(66727,118976,0),(66728,118977,0),(66729,118978,0),(66730,118979,0),(66731,118980,0),(66732,118981,0),(66733,118982,0),(66734,118983,0),(66735,118984,0),(66736,118985,0),(66737,118986,0),(66738,118987,0),(66739,118988,0),(66740,118989,0),(66741,118990,0),(66742,118991,0),(66743,118992,0),(66744,118993,0),(66745,118994,0),(66746,118995,0),(66747,118997,0),(66748,118998,0),(66749,119013,0),(66750,119014,0),(66751,119015,0),(66752,119016,0),(66753,119017,0),(66754,119018,0),(66755,119019,0),(66756,119020,0),(66757,119021,0),(66758,109913,5),(66759,109913,1),(66760,109914,5),(66761,109914,1),(66762,109928,5),(66763,109928,1),(66764,109907,5),(66765,109907,1),(66766,109908,5),(66767,109908,1),(66768,109925,5),(66769,109925,1),(66770,109926,5),(66771,109926,1),(66772,109904,5),(66773,109904,1),(66774,109905,5),(66775,109905,1),(66776,109906,5),(66777,109906,1),(66778,109918,5),(66779,109918,1),(66781,113878,1),(66782,113878,3),(66788,113945,5),(66789,113945,3),(66790,113852,1),(66791,113852,3),(66792,113937,1),(66793,113937,3),(66794,113847,1),(66795,113847,3),(66796,113873,1),(66797,113873,3),(66798,113883,1),(66799,113883,3),(66800,113605,1),(66801,113605,3),(66802,113637,1),(66803,113637,3),(66804,113830,1),(66805,113830,3),(66806,113972,1),(66807,113972,3),(66808,113916,1),(66809,113916,3),(66810,113971,1),(66811,113971,3),(66812,113929,1),(66813,113929,3),(66814,113657,1),(66815,113657,3),(66816,119049,0),(66817,119050,0),(66818,119051,0),(66819,119052,0),(66820,119053,0),(66821,119054,0),(66822,119055,0),(66823,119056,0),(66824,119057,0),(66825,119058,0),(66827,119133,0),(66828,119135,0),(66829,119136,0),(66830,119137,0),(66831,119138,0),(66832,119140,0),(66833,116306,4),(66834,116296,4),(66835,116297,5),(66836,116307,4),(66837,116298,4),(66838,116308,4),(66839,116295,4),(66840,116305,4),(66841,116294,4),(66842,116304,4),(66843,119173,0),(66844,119173,5),(66845,119173,1),(66846,119174,0),(66847,119174,5),(66848,119174,1),(66849,119175,0),(66850,119175,5),(66851,119175,1),(66852,119176,0),(66853,119176,5),(66854,119176,1),(66855,119181,0),(66856,119181,5),(66857,119181,1),(66858,119202,0),(66859,119203,0),(66860,119204,0),(66862,119206,0),(66863,119207,0),(66864,119224,0),(66865,119225,0),(66866,119226,0),(66867,118805,0),(66868,119227,0),(66869,119228,0),(66870,119229,0),(66872,115996,4),(66873,115997,4),(66874,116000,4),(66875,116006,4),(66876,116007,4),(66877,116018,4),(66879,116230,4),(66880,116235,4),(66881,116239,4),(66882,116241,4),(66883,116242,4),(66884,116256,4),(66885,116257,4),(66886,116262,4),(66887,116208,4),(66888,116210,4),(66889,116211,4),(66890,116212,4),(66891,116215,4),(66892,116217,4),(66893,116222,4),(66894,116223,4),(66895,116224,4),(66896,116206,4),(66897,116213,4),(66898,116218,4),(66899,116220,4),(66900,116225,4),(66901,116226,4),(66902,116228,4),(66903,116229,4),(66904,116265,4),(66905,116205,4),(66906,116209,4),(66907,116214,4),(66908,116216,4),(66909,116219,4),(66910,116227,4),(66911,116264,4),(66912,116033,4),(66913,116035,4),(66914,116036,4),(66915,116037,4),(66916,116038,4),(66917,116039,4),(66918,116051,4),(66919,115998,4),(66920,116002,4),(66921,116005,4),(66922,116008,4),(66923,116012,4),(66924,116015,4),(66925,116017,4),(66926,116019,4),(66927,116022,4),(66928,116027,4),(66929,116030,4),(66930,116032,4),(66931,116034,4),(66932,116041,4),(66933,116044,4),(66934,116045,4),(66935,116047,4),(66936,116025,4),(66937,116028,4),(66938,116029,4),(66939,116040,4),(66940,116042,4),(66941,116046,4),(66942,116048,4),(66943,116049,4),(66944,116050,4),(66945,116231,4),(66946,116237,4),(66947,116238,4),(66948,116240,4),(66949,116244,4),(66950,116253,4),(66951,116254,4),(66952,116255,4),(66953,116263,4),(66954,116233,4),(66955,116234,4),(66956,116236,4),(66957,116243,4),(66958,116245,4),(66959,116250,4),(66960,116251,4),(66961,116252,4),(66962,115999,4),(66963,116003,4),(66964,116004,4),(66965,116009,4),(66966,116010,4),(66967,116011,4),(66968,116014,4),(66969,116016,4),(66970,119304,0),(66971,119325,0),(66972,119327,0),(66973,119331,0),(66974,119331,5),(66975,119331,1),(66976,119332,0),(66977,119332,5),(66978,119332,1),(66979,119333,0),(66980,119333,5),(66981,119333,1),(66982,119334,0),(66983,119334,5),(66984,119334,1),(66985,119335,0),(66986,119335,5),(66987,119335,1),(66988,119336,0),(66989,119336,5),(66990,119336,1),(66991,119337,0),(66992,119337,5),(66993,119337,1),(66994,119338,0),(66995,119338,5),(66996,119338,1),(66997,119339,0),(66998,119339,5),(66999,119339,1),(67000,119340,0),(67001,119340,5),(67002,119340,1),(67003,119341,0),(67004,119341,5),(67005,119341,1),(67006,119342,0),(67007,119342,5),(67008,119342,1),(67009,119343,0),(67010,119343,1),(67011,119343,3),(67012,119344,0),(67013,119344,1),(67014,119344,3),(67015,119345,0),(67016,119345,1),(67017,119345,3),(67018,119346,0),(67019,119346,1),(67020,119346,3),(67021,119347,0),(67022,119347,1),(67023,119347,3),(67024,119349,0),(67025,119350,0),(67026,119351,0),(67027,119352,0),(67028,119353,0),(67029,119354,0),(67030,119355,0),(67031,119356,0),(67032,119357,0),(67033,119358,0),(67034,119359,0),(67035,119360,0),(67036,119361,0),(67037,119362,0),(67038,119363,0),(67039,119364,0),(67040,119365,0),(67041,119366,0),(67042,119367,0),(67043,119368,0),(67044,119369,0),(67045,119370,0),(67046,119371,0),(67047,119372,0),(67048,119373,0),(67049,119378,0),(67050,119379,0),(67051,119380,0),(67052,119381,0),(67053,119382,0),(67054,119383,0),(67055,119384,0),(67056,119385,0),(67057,119390,0),(67058,119391,0),(67059,119392,0),(67060,119393,0),(67061,119394,0),(67062,119395,0),(67063,119396,0),(67064,119397,0),(67065,119398,0),(67066,119399,0),(67067,119400,0),(67068,119401,0),(67069,119402,0),(67070,119403,0),(67071,119404,0),(67072,119405,0),(67073,119406,0),(67074,119407,0),(67075,119408,0),(67076,119409,0),(67077,119410,0),(67078,119411,0),(67079,119412,0),(67080,119413,0),(67081,119414,0),(67082,119422,0),(67083,119423,0),(67084,119424,0),(67085,119425,0),(67086,119426,0),(67087,119427,0),(67088,119428,0),(67089,119429,0),(67090,119430,0),(67091,113837,1),(67092,113837,3),(67093,113609,3),(67094,113642,3),(67095,113850,3),(67102,115550,1),(67103,115550,3),(67104,115551,1),(67105,115551,3),(67106,115552,1),(67107,115552,3),(67108,115553,1),(67109,115553,3),(67110,115554,1),(67111,115554,3),(67112,113636,3),(67113,113649,3),(67114,113664,3),(67115,113832,3),(67116,113856,3),(67117,113870,3),(67118,113880,3),(67119,113962,3),(67120,115540,1),(67121,115540,3),(67122,115541,1),(67123,115541,3),(67124,115542,1),(67125,115542,3),(67126,115543,1),(67127,115543,3),(67128,115544,1),(67129,115544,3),(67130,119448,0),(67131,119448,1),(67132,119448,3),(67133,114247,6),(67134,114254,6),(67135,114255,6),(67136,114259,6),(67137,114263,6),(67138,114267,6),(67139,114271,6),(67140,114275,6),(67141,114248,6),(67142,114251,6),(67143,114256,6),(67144,114260,6),(67145,114264,6),(67146,114268,6),(67147,114272,6),(67148,114276,6),(67149,116390,4),(67150,114249,6),(67151,114252,6),(67152,114257,6),(67153,114261,6),(67154,114265,6),(67155,114269,6),(67156,114273,6),(67157,114277,6),(67158,113659,3),(67159,113844,3),(67160,113884,3),(67161,113894,3),(67162,113921,3),(67163,113925,3),(67164,113961,3),(67165,113977,3),(67166,115580,1),(67167,115580,3),(67168,115581,1),(67169,115581,3),(67170,115582,1),(67171,115582,3),(67172,115583,1),(67173,115583,3),(67174,115584,1),(67175,115584,3),(67176,113600,3),(67177,113633,3),(67178,113855,3),(67179,113881,3),(67180,113896,3),(67181,113906,3),(67182,113936,3),(67183,113950,3),(67184,115535,1),(67185,115535,3),(67186,115536,1),(67187,115536,3),(67188,115537,1),(67189,115537,3),(67190,115538,1),(67191,115538,3),(67192,115539,1),(67193,115539,3),(67194,113608,3),(67195,113641,3),(67196,113827,3),(67197,113849,3),(67198,113867,3),(67199,113875,3),(67200,113888,3),(67201,113902,3),(67202,113919,3),(67203,113943,3),(67204,113955,3),(67205,115545,1),(67206,115545,3),(67207,115546,1),(67208,115546,3),(67209,115547,1),(67210,115547,3),(67211,115548,1),(67212,115548,3),(67213,115549,1),(67214,115549,3),(67215,113610,3),(67216,113655,3),(67217,113840,3),(67218,113928,3),(67219,113941,3),(67220,113956,3),(67221,113970,3),(67222,113981,3),(67223,115585,1),(67224,115585,3),(67225,115586,1),(67226,115586,3),(67227,115587,1),(67228,115587,3),(67229,115588,1),(67230,115588,3),(67231,115589,1),(67232,115589,3),(67233,113845,3),(67234,113895,3),(67235,113907,3),(67236,113924,3),(67237,113935,3),(67238,113949,3),(67239,113989,3),(67240,115555,1),(67241,115555,3),(67242,115556,1),(67243,115556,3),(67244,115557,1),(67245,115557,3),(67246,115558,1),(67247,115558,3),(67248,115559,1),(67249,115559,3),(67250,113656,3),(67251,113828,3),(67252,113864,3),(67253,113876,3),(67254,113887,3),(67255,113903,3),(67256,113958,3),(67257,115560,1),(67258,115560,3),(67259,115561,1),(67260,115561,3),(67261,115562,1),(67262,115562,3),(67263,115563,1),(67264,115563,3),(67265,115564,1),(67266,115564,3),(67267,113654,3),(67268,113826,3),(67269,113839,3),(67270,113863,3),(67271,113891,3),(67272,113899,3),(67273,113915,3),(67274,113930,3),(67275,113944,3),(67276,113954,3),(67277,113968,3),(67278,113982,3),(67279,115575,1),(67280,115575,3),(67281,115576,1),(67282,115576,3),(67283,115577,1),(67284,115577,3),(67285,115578,1),(67286,115578,3),(67287,115579,1),(67288,115579,3),(67289,113632,3),(67290,113648,3),(67291,113660,3),(67292,113831,3),(67293,113871,3),(67294,113910,3),(67295,113976,3),(67296,113990,3),(67297,115565,1),(67298,115565,3),(67299,115566,1),(67300,115566,3),(67301,115567,1),(67302,115567,3),(67303,115568,1),(67304,115568,3),(67305,115569,1),(67306,115569,3),(67307,113602,3),(67308,113634,3),(67309,113661,3),(67310,113951,3),(67311,113964,3),(67312,113974,3),(67313,115570,1),(67314,115570,3),(67315,115571,1),(67316,115571,3),(67317,115572,1),(67318,115572,3),(67319,115573,1),(67320,115573,3),(67321,115574,1),(67322,115574,3),(67323,119457,0),(67324,119458,0),(67325,119459,0),(67326,119460,0),(67327,119461,0),(67328,119462,0),(67329,119463,0),(67330,119464,0),(67331,119469,0),(67332,119470,0),(67333,119471,0),(67334,119472,0),(67335,119473,0),(67336,119474,0),(67337,119475,0),(67338,119476,0),(67339,119477,0),(67340,119478,0),(67341,119479,0),(67342,119485,0),(67343,119486,0),(67344,119487,0),(67345,119488,0),(67346,119489,0),(67347,119490,0),(67348,119496,0),(67349,119497,0),(67350,119498,0),(67351,119499,0),(67352,119500,0),(67353,119506,0),(67354,119507,0),(67355,119508,0),(67356,119509,0),(67357,119510,0),(67358,119511,0),(67359,119512,0),(67360,119513,0),(67361,119514,0),(67362,119520,0),(67363,119521,0),(67364,119522,0),(67365,119523,0),(67366,119524,0),(67367,119525,0),(67368,119526,0),(67369,119527,0),(67370,119528,0),(67371,119529,0),(67372,119535,0),(67373,119536,0),(67374,119537,0),(67375,119538,0),(67376,119539,0),(67377,119540,0),(67378,119541,0),(67379,119542,0),(67380,119543,0),(67381,119544,0),(67382,119545,0),(67383,119551,0),(67384,119552,0),(67385,119553,0),(67386,119554,0),(67387,119555,0),(67388,119556,0),(67389,119557,0),(67390,119558,0),(67391,119559,0),(67392,119560,0),(67393,119566,0),(67394,119567,0),(67395,119568,0),(67396,119569,0),(67397,119570,0),(67398,119571,0),(67399,119572,0),(67400,119573,0),(67401,119574,0),(67402,119575,0),(67403,119576,0),(67404,119581,0),(67405,119583,0),(67406,119584,0),(67407,119585,0),(67408,119586,0),(67409,119587,0),(67410,119588,0),(67411,119589,0),(67412,119590,0),(67413,119591,0),(67414,119592,0),(67415,119593,0),(67416,119594,0),(67417,119596,0),(67418,119601,0),(67419,119602,0),(67420,119603,0),(67421,119604,0),(67422,119605,0),(67423,119611,0),(67424,119612,0),(67425,119613,0),(67426,119614,0),(67427,119615,0),(67428,119616,0),(67429,119617,0),(67430,119618,0),(67431,119619,0),(67432,119620,0),(67433,119621,0),(67434,119622,0),(67435,119623,0),(67436,119624,0),(67437,119625,0),(67438,119626,0),(67439,119632,0),(67440,119633,0),(67441,119634,0),(67442,119635,0),(67443,119636,0),(67444,119637,0),(67445,119638,0),(67446,119639,0),(67447,119640,0),(67448,119646,0),(67449,119647,0),(67450,119648,0),(67451,119649,0),(67452,119650,0),(67453,119651,0),(67454,119657,0),(67455,119658,0),(67456,119659,0),(67457,119665,0),(67458,119666,0),(67459,119667,0),(67460,119668,0),(67461,119669,0),(67462,119670,0),(67463,119675,0),(67464,119677,0),(67465,119678,0),(67466,119679,0),(67467,119680,0),(67468,119681,0),(67469,119682,0),(67470,119683,0),(67471,119684,0),(67472,119685,0),(67473,119686,0),(67474,119687,0),(67475,119688,0),(67476,119689,0),(67477,119690,0),(67478,119691,0),(67479,119697,0),(67480,119698,0),(67481,119699,0),(67482,119700,0),(67483,119701,0),(67484,119702,0),(67485,119703,0),(67486,119704,0),(67487,119705,0),(67488,119706,0),(67489,119707,0),(67490,119708,0),(67491,119719,0),(67492,119720,0),(67493,119721,0),(67494,119722,0),(67495,119723,0),(67496,119724,0),(67497,119725,0),(67498,119726,0),(67499,119727,0),(67500,119728,0),(67501,119729,0),(67502,119730,0),(67503,119731,0),(67504,119732,0),(67505,119733,0),(67506,119734,0),(67507,119735,0),(67508,119736,0),(67509,119737,0),(67510,119738,0),(67511,119744,0),(67512,119745,0),(67513,119746,0),(67514,119747,0),(67515,119748,0),(67516,119749,0),(67517,119750,0),(67518,119751,0),(67519,119752,0),(67520,119753,0),(67521,119754,0),(67522,119760,0),(67523,119761,0),(67524,119762,0),(67525,119763,0),(67526,119764,0),(67527,119765,0),(67528,119766,0),(67529,119767,0),(67530,119768,0),(67531,119769,0),(67532,119770,0),(67533,119771,0),(67534,119772,0),(67535,119773,0),(67536,119774,0),(67537,119775,0),(67538,119776,0),(67539,119777,0),(67540,119778,0),(67541,119779,0),(67542,119780,0),(67543,119781,0),(67544,119782,0),(67545,119783,0),(67546,119789,0),(67547,119790,0),(67548,119791,0),(67549,119792,0),(67550,119793,0),(67551,119794,0),(67552,119800,0),(67553,119801,0),(67554,119802,0),(67555,119803,0),(67556,119828,0),(67557,119829,0),(67558,119830,0),(67559,119831,0),(67560,119832,0),(67561,119833,0),(67562,119834,0),(67563,119835,0),(67564,119836,0),(67565,119837,0),(67566,119838,0),(67567,119839,0),(67568,119840,0),(67569,119841,0),(67570,119842,0),(67571,119843,0),(67572,119844,0),(67573,119845,0),(67574,119846,0),(67575,119847,0),(67576,119848,0),(67577,119849,0),(67578,119850,0),(67579,119851,0),(67580,119852,0),(67581,119853,0),(67582,119858,0),(67583,119859,0),(67584,119865,0),(67585,119866,0),(67586,119867,0),(67587,119868,0),(67588,119869,0),(67589,119870,0),(67590,119871,0),(67591,119872,0),(67592,119873,0),(67593,119874,0),(67594,119875,0),(67595,119876,0),(67596,119877,0),(67597,119878,0),(67598,119879,0),(67599,119880,0),(67600,119881,0),(67601,119882,0),(67602,119883,0),(67603,119884,0),(67604,119885,0),(67605,119886,0),(67606,119887,0),(67607,119888,0),(67608,119889,0),(67609,119890,0),(67610,119891,0),(67611,119892,0),(67612,119893,0),(67613,119894,0),(67614,119895,0),(67615,119896,0),(67616,119897,0),(67617,119898,0),(67618,119899,0),(67619,119900,0),(67620,119901,0),(67621,119902,0),(67622,119903,0),(67623,119904,0),(67624,119905,0),(67625,119906,0),(67626,119907,0),(67627,119908,0),(67628,119909,0),(67629,119910,0),(67630,119911,0),(67631,119912,0),(67632,119913,0),(67634,119915,0),(67635,119918,0),(67636,119919,0),(67637,119920,0),(67638,119921,0),(67639,119922,0),(67640,119925,0),(67641,119938,0),(67642,119939,0),(67643,119940,0),(67644,119941,0),(67645,119942,0),(67646,119943,0),(67647,119944,0),(67648,119945,0),(67649,119946,0),(67650,119947,0),(67651,119950,0),(67652,119951,0),(67653,119952,0),(67654,119953,0),(67655,119954,0),(67656,119955,0),(67657,119956,0),(67658,119957,0),(67659,119958,0),(67660,119959,0),(67661,119960,0),(67662,119961,0),(67663,119962,0),(67664,119963,0),(67665,119964,0),(67666,119965,0),(67667,119966,0),(67668,119967,0),(67669,119971,0),(67670,119972,0),(67671,119973,0),(67672,119974,0),(67673,119975,0),(67674,119976,0),(67675,119977,0),(67676,119978,0),(67677,119979,0),(67678,119980,0),(67679,119981,0),(67680,119982,0),(67681,119983,0),(67682,119984,0),(67683,119985,0),(67684,119986,0),(67685,119987,0),(67686,119988,0),(67687,119994,0),(67688,119995,0),(67689,119996,0),(67690,119997,0),(67691,119998,0),(67692,119999,0),(67693,120000,0),(67694,120001,0),(67695,120002,0),(67696,120003,0),(67697,120004,0),(67698,120005,0),(67699,120006,0),(67700,120007,0),(67701,120008,0),(67702,120009,0),(67703,120010,0),(67704,120011,0),(67705,120012,0),(67706,120013,0),(67707,120014,0),(67708,120015,0),(67709,120016,0),(67710,120017,0),(67711,120018,0),(67712,120019,0),(67713,120020,0),(67714,120021,0),(67715,120022,0),(67716,120023,0),(67717,120024,0),(67718,120025,0),(67719,120026,0),(67720,120027,0),(67721,120028,0),(67722,120029,0),(67723,120030,0),(67724,120031,0),(67725,120032,0),(67726,120035,0),(67727,120036,0),(67728,120037,0),(67729,120038,0),(67730,120039,0),(67731,120040,0),(67732,120041,0),(67733,120042,0),(67734,120043,0),(67735,120044,0),(67736,120045,0),(67737,120046,0),(67738,120047,0),(67739,120048,0),(67740,118797,0),(67741,118888,0),(67742,115733,0),(67743,115732,0),(67744,115654,0),(67745,115653,0),(67746,115652,0),(67747,115651,0),(67748,115605,0),(67749,115604,0),(67750,117914,0),(67751,117913,0),(67752,117835,0),(67753,117834,0),(67754,117833,0),(67755,117832,0),(67756,117786,0),(67757,117785,0),(67758,120053,0),(67759,120054,0),(67760,120055,0),(67761,120056,0),(67762,120057,0),(67763,120058,0),(67764,120059,0),(67765,120060,0),(67766,120061,0),(67767,120062,0),(67768,120063,0),(67769,120064,0),(67770,120065,0),(67771,120066,0),(67772,120067,0),(67773,120068,0),(67774,120069,0),(67775,120070,0),(67776,120071,0),(67777,120072,0),(67778,120073,0),(67779,120074,0),(67780,120075,0),(67781,120076,0),(67782,120078,0),(67783,120078,1),(67784,120078,3),(67785,119332,3),(67786,119336,3),(67787,119342,3),(67788,119333,3),(67789,119335,3),(67790,119340,3),(67791,119334,3),(67792,119338,3),(67793,119339,3),(67794,119331,3),(67795,119337,3),(67796,119341,3),(67798,120082,0),(67799,120088,0),(67800,120088,5),(67801,120088,1),(67802,120089,0),(67803,120089,5),(67804,120089,1),(67805,120090,0),(67806,120090,5),(67807,120090,1),(67808,120091,0),(67809,120091,5),(67810,120091,1),(67811,120099,0),(67812,120100,0),(67813,120101,0),(67814,120102,0),(67815,120111,0),(67816,120111,5),(67817,120111,1),(67818,120112,0),(67819,120112,5),(67820,120112,1),(67821,120113,0),(67822,120113,5),(67823,120113,1),(67824,120114,0),(67825,120114,5),(67826,120114,1),(67827,120115,0),(67828,118795,0),(67829,118799,0),(67830,118802,0),(67831,118800,0),(67832,118801,0),(67833,118803,0),(67834,118804,0),(67835,118806,0),(67836,118807,0),(67837,118808,0),(67838,118809,0),(67839,118810,0),(67840,118811,0),(67841,118812,0),(67842,118813,0),(67843,118814,0),(67844,118815,0),(67845,118816,0),(67846,118796,0),(67847,118793,0),(67848,118794,0),(67849,118798,0),(67850,118819,0),(67851,118871,0),(67852,118872,0),(67853,118873,0),(67854,118874,0),(67855,118781,0),(67856,118782,0),(67857,118783,0),(67858,118784,0),(67859,118785,0),(67860,118786,0),(67861,118787,0),(67862,118788,0),(67863,118789,0),(67864,118790,0),(67865,118791,0),(67866,118792,0),(67867,118849,0),(67868,118850,0),(67869,118851,0),(67870,118852,0),(67871,118817,0),(67872,118818,0),(67873,118820,0),(67874,118821,0),(67875,118822,0),(67876,118823,0),(67877,118824,0),(67878,118885,0),(67879,118889,0),(67880,118893,0),(67881,118825,0),(67882,118826,0),(67883,118827,0),(67884,118828,0),(67885,118829,0),(67886,118830,0),(67887,118831,0),(67888,118832,0),(67889,118886,0),(67890,118890,0),(67891,118894,0),(67892,118833,0),(67893,118834,0),(67894,118835,0),(67895,118836,0),(67896,118837,0),(67897,118838,0),(67898,118839,0),(67899,118887,0),(67900,118891,0),(67901,118895,0),(67902,118853,0),(67903,118854,0),(67904,118855,0),(67905,118856,0),(67906,118857,0),(67907,118858,0),(67908,118859,0),(67909,118860,0),(67910,118892,0),(67911,118896,0),(67912,120119,0),(67913,120123,0),(67918,120163,0),(67919,120164,0),(67920,120165,0),(67921,120166,0),(67922,120167,0),(67925,120189,0),(67926,120190,0),(67927,120191,0),(67928,120192,0),(67929,120193,0),(67930,120194,0),(67931,120195,0),(67932,120196,0),(67933,120197,0),(67934,120198,0),(67935,120199,0),(67939,120259,6),(67940,120259,7),(67941,120259,8),(67942,120261,6),(67943,120261,7),(67944,120261,8),(67946,120272,0),(67947,120273,0),(67948,120288,0),(67949,116975,0),(67950,116976,0),(67951,116974,0),(67952,116973,0),(67953,116971,0),(67954,116972,0),(67955,116970,0),(67956,116969,0),(67959,116013,4),(67965,120304,0),(67967,120317,0),(67968,120318,0),(67969,120326,0),(67970,113978,3),(67971,120340,0),(67972,120340,5),(67973,120340,1),(67974,120357,0),(67985,120373,0),(67986,120373,5),(67987,120373,1),(67988,120373,4),(67989,120374,0),(67990,120374,5),(67991,120374,1),(67992,120374,4),(67993,120375,0),(67994,120375,5),(67995,120375,1),(67996,120375,4),(67997,120376,0),(67998,120376,5),(67999,120376,1),(68000,120376,4),(68001,120377,0),(68002,120377,5),(68003,120377,1),(68004,120377,4),(68005,120378,0),(68006,120378,1),(68007,120378,4),(68008,120379,0),(68009,120379,5),(68010,120379,1),(68011,120379,4),(68012,120380,0),(68013,120380,4),(68016,120381,0),(68017,120381,5),(68018,120381,1),(68019,120381,4),(68020,120382,0),(68021,120382,5),(68022,120382,1),(68023,120382,4),(68024,120383,0),(68025,120383,5),(68026,120383,1),(68027,120383,4),(68028,120384,0),(68029,120384,5),(68030,120384,1),(68031,120384,4),(68032,120385,0),(68033,120385,5),(68034,120385,1),(68035,120385,4),(68036,120386,0),(68037,120386,5),(68038,120386,1),(68039,120386,4),(68040,120387,0),(68041,120387,5),(68042,120387,1),(68043,120387,4),(68044,120388,0),(68045,120388,5),(68046,120388,1),(68047,120388,4),(68048,120389,0),(68049,120389,5),(68050,120389,1),(68051,120389,4),(68052,120390,0),(68053,120390,5),(68054,120390,1),(68055,120390,4),(68056,120391,0),(68057,120391,5),(68058,120391,1),(68059,120391,4),(68060,120392,0),(68061,120392,5),(68062,120392,1),(68063,120392,4),(68064,120393,0),(68065,120393,5),(68066,120393,1),(68067,120393,4),(68068,120394,0),(68069,120394,5),(68070,120394,1),(68071,120394,4),(68072,120395,0),(68073,120395,5),(68074,120395,1),(68075,120395,4),(68076,120396,0),(68077,120396,5),(68078,120396,1),(68079,120396,4),(68086,120406,0),(68093,120427,0),(68095,120430,0),(68096,120431,0),(68097,120432,0),(68098,120433,0),(68099,120434,0),(68100,120435,0),(68101,120436,0),(68102,120437,0),(68103,120438,0),(68104,120439,0),(68107,120858,0),(68108,120861,0),(68130,120950,0),(68131,120951,0),(68132,120952,0),(68133,120953,0),(68134,120954,0),(68144,120976,0),(68145,120977,0),(68147,120980,0),(68148,120981,0),(68149,120982,0),(68150,120983,0),(68151,120984,0),(68152,120985,0),(68153,120986,0),(68154,120987,0),(68155,120988,0),(68156,120990,0),(68157,120991,0),(68158,120992,0),(68159,120993,0),(68160,120994,0),(68161,120995,0),(68162,120996,0),(69050,122097,0),(69052,122130,0),(69053,122131,0),(69057,122149,0),(69058,122151,0),(69060,122165,0),(69061,122166,0),(69062,122167,0),(69063,122168,0),(69064,122169,0),(69065,122170,0),(69066,122171,0),(69067,122172,0),(69068,122173,0),(69069,122174,0),(69070,122175,0),(69071,122176,0),(69072,122178,0),(69073,122181,0),(69074,122182,0),(69075,122185,0),(69076,122186,0),(69085,122240,0),(69086,122245,0),(69087,122246,0),(69088,122247,0),(69089,122248,0),(69090,122249,0),(69091,122250,0),(69092,122251,0),(69093,122252,0),(69094,122253,0),(69095,122254,0),(69096,122255,0),(69097,122256,0),(69098,122260,0),(69099,122261,0),(69100,122262,0),(69101,122263,0),(69102,122264,0),(69103,122266,0),(69115,122308,0),(69116,122308,5),(69117,122308,1),(69118,122309,0),(69119,122309,5),(69120,122309,1),(69121,122310,0),(69122,122310,5),(69123,122310,1),(69124,122311,0),(69125,122311,5),(69126,122311,1),(69127,122312,0),(69128,122312,5),(69129,122312,1),(69130,122313,0),(69131,122313,5),(69132,122313,1),(69133,122314,0),(69134,122314,5),(69135,122314,1),(69136,122315,0),(69137,122315,5),(69138,122315,1),(69139,122316,0),(69140,122316,5),(69141,122316,1),(69142,122317,0),(69143,122317,5),(69144,122317,1),(69145,122318,0),(69146,122318,5),(69147,122318,1),(69148,122319,0),(69149,122319,5),(69150,122319,1),(69151,122320,0),(69152,122320,5),(69153,122320,1),(69154,122321,0),(69155,122321,5),(69156,122321,1),(69157,122322,0),(69158,122322,5),(69159,122322,1),(69160,122323,0),(69161,122323,5),(69162,122323,1),(69163,122324,0),(69164,122324,5),(69165,122324,1),(69166,122325,0),(69167,122325,5),(69168,122325,1),(69169,122326,0),(69170,122326,5),(69171,122326,1),(69172,122327,0),(69173,122327,5),(69174,122327,1),(69175,122328,0),(69176,122329,0),(69177,122330,0),(69178,122331,0),(69179,122332,0),(69180,122349,0),(69181,122350,0),(69182,122351,0),(69183,122352,0),(69184,122353,0),(69185,122354,0),(69186,122355,0),(69187,122356,0),(69188,122357,0),(69189,122358,0),(69190,122359,0),(69191,122360,0),(69192,122363,0),(69193,122364,0),(69194,122365,0),(69195,122366,0),(69196,122367,0),(69197,122368,0),(69198,122369,0),(69199,122372,0),(69200,122373,0),(69201,122374,0),(69202,122375,0),(69203,122376,0),(69204,122377,0),(69205,122378,0),(69206,122379,0),(69207,122380,0),(69208,122381,0),(69209,122382,0),(69210,122383,0),(69211,122384,0),(69212,122385,0),(69213,122386,0),(69214,122387,0),(69215,122388,0),(69216,122389,0),(69217,122390,0),(69218,122391,0),(69219,122392,0),(69220,122396,0),(69222,117565,0),(69244,122528,0),(69439,123973,0),(69440,123981,0),(69441,123983,0),(69442,123984,0),(69443,123985,0),(69444,123986,0),(69445,123987,0),(69446,123988,0),(69447,123989,0),(69448,123990,0),(69449,123991,0),(69450,123993,0),(69451,123994,0),(69452,123995,0),(69453,123996,0),(69454,123997,0),(69455,123998,0),(69456,123999,0),(69457,124000,0),(69458,124001,0),(69459,124002,0),(69460,124011,0),(69461,124012,0),(69462,124013,0),(69463,124014,0),(69464,124026,0),(69465,124027,0),(69466,124028,0),(69467,124029,0),(69468,124030,0),(69469,124033,0),(69478,124065,0),(69503,124085,0),(69504,124086,0),(69507,124132,0),(69508,124132,1),(69509,124132,3),(69510,124133,0),(69511,124133,1),(69512,124133,3),(69513,124134,0),(69514,124134,1),(69515,124134,3),(69516,124135,0),(69517,124135,1),(69518,124135,3),(69519,124136,0),(69520,124136,1),(69521,124136,3),(69522,124137,0),(69523,124137,1),(69524,124137,3),(69525,124138,0),(69526,124138,1),(69527,124138,3),(69528,124139,0),(69529,124139,1),(69530,124139,3),(69531,124140,0),(69532,124140,1),(69533,124140,3),(69534,124141,0),(69535,124141,1),(69536,124141,3),(69537,124142,0),(69538,124142,1),(69539,124142,3),(69540,124143,0),(69541,124143,1),(69542,124143,3),(69543,124144,0),(69544,124144,1),(69545,124144,3),(69546,124145,0),(69547,124145,1),(69548,124145,3),(69549,124146,0),(69550,124146,1),(69551,124146,3),(69552,124147,0),(69553,124147,1),(69554,124147,3),(69555,124148,0),(69556,124148,5),(69557,124148,1),(69558,124148,3),(69559,124149,0),(69560,124149,5),(69561,124149,1),(69562,124149,3),(69563,124150,0),(69564,124150,1),(69565,124150,3),(69566,124151,0),(69567,124151,5),(69568,124151,1),(69569,124151,3),(69570,124152,0),(69571,124152,5),(69572,124152,1),(69573,124152,3),(69574,124153,0),(69575,124153,5),(69576,124153,1),(69577,124153,3),(69578,124154,0),(69579,124154,1),(69580,124154,3),(69581,124155,0),(69582,124155,1),(69583,124155,3),(69584,124156,0),(69585,124156,1),(69586,124156,3),(69587,124157,0),(69588,124157,1),(69589,124157,3),(69590,124158,0),(69591,124158,1),(69592,124158,3),(69593,124159,0),(69597,124160,0),(69598,124160,1),(69599,124160,3),(69600,124161,0),(69601,124161,1),(69602,124161,3),(69603,124162,0),(69604,124162,1),(69605,124162,3),(69606,124163,0),(69607,124163,5),(69608,124163,1),(69609,124163,3),(69610,124164,0),(69611,124164,1),(69612,124164,3),(69613,124165,0),(69614,124165,1),(69615,124165,3),(69616,124166,0),(69617,124166,1),(69618,124166,3),(69619,124167,0),(69620,124167,1),(69621,124167,3),(69622,124168,0),(69623,124168,5),(69624,124168,1),(69625,124168,3),(69626,124169,0),(69627,124169,5),(69628,124169,1),(69629,124169,3),(69630,124170,0),(69631,124170,1),(69632,124170,3),(69633,124171,0),(69634,124171,1),(69635,124171,3),(69636,124172,0),(69637,124172,1),(69638,124172,3),(69639,124173,0),(69640,124173,1),(69641,124173,3),(69642,124174,0),(69643,124174,5),(69644,124174,1),(69645,124174,3),(69646,124175,0),(69647,124175,5),(69648,124175,1),(69649,124175,3),(69650,124176,0),(69654,124177,0),(69655,124177,1),(69656,124177,3),(69657,124178,0),(69658,124178,1),(69659,124178,3),(69660,124179,0),(69661,124179,1),(69662,124179,3),(69663,124180,0),(69664,124180,5),(69665,124180,1),(69666,124180,3),(69667,124181,0),(69668,124181,5),(69669,124181,1),(69670,124181,3),(69671,124182,0),(69672,124182,1),(69673,124182,3),(69674,124183,0),(69675,124183,5),(69676,124183,1),(69677,124183,3),(69678,124184,0),(69679,124184,5),(69680,124184,1),(69681,124184,3),(69682,124185,0),(69683,124185,5),(69684,124185,1),(69685,124185,3),(69686,124186,0),(69687,124186,5),(69688,124186,1),(69689,124186,3),(69690,124205,0),(69691,124205,1),(69692,124205,3),(69693,124206,0),(69694,124206,1),(69695,124206,3),(69696,124243,0),(69697,124243,1),(69698,124243,3),(69699,124244,0),(69700,124244,5),(69701,124244,1),(69702,124244,3),(69703,124245,0),(69704,124245,5),(69705,124245,1),(69706,124245,3),(69707,124246,0),(69708,124246,1),(69709,124246,3),(69710,124247,0),(69711,124247,1),(69712,124247,3),(69713,124248,0),(69714,124248,1),(69715,124248,3),(69716,124249,0),(69717,124249,5),(69718,124249,1),(69719,124249,3),(69720,124250,0),(69721,124250,5),(69722,124250,1),(69723,124250,3),(69724,124251,0),(69725,124251,5),(69726,124251,1),(69727,124251,3),(69728,124252,0),(69729,124252,5),(69730,124252,1),(69731,124252,3),(69732,124253,0),(69733,124253,5),(69734,124253,1),(69735,124253,3),(69736,124254,0),(69737,124254,5),(69738,124254,1),(69739,124254,3),(69740,124255,0),(69741,124255,1),(69742,124255,3),(69743,124256,0),(69744,124256,1),(69745,124256,3),(69746,124257,0),(69747,124257,1),(69748,124257,3),(69749,124258,0),(69750,124258,5),(69751,124258,1),(69752,124258,3),(69753,124259,0),(69754,124259,5),(69755,124259,1),(69756,124259,3),(69757,124260,0),(69758,124260,5),(69759,124260,1),(69760,124260,3),(69761,124261,0),(69762,124261,1),(69763,124261,3),(69764,124262,0),(69765,124262,1),(69766,124262,3),(69767,124263,0),(69768,124263,1),(69769,124263,3),(69770,124264,0),(69771,124264,5),(69772,124264,1),(69773,124264,3),(69774,124265,0),(69775,124265,5),(69776,124265,1),(69777,124265,3),(69778,124266,0),(69779,124266,1),(69780,124266,3),(69782,124267,0),(69783,124267,1),(69784,124267,3),(69785,124268,0),(69786,124268,1),(69787,124268,3),(69788,124269,0),(69789,124269,1),(69790,124269,3),(69791,124270,0),(69792,124270,5),(69793,124270,1),(69794,124270,3),(69795,124271,0),(69796,124271,5),(69797,124271,1),(69798,124271,3),(69799,124272,0),(69800,124272,1),(69801,124272,3),(69802,124273,0),(69803,124273,1),(69804,124273,3),(69805,124274,0),(69806,124274,1),(69807,124274,3),(69808,124275,0),(69809,124275,5),(69810,124275,1),(69811,124275,3),(69812,124276,0),(69813,124276,5),(69814,124276,1),(69815,124276,3),(69816,124277,0),(69817,124277,5),(69818,124277,1),(69819,124277,3),(69820,124278,0),(69821,124278,5),(69822,124278,1),(69823,124278,3),(69824,124279,0),(69825,124279,5),(69826,124279,1),(69827,124279,3),(69828,124280,0),(69829,124280,1),(69830,124280,3),(69831,124281,0),(69832,124281,5),(69833,124281,1),(69834,124281,3),(69835,124282,0),(69836,124282,5),(69837,124282,1),(69838,124282,3),(69839,124283,0),(69840,124283,5),(69841,124283,1),(69842,124283,3),(69843,124284,0),(69844,124284,1),(69845,124284,3),(69846,124285,0),(69847,124285,1),(69848,124285,3),(69849,124286,0),(69850,124286,5),(69851,124286,1),(69852,124286,3),(69853,124287,0),(69854,124287,5),(69855,124287,1),(69856,124287,3),(69857,124288,0),(69858,124288,5),(69859,124288,1),(69860,124288,3),(69861,124289,0),(69862,124289,1),(69863,124289,3),(69864,124290,0),(69865,124290,5),(69866,124290,1),(69867,124290,3),(69868,124291,0),(69869,124291,5),(69870,124291,1),(69871,124291,3),(69872,124292,0),(69873,124292,1),(69874,124292,3),(69875,124293,0),(69876,124293,1),(69877,124293,3),(69878,124294,0),(69879,124294,5),(69880,124294,1),(69881,124294,3),(69882,124295,0),(69883,124295,5),(69884,124295,1),(69885,124295,3),(69886,124296,0),(69887,124296,1),(69888,124296,3),(69889,124297,0),(69890,124297,1),(69891,124297,3),(69892,124298,0),(69893,124298,5),(69894,124298,1),(69895,124298,3),(69896,124299,0),(69897,124299,1),(69898,124299,3),(69900,124300,0),(69901,124300,5),(69902,124300,1),(69903,124300,3),(69904,124301,0),(69905,124301,1),(69906,124301,3),(69907,124302,0),(69908,124302,1),(69909,124302,3),(69910,124303,0),(69911,124303,1),(69912,124303,3),(69913,124304,0),(69914,124304,5),(69915,124304,1),(69916,124304,3),(69917,124305,0),(69918,124305,5),(69919,124305,1),(69920,124305,3),(69921,124306,0),(69922,124306,5),(69923,124306,1),(69924,124306,3),(69925,124307,0),(69926,124307,1),(69927,124307,3),(69928,124308,0),(69929,124308,1),(69930,124308,3),(69931,124309,0),(69932,124309,5),(69933,124309,1),(69934,124309,3),(69935,124310,0),(69936,124310,5),(69937,124310,1),(69938,124310,3),(69939,124311,0),(69940,124311,5),(69941,124311,1),(69942,124311,3),(69943,124312,0),(69944,124312,5),(69945,124312,1),(69946,124312,3),(69947,124313,0),(69948,124313,5),(69949,124313,1),(69950,124313,3),(69951,124314,0),(69952,124314,5),(69953,124314,1),(69954,124314,3),(69955,124315,0),(69956,124315,5),(69957,124315,1),(69958,124315,3),(69959,124316,0),(69960,124316,5),(69961,124316,1),(69962,124316,3),(69963,124317,0),(69964,124317,1),(69965,124317,3),(69966,124318,0),(69967,124318,1),(69968,124318,3),(69969,124319,0),(69970,124319,1),(69971,124319,3),(69972,124320,0),(69973,124320,5),(69974,124320,1),(69975,124320,3),(69976,124321,0),(69977,124321,5),(69978,124321,1),(69979,124321,3),(69980,124322,0),(69981,124322,5),(69982,124322,1),(69983,124322,3),(69984,124323,0),(69985,124323,5),(69986,124323,1),(69987,124323,3),(69988,124324,0),(69989,124324,5),(69990,124324,1),(69991,124324,3),(69992,124325,0),(69993,124325,5),(69994,124325,1),(69995,124325,3),(69996,124326,0),(69997,124326,5),(69998,124326,1),(69999,124326,3),(70000,124327,0),(70001,124327,1),(70002,124327,3),(70003,124328,0),(70004,124328,1),(70005,124328,3),(70006,124329,0),(70007,124329,1),(70008,124329,3),(70009,124330,0),(70010,124330,5),(70011,124330,1),(70012,124330,3),(70013,124331,0),(70014,124331,5),(70015,124331,1),(70016,124331,3),(70017,124332,0),(70018,124332,1),(70019,124332,3),(70020,124333,0),(70021,124333,1),(70022,124333,3),(70023,124334,0),(70024,124334,1),(70025,124334,3),(70026,124335,0),(70027,124335,5),(70028,124335,1),(70029,124335,3),(70030,124336,0),(70031,124336,5),(70032,124336,1),(70033,124336,3),(70034,124337,0),(70035,124337,5),(70036,124337,1),(70037,124337,3),(70038,124338,0),(70039,124338,1),(70040,124338,3),(70041,124339,0),(70042,124339,1),(70043,124339,3),(70044,124340,0),(70045,124340,1),(70046,124340,3),(70047,124341,0),(70048,124341,5),(70049,124341,1),(70050,124341,3),(70051,124342,0),(70052,124342,5),(70053,124342,1),(70054,124342,3),(70055,124343,0),(70056,124343,5),(70057,124343,1),(70058,124343,3),(70059,124344,0),(70060,124344,1),(70061,124344,3),(70062,124345,0),(70063,124345,1),(70064,124345,3),(70065,124346,0),(70066,124346,1),(70067,124346,3),(70068,124347,0),(70069,124347,5),(70070,124347,1),(70071,124347,3),(70072,124348,0),(70073,124348,5),(70074,124348,1),(70075,124348,3),(70076,124349,0),(70077,124349,5),(70078,124349,1),(70079,124349,3),(70080,124350,0),(70081,124350,5),(70082,124350,1),(70083,124350,3),(70084,124351,0),(70085,124351,5),(70086,124351,1),(70087,124351,3),(70088,124352,0),(70089,124352,5),(70090,124352,1),(70091,124352,3),(70092,124353,0),(70093,124353,5),(70094,124353,1),(70095,124353,3),(70096,124354,0),(70097,124354,1),(70098,124354,3),(70099,124355,0),(70100,124355,1),(70101,124355,3),(70102,124356,0),(70103,124356,1),(70104,124356,3),(70105,124357,0),(70106,124357,1),(70107,124357,3),(70108,124358,0),(70109,124358,1),(70110,124358,3),(70111,124359,0),(70112,124359,1),(70113,124359,3),(70114,124360,0),(70115,124360,1),(70116,124360,3),(70117,124361,0),(70118,124361,1),(70119,124361,3),(70120,124362,0),(70121,124362,1),(70122,124362,3),(70123,124363,0),(70124,124363,1),(70125,124363,3),(70126,124364,0),(70127,124364,1),(70128,124364,3),(70129,124365,0),(70130,124365,1),(70131,124365,3),(70132,124366,0),(70133,124366,1),(70134,124366,3),(70135,124367,0),(70136,124367,1),(70137,124367,3),(70138,124368,0),(70139,124368,1),(70140,124368,3),(70141,124369,0),(70142,124369,1),(70143,124369,3),(70144,124370,0),(70145,124370,1),(70146,124370,3),(70147,124371,0),(70148,124371,1),(70149,124371,3),(70150,124372,0),(70151,124372,1),(70152,124372,3),(70153,124373,0),(70154,124373,1),(70155,124373,3),(70156,124374,0),(70157,124374,1),(70158,124374,3),(70159,124375,0),(70160,124375,1),(70161,124375,3),(70162,124376,0),(70163,124376,1),(70164,124376,3),(70165,124377,0),(70166,124377,1),(70167,124377,3),(70168,124378,0),(70169,124378,1),(70170,124378,3),(70171,124379,0),(70172,124379,1),(70173,124379,3),(70174,124380,0),(70175,124380,1),(70176,124380,3),(70177,124381,0),(70178,124381,1),(70179,124381,3),(70180,124382,0),(70181,124382,1),(70182,124382,3),(70183,124383,0),(70184,124383,1),(70185,124383,3),(70186,124384,0),(70187,124384,1),(70188,124384,3),(70189,124385,0),(70190,124385,1),(70191,124385,3),(70192,124386,0),(70193,124386,1),(70194,124386,3),(70195,124387,0),(70196,124387,1),(70197,124387,3),(70198,124388,0),(70199,124388,1),(70200,124388,3),(70201,124389,0),(70202,124389,1),(70203,124389,3),(70204,124390,0),(70205,124390,1),(70206,124390,3),(70207,124445,0),(70208,124446,0),(70209,124447,0),(70210,124448,0),(70228,124524,0),(70232,124529,0),(70239,124543,0),(70240,124544,0),(70243,124549,0),(70244,124563,0),(70248,124564,0),(70252,124565,0),(70256,124566,0),(70260,124567,0),(70264,124568,0),(70268,124569,0),(70272,124570,0),(70276,124571,0),(70280,124572,0),(70284,124573,0),(70288,124574,0),(70292,124575,0),(70296,124576,0),(70300,124577,0),(70304,124578,0),(70308,124579,0),(70312,124580,0),(70316,124581,0),(70320,124582,0),(70324,124583,0),(70328,124584,0),(70332,124585,0),(70336,124586,0),(70340,124587,0),(70344,124588,0),(70348,124589,0),(70352,124590,0),(70356,124591,0),(70360,124592,0),(70364,124593,0),(70368,124594,0),(70372,124613,0),(70373,124614,0),(70374,124615,0),(70375,124616,0),(70376,124617,0),(70377,124618,0),(70378,124624,0),(70379,124625,0),(70380,124626,0),(70381,124627,0),(70382,124628,0),(70383,124629,0),(70384,124630,0),(70385,124631,0),(70392,124675,0),(70393,124676,0),(70394,124677,0),(70395,124678,0),(70396,124679,0),(70397,124680,0),(70398,124681,0),(70399,124682,0),(70400,124683,0),(70401,124684,0),(70402,124685,0),(70403,124686,0),(70404,124692,0),(70405,124693,0),(70406,124694,0),(70407,124695,0),(70408,124696,0),(70409,124697,0),(70410,124698,0),(70411,124699,0),(70412,124700,0),(70413,124701,0),(70414,124702,0),(70415,124703,0),(70416,124704,0),(70417,124705,0),(70418,124706,0),(70419,124707,0),(70420,124708,0),(70421,124709,0),(70422,124710,0),(70423,124711,0),(70424,124712,0),(70425,124713,0),(70426,124714,0),(70427,124715,0),(70428,124716,0),(70429,124717,0),(70430,124718,0),(70431,124719,0),(70432,124720,0),(70433,124721,0),(70434,124722,0),(70435,124723,0),(70436,124724,0),(70437,124725,0),(70438,124726,0),(70439,124727,0),(70440,124728,0),(70441,124729,0),(70442,124730,0),(70443,124731,0),(70444,124732,0),(70445,124733,0),(70446,124734,0),(70447,124735,0),(70448,124736,0),(70449,124741,0),(70450,124742,0),(70451,124748,0),(70452,124749,0),(70453,124750,0),(70454,124751,0),(70455,124752,0),(70456,124753,0),(70457,124754,0),(70458,124755,0),(70459,124756,0),(70460,124757,0),(70461,124758,0),(70462,124759,0),(70463,124760,0),(70464,124761,0),(70465,124762,0),(70466,124763,0),(70467,124764,0),(70468,124765,0),(70469,124766,0),(70470,124767,0),(70471,124768,0),(70472,124769,0),(70473,124770,0),(70474,124771,0),(70475,124772,0),(70476,124773,0),(70477,124774,0),(70478,124775,0),(70479,124776,0),(70480,124777,0),(70481,124778,0),(70482,124779,0),(70483,124780,0),(70484,124781,0),(70485,124782,0),(70486,124783,0),(70487,124784,0),(70488,124785,0),(70489,124786,0),(70490,124787,0),(70491,124788,0),(70492,124789,0),(70493,124790,0),(70494,124791,0),(70495,124792,0),(70496,124793,0),(70497,124794,0),(70498,124795,0),(70499,124796,0),(70500,124797,0),(70501,124798,0),(70502,124799,0),(70503,124800,0),(70504,124801,0),(70505,124802,0),(70506,124803,0),(70507,124804,0),(70508,124805,0),(70509,124806,0),(70510,124807,0),(70511,124808,0),(70512,124809,0),(70513,124810,0),(70514,124811,0),(70515,124812,0),(70516,124813,0),(70517,124814,0),(70518,124815,0),(70519,124816,0),(70520,124817,0),(70521,124818,0),(70522,124819,0),(70523,124820,0),(70524,124821,0),(70525,124822,0),(70526,124823,0),(70527,124824,0),(70528,124825,0),(70529,124826,0),(70530,124827,0),(70531,124828,0),(70532,124829,0),(70533,124830,0),(70534,124831,0),(70535,124832,0),(70536,124833,0),(70537,124834,0),(70538,124835,0),(70539,124836,0),(70540,124837,0),(70541,124838,0),(70542,124839,0),(70543,124840,0),(70544,124841,0),(70545,124842,0),(70546,124843,0),(70547,124844,0),(70548,124845,0),(70549,124851,0),(70550,124852,0),(70551,124875,0),(70552,124876,0),(70553,124877,0),(70554,124878,0),(70555,124879,0),(70556,124880,0),(70557,124881,0),(70558,124882,0),(70559,124883,0),(70560,124884,0),(70561,124885,0),(70562,124886,0),(70563,124887,0),(70564,124888,0),(70565,124889,0),(70566,124890,0),(70567,124891,0),(70568,124892,0),(70569,124893,0),(70570,124894,0),(70571,124895,0),(70572,124896,0),(70573,124902,0),(70574,124903,0),(70575,124904,0),(70576,124905,0),(70577,124906,0),(70578,124907,0),(70579,124908,0),(70580,124909,0),(70581,124910,0),(70582,124911,0),(70583,124912,0),(70584,124913,0),(70585,124914,0),(70586,124915,0),(70587,124916,0),(70588,124917,0),(70589,124918,0),(70590,124919,0),(70591,124920,0),(70592,124921,0),(70593,124922,0),(70594,124923,0),(70595,124924,0),(70596,124925,0),(70597,124926,0),(70598,124927,0),(70599,124928,0),(70600,124929,0),(70601,124930,0),(70602,124931,0),(70603,124932,0),(70604,124933,0),(70605,124934,0),(70606,124935,0),(70607,124936,0),(70608,124937,0),(70609,124938,0),(70610,124943,0),(70611,124944,0),(70612,124950,0),(70613,124951,0),(70614,124952,0),(70615,124953,0),(70616,124954,0),(70617,124955,0),(70618,124956,0),(70619,124957,0),(70620,124958,0),(70621,124959,0),(70622,124960,0),(70623,124961,0),(70624,124962,0),(70625,124963,0),(70626,124964,0),(70627,124965,0),(70628,124966,0),(70629,124967,0),(70630,124968,0),(70631,124969,0),(70632,124970,0),(70633,124971,0),(70634,124972,0),(70635,124973,0),(70636,124974,0),(70637,124975,0),(70638,124976,0),(70639,124977,0),(70640,124978,0),(70641,124979,0),(70642,124980,0),(70643,124981,0),(70644,124982,0),(70645,124983,0),(70646,124984,0),(70647,124985,0),(70648,124986,0),(70649,124987,0),(70650,124988,0),(70651,124989,0),(70652,124990,0),(70653,124991,0),(70654,124992,0),(70655,124993,0),(70656,124994,0),(70657,124995,0),(70658,124996,0),(70659,124997,0),(70660,124998,0),(70661,124999,0),(70662,125000,0),(70663,125001,0),(70664,125002,0),(70665,125003,0),(70666,125004,0),(70667,125005,0),(70668,125006,0),(70669,125007,0),(70670,125008,0),(70671,125009,0),(70672,125010,0),(70673,125011,0),(70674,125012,0),(70675,125013,0),(70676,125014,0),(70677,125015,0),(70679,125017,0),(70680,125018,0),(70681,125019,0),(70682,125020,0),(70683,125021,0),(70684,125022,0),(70685,125023,0),(70686,125029,0),(70687,125049,0),(70688,125053,0),(70689,125054,0),(70690,125055,0),(70691,125056,0),(70692,125057,0),(70693,125058,0),(70694,125059,0),(70695,125060,0),(70696,125061,0),(70697,125062,0),(70698,125063,0),(70699,125067,0),(70700,125068,0),(70701,125069,0),(70702,125070,0),(70703,125071,0),(70704,125072,0),(70705,125073,0),(70706,125074,0),(70707,125075,0),(70708,125076,0),(70709,125077,0),(70710,125078,0),(70711,125079,0),(70712,125080,0),(70713,125081,0),(70714,125082,0),(70715,125083,0),(70716,125084,0),(70717,125085,0),(70718,125086,0),(70719,125093,0),(70720,125094,0),(70721,125095,0),(70722,125096,0),(70723,125097,0),(70724,125098,0),(70725,125099,0),(70726,125100,0),(70727,125101,0),(70728,125102,0),(70729,125103,0),(70730,125104,0),(70731,125105,0),(70732,125106,0),(70733,125107,0),(70734,125108,0),(70735,125109,0),(70736,125110,0),(70737,125111,0),(70738,125112,0),(70739,125113,0),(70740,125114,0),(70741,125115,0),(70742,125116,0),(70743,125117,0),(70744,125118,0),(70745,125119,0),(70746,125120,0),(70747,125121,0),(70748,125122,0),(70749,125123,0),(70750,125124,0),(70751,125125,0),(70752,125126,0),(70753,125127,0),(70754,125128,0),(70755,125129,0),(70756,125130,0),(70757,125131,0),(70758,125132,0),(70759,125135,0),(70760,125144,0),(70761,125145,0),(70762,125146,0),(70763,125147,0),(70764,125148,0),(70765,125149,0),(70766,125150,0),(70767,125151,0),(70768,125152,0),(70769,125153,0),(70770,125154,0),(70771,125155,0),(70772,125156,0),(70773,125157,0),(70774,125158,0),(70775,125159,0),(70776,125160,0),(70777,125161,0),(70778,125162,0),(70779,125163,0),(70780,125164,0),(70781,125165,0),(70782,125171,0),(70783,125172,0),(70784,125173,0),(70785,125174,0),(70786,125175,0),(70787,125176,0),(70788,125177,0),(70789,125178,0),(70790,125179,0),(70791,125180,0),(70792,125181,0),(70793,125182,0),(70794,125183,0),(70795,125184,0),(70796,125185,0),(70797,125186,0),(70798,125187,0),(70799,125188,0),(70800,125189,0),(70801,125190,0),(70802,125191,0),(70803,125192,0),(70804,125193,0),(70805,125194,0),(70806,125195,0),(70807,125196,0),(70808,125197,0),(70809,125198,0),(70810,125199,0),(70811,125200,0),(70812,125201,0),(70813,125202,0),(70814,125203,0),(70815,125204,0),(70816,125205,0),(70817,125206,0),(70818,125207,0),(70819,125208,0),(70820,125209,0),(70821,125210,0),(70822,125211,0),(70823,125212,0),(70824,125213,0),(70825,125214,0),(70826,125215,0),(70827,125220,0),(70828,125221,0),(70829,125227,0),(70830,125228,0),(70831,125229,0),(70832,125230,0),(70833,125231,0),(70834,125232,0),(70835,125233,0),(70836,125234,0),(70837,125235,0),(70838,125236,0),(70839,125237,0),(70840,125238,0),(70841,125239,0),(70842,125240,0),(70843,125241,0),(70844,125242,0),(70845,125243,0),(70846,125244,0),(70847,125245,0),(70848,125246,0),(70849,125247,0),(70850,125248,0),(70851,125249,0),(70852,125250,0),(70853,125251,0),(70854,125252,0),(70855,125253,0),(70856,125254,0),(70857,125255,0),(70858,125256,0),(70859,125257,0),(70860,125258,0),(70861,125259,0),(70862,125260,0),(70863,125261,0),(70864,125262,0),(70865,125263,0),(70866,125264,0),(70867,125265,0),(70868,125266,0),(70869,125267,0),(70870,125268,0),(70871,125269,0),(70872,125270,0),(70873,125271,0),(70874,125272,0),(70875,125273,0),(70876,125274,0),(70877,125275,0),(70878,125276,0),(70879,125277,0),(70880,125278,0),(70881,125279,0),(70882,125280,0),(70883,125281,0),(70884,125282,0),(70885,125283,0),(70886,125284,0),(70887,125285,0),(70888,125286,0),(70889,125287,0),(70890,125288,0),(70891,125289,0),(70892,125290,0),(70893,125291,0),(70894,125292,0),(70895,125293,0),(70896,125294,0),(70897,125295,0),(70898,125296,0),(70899,125297,0),(70900,125298,0),(70901,125299,0),(70902,125300,0),(70903,125301,0),(70904,125302,0),(70905,125303,0),(70906,125304,0),(70907,125305,0),(70908,125306,0),(70909,125307,0),(70910,125308,0),(70911,125309,0),(70912,125310,0),(70913,125311,0),(70914,125312,0),(70915,125313,0),(70916,125314,0),(70917,125315,0),(70918,125316,0),(70919,125317,0),(70920,125318,0),(70921,125319,0),(70922,125320,0),(70923,125321,0),(70924,125322,0),(70925,125323,0),(70926,125324,0),(70927,125330,0),(70928,125331,0),(70929,125352,0),(70930,125353,0),(70931,125354,0),(70932,125355,0),(70933,125356,0),(70934,125357,0),(70935,125358,0),(70936,125359,0),(70937,125360,0),(70938,125361,0),(70939,125362,0),(70940,125363,0),(70941,125364,0),(70942,125365,0),(70943,125366,0),(70944,125367,0),(70945,125368,0),(70946,125369,0),(70947,125370,0),(70948,125371,0),(70949,125372,0),(70950,125373,0),(70951,125379,0),(70952,125380,0),(70953,125381,0),(70954,125382,0),(70955,125383,0),(70956,125384,0),(70957,125385,0),(70958,125386,0),(70959,125387,0),(70960,125388,0),(70961,125389,0),(70962,125390,0),(70963,125391,0),(70964,125392,0),(70965,125393,0),(70966,125394,0),(70967,125395,0),(70968,125396,0),(70969,125397,0),(70970,125398,0),(70971,125399,0),(70972,125400,0),(70973,125401,0),(70974,125402,0),(70975,125403,0),(70976,125404,0),(70977,125405,0),(70978,125406,0),(70979,125407,0),(70980,125408,0),(70981,125409,0),(70982,125410,0),(70983,125411,0),(70984,125412,0),(70985,125413,0),(70986,125414,0),(70987,125415,0),(70988,125420,0),(70989,125421,0),(70990,125427,0),(70991,125428,0),(70992,125429,0),(70993,125430,0),(70994,125431,0),(70995,125432,0),(70996,125433,0),(70997,125434,0),(70998,125435,0),(70999,125436,0),(71000,125437,0),(71001,125438,0),(71002,125439,0),(71003,125440,0),(71004,125441,0),(71005,125442,0),(71006,125443,0),(71007,125444,0),(71008,125445,0),(71009,125446,0),(71010,125447,0),(71011,125448,0),(71012,125449,0),(71013,125450,0),(71014,125451,0),(71015,125452,0),(71016,125453,0),(71017,125454,0),(71018,125455,0),(71019,125456,0),(71020,125457,0),(71021,125458,0),(71022,125459,0),(71023,125460,0),(71024,125461,0),(71025,125462,0),(71026,125463,0),(71027,125464,0),(71028,125465,0),(71029,125466,0),(71030,125467,0),(71031,125468,0),(71032,125469,0),(71033,125470,0),(71034,125471,0),(71035,125472,0),(71036,125473,0),(71037,125474,0),(71038,125475,0),(71039,125476,0),(71040,125477,0),(71041,125478,0),(71042,125479,0),(71043,125480,0),(71044,125481,0),(71045,125482,0),(71046,125483,0),(71047,125484,0),(71048,125485,0),(71049,125486,0),(71050,125487,0),(71051,125488,0),(71052,125489,0),(71053,125490,0),(71054,125491,0),(71055,125492,0),(71056,125493,0),(71057,125494,0),(71058,125495,0),(71059,125496,0),(71060,125497,0),(71061,125498,0),(71062,125499,0),(71063,125500,0),(71064,125506,0),(71065,125526,0),(71066,125530,0),(71067,125531,0),(71068,125532,0),(71069,125533,0),(71070,125534,0),(71071,125535,0),(71072,125536,0),(71073,125537,0),(71074,125538,0),(71075,125539,0),(71076,125540,0),(71077,125544,0),(71078,125545,0),(71079,125546,0),(71080,125547,0),(71081,125548,0),(71082,125549,0),(71083,125550,0),(71084,125551,0),(71085,125552,0),(71086,125553,0),(71087,125554,0),(71088,125555,0),(71089,125556,0),(71090,125557,0),(71091,125558,0),(71092,125559,0),(71093,125560,0),(71094,125561,0),(71095,125562,0),(71096,125563,0),(71097,125570,0),(71098,125571,0),(71099,125572,0),(71100,125573,0),(71101,125574,0),(71102,125575,0),(71103,125576,0),(71104,125577,0),(71105,125578,0),(71106,125579,0),(71107,125580,0),(71108,125581,0),(71109,125582,0),(71110,125583,0),(71111,125584,0),(71112,125585,0),(71113,125586,0),(71114,125587,0),(71115,125588,0),(71116,125589,0),(71117,125590,0),(71118,125591,0),(71119,125592,0),(71120,125593,0),(71121,125594,0),(71122,125595,0),(71123,125596,0),(71124,125597,0),(71125,125598,0),(71126,125599,0),(71127,125600,0),(71128,125601,0),(71129,125602,0),(71130,125603,0),(71131,125604,0),(71132,125605,0),(71133,125606,0),(71134,125607,0),(71135,125608,0),(71136,125609,0),(71137,125612,0),(71138,125621,0),(71139,125622,0),(71140,125623,0),(71141,125624,0),(71142,125625,0),(71143,125626,0),(71144,125627,0),(71145,125628,0),(71146,125629,0),(71147,125630,0),(71148,125631,0),(71149,125632,0),(71150,125633,0),(71151,125634,0),(71152,125635,0),(71153,125636,0),(71154,125637,0),(71155,125638,0),(71156,125639,0),(71157,125640,0),(71158,125641,0),(71159,125642,0),(71160,125643,0),(71161,125644,0),(71162,125645,0),(71163,125646,0),(71164,125647,0),(71165,125648,0),(71166,125649,0),(71167,125650,0),(71168,125651,0),(71169,125652,0),(71170,125653,0),(71171,125654,0),(71172,125655,0),(71173,125656,0),(71174,125657,0),(71175,125658,0),(71176,125659,0),(71177,125660,0),(71178,125661,0),(71179,125662,0),(71180,125663,0),(71181,125664,0),(71182,125665,0),(71183,125666,0),(71184,125667,0),(71185,125668,0),(71186,125669,0),(71187,125670,0),(71188,125671,0),(71189,125672,0),(71190,125673,0),(71191,125674,0),(71192,125675,0),(71193,125676,0),(71194,125677,0),(71195,125678,0),(71196,125679,0),(71197,125680,0),(71198,125681,0),(71199,125682,0),(71200,125683,0),(71201,125684,0),(71202,125685,0),(71203,125686,0),(71204,125687,0),(71205,125688,0),(71206,125689,0),(71207,125690,0),(71208,125691,0),(71209,125692,0),(71210,125693,0),(71211,125694,0),(71212,125695,0),(71213,125696,0),(71214,125697,0),(71215,125698,0),(71216,125699,0),(71217,125700,0),(71218,125701,0),(71219,125702,0),(71220,125703,0),(71221,125704,0),(71222,125705,0),(71223,125706,0),(71224,125707,0),(71225,125708,0),(71226,125709,0),(71227,125710,0),(71228,125711,0),(71229,125712,0),(71230,125713,0),(71231,125714,0),(71232,125715,0),(71233,125716,0),(71234,125717,0),(71235,125718,0),(71236,125719,0),(71237,125720,0),(71238,125721,0),(71239,125722,0),(71240,125723,0),(71241,125724,0),(71242,125725,0),(71243,125726,0),(71244,125727,0),(71245,125728,0),(71246,125729,0),(71247,125730,0),(71248,125731,0),(71249,125732,0),(71250,125733,0),(71251,125734,0),(71252,125735,0),(71253,125736,0),(71254,125737,0),(71255,125738,0),(71256,125739,0),(71257,125740,0),(71258,125741,0),(71259,125742,0),(71260,125743,0),(71261,125744,0),(71262,125745,0),(71263,125746,0),(71264,125747,0),(71265,125748,0),(71266,125749,0),(71267,125750,0),(71268,125751,0),(71269,125752,0),(71270,125753,0),(71271,125754,0),(71272,125755,0),(71273,125756,0),(71274,125757,0),(71275,125758,0),(71276,125759,0),(71277,125760,0),(71278,125761,0),(71279,125762,0),(71280,125763,0),(71281,125764,0),(71282,125765,0),(71283,125766,0),(71284,125767,0),(71285,125768,0),(71286,125769,0),(71287,125770,0),(71288,125771,0),(71289,125772,0),(71290,125773,0),(71291,125774,0),(71292,125775,0),(71293,125776,0),(71294,125777,0),(71295,125778,0),(71296,125779,0),(71297,125780,0),(71298,125781,0),(71299,125782,0),(71300,125783,0),(71301,125784,0),(71302,125785,0),(71303,125789,0),(71304,125790,0),(71305,125791,0),(71306,125792,0),(71307,125793,0),(71308,125794,0),(71309,125795,0),(71310,125796,0),(71311,125797,0),(71312,125798,0),(71313,125799,0),(71314,125800,0),(71315,125806,0),(71316,125807,0),(71317,125808,0),(71318,125809,0),(71319,125810,0),(71320,125811,0),(71321,125812,0),(71322,125813,0),(71323,125814,0),(71324,125815,0),(71325,125816,0),(71326,125817,0),(71327,125818,0),(71328,125819,0),(71329,125820,0),(71330,125821,0),(71331,125822,0),(71332,125823,0),(71333,125824,0),(71334,125825,0),(71335,125826,0),(71336,125827,0),(71337,125828,0),(71338,125829,0),(71339,125830,0),(71340,125831,0),(71341,125832,0),(71342,125833,0),(71343,125834,0),(71344,125835,0),(71345,125836,0),(71346,125837,0),(71347,125838,0),(71348,125839,0),(71349,125840,0),(71350,125841,0),(71351,125842,0),(71352,125843,0),(71353,125844,0),(71354,125845,0),(71355,125846,0),(71356,125847,0),(71357,125848,0),(71358,125849,0),(71359,125850,0),(71360,125855,0),(71361,125856,0),(71362,125862,0),(71363,125863,0),(71364,125864,0),(71365,125865,0),(71366,125866,0),(71367,125867,0),(71368,125868,0),(71369,125869,0),(71370,125870,0),(71371,125871,0),(71372,125872,0),(71373,125873,0),(71374,125874,0),(71375,125875,0),(71376,125876,0),(71377,125877,0),(71378,125878,0),(71379,125879,0),(71380,125880,0),(71381,125881,0),(71382,125882,0),(71383,125883,0),(71384,125884,0),(71385,125885,0),(71386,125886,0),(71387,125887,0),(71388,125888,0),(71389,125889,0),(71390,125890,0),(71391,125891,0),(71392,125892,0),(71393,125893,0),(71394,125894,0),(71395,125895,0),(71396,125896,0),(71397,125897,0),(71398,125898,0),(71399,125899,0),(71400,125900,0),(71401,125901,0),(71402,125902,0),(71403,125903,0),(71404,125904,0),(71405,125905,0),(71406,125906,0),(71407,125907,0),(71408,125908,0),(71409,125909,0),(71410,125910,0),(71411,125911,0),(71412,125912,0),(71413,125913,0),(71414,125914,0),(71415,125915,0),(71416,125916,0),(71417,125917,0),(71418,125918,0),(71419,125919,0),(71420,125920,0),(71421,125921,0),(71422,125922,0),(71423,125923,0),(71424,125924,0),(71425,125925,0),(71426,125926,0),(71427,125927,0),(71428,125928,0),(71429,125929,0),(71430,125930,0),(71431,125931,0),(71432,125932,0),(71433,125933,0),(71434,125934,0),(71435,125935,0),(71436,125936,0),(71437,125937,0),(71438,125938,0),(71439,125939,0),(71440,125940,0),(71441,125941,0),(71442,125942,0),(71443,125943,0),(71444,125944,0),(71445,125945,0),(71446,125946,0),(71447,125947,0),(71448,125948,0),(71449,125949,0),(71450,125950,0),(71451,125951,0),(71452,125952,0),(71453,125953,0),(71454,125954,0),(71455,125955,0),(71456,125956,0),(71457,125957,0),(71458,125958,0),(71459,125959,0),(71460,125965,0),(71461,125966,0),(71462,125989,0),(71463,125990,0),(71464,125991,0),(71465,125992,0),(71466,125993,0),(71467,125994,0),(71468,125995,0),(71469,125996,0),(71470,125997,0),(71471,125998,0),(71472,125999,0),(71473,126000,0),(71474,126001,0),(71475,126002,0),(71476,126003,0),(71477,126004,0),(71478,126005,0),(71479,126006,0),(71480,126007,0),(71481,126008,0),(71482,126009,0),(71483,126010,0),(71484,126016,0),(71485,126017,0),(71486,126018,0),(71487,126019,0),(71488,126020,0),(71489,126021,0),(71490,126022,0),(71491,126023,0),(71492,126024,0),(71493,126025,0),(71494,126026,0),(71495,126027,0),(71496,126028,0),(71497,126029,0),(71498,126030,0),(71499,126031,0),(71500,126032,0),(71501,126033,0),(71502,126034,0),(71503,126035,0),(71504,126036,0),(71505,126037,0),(71506,126038,0),(71507,126039,0),(71508,126040,0),(71509,126041,0),(71510,126042,0),(71511,126043,0),(71512,126044,0),(71513,126045,0),(71514,126046,0),(71515,126047,0),(71516,126048,0),(71517,126049,0),(71518,126050,0),(71519,126051,0),(71520,126052,0),(71521,126057,0),(71522,126058,0),(71523,126064,0),(71524,126065,0),(71525,126066,0),(71526,126067,0),(71527,126068,0),(71528,126069,0),(71529,126070,0),(71530,126071,0),(71531,126072,0),(71532,126073,0),(71533,126074,0),(71534,126075,0),(71535,126076,0),(71536,126077,0),(71537,126078,0),(71538,126079,0),(71539,126080,0),(71540,126081,0),(71541,126082,0),(71542,126083,0),(71543,126084,0),(71544,126085,0),(71545,126086,0),(71546,126087,0),(71547,126088,0),(71548,126089,0),(71549,126090,0),(71550,126091,0),(71551,126092,0),(71552,126093,0),(71553,126094,0),(71554,126095,0),(71555,126096,0),(71556,126097,0),(71557,126098,0),(71558,126099,0),(71559,126100,0),(71560,126101,0),(71561,126102,0),(71562,126103,0),(71563,126104,0),(71564,126105,0),(71565,126106,0),(71566,126107,0),(71567,126108,0),(71568,126109,0),(71569,126110,0),(71570,126111,0),(71571,126112,0),(71572,126113,0),(71573,126114,0),(71574,126115,0),(71575,126116,0),(71576,126117,0),(71577,126118,0),(71578,126119,0),(71579,126120,0),(71580,126121,0),(71581,126122,0),(71582,126123,0),(71583,126124,0),(71584,126125,0),(71585,126126,0),(71586,126127,0),(71587,126128,0),(71588,126129,0),(71589,126130,0),(71590,126131,0),(71591,126132,0),(71592,126133,0),(71593,126134,0),(71594,126135,0),(71595,126136,0),(71596,126137,0),(71597,126143,0),(71598,126163,0),(71599,126167,0),(71600,126168,0),(71601,126169,0),(71602,126170,0),(71603,126171,0),(71604,126172,0),(71605,126173,0),(71606,126174,0),(71607,126175,0),(71608,126176,0),(71609,126177,0),(71610,126181,0),(71611,126182,0),(71612,126183,0),(71613,126184,0),(71614,126185,0),(71615,126186,0),(71616,126187,0),(71617,126188,0),(71618,126189,0),(71619,126190,0),(71620,126191,0),(71621,126192,0),(71622,126193,0),(71623,126194,0),(71624,126195,0),(71625,126196,0),(71626,126197,0),(71627,126198,0),(71628,126199,0),(71629,126200,0),(71630,126207,0),(71631,126208,0),(71632,126209,0),(71633,126210,0),(71634,126211,0),(71635,126212,0),(71636,126213,0),(71637,126214,0),(71638,126215,0),(71639,126216,0),(71640,126217,0),(71641,126218,0),(71642,126219,0),(71643,126220,0),(71644,126221,0),(71645,126222,0),(71646,126223,0),(71647,126224,0),(71648,126225,0),(71649,126226,0),(71650,126227,0),(71651,126228,0),(71652,126229,0),(71653,126230,0),(71654,126231,0),(71655,126232,0),(71656,126233,0),(71657,126234,0),(71658,126235,0),(71659,126236,0),(71660,126237,0),(71661,126238,0),(71662,126239,0),(71663,126240,0),(71664,126241,0),(71665,126242,0),(71666,126243,0),(71667,126244,0),(71668,126245,0),(71669,126246,0),(71670,126249,0),(71671,126258,0),(71672,126259,0),(71673,126260,0),(71674,126261,0),(71675,126262,0),(71676,126263,0),(71677,126264,0),(71678,126265,0),(71679,126266,0),(71680,126267,0),(71681,126268,0),(71682,126269,0),(71683,126270,0),(71684,126271,0),(71685,126272,0),(71686,126273,0),(71687,126274,0),(71688,126275,0),(71689,126276,0),(71690,126277,0),(71691,126278,0),(71692,126279,0),(71693,126285,0),(71694,126286,0),(71695,126287,0),(71696,126288,0),(71697,126289,0),(71698,126290,0),(71699,126291,0),(71700,126292,0),(71701,126293,0),(71702,126294,0),(71703,126295,0),(71704,126296,0),(71705,126297,0),(71706,126298,0),(71707,126299,0),(71708,126300,0),(71709,126301,0),(71710,126302,0),(71711,126303,0),(71712,126304,0),(71713,126305,0),(71714,126306,0),(71715,126307,0),(71716,126308,0),(71717,126309,0),(71718,126310,0),(71719,126311,0),(71720,126312,0),(71721,126313,0),(71722,126314,0),(71723,126315,0),(71724,126316,0),(71725,126317,0),(71726,126318,0),(71727,126319,0),(71728,126320,0),(71729,126321,0),(71730,126322,0),(71731,126323,0),(71732,126324,0),(71733,126325,0),(71734,126326,0),(71735,126327,0),(71736,126328,0),(71737,126329,0),(71738,126334,0),(71739,126335,0),(71740,126341,0),(71741,126342,0),(71742,126343,0),(71743,126344,0),(71744,126345,0),(71745,126346,0),(71746,126347,0),(71747,126348,0),(71748,126349,0),(71749,126350,0),(71750,126351,0),(71751,126352,0),(71752,126353,0),(71753,126354,0),(71754,126355,0),(71755,126356,0),(71756,126357,0),(71757,126358,0),(71758,126359,0),(71759,126360,0),(71760,126361,0),(71761,126362,0),(71762,126363,0),(71763,126364,0),(71764,126365,0),(71765,126366,0),(71766,126367,0),(71767,126368,0),(71768,126369,0),(71769,126370,0),(71770,126371,0),(71771,126372,0),(71772,126373,0),(71773,126374,0),(71774,126375,0),(71775,126376,0),(71776,126377,0),(71777,126378,0),(71778,126379,0),(71779,126380,0),(71780,126381,0),(71781,126382,0),(71782,126383,0),(71783,126384,0),(71784,126385,0),(71785,126386,0),(71786,126387,0),(71787,126388,0),(71788,126389,0),(71789,126390,0),(71790,126391,0),(71791,126392,0),(71792,126393,0),(71793,126394,0),(71794,126395,0),(71795,126396,0),(71796,126397,0),(71797,126398,0),(71798,126399,0),(71799,126400,0),(71800,126401,0),(71801,126402,0),(71802,126403,0),(71803,126404,0),(71804,126405,0),(71805,126406,0),(71806,126407,0),(71807,126408,0),(71808,126409,0),(71809,126410,0),(71810,126411,0),(71811,126412,0),(71812,126413,0),(71813,126414,0),(71814,126415,0),(71815,126416,0),(71816,126417,0),(71817,126418,0),(71818,126419,0),(71819,126420,0),(71820,126421,0),(71821,126422,0),(71822,126423,0),(71823,126424,0),(71824,126425,0),(71825,126426,0),(71826,126427,0),(71827,126428,0),(71828,126429,0),(71829,126430,0),(71830,126431,0),(71831,126432,0),(71832,126433,0),(71833,126434,0),(71834,126435,0),(71835,126436,0),(71836,126437,0),(71837,126438,0),(71838,126444,0),(71839,126445,0),(71840,126466,0),(71841,126467,0),(71842,126468,0),(71843,126469,0),(71844,126470,0),(71845,126471,0),(71846,126472,0),(71847,126473,0),(71848,126474,0),(71849,126475,0),(71850,126476,0),(71851,126477,0),(71852,126478,0),(71853,126479,0),(71854,126480,0),(71855,126481,0),(71856,126482,0),(71857,126483,0),(71858,126484,0),(71859,126485,0),(71860,126486,0),(71861,126487,0),(71862,126493,0),(71863,126494,0),(71864,126495,0),(71865,126496,0),(71866,126497,0),(71867,126498,0),(71868,126499,0),(71869,126500,0),(71870,126501,0),(71871,126502,0),(71872,126503,0),(71873,126504,0),(71874,126505,0),(71875,126506,0),(71876,126507,0),(71877,126508,0),(71878,126509,0),(71879,126510,0),(71880,126511,0),(71881,126512,0),(71882,126513,0),(71883,126514,0),(71884,126515,0),(71885,126516,0),(71886,126517,0),(71887,126518,0),(71888,126519,0),(71889,126520,0),(71890,126521,0),(71891,126522,0),(71892,126523,0),(71893,126524,0),(71894,126525,0),(71895,126526,0),(71896,126527,0),(71897,126528,0),(71898,126529,0),(71899,126534,0),(71900,126535,0),(71901,126541,0),(71902,126542,0),(71903,126543,0),(71904,126544,0),(71905,126545,0),(71906,126546,0),(71907,126547,0),(71908,126548,0),(71909,126549,0),(71910,126550,0),(71911,126551,0),(71912,126552,0),(71913,126553,0),(71914,126554,0),(71915,126555,0),(71916,126556,0),(71917,126557,0),(71918,126558,0),(71919,126559,0),(71920,126560,0),(71921,126561,0),(71922,126562,0),(71923,126563,0),(71924,126564,0),(71925,126565,0),(71926,126566,0),(71927,126567,0),(71928,126568,0),(71929,126569,0),(71930,126570,0),(71931,126571,0),(71932,126572,0),(71933,126573,0),(71934,126574,0),(71935,126575,0),(71936,126576,0),(71937,126577,0),(71938,126578,0),(71939,126579,0),(71940,126580,0),(71941,126581,0),(71942,126582,0),(71943,126583,0),(71944,126584,0),(71945,126585,0),(71946,126586,0),(71947,126587,0),(71948,126588,0),(71949,126589,0),(71950,126590,0),(71951,126591,0),(71952,126592,0),(71953,126593,0),(71954,126594,0),(71955,126595,0),(71956,126596,0),(71957,126597,0),(71958,126598,0),(71959,126599,0),(71960,126600,0),(71961,126601,0),(71962,126602,0),(71963,126603,0),(71964,126604,0),(71965,126605,0),(71966,126606,0),(71967,126607,0),(71968,126608,0),(71969,126609,0),(71970,126610,0),(71971,126611,0),(71972,126612,0),(71973,126613,0),(71974,126614,0),(71975,126620,0),(71976,126640,0),(71977,126644,0),(71978,126645,0),(71979,126646,0),(71980,126647,0),(71981,126648,0),(71982,126649,0),(71983,126650,0),(71984,126651,0),(71985,126652,0),(71986,126653,0),(71987,126654,0),(71988,126658,0),(71989,126659,0),(71990,126660,0),(71991,126661,0),(71992,126662,0),(71993,126663,0),(71994,126664,0),(71995,126665,0),(71996,126666,0),(71997,126667,0),(71998,126668,0),(71999,126669,0),(72000,126670,0),(72001,126671,0),(72002,126672,0),(72003,126673,0),(72004,126674,0),(72005,126675,0),(72006,126676,0),(72007,126677,0),(72008,126684,0),(72009,126685,0),(72010,126686,0),(72011,126687,0),(72012,126688,0),(72013,126689,0),(72014,126690,0),(72015,126691,0),(72016,126692,0),(72017,126693,0),(72018,126694,0),(72019,126695,0),(72020,126696,0),(72021,126697,0),(72022,126698,0),(72023,126699,0),(72024,126700,0),(72025,126701,0),(72026,126702,0),(72027,126703,0),(72028,126704,0),(72029,126705,0),(72030,126706,0),(72031,126707,0),(72032,126708,0),(72033,126709,0),(72034,126710,0),(72035,126711,0),(72036,126712,0),(72037,126713,0),(72038,126714,0),(72039,126715,0),(72040,126716,0),(72041,126717,0),(72042,126718,0),(72043,126719,0),(72044,126720,0),(72045,126721,0),(72046,126722,0),(72047,126723,0),(72048,126726,0),(72049,126735,0),(72050,126736,0),(72051,126737,0),(72052,126738,0),(72053,126739,0),(72054,126740,0),(72055,126741,0),(72056,126742,0),(72057,126743,0),(72058,126744,0),(72059,126745,0),(72060,126746,0),(72061,126747,0),(72062,126748,0),(72063,126749,0),(72064,126750,0),(72065,126751,0),(72066,126752,0),(72067,126753,0),(72068,126754,0),(72069,126755,0),(72070,126756,0),(72071,126757,0),(72072,126758,0),(72073,126759,0),(72074,126760,0),(72075,126761,0),(72076,126762,0),(72077,126763,0),(72078,126764,0),(72079,126765,0),(72080,126766,0),(72081,126767,0),(72082,126768,0),(72083,126769,0),(72084,126770,0),(72085,126771,0),(72086,126772,0),(72087,126773,0),(72088,126774,0),(72089,126775,0),(72090,126776,0),(72091,126777,0),(72092,126778,0),(72093,126779,0),(72094,126780,0),(72095,126781,0),(72096,126782,0),(72097,126783,0),(72098,126784,0),(72099,126785,0),(72100,126786,0),(72101,126787,0),(72102,126788,0),(72103,126789,0),(72104,126790,0),(72105,126791,0),(72106,126792,0),(72107,126793,0),(72108,126794,0),(72109,126795,0),(72110,126796,0),(72111,126797,0),(72112,126798,0),(72113,126799,0),(72114,126800,0),(72115,126801,0),(72116,126802,0),(72117,126803,0),(72118,126804,0),(72119,126805,0),(72120,126806,0),(72121,126807,0),(72122,126808,0),(72123,126809,0),(72124,126810,0),(72125,126811,0),(72126,126812,0),(72127,126813,0),(72128,126814,0),(72129,126815,0),(72130,126816,0),(72131,126817,0),(72132,126818,0),(72133,126819,0),(72134,126820,0),(72135,126821,0),(72136,126822,0),(72137,126823,0),(72138,126824,0),(72139,126825,0),(72140,126826,0),(72141,126827,0),(72142,126828,0),(72143,126829,0),(72144,126830,0),(72145,126831,0),(72146,126832,0),(72147,126833,0),(72148,126834,0),(72149,126835,0),(72150,126836,0),(72151,126837,0),(72152,126838,0),(72153,126839,0),(72154,126840,0),(72155,126841,0),(72156,126842,0),(72157,126843,0),(72158,126844,0),(72159,126845,0),(72160,126846,0),(72161,126847,0),(72162,126848,0),(72163,126849,0),(72164,126850,0),(72165,126851,0),(72166,126852,0),(72167,126853,0),(72168,126854,0),(72169,126855,0),(72170,126856,0),(72171,126857,0),(72172,126858,0),(72173,126859,0),(72174,126860,0),(72175,126861,0),(72176,126862,0),(72177,126863,0),(72178,126864,0),(72179,126865,0),(72180,126866,0),(72181,126867,0),(72182,126868,0),(72183,126869,0),(72184,126870,0),(72185,126871,0),(72186,126872,0),(72187,126873,0),(72188,126874,0),(72189,126875,0),(72190,126876,0),(72191,126877,0),(72192,126878,0),(72193,126879,0),(72194,126880,0),(72195,126881,0),(72196,126882,0),(72197,126883,0),(72198,126884,0),(72199,126885,0),(72200,126886,0),(72201,126887,0),(72202,126888,0),(72203,126889,0),(72204,126890,0),(72205,126891,0),(72206,126892,0),(72207,126893,0),(72208,126894,0),(72209,126895,0),(72210,126896,0),(72211,126897,0),(72212,126898,0),(72213,126899,0),(72214,126937,0),(72215,126938,0),(72216,126953,0),(72217,126954,0),(72218,126955,0),(72219,126956,0),(72220,126957,0),(72221,126958,0),(72222,126959,0),(72223,126960,0),(72224,126961,0),(72225,126962,0),(72226,126963,0),(72227,126964,0),(72228,126965,0),(72229,126966,0),(72230,126967,0),(72231,126968,0),(72232,126969,0),(72233,126970,0),(72234,126971,0),(72235,126972,0),(72236,126973,0),(72237,126974,0),(72238,126975,0),(72239,126976,0),(72240,126977,0),(72241,126978,0),(72242,126979,0),(72243,126980,0),(72244,126981,0),(72245,126982,0),(72265,127010,0),(72266,127011,0),(72267,127012,0),(72304,127049,0),(72305,127050,0),(72306,127051,0),(72307,127052,0),(72308,127053,0),(72309,127054,0),(72310,127055,0),(72318,127063,0),(72319,127064,0),(72320,127065,0),(72321,127066,0),(72326,127071,0),(72327,127072,0),(72328,127073,0),(72329,127074,0),(72330,127075,0),(72331,127076,0),(72332,127077,0),(72333,127078,0),(72334,127079,0),(72335,127080,0),(72336,127081,0),(72337,127082,0),(72338,127083,0),(72339,127084,0),(72340,127085,0),(72341,127086,0),(72342,127087,0),(72343,127088,0),(72344,127089,0),(72345,127090,0),(72346,127091,0),(72347,127092,0),(72348,127093,0),(72349,127094,0),(72350,127095,0),(72351,127096,0),(72352,127097,0),(72353,127098,0),(72354,127099,0),(72355,127100,0),(72356,127101,0),(72357,127102,0),(72358,127103,0),(72359,127104,0),(72360,127105,0),(72361,127106,0),(72362,127107,0),(72363,127108,0),(72364,127109,0),(72365,127110,0),(72366,127111,0),(72367,127112,0),(72368,127113,0),(72369,127114,0),(72376,127149,0),(72377,127150,0),(72378,127151,0),(72379,127152,0),(72380,127153,0),(72381,127154,0),(72382,127155,0),(72383,127156,0),(72384,127157,0),(72385,127158,0),(72386,127159,0),(72387,127160,0),(72388,127162,0),(72389,127163,0),(72390,127164,0),(72391,127165,0),(72392,127166,0),(72393,127168,0),(72394,127169,0),(72395,127170,0),(72396,127171,0),(72397,127172,0),(72398,127175,0),(72399,127176,0),(72400,127177,0),(72401,127178,0),(72402,127179,0),(72403,127180,0),(72404,127181,0),(72405,127182,0),(72406,127183,0),(72407,127185,0),(72408,127186,0),(72409,127187,0),(72410,127188,0),(72411,127189,0),(72412,127190,0),(72413,127191,0),(72414,127192,0),(72415,127194,0),(72416,127195,0),(72417,127196,0),(72418,127197,0),(72419,127199,0),(72420,127200,0),(72421,127202,0),(72422,127203,0),(72423,127204,0),(72424,127206,0),(72425,127207,0),(72426,127208,0),(72427,127209,0),(72428,127210,0),(72429,127211,0),(72430,127212,0),(72431,127214,0),(72432,127215,0),(72433,127216,0),(72434,127217,0),(72435,127218,0),(72436,127219,0),(72437,127220,0),(72438,127221,0),(72439,127222,0),(72440,127223,0),(72441,127224,0),(72442,127225,0),(72443,127226,0),(72444,127228,0),(72445,127229,0),(72446,127230,0),(72447,127232,0),(72448,127233,0),(72449,127234,0),(72450,127235,0),(72451,127236,0),(72452,127237,0),(72453,127238,0),(72454,127240,0),(72455,127241,0),(72456,127242,0),(72457,127243,0),(72458,127244,0),(72459,127246,0),(72460,127247,0),(72461,127248,0),(72462,127249,0),(72463,127250,0),(72464,127251,0),(72465,127252,0),(72466,127253,0),(72467,127254,0),(72468,127255,0),(72469,127256,0),(72470,127258,0),(72471,127259,0),(72473,125016,0),(72474,127274,0),(72475,127275,0),(72479,127296,0),(72480,127297,0),(72481,127298,0),(72482,127299,0),(72483,127300,0),(72484,127301,0),(72485,127302,0),(72486,127303,0),(72487,127304,0),(72488,127305,0),(72489,127306,0),(72490,127307,0),(72491,127308,0),(72492,127309,0),(72493,127310,0),(72494,127311,0),(72495,127312,0),(72496,127313,0),(72497,127314,0),(72498,127315,0),(72499,127316,0),(72500,127317,0),(72501,127318,0),(72502,127319,0),(72503,127320,0),(72504,127321,0),(72505,127322,0),(72506,127323,0),(72507,127324,0),(72508,127325,0),(72509,127326,0),(72510,127327,0),(72511,127328,0),(72512,127329,0),(72513,127330,0),(72514,127331,0),(72515,127332,0),(72516,127333,0),(72517,127334,0),(72518,127335,0),(72519,127336,0),(72520,127337,0),(72521,127338,0),(72522,127339,0),(72523,127340,0),(72524,127341,0),(72526,127347,0),(72527,127348,0),(72528,127354,0),(72529,127355,0),(72530,127356,0),(72531,127357,0),(72532,127365,0),(72533,127366,0),(72534,127369,0),(72535,127371,0),(72536,127374,0),(72537,127375,0),(72538,127376,0),(72539,127377,0),(72540,127378,0),(72541,127379,0),(72542,127380,0),(72543,127381,0),(72551,127419,0),(72552,127420,0),(72553,127421,0),(72554,127422,0),(72555,127423,0),(72556,127430,0),(72557,127431,0),(72558,127432,0),(72559,127433,0),(72560,127434,0),(72561,127435,0),(72562,127436,0),(72563,127437,0),(72564,127438,0),(72565,127440,0),(72566,127442,0),(72567,127443,0),(72568,127444,0),(72569,127445,0),(72570,127446,0),(72571,127447,0),(72572,127449,0),(72573,127450,0),(72574,127451,0),(72575,127452,0),(72576,127453,0),(72577,127454,0),(72578,127455,0),(72579,127456,0),(72580,127457,0),(72581,127458,0),(72582,127459,0),(72583,127460,0),(72584,127461,0),(72585,127462,0),(72586,127463,0),(72587,127464,0),(72588,127465,0),(72589,127467,0),(72590,127468,0),(72591,127469,0),(72592,127471,0),(72593,127472,0),(72594,127473,0),(72595,127475,0),(72596,127476,0),(72597,127477,0),(72598,127478,0),(72599,127479,0),(72600,127480,0),(72601,127481,0),(72602,127482,0),(72603,127483,0),(72604,127484,0),(72605,127486,0),(72606,127487,0),(72607,127488,0),(72608,127489,0),(72609,127490,0),(72610,127491,0),(72611,127492,0),(72612,127494,0),(72613,127496,0),(72614,127497,0),(72615,127498,0),(72616,127499,0),(72617,127500,0),(72619,127502,0),(72620,127503,0),(72621,127504,0),(72622,127505,0),(72623,127506,0),(72624,127507,0),(72625,127508,0),(72626,127509,0),(72627,127510,0),(72628,127511,0),(72629,127513,0),(72630,127514,0),(72631,127515,0),(72632,127516,0),(72633,127517,0),(72634,127518,0),(72635,127519,0),(72636,127520,0),(72637,127521,0),(72638,127522,0),(72639,127523,0),(72640,127524,0),(72641,127525,0),(72642,127526,0),(72643,127527,0),(72644,127528,0),(72645,127529,0),(72646,127530,0),(72647,127531,0),(72648,127533,0),(72649,127534,0),(72650,127535,0),(72651,127536,0),(72652,127537,0),(72653,127538,0),(72654,127539,0),(72655,127540,0),(72656,127541,0),(72657,127542,0),(72658,127543,0),(72659,127544,0),(72660,127545,0),(72661,127546,0),(72662,127547,0),(72663,127548,0),(72664,127549,0),(72665,127551,0),(72666,127552,0),(72667,127553,0),(72668,127555,0),(72669,127556,0),(72670,127557,0),(72671,127559,0),(72672,127560,0),(72673,127561,0),(72674,127564,0),(72675,127565,0),(72676,127566,0),(72677,127567,0),(72678,127568,0),(72679,127569,0),(72680,127571,0),(72681,127572,0),(72682,127573,0),(72683,127574,0),(72684,127575,0),(72685,127576,0),(72686,127577,0),(72687,127578,0),(72688,127579,0),(72689,127580,0),(72690,127581,0),(72691,127582,0),(72692,127583,0),(72693,127585,0),(72694,127586,0),(72695,127587,0),(72696,127589,0),(72697,127590,0),(72698,127591,0),(72699,127592,0),(72700,127593,0),(72701,127595,0),(72702,127596,0),(72703,127597,0),(72704,127598,0),(72705,127599,0),(72706,127600,0),(72707,127601,0),(72708,127602,0),(72709,127603,0),(72710,127604,0),(72711,127605,0),(72712,127606,0),(72713,127607,0),(72714,127608,0),(72715,127609,0),(72716,127610,0),(72717,127612,0),(72718,127613,0),(72719,127614,0),(72720,127615,0),(72721,127616,0),(72722,127617,0),(72723,127619,0),(72724,127620,0),(72725,127621,0),(72726,127623,0),(72727,127624,0),(72728,127625,0),(72729,127626,0),(72730,127627,0),(72731,127628,0),(72732,127629,0),(72733,127630,0),(72734,127631,0),(72735,127632,0),(72736,127633,0),(72737,127635,0),(72738,127637,0),(72739,127638,0),(72740,127639,0),(72741,127640,0),(72742,127642,0),(72743,127643,0),(72744,127645,0),(72745,127646,0),(72746,127647,0),(72747,127648,0),(72748,127650,0),(72750,127653,0),(72751,127656,0),(72752,127658,0),(72753,127664,0),(72754,127665,0),(72761,127694,0),(72762,127826,0),(72763,127827,0),(72764,127828,0),(72767,127832,0),(72787,127862,0),(72830,127971,0),(72831,127971,1),(72832,127971,3),(72833,127972,0),(72834,127972,1),(72835,127972,3),(72836,127973,0),(72837,127973,1),(72838,127973,3),(72839,127974,0),(72840,127974,1),(72841,127974,3),(72842,127975,0),(72843,127975,1),(72844,127975,3),(72845,127981,0),(72846,127981,5),(72847,127981,1),(72848,127981,3),(72849,127982,0),(72850,127982,5),(72851,127982,1),(72852,127982,3),(72853,127983,0),(72854,127983,5),(72855,127983,1),(72856,127983,3),(72857,127984,0),(72858,127984,5),(72859,127984,1),(72860,127984,3),(72871,128028,0),(72872,128028,5),(72873,128028,1),(72874,128028,4),(72875,128029,0),(72876,128029,5),(72877,128029,1),(72878,128029,4),(72879,128030,0),(72880,128030,5),(72881,128030,1),(72882,128030,4),(72883,128031,0),(72884,128031,5),(72885,128031,1),(72886,128031,4),(72887,128032,0),(72888,128032,5),(72889,128032,1),(72890,128032,4),(72891,128033,0),(72892,128033,5),(72893,128033,1),(72894,128033,4),(72895,128034,0),(72896,128034,5),(72897,128034,1),(72898,128034,4),(72899,128035,0),(72900,128035,5),(72901,128035,1),(72902,128035,4),(72903,128036,0),(72904,128036,5),(72905,128036,1),(72906,128036,4),(72907,128037,0),(72908,128037,5),(72909,128037,1),(72910,128037,4),(72911,128038,0),(72912,128038,5),(72913,128038,1),(72914,128038,4),(72915,128039,0),(72916,128039,5),(72917,128039,1),(72918,128039,4),(72919,128040,0),(72920,128040,5),(72921,128040,1),(72922,128040,4),(72923,128041,0),(72924,128041,5),(72925,128041,1),(72926,128041,4),(72927,128042,0),(72928,128042,5),(72929,128042,1),(72930,128042,4),(72931,128043,0),(72932,128043,5),(72933,128043,1),(72934,128043,4),(72935,128044,0),(72936,128044,5),(72937,128044,1),(72938,128044,4),(72939,128045,0),(72940,128045,5),(72941,128045,1),(72942,128045,4),(72943,128046,0),(72944,128046,5),(72945,128046,1),(72946,128046,4),(72947,128047,0),(72948,128047,5),(72949,128047,1),(72950,128047,4),(72951,128048,0),(72952,128048,5),(72953,128048,1),(72954,128048,4),(72955,128049,0),(72956,128049,5),(72957,128049,1),(72958,128049,4),(72959,128050,0),(72960,128050,5),(72961,128050,1),(72962,128050,4),(72963,128051,0),(72964,128051,5),(72965,128051,1),(72966,128051,4),(72967,128052,0),(72968,128052,5),(72969,128052,1),(72970,128052,4),(72971,128053,0),(72972,128053,5),(72973,128053,1),(72974,128053,4),(72975,128054,0),(72976,128054,5),(72977,128054,1),(72978,128054,4),(72979,128055,0),(72980,128055,5),(72981,128055,1),(72982,128055,4),(72983,128056,0),(72984,128056,5),(72985,128056,1),(72986,128056,4),(72987,128057,0),(72988,128057,5),(72989,128057,1),(72990,128057,4),(72991,128058,0),(72992,128058,5),(72993,128058,1),(72994,128058,4),(72995,128059,0),(72996,128059,5),(72997,128059,1),(72998,128059,4),(72999,128060,0),(73000,128060,5),(73001,128060,1),(73002,128060,4),(73003,128061,0),(73004,128061,5),(73005,128061,1),(73006,128061,4),(73007,128062,0),(73008,128062,5),(73009,128062,1),(73010,128062,4),(73011,128063,0),(73012,128063,5),(73013,128063,1),(73014,128063,4),(73015,128064,0),(73016,128064,5),(73017,128064,1),(73018,128064,4),(73019,128065,0),(73020,128065,5),(73021,128065,1),(73022,128065,4),(73023,128066,0),(73024,128066,5),(73025,128066,1),(73026,128066,4),(73027,128067,0),(73028,128067,5),(73029,128067,1),(73030,128067,4),(73031,128068,0),(73032,128068,5),(73033,128068,1),(73034,128068,4),(73035,128069,0),(73036,128069,5),(73037,128069,1),(73038,128069,4),(73039,128070,0),(73040,128070,5),(73041,128070,1),(73042,128070,4),(73043,128071,0),(73044,128071,5),(73045,128071,1),(73046,128071,4),(73047,128072,0),(73048,128072,5),(73049,128072,1),(73050,128072,4),(73051,128073,0),(73052,128073,5),(73053,128073,1),(73054,128073,4),(73055,128074,0),(73056,128074,5),(73057,128074,1),(73058,128074,4),(73059,128075,0),(73060,128075,5),(73061,128075,1),(73062,128075,4),(73063,128076,0),(73064,128076,5),(73065,128076,1),(73066,128076,4),(73067,128077,0),(73068,128077,5),(73069,128077,1),(73070,128077,4),(73071,128078,0),(73072,128078,5),(73073,128078,1),(73074,128078,4),(73075,128079,0),(73076,128079,5),(73077,128079,1),(73078,128079,4),(73079,128080,0),(73080,128080,5),(73081,128080,1),(73082,128080,4),(73083,128081,0),(73084,128081,5),(73085,128081,1),(73086,128081,4),(73087,128082,0),(73088,128082,5),(73089,128082,1),(73090,128082,4),(73091,128083,0),(73092,128083,5),(73093,128083,1),(73094,128083,4),(73095,128084,0),(73096,128084,5),(73097,128084,1),(73098,128084,4),(73099,128085,0),(73100,128085,5),(73101,128085,1),(73102,128085,4),(73103,128086,0),(73104,128086,5),(73105,128086,1),(73106,128086,4),(73107,128087,0),(73108,128087,5),(73109,128087,1),(73110,128087,4),(73111,128088,0),(73112,128088,5),(73113,128088,1),(73114,128088,4),(73115,128089,0),(73116,128089,5),(73117,128089,1),(73118,128089,4),(73119,128090,0),(73120,128090,5),(73121,128090,1),(73122,128090,4),(73123,128091,0),(73124,128091,5),(73125,128091,1),(73126,128091,4),(73127,128092,4),(73129,128093,4),(73131,128094,4),(73133,128095,4),(73135,128096,4),(73137,128097,4),(73139,128098,4),(73141,128099,0),(73143,128100,4),(73145,128101,4),(73147,128102,0),(73148,128102,4),(73149,128103,0),(73150,128103,4),(73151,128104,0),(73152,128104,4),(73153,128105,0),(73154,128105,4),(73155,128106,0),(73156,128106,4),(73157,128112,4),(73159,128118,4),(73161,128119,4),(73163,128120,0),(73164,128120,5),(73165,128120,1),(73166,128120,4),(73167,128121,0),(73168,128121,5),(73169,128121,1),(73170,128121,4),(73171,128122,0),(73172,128122,5),(73173,128122,1),(73174,128122,4),(73175,128123,0),(73176,128123,5),(73177,128123,1),(73178,128123,4),(73179,128124,0),(73180,128124,5),(73181,128124,1),(73182,128124,4),(73183,128125,0),(73184,128125,4),(73185,128126,0),(73186,128126,5),(73187,128126,1),(73188,128126,4),(73189,128127,0),(73190,128127,5),(73191,128127,1),(73192,128127,4),(73193,128128,0),(73194,128128,5),(73195,128128,1),(73196,128128,4),(73197,128129,0),(73198,128129,5),(73199,128129,1),(73200,128129,4),(73201,128130,0),(73202,128130,5),(73203,128130,1),(73204,128130,4),(73205,128131,0),(73206,128131,5),(73207,128131,1),(73208,128131,4),(73209,128132,0),(73210,128132,5),(73211,128132,1),(73212,128132,4),(73213,128133,0),(73214,128133,5),(73215,128133,1),(73216,128133,4),(73217,128134,0),(73218,128134,5),(73219,128134,1),(73220,128134,4),(73221,128135,0),(73222,128135,5),(73223,128135,1),(73224,128135,4),(73225,128136,0),(73226,128136,5),(73227,128136,1),(73228,128136,4),(73229,128137,0),(73230,128137,5),(73231,128137,1),(73232,128137,4),(73233,128138,0),(73234,128138,5),(73235,128138,1),(73236,128138,4),(73237,128139,0),(73238,128139,5),(73239,128139,1),(73240,128139,4),(73269,128167,0),(73270,128167,5),(73271,128167,1),(73272,128167,4),(73273,128168,0),(73274,128168,5),(73275,128168,1),(73276,128168,4),(73277,128170,0),(73278,128170,5),(73279,128170,1),(73280,128170,4),(73281,128171,0),(73282,128171,5),(73283,128171,1),(73284,128171,4),(73285,128174,0),(73286,128174,5),(73287,128174,1),(73288,128174,4),(73289,128175,0),(73290,128175,5),(73291,128175,1),(73292,128175,4),(73293,128176,0),(73294,128176,5),(73295,128176,1),(73296,128176,4),(73297,128177,0),(73298,128177,5),(73299,128177,1),(73300,128177,4),(73301,128186,0),(73302,128186,4),(73303,128187,0),(73304,128187,4),(73305,128188,0),(73306,128188,4),(73307,128189,0),(73308,128189,4),(73309,128190,0),(73310,128190,4),(73311,128191,4),(73313,128192,4),(73315,128193,4),(73317,128194,4),(73319,128195,4),(73321,128196,4),(73323,128197,4),(73325,128198,0),(73326,128198,4),(73327,128199,4),(73329,128200,4),(73331,128201,4),(73333,128202,4),(73339,128218,0),(73341,128226,0),(73373,128278,0),(73374,128279,0),(73375,128284,0),(73381,128295,0),(73382,128295,5),(73383,128295,1),(73384,128295,4),(73385,128298,0),(73386,128298,5),(73387,128298,1),(73388,128298,4),(73389,128299,0),(73390,128299,5),(73391,128299,1),(73392,128299,4),(73393,128300,0),(73394,128300,5),(73395,128300,1),(73396,128300,4),(73407,128323,0),(73423,124200,0),(73424,128349,0),(73428,128350,0),(73432,128351,0),(73436,128352,0),(73444,128362,0),(73445,128363,0),(73446,128364,0),(73447,128365,0),(73448,128366,0),(73483,128447,0),(73484,128448,0),(73485,128449,0),(73486,128450,0),(73487,128455,0),(73488,128456,0),(73489,128457,0),(73490,128458,0),(73491,128459,0),(73492,128460,0),(73493,128461,0),(73494,128463,0),(73495,128464,0),(73496,128465,0),(73497,128466,0),(73498,128467,0),(73499,128468,0),(73500,128469,0),(73501,128470,0),(73557,128629,0),(73784,128961,0),(73785,128962,0),(74025,129379,0),(74026,129380,0),(74027,129381,0),(74028,129382,0),(74029,129383,0),(74030,129384,0),(74031,129389,0),(74032,129391,0),(74033,129392,0),(74034,129393,0),(74035,129394,0),(74036,129395,0),(74037,129396,0),(74038,129397,0),(74039,129398,0),(74040,129399,0),(74041,129400,0),(74042,129401,0),(74043,129402,0),(74044,129403,0),(74045,129404,0),(74051,129415,0),(74052,129416,0),(74053,129417,0),(74054,129418,0),(74055,129419,0),(74056,129420,0),(74057,129421,0),(74058,129422,0),(74059,129423,0),(74060,129424,0),(74061,129425,0),(74062,129426,0),(74063,129427,0),(74064,129428,0),(74065,129429,0),(74066,129430,0),(74067,129431,0),(74068,129432,0),(74069,129433,0),(74070,129434,0),(74071,129435,0),(74072,129436,0),(74073,129442,0),(74074,129443,0),(74075,129444,0),(74076,129445,0),(74077,129446,0),(74078,129447,0),(74079,129453,0),(74080,129454,0),(74081,129455,0),(74082,129456,0),(74083,129457,0),(74084,129463,0),(74085,129464,0),(74086,129465,0),(74087,129466,0),(74088,129467,0),(74089,129468,0),(74090,129469,0),(74091,129470,0),(74092,129471,0),(74093,129472,0),(74094,129473,0),(74095,129478,0),(74096,129480,0),(74097,129481,0),(74098,129482,0),(74099,129483,0),(74100,129484,0),(74101,129485,0),(74102,129486,0),(74103,129487,0),(74104,129488,0),(74105,129489,0),(74106,129490,0),(74107,129491,0),(74108,129493,0),(74109,129498,0),(74110,129499,0),(74111,129500,0),(74112,129501,0),(74113,129502,0),(74114,129508,0),(74115,129509,0),(74116,129515,0),(74117,129516,0),(74118,129517,0),(74119,129518,0),(74120,129519,0),(74121,129520,0),(74122,129521,0),(74123,129522,0),(74124,129523,0),(74125,129524,0),(74126,129525,0),(74127,129526,0),(74128,129527,0),(74129,129528,0),(74130,129529,0),(74131,129530,0),(74132,129531,0),(74133,129532,0),(74134,129533,0),(74135,129534,0),(74136,129535,0),(74137,129536,0),(74138,129537,0),(74139,129538,0),(74140,129544,0),(74141,129545,0),(74142,129546,0),(74143,129547,0),(74144,129548,0),(74145,129549,0),(74146,129555,0),(74147,129556,0),(74148,129557,0),(74149,129558,0),(74150,129564,0),(74151,129565,0),(74152,129566,0),(74153,129567,0),(74154,129568,0),(74155,129569,0),(74156,129570,0),(74157,129571,0),(74158,129572,0),(74159,129578,0),(74160,129579,0),(74161,129580,0),(74162,129581,0),(74163,129582,0),(74164,129583,0),(74165,129584,0),(74166,129585,0),(74167,129586,0),(74168,129587,0),(74169,129593,0),(74170,129594,0),(74171,129595,0),(74172,129596,0),(74173,129597,0),(74174,129598,0),(74175,129599,0),(74176,129600,0),(74177,129601,0),(74178,129602,0),(74179,129603,0),(74180,129609,0),(74181,129620,0),(74182,129621,0),(74183,129622,0),(74184,129623,0),(74185,129624,0),(74186,129625,0),(74187,129626,0),(74188,129627,0),(74189,129628,0),(74190,129629,0),(74191,129630,0),(74192,129631,0),(74193,129632,0),(74194,129633,0),(74195,129634,0),(74196,129635,0),(74197,129636,0),(74198,129637,0),(74199,129638,0),(74200,129639,0),(74201,129645,0),(74202,129646,0),(74203,129647,0),(74204,129648,0),(74205,129649,0),(74206,129650,0),(74207,129651,0),(74208,129652,0),(74209,129653,0),(74210,129654,0),(74211,129655,0),(74212,129656,0),(74213,129657,0),(74214,129658,0),(74215,129659,0),(74216,129660,0),(74217,129661,0),(74218,129662,0),(74219,129663,0),(74220,129664,0),(74221,129665,0),(74222,129666,0),(74223,129667,0),(74224,129668,0),(74225,129669,0),(74226,129675,0),(74227,129676,0),(74228,129677,0),(74229,129678,0),(74230,129679,0),(74231,129680,0),(74232,129681,0),(74233,129682,0),(74234,129683,0),(74235,129689,0),(74236,129690,0),(74237,129691,0),(74238,129692,0),(74239,129693,0),(74240,129694,0),(74241,129700,0),(74242,129701,0),(74243,129702,0),(74244,129703,0),(74245,129709,0),(74246,129710,0),(74247,129711,0),(74248,129712,0),(74249,129713,0),(74250,129714,0),(74251,129715,0),(74252,129716,0),(74253,129717,0),(74320,129827,0),(74321,129828,0),(74322,129829,0),(74323,129830,0),(74324,129831,0),(74325,129832,0),(74326,129833,0),(74327,129834,0),(74328,129835,0),(74329,129836,0),(74330,129837,0),(74331,129838,0),(74332,129839,0),(74333,129840,0),(74334,129841,0),(74335,129842,0),(74336,129843,0),(74337,129844,0),(74338,129845,0),(74339,129846,0),(74340,129847,0),(74341,129852,0),(74342,129853,0),(74343,129854,0),(74344,129855,0),(74345,129856,0),(74346,129857,0),(74347,129858,0),(74348,129859,0),(74349,129861,0),(74350,129868,0),(74351,129869,0),(74352,129870,0),(74353,129871,0),(74354,129877,0),(74355,129879,0),(74356,129880,0),(74357,129881,0),(74358,129887,0),(74359,129889,0),(74360,129890,0),(74361,129891,0),(74362,129892,0),(74365,129931,0),(74366,129934,0),(74367,129935,0),(74368,129936,0),(76567,133179,0),(76568,133180,0),(76569,133181,0),(76570,133182,0),(76571,133184,0),(76572,133185,0),(76573,133186,0),(76574,133187,0),(76575,133188,0),(76576,133190,0),(76577,133191,0),(76578,133193,0),(76579,133195,0),(76580,133196,0),(76581,133198,0),(76582,133200,0),(76583,133202,0),(76584,133205,0),(76585,133207,0),(76586,133208,0),(76587,133209,0),(76588,133212,0),(76589,133213,0),(76590,133214,0),(76591,133217,0),(76592,133218,0),(76593,133219,0),(76594,133220,0),(76595,133221,0),(76596,133223,0),(76597,133225,0),(76598,133226,0),(76599,133228,0),(76600,133229,0),(76601,133230,0),(76602,133231,0),(76603,133232,0),(76604,133233,0),(76605,133234,0),(76606,133235,0),(76607,133237,0),(76608,133239,0),(76609,133240,0),(76610,133242,0),(76611,133243,0),(76612,133244,0),(76613,133245,0),(76614,133247,0),(76615,133249,0),(76616,133250,0),(76617,133251,0),(76618,133253,0),(76619,133254,0),(76620,133256,0),(76621,133257,0),(76622,133258,0),(76623,133259,0),(76624,133261,0),(76625,133262,0),(76626,133264,0),(76627,133265,0),(76628,133267,0),(76629,133270,0),(76630,133271,0),(76631,133272,0),(76632,133274,0),(76633,133276,0),(76634,133277,0),(76635,133278,0),(76636,133280,0),(76637,133283,0),(76638,133284,0),(76639,133285,0),(76640,133288,0),(76641,133289,0),(76642,133290,0),(76643,133292,0),(76644,133293,0),(76645,133294,0),(76646,133295,0),(76647,133296,0),(76648,133297,0),(76649,133298,0),(76650,133301,0),(76651,133302,0),(76652,133303,0),(76653,133306,0),(76654,133308,0),(76655,133309,0),(76677,133353,0),(76678,133354,0),(76680,133356,0),(76681,133357,0),(76682,133358,0),(76683,133360,0),(76684,133362,0),(76685,133363,0),(76686,133365,0),(76687,133367,0),(76688,133368,0),(76689,133370,0),(76690,133371,0),(76691,133374,0),(76692,133375,0),(76693,133376,0),(76694,133385,0),(76695,133386,0),(76696,133387,0),(76697,133388,0),(76698,133389,0),(76699,133390,0),(76700,133391,0),(76701,133392,0),(76702,133393,0),(76703,133394,0),(76704,133395,0),(76705,133396,0),(76706,133397,0),(76707,133398,0),(76708,133399,0),(76709,133400,0),(76710,133401,0),(76711,133402,0),(76712,133403,0),(76713,133404,0),(76714,133405,0),(76715,133406,0),(76716,133407,0),(76717,133408,0),(76718,133409,0),(76719,133410,0),(76720,133411,0),(76721,133412,0),(76722,133413,0),(76723,133414,0),(76724,133415,0),(76725,133416,0),(76726,133417,0),(76727,133418,0),(76728,133419,0),(76729,133421,0),(76730,133422,0),(76732,133424,0),(76733,133428,0),(76734,133431,0),(76735,133432,0),(76736,133433,0),(76737,133434,0),(76738,133435,0),(76739,133436,0),(76740,133437,0),(76741,133439,0),(76742,133441,0),(76743,133442,0),(76745,133444,0),(76746,133445,0),(76747,133446,0),(76748,133447,0),(76749,133448,0),(76750,133449,0),(76751,133450,0),(76752,133451,0),(76753,133452,0),(76754,133453,0),(76755,133455,0),(76756,133456,0),(76757,133457,0),(76758,133458,0),(76759,133459,0),(76761,133465,0),(76762,133466,0),(76763,133467,0),(76764,133468,0),(76765,133469,0),(76766,133470,0),(76767,133471,0),(76768,133472,0),(76769,133473,0),(76770,133474,0),(76771,133475,0),(76772,133476,0),(76773,133477,0),(76774,133478,0),(76775,133479,0),(76779,133485,0),(76780,133486,0),(76781,133488,0),(76782,133489,0),(76783,133490,0),(76784,133491,0),(76785,133492,0),(76786,133493,0),(76787,133494,0),(76788,133495,0),(76789,133497,0),(76790,133498,0),(76791,133499,0),(76792,133501,0),(76793,133502,0),(76794,133503,0),(76795,133504,0),(76796,133505,0),(76797,133506,0),(76798,133507,0),(76799,133508,0),(76800,133517,0),(76803,133525,0),(76804,133526,0),(76805,133527,0),(76806,133528,0),(76807,133529,0),(76808,133530,0),(76809,133531,0),(76810,133532,0),(76811,133533,0),(76812,133534,0),(76813,133535,0),(76814,133536,0),(76840,133582,0),(76841,133583,0),(76842,133584,0); +/*!40000 ALTER TABLE `dbc_itemmodifiedappearance` ENABLE KEYS */; +UNLOCK TABLES; + +INSERT INTO `item_instance_transmog` +SELECT ii.guid, ima.Id, 0, 0, 0, 0, ii.enchantIllusion, 0, 0, 0, 0 +FROM item_instance ii LEFT JOIN dbc_itemmodifiedappearance ima ON +(ii.transmogrification & 0xFFFFFF) = ima.ItemId AND +(ii.transmogrification >> 24) = ima.AppearanceModID +WHERE +ima.Id IS NOT NULL; + +ALTER TABLE `item_instance` + DROP `transmogrification`, + DROP `enchantIllusion`; + +DROP TABLE `dbc_itemmodifiedappearance`; diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_10.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_10.sql new file mode 100644 index 00000000000..bcd51ae80b9 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_10.sql @@ -0,0 +1,37 @@ +-- +-- Table structure for table `item_search_name` +-- +DROP TABLE IF EXISTS `item_search_name`; +CREATE TABLE `item_search_name` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Flags1` int(10) unsigned NOT NULL DEFAULT '0', + `Flags2` int(10) unsigned NOT NULL DEFAULT '0', + `Flags3` int(10) unsigned NOT NULL DEFAULT '0', + `AllowableRace` int(10) unsigned NOT NULL DEFAULT '0', + `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0', + `RequiredReputationFaction` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredSkill` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredExpansion` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredReputationRank` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `AllowableClass` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_search_name_locale` +-- +DROP TABLE IF EXISTS `item_search_name_locale`; +CREATE TABLE `item_search_name_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index ea5cc8ae3ae..fc729e04e5b 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -22,7 +22,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); -#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" +#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, " \ + "ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, " \ + "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " \ + "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " \ + "ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -108,7 +112,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_SEASONAL_BY_EVENT, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC); @@ -138,8 +142,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE mail_id = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid WHERE mail_id = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC); @@ -161,14 +165,18 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, transmogrification = ?, upgradeId = ?, enchantIllusion = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_TRANSMOG, "INSERT INTO item_instance_transmog (itemGuid, itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, " + "spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG, "DELETE FROM item_instance_transmog WHERE itemGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG_BY_OWNER, "DELETE iit FROM item_instance_transmog iit LEFT JOIN item_instance ii ON iit.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH); @@ -200,7 +208,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8 - PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) " diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index fedc4087704..e58debb7939 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -147,6 +147,9 @@ enum CharacterDatabaseStatements CHAR_INS_ITEM_INSTANCE_GEMS, CHAR_DEL_ITEM_INSTANCE_GEMS, CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, + CHAR_INS_ITEM_INSTANCE_TRANSMOG, + CHAR_DEL_ITEM_INSTANCE_TRANSMOG, + CHAR_DEL_ITEM_INSTANCE_TRANSMOG_BY_OWNER, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, CHAR_SEL_CHARACTER_GIFT_BY_ITEM, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index e6b4f4480eb..210516eaf7c 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -441,6 +441,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() "AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSearchName.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT ID, Name, Flags1, Flags2, Flags3, AllowableRace, RequiredSpell, RequiredReputationFaction, " + "RequiredSkill, RequiredSkillRank, ItemLevel, Quality, RequiredExpansion, RequiredReputationRank, RequiredLevel, AllowableClass" + " FROM item_search_name ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT ID, Name_lang FROM item_search_name_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSet.db2 PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill, Flags FROM item_set" diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 5c3b0ddb196..f49e28b8de2 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -249,6 +249,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_RANDOM_SUFFIX, HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SEARCH_NAME, + HOTFIX_SEL_ITEM_SEARCH_NAME_LOCALE, + HOTFIX_SEL_ITEM_SET, HOTFIX_SEL_ITEM_SET_LOCALE, diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 249839c079b..a11f5d2c677 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -156,4 +156,12 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_ACCOUNT_HEIRLOOMS, "SELECT itemId, flags FROM battlenet_account_heirlooms WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_REP_ACCOUNT_HEIRLOOMS, "REPLACE INTO battlenet_account_heirlooms (accountId, itemId, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC); + + // Transmog collection + PrepareStatement(LOGIN_SEL_BNET_ITEM_APPEARANCES, "SELECT blobIndex, appearanceMask FROM battlenet_item_appearances WHERE battlenetAccountId = ? ORDER BY blobIndex DESC", CONNECTION_ASYNC); + PrepareStatement(LOGIN_INS_BNET_ITEM_APPEARANCES, "INSERT INTO battlenet_item_appearances (battlenetAccountId, blobIndex, appearanceMask) VALUES (?, ?, ?) " + "ON DUPLICATE KEY UPDATE appearanceMask = appearanceMask | VALUES(appearanceMask)", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES, "SELECT itemModifiedAppearanceId FROM battlenet_item_favorite_appearances WHERE battlenetAccountId = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_INS_BNET_ITEM_FAVORITE_APPEARANCE, "INSERT INTO battlenet_item_favorite_appearances (battlenetAccountId, itemModifiedAppearanceId) VALUES (?, ?)", CONNECTION_ASYNC); + PrepareStatement(LOGIN_DEL_BNET_ITEM_FAVORITE_APPEARANCE, "DELETE FROM battlenet_item_favorite_appearances WHERE battlenetAccountId = ? AND itemModifiedAppearanceId = ?", CONNECTION_ASYNC); } diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index 80fd8bc4dd8..29c16d3c974 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -146,6 +146,12 @@ enum LoginDatabaseStatements LOGIN_SEL_ACCOUNT_HEIRLOOMS, LOGIN_REP_ACCOUNT_HEIRLOOMS, + LOGIN_SEL_BNET_ITEM_APPEARANCES, + LOGIN_INS_BNET_ITEM_APPEARANCES, + LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES, + LOGIN_INS_BNET_ITEM_FAVORITE_APPEARANCE, + LOGIN_DEL_BNET_ITEM_FAVORITE_APPEARANCE, + MAX_LOGINDATABASE_STATEMENTS }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index f4a8d6423b8..2acf3205ddc 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -116,6 +116,7 @@ DB2Storage sItemModifiedAppearanceStore("It DB2Storage sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE); DB2Storage sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); DB2Storage sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX); +DB2Storage sItemSearchNameStore("ItemSearchName.db2", ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME); DB2Storage sItemSetStore("ItemSet.db2", ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET); DB2Storage sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL); DB2SparseStorage sItemSparseStore("Item-sparse.db2", ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE); @@ -374,6 +375,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemPriceBaseStore); LOAD_DB2(sItemRandomPropertiesStore); LOAD_DB2(sItemRandomSuffixStore); + LOAD_DB2(sItemSearchNameStore); LOAD_DB2(sItemSetStore); LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b5a052428f4..fc8407eb96b 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -106,6 +106,7 @@ TC_GAME_API extern DB2Storage sItemModifie TC_GAME_API extern DB2Storage sItemPriceBaseStore; TC_GAME_API extern DB2Storage sItemRandomPropertiesStore; TC_GAME_API extern DB2Storage sItemRandomSuffixStore; +TC_GAME_API extern DB2Storage sItemSearchNameStore; TC_GAME_API extern DB2Storage sItemSetStore; TC_GAME_API extern DB2Storage sItemSetSpellStore; TC_GAME_API extern DB2SparseStorage sItemSparseStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index d5ff75ce421..47e54d1f7af 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -1317,6 +1317,24 @@ struct ItemRandomSuffixEntry uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; }; +struct ItemSearchNameEntry +{ + uint32 ID; + LocalizedString* Name; + uint32 Flags[3]; + uint32 AllowableRace; + uint32 RequiredSpell; + uint16 RequiredReputationFaction; + uint16 RequiredSkill; + uint16 RequiredSkillRank; + uint16 ItemLevel; + uint8 Quality; + uint8 RequiredExpansion; + uint8 RequiredReputationRank; + uint8 RequiredLevel; + uint32 AllowableClass; +}; + #define MAX_ITEM_SET_ITEMS 17 struct ItemSetEntry @@ -1717,7 +1735,7 @@ struct PhaseXPhaseGroupEntry struct PlayerConditionEntry { - uint32 ID; // 1, 1, 1 + uint32 ID; uint32 RaceMask; uint32 SkillLogic; uint32 ReputationLogic; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9fbea011dd6..9bb17ec1fa5 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -32,6 +32,7 @@ #include "ItemPackets.h" #include "TradeData.h" #include "GameTables.h" +#include "CollectionMgr.h" void AddItemsSetItem(Player* player, Item* item) { @@ -234,6 +235,34 @@ bool ItemCanGoIntoBag(ItemTemplate const* pProto, ItemTemplate const* pBagProto) return false; } +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 +}; + +static uint32 const AppearanceModifierMaskSpecSpecific = + (1 << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1) | + (1 << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2) | + (1 << ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3) | + (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 +}; + +static uint32 const IllusionModifierMaskSpecSpecific = + (1 << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1) | + (1 << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2) | + (1 << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3) | + (1 << ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4); + Item::Item() { m_objectType |= TYPEMASK_ITEM; @@ -356,9 +385,7 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt16(++index, GetUInt32Value(ITEM_FIELD_DURABILITY)); stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME)); stmt->setString(++index, m_text); - stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID) | (GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD) << 24)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_UPGRADE_ID)); - stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL)); @@ -395,6 +422,43 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt32(1 + i, 0); trans->Append(stmt); } + + static ItemModifier const transmogMods[10] = + { + ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, + 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_ENCHANT_ILLUSION_ALL_SPECS, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, + }; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + if (std::find_if(std::begin(transmogMods), std::end(transmogMods), [this](ItemModifier modifier) { return GetModifier(modifier) != 0; }) != std::end(transmogMods)) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_TRANSMOG); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt32(1, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + stmt->setUInt32(2, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1)); + stmt->setUInt32(3, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2)); + stmt->setUInt32(4, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3)); + stmt->setUInt32(5, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4)); + stmt->setUInt32(6, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + stmt->setUInt32(7, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1)); + stmt->setUInt32(8, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2)); + stmt->setUInt32(9, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3)); + stmt->setUInt32(10, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4)); + trans->Append(stmt); + } + break; } case ITEM_REMOVED: @@ -436,12 +500,16 @@ void Item::SaveToDB(SQLTransaction& trans) bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fields, uint32 entry) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 - //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, - // 13 14 15 16 17 18 19 20 - // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, - // 21 22 23 - // gemItemId1, gemItemId2, gemItemId3 FROM item_instance WHERE guid = '%u'", guid); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, + // 13 14 15 16 17 18 + // upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 19 20 21 22 23 + // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, + // 24 25 26 27 28 + // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, + // 29 30 31 + // gemItemId1, gemItemId2, gemItemId3 FROM item_instance // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -509,19 +577,32 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, fields[11].GetUInt32()); SetText(fields[12].GetString()); - if (uint32 transmogEntry = fields[13].GetUInt32()) + SetModifier(ITEM_MODIFIER_UPGRADE_ID, fields[13].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[14].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[15].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[16].GetUInt16()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[17].GetUInt32()); + + Tokenizer bonusListIDs(fields[18].GetString(), ' '); + for (char const* token : bonusListIDs) { - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, (transmogEntry >> 24) & 0xFF); - SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogEntry & 0xFFFFFF); + uint32 bonusListID = atoul(token); + AddBonuses(bonusListID); } - SetModifier(ITEM_MODIFIER_UPGRADE_ID, fields[14].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION, fields[15].GetUInt32()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[16].GetUInt32()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[17].GetUInt32()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[18].GetUInt16()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); - - uint32 gemItemIds[3] = { fields[21].GetUInt32(), fields[22].GetUInt32(), fields[23].GetUInt32() }; + + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, fields[19].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, fields[20].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, fields[21].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, fields[22].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, fields[23].GetUInt32()); + + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, fields[24].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, fields[25].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, fields[26].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[27].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[28].GetUInt32()); + + uint32 gemItemIds[3] = { fields[29].GetUInt32(), fields[30].GetUInt32(), fields[31].GetUInt32() }; if (gemItemIds[0] || gemItemIds[1] || gemItemIds[2]) { // gem slots must be preserved, hence funky logic @@ -532,13 +613,6 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[2]); } - Tokenizer bonusListIDs(fields[20].GetString(), ' '); - for (char const* token : bonusListIDs) - { - uint32 bonusListID = atoul(token); - AddBonuses(bonusListID); - } - if (need_save) // normal item changed state set not work at loading { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD); @@ -1130,7 +1204,7 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* arrayMask.SetCount(values.size()); for (std::size_t v = 0; v < values.size(); ++v) { - if (updateType != UPDATETYPE_VALUES || _dynamicChangesArrayMask[index].GetBit(v)) + if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index].GetBit(v) : values[v]) { arrayMask.SetBit(v); buffer << uint32(values[v]); @@ -1149,7 +1223,6 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* buffer << uint32(modifier); } } - } fieldBuffer << uint16(arrayMask.GetBlockCount()); @@ -1204,7 +1277,7 @@ void Item::DeleteRefundDataFromDB(SQLTransaction* trans) } } -void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, SQLTransaction* trans /*=NULL*/) +void Item::SetNotRefundable(Player* owner, bool changestate /*= true*/, SQLTransaction* trans /*= nullptr*/, bool addToCollection /*= true*/) { if (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) return; @@ -1224,6 +1297,8 @@ void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, SQLTransa DeleteRefundDataFromDB(trans); owner->DeleteRefundReference(GetGUID()); + if (addToCollection) + owner->GetSession()->GetCollectionMgr()->AddItemAppearance(this); } void Item::UpdatePlayedTime(Player* owner) @@ -1278,6 +1353,7 @@ void Item::ClearSoulboundTradeable(Player* currentOwner) if (allowedGUIDs.empty()) return; + currentOwner->GetSession()->GetCollectionMgr()->AddItemAppearance(this); allowedGUIDs.clear(); SetState(ITEM_CHANGED, currentOwner); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_BOP_TRADE); @@ -1303,9 +1379,6 @@ bool Item::IsValidTransmogrificationTarget() const if (!proto) return false; - if (proto->GetQuality() == ITEM_QUALITY_LEGENDARY) - return false; - if (proto->GetClass() != ITEM_CLASS_ARMOR && proto->GetClass() != ITEM_CLASS_WEAPON) return false; @@ -1322,34 +1395,6 @@ bool Item::IsValidTransmogrificationTarget() const return true; } -bool Item::IsValidTransmogrificationSource(WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus) -{ - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(transmogrifier.ItemID); - if (!proto) - return false; - - if (proto->GetFlags2() & ITEM_FLAG2_CANNOT_TRANSMOG) - return false; - - if (proto->GetQuality() == ITEM_QUALITY_LEGENDARY) - return false; - - if (proto->GetClass() != ITEM_CLASS_ARMOR && - proto->GetClass() != ITEM_CLASS_WEAPON) - return false; - - if (proto->GetClass() == ITEM_CLASS_WEAPON && proto->GetSubClass() == ITEM_SUBCLASS_WEAPON_FISHING_POLE) - return false; - - if (proto->GetFlags2() & ITEM_FLAG2_CAN_TRANSMOG) - return true; - - if (!HasStats(transmogrifier, bonus)) - return false; - - return true; -} - bool Item::HasStats() const { if (GetItemRandomPropertyId() != 0) @@ -1456,18 +1501,18 @@ int32 const ItemTransmogrificationSlots[MAX_INVTYPE] = -1 // INVTYPE_RELIC }; -bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus) +bool Item::CanTransmogrifyItemWithItem(Item const* item, ItemModifiedAppearanceEntry const* itemModifiedAppearance) { - ItemTemplate const* source = sObjectMgr->GetItemTemplate(transmogrifier.ItemID); // source - ItemTemplate const* target = transmogrified->GetTemplate(); // dest + ItemTemplate const* source = sObjectMgr->GetItemTemplate(itemModifiedAppearance->ItemID); // source + ItemTemplate const* target = item->GetTemplate(); // dest if (!source || !target) return false; - if (sDB2Manager.GetItemDisplayId(source->GetId(), bonus->AppearanceModID) == transmogrified->GetDisplayId()) + if (itemModifiedAppearance == item->GetItemModifiedAppearance()) return false; - if (!IsValidTransmogrificationSource(transmogrifier, bonus) || !transmogrified->IsValidTransmogrificationTarget()) + if (!item->IsValidTransmogrificationTarget()) return false; if (source->GetClass() != target->GetClass()) @@ -1483,11 +1528,19 @@ bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets: if (source->GetSubClass() != target->GetSubClass()) { - if (source->GetClass() != ITEM_CLASS_WEAPON) - return false; - - if (GetTransmogrificationWeaponCategory(source) != GetTransmogrificationWeaponCategory(target)) - return false; + switch (source->GetClass()) + { + case ITEM_CLASS_WEAPON: + if (GetTransmogrificationWeaponCategory(source) != GetTransmogrificationWeaponCategory(target)) + return false; + break; + case ITEM_CLASS_ARMOR: + if (source->GetSubClass() != ITEM_SUBCLASS_ARMOR_COSMETIC) + return false; + break; + default: + return false; + } } if (source->GetInventoryType() != target->GetInventoryType()) @@ -1863,10 +1916,14 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const return _bonusData.ItemStatValue[index]; } -uint32 Item::GetDisplayId() const +uint32 Item::GetDisplayId(Player const* owner) const { - if (uint32 transmogrification = GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID)) - return sDB2Manager.GetItemDisplayId(transmogrification, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD)); + ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; + if (HasFlag(ITEM_FIELD_MODIFIERS_MASK, AppearanceModifierMaskSpecSpecific)) + transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + return sDB2Manager.GetItemDisplayId(transmog->ItemID, transmog->AppearanceModID); return sDB2Manager.GetItemDisplayId(GetEntry(), GetAppearanceModId()); } @@ -1882,33 +1939,46 @@ void Item::SetModifier(ItemModifier modifier, uint32 value) ApplyModFlag(ITEM_FIELD_MODIFIERS_MASK, 1 << modifier, value != 0); } -uint32 Item::GetVisibleEntry() const +uint32 Item::GetVisibleEntry(Player const* owner) const { - if (uint32 transmogrification = GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID)) - return transmogrification; + ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; + if (HasFlag(ITEM_FIELD_MODIFIERS_MASK, AppearanceModifierMaskSpecSpecific)) + transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + return transmog->ItemID; return GetEntry(); } -uint16 Item::GetVisibleAppearanceModId() const +uint16 Item::GetVisibleAppearanceModId(Player const* owner) const { - if (GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID)) - return uint16(GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD)); + ItemModifier transmogModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; + if (HasFlag(ITEM_FIELD_MODIFIERS_MASK, AppearanceModifierMaskSpecSpecific)) + transmogModifier = AppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]; + + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(transmogModifier))) + return transmog->AppearanceModID; return uint16(GetAppearanceModId()); } -uint32 Item::GetVisibleEnchantmentId() const +uint32 Item::GetVisibleEnchantmentId(Player const* owner) const { - if (uint32 enchantIllusion = GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION)) + ItemModifier illusionModifier = ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS; + if (HasFlag(ITEM_FIELD_MODIFIERS_MASK, IllusionModifierMaskSpecSpecific)) + illusionModifier = IllusionModifierSlotBySpec[owner->GetActiveTalentGroup()]; + + if (ItemModifiedAppearanceEntry const* transmog = sItemModifiedAppearanceStore.LookupEntry(GetModifier(illusionModifier))) + if (uint32 enchantIllusion = GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)) return enchantIllusion; return GetEnchantmentId(PERM_ENCHANTMENT_SLOT); } -uint16 Item::GetVisibleItemVisual() const +uint16 Item::GetVisibleItemVisual(Player const* owner) const { - if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetVisibleEnchantmentId())) + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(GetVisibleEnchantmentId(owner))) return enchant->ItemVisual; return 0; diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 7f52e3874fe..12a33f86a23 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -208,10 +208,12 @@ enum EnchantmentOffset enum EnchantmentSlotMask { - ENCHANTMENT_CAN_SOULBOUND = 0x01, - ENCHANTMENT_UNK1 = 0x02, - ENCHANTMENT_UNK2 = 0x04, - ENCHANTMENT_UNK3 = 0x08 + ENCHANTMENT_CAN_SOULBOUND = 0x01, + ENCHANTMENT_UNK1 = 0x02, + ENCHANTMENT_UNK2 = 0x04, + ENCHANTMENT_UNK3 = 0x08, + ENCHANTMENT_COLLECTABLE = 0x100, + ENCHANTMENT_HIDE_IF_NOT_COLLECTED = 0x200, }; enum ItemUpdateState @@ -224,14 +226,29 @@ enum ItemUpdateState enum ItemModifier { - ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD = 0, - ITEM_MODIFIER_TRANSMOG_ITEM_ID = 1, - ITEM_MODIFIER_UPGRADE_ID = 2, - ITEM_MODIFIER_BATTLE_PET_SPECIES_ID = 3, - ITEM_MODIFIER_BATTLE_PET_BREED_DATA = 4, // (breedId) | (breedQuality << 24) - ITEM_MODIFIER_BATTLE_PET_LEVEL = 5, - ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID = 6, - ITEM_MODIFIER_ENCHANT_ILLUSION = 7, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS = 0, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1 = 1, + ITEM_MODIFIER_UPGRADE_ID = 2, + ITEM_MODIFIER_BATTLE_PET_SPECIES_ID = 3, + ITEM_MODIFIER_BATTLE_PET_BREED_DATA = 4, // (breedId) | (breedQuality << 24) + ITEM_MODIFIER_BATTLE_PET_LEVEL = 5, + ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID = 6, + ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS = 7, + ITEM_MODIFIER_ARTIFACT_APPEARANCE_ID = 8, + ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL = 9, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1 = 10, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2 = 11, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2 = 12, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3 = 13, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3 = 13, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4 = 15, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4 = 16, + ITEM_MODIFIER_CHALLENGE_MAP_CHALLENGE_MODE_ID = 17, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_LEVEL = 18, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_1 = 19, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_2 = 20, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_3 = 21, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_IS_CHARGED = 22, MAX_ITEM_MODIFIERS }; @@ -239,6 +256,8 @@ enum ItemModifier #define MAX_ITEM_SPELLS 5 bool ItemCanGoIntoBag(ItemTemplate const* proto, ItemTemplate const* pBagProto); +extern ItemModifier const AppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]; +extern ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS]; struct BonusData { @@ -397,13 +416,13 @@ class TC_GAME_API Item : public Object uint32 GetAppearanceModId() const { return _bonusData.AppearanceModID; } uint32 GetArmor(Player const* owner) const { return GetTemplate()->GetArmor(GetItemLevel(owner)); } void GetDamage(Player const* owner, float& minDamage, float& maxDamage) const { GetTemplate()->GetDamage(GetItemLevel(owner), minDamage, maxDamage); } - uint32 GetDisplayId() const; + uint32 GetDisplayId(Player const* owner) const; ItemModifiedAppearanceEntry const* GetItemModifiedAppearance() const; float GetRepairCostMultiplier() const { return _bonusData.RepairCostMultiplier; } uint32 GetScalingStatDistribution() const { return _bonusData.ScalingStatDistribution; } // Item Refund system - void SetNotRefundable(Player* owner, bool changestate = true, SQLTransaction* trans = NULL); + void SetNotRefundable(Player* owner, bool changestate = true, SQLTransaction* trans = nullptr, bool addToCollection = true); void SetRefundRecipient(ObjectGuid const& guid) { m_refundRecipient = guid; } void SetPaidMoney(uint32 money) { m_paidMoney = money; } void SetPaidExtendedCost(uint32 iece) { m_paidExtendedCost = iece; } @@ -429,17 +448,16 @@ class TC_GAME_API Item : public Object uint32 GetScriptId() const { return GetTemplate()->ScriptId; } bool IsValidTransmogrificationTarget() const; - static bool IsValidTransmogrificationSource(WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus); bool HasStats() const; static bool HasStats(WorldPackets::Item::ItemInstance const& itemInstance, BonusData const* bonus); - static bool CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus); + static bool CanTransmogrifyItemWithItem(Item const* item, ItemModifiedAppearanceEntry const* itemModifiedAppearance); static uint32 GetSpecialPrice(ItemTemplate const* proto, uint32 minimumPrice = 10000); uint32 GetSpecialPrice(uint32 minimumPrice = 10000) const { return Item::GetSpecialPrice(GetTemplate(), minimumPrice); } - uint32 GetVisibleEntry() const; - uint16 GetVisibleAppearanceModId() const; - uint32 GetVisibleEnchantmentId() const; - uint16 GetVisibleItemVisual() const; + uint32 GetVisibleEntry(Player const* owner) const; + uint16 GetVisibleAppearanceModId(Player const* owner) const; + uint32 GetVisibleEnchantmentId(Player const* owner) const; + uint16 GetVisibleItemVisual(Player const* owner) const; static uint32 GetSellPrice(ItemTemplate const* proto, bool& success); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 2627f9cf328..756d21e7856 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -217,7 +217,7 @@ enum ItemFlags2 : uint32 ITEM_FLAG2_NEED_ROLL_DISABLED = 0x00000100, ITEM_FLAG2_CASTER_WEAPON = 0x00000200, ITEM_FLAG2_UNK6 = 0x00000400, - ITEM_FLAG2_UNK7 = 0x00000800, + ITEM_FLAG2_UNAVAILABLE_FOR_PLAYERS= 0x00000800, ITEM_FLAG2_UNK8 = 0x00001000, ITEM_FLAG2_UNK9 = 0x00002000, ITEM_FLAG2_HAS_NORMAL_PRICE = 0x00004000, @@ -490,7 +490,7 @@ enum ItemSubclassArmor ITEM_SUBCLASS_ARMOR_LEATHER = 2, ITEM_SUBCLASS_ARMOR_MAIL = 3, ITEM_SUBCLASS_ARMOR_PLATE = 4, - ITEM_SUBCLASS_ARMOR_BUCKLER = 5, // OBSOLETE + ITEM_SUBCLASS_ARMOR_COSMETIC = 5, ITEM_SUBCLASS_ARMOR_SHIELD = 6, ITEM_SUBCLASS_ARMOR_LIBRAM = 7, ITEM_SUBCLASS_ARMOR_IDOL = 8, @@ -769,6 +769,7 @@ struct TC_GAME_API ItemTemplate uint32 FlagsCu; float SpellPPMRate; std::unordered_set Specializations[2]; // one set for 1-40 level range and another for 41-100 + uint32 ItemSpecClassMask; // helpers bool CanChangeEquipStateInCombat() const; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index b1a915e474e..028f954744f 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -813,7 +813,7 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player arrayMask.SetCount(values.size()); for (std::size_t v = 0; v < values.size(); ++v) { - if (updateType != UPDATETYPE_VALUES || _dynamicChangesArrayMask[index].GetBit(v)) + if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index].GetBit(v) : values[v]) { arrayMask.SetBit(v); buffer << uint32(values[v]); @@ -1382,10 +1382,23 @@ void Object::AddDynamicValue(uint16 index, uint32 value) AddToObjectUpdateIfNeeded(); } -void Object::RemoveDynamicValue(uint16 index, uint32 /*value*/) +void Object::RemoveDynamicValue(uint16 index, uint32 value) { ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); - /// TODO: Research if this is actually needed + + // TODO: Research if this is blizzlike to just set value to 0 + std::vector& values = _dynamicValues[index]; + for (std::size_t i = 0; i < values.size(); ++i) + { + if (values[i] == value) + { + values[i] = 0; + _dynamicChangesMask.SetBit(index); + _dynamicChangesArrayMask[index].SetBit(i); + + AddToObjectUpdateIfNeeded(); + } + } } void Object::ClearDynamicValue(uint16 index) diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index 2def446ccfb..0dffcc6e8ad 100644 --- a/src/server/game/Entities/Player/CollectionMgr.cpp +++ b/src/server/game/Entities/Player/CollectionMgr.cpp @@ -16,7 +16,13 @@ */ #include "CollectionMgr.h" +#include "ObjectMgr.h" #include "Player.h" +#include "TransmogrificationPackets.h" + +CollectionMgr::CollectionMgr(WorldSession* owner) : _owner(owner), _appearances() +{ +} void CollectionMgr::LoadToys() { @@ -77,6 +83,14 @@ void CollectionMgr::ToySetFavorite(uint32 itemId, bool favorite) itr->second = favorite; } +void CollectionMgr::OnItemAdded(Item* item) +{ + if (sDB2Manager.GetHeirloomByItemId(item->GetEntry())) + AddHeirloom(item->GetEntry(), 0); + + AddItemAppearance(item); +} + void CollectionMgr::LoadAccountHeirlooms(PreparedQueryResult result) { if (!result) @@ -259,3 +273,353 @@ bool CollectionMgr::CanApplyHeirloomXpBonus(uint32 itemId, uint32 level) return level <= 60; } + +struct DynamicBitsetBlockOutputIterator : public std::iterator +{ + explicit DynamicBitsetBlockOutputIterator(std::function&& action) : _action(std::forward>(action)) { } + + DynamicBitsetBlockOutputIterator& operator=(uint32 value) + { + _action(value); + return *this; + } + + DynamicBitsetBlockOutputIterator& operator*() { return *this; } + DynamicBitsetBlockOutputIterator& operator++() { return *this; } + DynamicBitsetBlockOutputIterator operator++(int) { return *this; } + +private: + std::function _action; +}; + +void CollectionMgr::LoadItemAppearances() +{ + boost::to_block_range(_appearances, DynamicBitsetBlockOutputIterator([this](uint32 blockValue) + { + _owner->GetPlayer()->AddDynamicValue(PLAYER_DYNAMIC_FIELD_TRANSMOG, blockValue); + })); + + for (auto itr = _temporaryAppearances.begin(); itr != _temporaryAppearances.end(); ++itr) + _owner->GetPlayer()->AddDynamicValue(PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG, itr->first); +} + +void CollectionMgr::LoadAccountItemAppearances(PreparedQueryResult knownAppearances, PreparedQueryResult favoriteAppearances) +{ + if (knownAppearances) + { + std::vector blocks; + do + { + Field* fields = knownAppearances->Fetch(); + uint16 blobIndex = fields[0].GetUInt16(); + if (blobIndex >= blocks.size()) + blocks.resize(blobIndex + 1); + + blocks[blobIndex] = fields[1].GetUInt32(); + + } while (knownAppearances->NextRow()); + + _appearances.init_from_block_range(blocks.begin(), blocks.end()); + } + + if (favoriteAppearances) + { + do + { + _favoriteAppearances[favoriteAppearances->Fetch()[0].GetUInt32()] = FavoriteAppearanceState::Unchanged; + } while (favoriteAppearances->NextRow()); + } + + // Static item appearances known by every player + static uint32 const hiddenAppearanceItems[3] = { 134110, 134111, 134112 }; + for (uint32 hiddenItem : hiddenAppearanceItems) + { + ItemModifiedAppearanceEntry const* hiddenAppearance = sDB2Manager.GetItemModifiedAppearance(hiddenItem, 0); + ASSERT(hiddenAppearance); + if (_appearances.size() <= hiddenAppearance->ID) + _appearances.resize(hiddenAppearance->ID + 1); + + _appearances.set(hiddenAppearance->ID); + } +} + +void CollectionMgr::SaveAccountItemAppearances(SQLTransaction& trans) +{ + uint16 blockIndex = 0; + boost::to_block_range(_appearances, DynamicBitsetBlockOutputIterator([this, &blockIndex, trans](uint32 blockValue) + { + if (blockValue) // this table is only appended/bits are set (never cleared) so don't save empty blocks + { + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BNET_ITEM_APPEARANCES); + stmt->setUInt32(0, GetOwner()->GetBattlenetAccountId()); + stmt->setUInt16(1, blockIndex); + stmt->setUInt32(2, blockValue); + trans->Append(stmt); + } + + ++blockIndex; + })); + + PreparedStatement* stmt; + for (auto itr = _favoriteAppearances.begin(); itr != _favoriteAppearances.end();) + { + switch (itr->second) + { + case FavoriteAppearanceState::New: + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BNET_ITEM_FAVORITE_APPEARANCE); + stmt->setUInt32(0, _owner->GetBattlenetAccountId()); + stmt->setUInt32(1, itr->first); + trans->Append(stmt); + itr->second = FavoriteAppearanceState::Unchanged; + ++itr; + break; + case FavoriteAppearanceState::Removed: + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BNET_ITEM_FAVORITE_APPEARANCE); + stmt->setUInt32(0, _owner->GetBattlenetAccountId()); + stmt->setUInt32(1, itr->first); + trans->Append(stmt); + itr = _favoriteAppearances.erase(itr); + break; + case FavoriteAppearanceState::Unchanged: + ++itr; + break; + } + } +} + +uint32 const PlayerClassByArmorSubclass[MAX_ITEM_SUBCLASS_ARMOR] = +{ + CLASSMASK_ALL_PLAYABLE, //ITEM_SUBCLASS_ARMOR_MISCELLANEOUS + (1 << (CLASS_PRIEST - 1)) | (1 << (CLASS_MAGE - 1)) | (1 << (CLASS_WARLOCK - 1)), //ITEM_SUBCLASS_ARMOR_CLOTH + (1 << (CLASS_ROGUE - 1)) | (1 << (CLASS_MONK - 1)) | (1 << (CLASS_DRUID - 1)) | (1 << (CLASS_DEMON_HUNTER - 1)), //ITEM_SUBCLASS_ARMOR_LEATHER + (1 << (CLASS_HUNTER - 1)) | (1 << (CLASS_SHAMAN - 1)), //ITEM_SUBCLASS_ARMOR_MAIL + (1 << (CLASS_WARRIOR - 1)) | (1 << (CLASS_PALADIN - 1)) | (1 << (CLASS_DEATH_KNIGHT - 1)), //ITEM_SUBCLASS_ARMOR_PLATE + CLASSMASK_ALL_PLAYABLE, //ITEM_SUBCLASS_ARMOR_BUCKLER + (1 << (CLASS_WARRIOR - 1)) | (1 << (CLASS_PALADIN - 1)) | (1 << (CLASS_SHAMAN - 1)), //ITEM_SUBCLASS_ARMOR_SHIELD + 1 << (CLASS_PALADIN - 1), //ITEM_SUBCLASS_ARMOR_LIBRAM + 1 << (CLASS_DRUID - 1), //ITEM_SUBCLASS_ARMOR_IDOL + 1 << (CLASS_SHAMAN - 1), //ITEM_SUBCLASS_ARMOR_TOTEM + 1 << (CLASS_DEATH_KNIGHT - 1), //ITEM_SUBCLASS_ARMOR_SIGIL + (1 << (CLASS_PALADIN - 1)) | (1 << (CLASS_DEATH_KNIGHT - 1)) | (1 << (CLASS_SHAMAN - 1)) | (1 << (CLASS_DRUID - 1)), //ITEM_SUBCLASS_ARMOR_RELIC +}; + + +void CollectionMgr::AddItemAppearance(Item* item) +{ + if (!item->IsSoulBound()) + return; + + ItemModifiedAppearanceEntry const* itemModifiedAppearance = item->GetItemModifiedAppearance(); + if (!CanAddAppearance(itemModifiedAppearance)) + return; + + if (item->GetUInt32Value(ITEM_FIELD_FLAGS) & (ITEM_FIELD_FLAG_BOP_TRADEABLE | ITEM_FIELD_FLAG_REFUNDABLE)) + { + AddTemporaryAppearance(item->GetGUID(), itemModifiedAppearance); + return; + } + + AddItemAppearance(itemModifiedAppearance); +} + +void CollectionMgr::AddItemAppearance(uint32 itemId) +{ + ItemModifiedAppearanceEntry const* itemModifiedAppearance = sDB2Manager.GetItemModifiedAppearance(itemId, 0); + if (!CanAddAppearance(itemModifiedAppearance)) + return; + + AddItemAppearance(itemModifiedAppearance); +} + +bool CollectionMgr::CanAddAppearance(ItemModifiedAppearanceEntry const* itemModifiedAppearance) const +{ + if (!itemModifiedAppearance) + return false; + + if (itemModifiedAppearance->SourceType == 6 || itemModifiedAppearance->SourceType == 9) + return false; + + if (!sItemSearchNameStore.LookupEntry(itemModifiedAppearance->ItemID)) + return false; + + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemModifiedAppearance->ItemID); + if (!itemTemplate) + return false; + + if (_owner->GetPlayer()->CanUseItem(itemTemplate) != EQUIP_ERR_OK) + return false; + + if (itemTemplate->GetFlags2() & ITEM_FLAG2_CANNOT_TRANSMOG || itemTemplate->GetQuality() == ITEM_QUALITY_ARTIFACT) + return false; + + switch (itemTemplate->GetClass()) + { + case ITEM_CLASS_WEAPON: + { + if (!(_owner->GetPlayer()->GetWeaponProficiency() & (1 << itemTemplate->GetSubClass()))) + return false; + if (itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_EXOTIC || + itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_EXOTIC2 || + itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_MISCELLANEOUS || + itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_THROWN || + itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_SPEAR || + itemTemplate->GetSubClass() == ITEM_SUBCLASS_WEAPON_FISHING_POLE) + return false; + break; + } + case ITEM_CLASS_ARMOR: + { + switch (itemTemplate->GetInventoryType()) + { + case INVTYPE_BODY: + case INVTYPE_SHIELD: + case INVTYPE_CLOAK: + case INVTYPE_TABARD: + case INVTYPE_HOLDABLE: + break; + case INVTYPE_HEAD: + case INVTYPE_SHOULDERS: + case INVTYPE_CHEST: + case INVTYPE_WAIST: + case INVTYPE_LEGS: + case INVTYPE_FEET: + case INVTYPE_WRISTS: + case INVTYPE_HANDS: + case INVTYPE_ROBE: + if (itemTemplate->GetSubClass() == ITEM_SUBCLASS_ARMOR_MISCELLANEOUS) + return false; + break; + default: + return false; + } + if (itemTemplate->GetInventoryType() != INVTYPE_CLOAK) + if (!(PlayerClassByArmorSubclass[itemTemplate->GetSubClass()] & _owner->GetPlayer()->getClassMask())) + return false; + break; + } + default: + return false; + } + + if (itemTemplate->GetQuality() < ITEM_QUALITY_UNCOMMON) + if (!(itemTemplate->GetFlags2() & ITEM_FLAG2_CAN_TRANSMOG) || !(itemTemplate->GetFlags3() & 0x200000)) + return false; + + if (itemModifiedAppearance->ID < _appearances.size() && _appearances.test(itemModifiedAppearance->ID)) + return false; + + return true; +} + +void CollectionMgr::AddItemAppearance(ItemModifiedAppearanceEntry const* itemModifiedAppearance) +{ + if (_appearances.size() <= itemModifiedAppearance->ID) + { + uint32 numBlocks = _appearances.num_blocks(); + _appearances.resize(itemModifiedAppearance->ID + 1); + numBlocks = _appearances.num_blocks() - numBlocks; + while (numBlocks--) + _owner->GetPlayer()->AddDynamicValue(PLAYER_DYNAMIC_FIELD_TRANSMOG, 0); + } + + _appearances.set(itemModifiedAppearance->ID); + uint32 blockIndex = itemModifiedAppearance->ID / 32; + uint32 bitIndex = itemModifiedAppearance->ID % 32; + uint32 currentMask = _owner->GetPlayer()->GetDynamicValue(PLAYER_DYNAMIC_FIELD_TRANSMOG, blockIndex); + _owner->GetPlayer()->SetDynamicValue(PLAYER_DYNAMIC_FIELD_TRANSMOG, blockIndex, currentMask | (1 << bitIndex)); + auto temporaryAppearance = _temporaryAppearances.find(itemModifiedAppearance->ID); + if (temporaryAppearance != _temporaryAppearances.end()) + { + _owner->GetPlayer()->RemoveDynamicValue(PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG, itemModifiedAppearance->ID); + _temporaryAppearances.erase(temporaryAppearance); + } +} + +void CollectionMgr::AddTemporaryAppearance(ObjectGuid const& itemGuid, ItemModifiedAppearanceEntry const* itemModifiedAppearance) +{ + std::unordered_set& itemsWithAppearance = _temporaryAppearances[itemModifiedAppearance->ID]; + if (itemsWithAppearance.empty()) + _owner->GetPlayer()->AddDynamicValue(PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG, itemModifiedAppearance->ID); + + itemsWithAppearance.insert(itemGuid); +} + +void CollectionMgr::RemoveTemporaryAppearance(Item* item) +{ + ItemModifiedAppearanceEntry const* itemModifiedAppearance = item->GetItemModifiedAppearance(); + if (!itemModifiedAppearance) + return; + + auto itr = _temporaryAppearances.find(itemModifiedAppearance->ID); + if (itr == _temporaryAppearances.end()) + return; + + itr->second.erase(item->GetGUID()); + if (itr->second.empty()) + { + _owner->GetPlayer()->RemoveDynamicValue(PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG, itemModifiedAppearance->ID); + _temporaryAppearances.erase(itr); + } +} + +std::pair CollectionMgr::HasItemAppearance(uint32 itemModifiedAppearanceId) const +{ + if (itemModifiedAppearanceId < _appearances.size() && _appearances.test(itemModifiedAppearanceId)) + return{ true, false }; + + if (_temporaryAppearances.find(itemModifiedAppearanceId) != _temporaryAppearances.end()) + return{ true,true }; + + return{ false,false }; +} + +std::unordered_set CollectionMgr::GetItemsProvidingTemporaryAppearance(uint32 itemModifiedAppearanceId) const +{ + auto temporaryAppearance = _temporaryAppearances.find(itemModifiedAppearanceId); + if (temporaryAppearance != _temporaryAppearances.end()) + return temporaryAppearance->second; + + return{}; +} + +void CollectionMgr::SetAppearanceIsFavorite(uint32 itemModifiedAppearanceId, bool apply) +{ + auto itr = _favoriteAppearances.find(itemModifiedAppearanceId); + if (apply) + { + if (itr == _favoriteAppearances.end()) + _favoriteAppearances[itemModifiedAppearanceId] = FavoriteAppearanceState::New; + else if (itr->second == FavoriteAppearanceState::Removed) + itr->second = FavoriteAppearanceState::Unchanged; + else + return; + } + else if (itr != _favoriteAppearances.end()) + { + if (itr->second == FavoriteAppearanceState::New) + _favoriteAppearances.erase(itemModifiedAppearanceId); + else + itr->second = FavoriteAppearanceState::Removed; + } + else + return; + + WorldPackets::Transmogrification::TransmogCollectionUpdate transmogCollectionUpdate; + transmogCollectionUpdate.IsFullUpdate = false; + transmogCollectionUpdate.IsSetFavorite = apply; + transmogCollectionUpdate.FavoriteAppearances.push_back(itemModifiedAppearanceId); + + _owner->SendPacket(transmogCollectionUpdate.Write()); +} + +void CollectionMgr::SendFavoriteAppearances() const +{ + WorldPackets::Transmogrification::TransmogCollectionUpdate transmogCollectionUpdate; + transmogCollectionUpdate.IsFullUpdate = true; + transmogCollectionUpdate.FavoriteAppearances.reserve(_favoriteAppearances.size()); + for (auto itr = _favoriteAppearances.begin(); itr != _favoriteAppearances.end(); ++itr) + if (itr->second != FavoriteAppearanceState::Removed) + transmogCollectionUpdate.FavoriteAppearances.push_back(itr->first); + + _owner->SendPacket(transmogCollectionUpdate.Write()); +} diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h index 1b995be3646..2cb11bdab8b 100644 --- a/src/server/game/Entities/Player/CollectionMgr.h +++ b/src/server/game/Entities/Player/CollectionMgr.h @@ -19,6 +19,7 @@ #define CollectionMgr_h__ #include "WorldSession.h" +#include enum HeirloomPlayerFlags { @@ -48,7 +49,7 @@ typedef std::map HeirloomContainer; class TC_GAME_API CollectionMgr { public: - explicit CollectionMgr(WorldSession* owner) : _owner(owner) { } + explicit CollectionMgr(WorldSession* owner); WorldSession* GetOwner() const { return _owner; } @@ -64,6 +65,8 @@ public: ToyBoxContainer const& GetAccountToys() const { return _toys; } + void OnItemAdded(Item* item); + // Account-wide heirlooms void LoadHeirlooms(); void LoadAccountHeirlooms(PreparedQueryResult result); @@ -79,11 +82,39 @@ public: // Account-wide mounts + // Appearances + void LoadItemAppearances(); + void LoadAccountItemAppearances(PreparedQueryResult knownAppearances, PreparedQueryResult favoriteAppearances); + void SaveAccountItemAppearances(SQLTransaction& trans); + void AddItemAppearance(Item* item); + void AddItemAppearance(uint32 itemId); + void RemoveTemporaryAppearance(Item* item); + // returns pair + std::pair HasItemAppearance(uint32 itemModifiedAppearanceId) const; + std::unordered_set GetItemsProvidingTemporaryAppearance(uint32 itemModifiedAppearanceId) const; + + enum class FavoriteAppearanceState + { + New, + Removed, + Unchanged + }; + + void SetAppearanceIsFavorite(uint32 itemModifiedAppearanceId, bool apply); + void SendFavoriteAppearances() const; + private: + bool CanAddAppearance(ItemModifiedAppearanceEntry const* itemModifiedAppearance) const; + void AddItemAppearance(ItemModifiedAppearanceEntry const* itemModifiedAppearance); + void AddTemporaryAppearance(ObjectGuid const& itemGuid, ItemModifiedAppearanceEntry const* itemModifiedAppearance); + WorldSession* _owner; ToyBoxContainer _toys; HeirloomContainer _heirlooms; + boost::dynamic_bitset _appearances; + std::unordered_map> _temporaryAppearances; + std::unordered_map _favoriteAppearances; }; #endif // CollectionMgr_h__ diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 388fb2b6bab..a59624515dd 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -88,6 +88,7 @@ #include "SpellMgr.h" #include "SpellPackets.h" #include "TalentPackets.h" +#include "TransmogrificationPackets.h" #include "ToyPackets.h" #include "Transport.h" #include "UpdateData.h" @@ -3963,6 +3964,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG_BY_OWNER); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4345,7 +4350,7 @@ Corpse* Player::CreateCorpse() { if (m_items[i]) { - iDisplayID = m_items[i]->GetDisplayId(); + iDisplayID = m_items[i]->GetDisplayId(this); iIventoryType = m_items[i]->GetTemplate()->GetInventoryType(); _cfi = iDisplayID | (iIventoryType << 24); @@ -10930,9 +10935,6 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const return EQUIP_ERR_PROFICIENCY_NEEDED; } - if (pProto->GetRequiredReputationFaction() && uint32(GetReputationRank(pProto->GetRequiredReputationFaction())) < pProto->GetRequiredReputationRank()) - return EQUIP_ERR_CANT_EQUIP_REPUTATION; - return EQUIP_ERR_OK; } } @@ -10946,6 +10948,9 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const if (!proto) return EQUIP_ERR_ITEM_NOT_FOUND; + if (proto->GetFlags2() & ITEM_FLAG2_UNAVAILABLE_FOR_PLAYERS) + return EQUIP_ERR_CANT_EQUIP_EVER; + if ((proto->GetFlags2() & ITEM_FLAG2_HORDE_ONLY) && GetTeam() != HORDE) return EQUIP_ERR_CANT_EQUIP_EVER; @@ -10973,6 +10978,9 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const if (proto->GetHolidayID() && !IsHolidayActive(proto->GetHolidayID())) return EQUIP_ERR_CLIENT_LOCKED_OUT; + if (proto->GetRequiredReputationFaction() && uint32(GetReputationRank(proto->GetRequiredReputationFaction())) < proto->GetRequiredReputationRank()) + return EQUIP_ERR_CANT_EQUIP_REPUTATION; + // learning (recipes, mounts, pets, etc.) if (proto->Effects.size() >= 2) if (proto->Effects[0]->SpellID == 483 || proto->Effects[0]->SpellID == 55884) @@ -11015,7 +11023,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje if (proto->GetClass() == ITEM_CLASS_WEAPON && GetSkillValue(proto->GetSkill()) == 0) return EQUIP_ERR_PROFICIENCY_NEEDED; - if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() > ITEM_SUBCLASS_ARMOR_MISCELLANEOUS && proto->GetSubClass() < ITEM_SUBCLASS_ARMOR_BUCKLER && proto->GetInventoryType() != INVTYPE_CLOAK) + if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() > ITEM_SUBCLASS_ARMOR_MISCELLANEOUS && proto->GetSubClass() < ITEM_SUBCLASS_ARMOR_COSMETIC && proto->GetInventoryType() != INVTYPE_CLOAK) { if (_class == CLASS_WARRIOR || _class == CLASS_PALADIN || _class == CLASS_DEATH_KNIGHT) { @@ -11051,7 +11059,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje } // Return stored item (if stored to stack, it can diff. from pItem). And pItem ca be deleted in this case. -Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId /*= 0*/, GuidSet const& allowedLooters /*= GuidSet()*/, std::vector const& bonusListIDs /*= std::vector()*/) +Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId /*= 0*/, GuidSet const& allowedLooters /*= GuidSet()*/, std::vector const& bonusListIDs /*= std::vector()*/, bool addToCollection /*= true*/) { uint32 count = 0; for (ItemPosCountVec::const_iterator itr = pos.begin(); itr != pos.end(); ++itr) @@ -11064,9 +11072,6 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat UpdateCriteria(CRITERIA_TYPE_RECEIVE_EPIC_ITEM, itemId, count); UpdateCriteria(CRITERIA_TYPE_OWN_ITEM, itemId, 1); - if (sDB2Manager.GetHeirloomByItemId(itemId)) - GetSession()->GetCollectionMgr()->AddHeirloom(itemId, 0); - if (randomPropertyId) item->SetItemRandomProperties(randomPropertyId); @@ -11093,6 +11098,9 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat stmt->setString(1, ss.str()); CharacterDatabase.Execute(stmt); } + + if (addToCollection) + GetSession()->GetCollectionMgr()->OnItemAdded(item); } return item; } @@ -11376,9 +11384,9 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) { if (pItem) { - SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 2), pItem->GetVisibleEntry()); - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 0, pItem->GetVisibleAppearanceModId()); - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 1, pItem->GetVisibleItemVisual()); + SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 2), pItem->GetVisibleEntry(this)); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 0, pItem->GetVisibleAppearanceModId(this)); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 1, pItem->GetVisibleItemVisual(this)); } else { @@ -11394,7 +11402,10 @@ void Player::VisualizeItem(uint8 slot, Item* pItem) // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory) if (pItem->GetTemplate()->GetBonding() == BIND_WHEN_EQUIPED || pItem->GetTemplate()->GetBonding() == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->GetBonding() == BIND_QUEST_ITEM) + { pItem->SetBinding(true); + GetSession()->GetCollectionMgr()->AddItemAppearance(pItem); + } TC_LOG_DEBUG("entities.player.items", "Player::SetVisibleItemSlot: Player '%s' (%s), Slot: %u, Item: %u", GetName().c_str(), GetGUID().ToString().c_str(), slot, pItem->GetEntry()); @@ -11505,8 +11516,9 @@ void Player::MoveItemFromInventory(uint8 bag, uint8 slot, bool update) { ItemRemovedQuestCheck(it->GetEntry(), it->GetCount()); RemoveItem(bag, slot, update); - it->SetNotRefundable(this, false); + it->SetNotRefundable(this, false, nullptr, false); it->RemoveFromUpdateQueueOf(this); + GetSession()->GetCollectionMgr()->RemoveTemporaryAppearance(it); if (it->IsInWorld()) { it->RemoveFromWorld(); @@ -13118,7 +13130,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool // visualize enchantment at player and equipped items if (slot == PERM_ENCHANTMENT_SLOT) - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 2), 1, item->GetVisibleItemVisual()); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 2), 1, item->GetVisibleItemVisual(this)); if (apply_dur) { @@ -16874,6 +16886,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); GetSession()->GetCollectionMgr()->LoadToys(); GetSession()->GetCollectionMgr()->LoadHeirlooms(); + GetSession()->GetCollectionMgr()->LoadItemAppearances(); LearnSpecializationSpells(); @@ -17271,10 +17284,16 @@ void Player::LoadCorpse(PreparedQueryResult result) void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId - // 15 16 17 18 19 20 21 22 23 24 25 - // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, + // 13 14 15 16 17 18 + // upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 19 20 21 22 23 + // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, + // 24 25 26 27 28 + // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, + // 29 30 31 32 33 + // gemItemId1, gemItemId2, gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17296,10 +17315,11 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[24].GetUInt64() ? ObjectGuid::Create(fields[24].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[25].GetUInt8(); + ObjectGuid bagGuid = fields[32].GetUInt64() ? ObjectGuid::Create(fields[32].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[33].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); + GetSession()->GetCollectionMgr()->AddItemAppearance(item); InventoryResult err = EQUIP_ERR_OK; // Item is not in bag @@ -17625,7 +17645,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[24].GetUInt64() ? ObjectGuid::Create(fields[24].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[32].GetUInt64() ? ObjectGuid::Create(fields[32].GetUInt64()) : ObjectGuid::Empty; if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: " UI64FMTD ") in mail (%u) doesn't exist, deleted from mail.", itemGuid, mail->messageID); @@ -17861,6 +17881,18 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result) if (!quest->IsDailyOrWeekly() && !quest->IsMonthly() && !quest->IsSeasonal()) if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); + + for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i) + GetSession()->GetCollectionMgr()->AddItemAppearance(quest->RewardChoiceItemId[i]); + + for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i) + GetSession()->GetCollectionMgr()->AddItemAppearance(quest->RewardItemId[i]); + + if (std::vector const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID())) + for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) + if (ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(questPackageItem->ItemID)) + if (rewardProto->ItemSpecClassMask & getClassMask()) + GetSession()->GetCollectionMgr()->AddItemAppearance(questPackageItem->ItemID); } m_RewardedQuests.insert(quest_id); @@ -18649,8 +18681,8 @@ void Player::SaveToDB(bool create /*=false*/) { if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { - ss << item->GetTemplate()->GetInventoryType() << ' ' << item->GetDisplayId() << ' '; - if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetVisibleEnchantmentId())) + ss << item->GetTemplate()->GetInventoryType() << ' ' << item->GetDisplayId(this) << ' '; + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetVisibleEnchantmentId(this))) ss << enchant->ItemVisual; else ss << '0'; @@ -18790,8 +18822,8 @@ void Player::SaveToDB(bool create /*=false*/) { if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { - ss << item->GetTemplate()->GetInventoryType() << ' ' << item->GetDisplayId() << ' '; - if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetVisibleEnchantmentId())) + ss << item->GetTemplate()->GetInventoryType() << ' ' << item->GetDisplayId(this) << ' '; + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetVisibleEnchantmentId(this))) ss << enchant->ItemVisual; else ss << '0'; @@ -18860,6 +18892,7 @@ void Player::SaveToDB(bool create /*=false*/) GetSession()->GetCollectionMgr()->SaveAccountToys(trans); GetSession()->GetBattlePetMgr()->SaveToDB(trans); GetSession()->GetCollectionMgr()->SaveAccountHeirlooms(trans); + GetSession()->GetCollectionMgr()->SaveAccountItemAppearances(trans); stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BNET_LAST_PLAYER_CHARACTERS); stmt->setUInt32(0, GetSession()->GetAccountId()); @@ -20232,7 +20265,7 @@ void Player::VehicleSpellInitialize() petSpells.TimeLimit = vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0; petSpells.ReactState = vehicle->GetReactState(); petSpells.CommandState = COMMAND_FOLLOW; - petSpells.Flag = 0x800; + petSpells.Flag = 0x8; for (uint32 i = 0; i < MAX_SPELL_CONTROL_BAR; ++i) petSpells.ActionButtons[i] = MAKE_UNIT_ACTION_BUTTON(0, i + 8); @@ -20993,7 +21026,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c } Item* it = bStore ? - StoreNewItem(vDest, item, true) : + StoreNewItem(vDest, item, true, Item::GenerateItemRandomPropertyId(item), {}, {}, false) : EquipNewItem(uiDest, item, true); if (it) { @@ -21020,6 +21053,8 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c it->SaveRefundDataToDB(); AddRefundReference(it->GetGUID()); } + + GetSession()->GetCollectionMgr()->OnItemAdded(it); } return true; } @@ -22293,6 +22328,8 @@ void Player::SendInitialPacketsBeforeAddToMap() heirloomUpdate.Heirlooms = &GetSession()->GetCollectionMgr()->GetAccountHeirlooms(); SendDirectMessage(heirloomUpdate.Write()); + GetSession()->GetCollectionMgr()->SendFavoriteAppearances(); + WorldPackets::Character::InitialSetup initialSetup; initialSetup.ServerExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION); SendDirectMessage(initialSetup.Write()); @@ -25199,6 +25236,10 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) SetPower(pw, 0); UpdateItemSetAuras(false); + // update visible transmog + for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i) + if (Item* equippedItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + SetVisibleItemSlot(i, equippedItem); } void Player::ResetTimeSync() @@ -25411,7 +25452,8 @@ void Player::RefundItem(Item* item) SQLTransaction trans = CharacterDatabase.BeginTransaction(); // Delete any references to the refund data - item->SetNotRefundable(this, true, &trans); + item->SetNotRefundable(this, true, &trans, false); + GetSession()->GetCollectionMgr()->RemoveTemporaryAppearance(item); // Destroy item DestroyItem(item->GetBagSlot(), item->GetSlot(), true); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3969e026aee..4f2df580d54 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1366,7 +1366,7 @@ class TC_GAME_API Player : public Unit, public GridObject bool HasItemTotemCategory(uint32 TotemCategory) const; InventoryResult CanUseItem(ItemTemplate const* pItem) const; InventoryResult CanRollForItemInLFG(ItemTemplate const* item, WorldObject const* lootedObject) const; - Item* StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId = 0, GuidSet const& allowedLooters = GuidSet(), std::vector const& bonusListIDs = std::vector()); + Item* StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId = 0, GuidSet const& allowedLooters = GuidSet(), std::vector const& bonusListIDs = std::vector(), bool addToCollection = true); Item* StoreItem(ItemPosCountVec const& pos, Item* pItem, bool update); Item* EquipNewItem(uint16 pos, uint32 item, bool update); Item* EquipItem(uint16 pos, Item* pItem, bool update); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 1466deda61d..0ea0f832405 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2666,6 +2666,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.MaxMoneyLoot = 0; itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; + itemTemplate.ItemSpecClassMask = 0; if (std::vector const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) { @@ -2699,8 +2700,13 @@ void ObjectMgr::LoadItemTemplates() continue; if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpec->SpecID)) + { if ((1 << (specialization->ClassID - 1)) & sparse->AllowableClass) + { + itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); itemTemplate.Specializations[itemSpec->MaxLevel > 40].insert(itemSpec->SpecID); + } + } } } } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index b09b75be882..2bd97bd7728 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2394,7 +2394,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[25].GetUInt8(); + uint8 tabId = fields[33].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 20cbf22d40e..48216a2809a 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -401,10 +401,16 @@ void GuildMgr::LoadGuilds() // Delete orphan guild bank items CharacterDatabase.DirectExecute("DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL"); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, - // 17 18 19 20 21 22 23 24 25 26 - // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, upgradeId, + // 14 15 16 17 18 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 19 20 21 22 23 + // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, + // 24 25 26 27 28 + // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, + // 29 30 31 32 33 + // gemItemId1, gemItemId2, gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -417,7 +423,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[24].GetUInt64(); + uint64 guildId = fields[32].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 63a37b42efd..c3bea2abb34 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1653,10 +1653,16 @@ void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipm else { saveEquipmentSet.Set.Pieces[i].Clear(); - if (saveEquipmentSet.Set.Appearances[i] && !sItemModifiedAppearanceStore.LookupEntry(saveEquipmentSet.Set.Appearances[i])) - return; + if (saveEquipmentSet.Set.Appearances[i]) + { + if (!sItemModifiedAppearanceStore.LookupEntry(saveEquipmentSet.Set.Appearances[i])) + return; - // TODO: validata whether appearance is known + bool hasAppearance, isTemporary; + std::tie(hasAppearance, isTemporary) = GetCollectionMgr()->HasItemAppearance(saveEquipmentSet.Set.Appearances[i]); + if (!hasAppearance) + return; + } } } else @@ -1672,6 +1678,33 @@ void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipm saveEquipmentSet.Set.Enchants[0] = 0; saveEquipmentSet.Set.Enchants[1] = 0; } + else + { + auto validateIllusion = [this](uint32 enchantId) -> bool + { + SpellItemEnchantmentEntry const* illusion = sSpellItemEnchantmentStore.LookupEntry(enchantId); + if (!illusion) + return false; + + if (!illusion->ItemVisual || !(illusion->Flags & ENCHANTMENT_COLLECTABLE)) + return false; + + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->PlayerConditionID)) + if (!sConditionMgr->IsPlayerMeetingCondition(_player, condition)) + return false; + + if (illusion->ScalingClassRestricted > 0 && uint8(illusion->ScalingClassRestricted) != _player->getClass()) + return false; + + return true; + }; + + if (saveEquipmentSet.Set.Enchants[0] && !validateIllusion(saveEquipmentSet.Set.Enchants[0])) + return; + + if (saveEquipmentSet.Set.Enchants[1] && !validateIllusion(saveEquipmentSet.Set.Enchants[1])) + return; + } _player->SetEquipmentSet(saveEquipmentSet.Set); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index b5c8e6bdc67..938523afb8a 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1096,164 +1096,6 @@ void WorldSession::HandleItemRefund(WorldPackets::Item::ItemPurchaseRefund& pack GetPlayer()->RefundItem(item); } -void WorldSession::HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems) -{ - Player* player = GetPlayer(); - // Validate - if (!player->GetNPCIfCanInteractWith(transmogrifyItems.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER)) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s not found or player can't interact with it.", transmogrifyItems.Npc.ToString().c_str()); - return; - } - - int64 cost = 0; - std::unordered_map transmogItems; - std::unordered_map> transmogVoidItems; - std::vector resetAppearanceItems; - - for (WorldPackets::Item::TransmogrifyItem const& transmogItem : transmogrifyItems.Items) - { - // slot of the transmogrified item - if (transmogItem.Slot >= EQUIPMENT_SLOT_END) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify wrong slot (%u) when transmogrifying items.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); - return; - } - - // transmogrified item - Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, transmogItem.Slot); - if (!itemTransmogrified) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); - return; - } - if (player->CanUseItem(itemTransmogrified->GetTemplate()) != EQUIP_ERR_OK) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify an unequippable item in a valid slot (slot: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); - return; - } - - WorldPackets::Item::ItemInstance itemInstance; - BonusData const* bonus = nullptr; - if (transmogItem.SrcItemGUID) - { - // guid of the transmogrifier item - Item* itemTransmogrifier = player->GetItemByGuid(*transmogItem.SrcItemGUID); - if (!itemTransmogrifier) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcItemGUID->ToString().c_str()); - return; - } - if (player->CanUseItem(itemTransmogrifier->GetTemplate()) != EQUIP_ERR_OK) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an unequippable item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcItemGUID->ToString().c_str()); - return; - } - - itemInstance.Initialize(itemTransmogrifier); - bonus = itemTransmogrifier->GetBonus(); - transmogItems[itemTransmogrified] = itemTransmogrifier; - } - else if (transmogItem.SrcVoidItemGUID) - { - // guid of the transmogrifier item - uint8 slot; - VoidStorageItem* itemTransmogrifier = player->GetVoidStorageItem(transmogItem.SrcVoidItemGUID->GetCounter(), slot); - if (!itemTransmogrifier) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid void storage item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcVoidItemGUID->ToString().c_str()); - return; - } - ItemTemplate const * transmogrifierTemplate = sObjectMgr->GetItemTemplate(itemTransmogrifier->ItemEntry); - if (player->CanUseItem(transmogrifierTemplate) != EQUIP_ERR_OK) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an unequippable void storage item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcVoidItemGUID->ToString().c_str()); - return; - } - - itemInstance.Initialize(itemTransmogrifier); - std::pair& transmogData = transmogVoidItems[itemTransmogrified]; - transmogData.first = itemTransmogrifier; - transmogData.second.Initialize(itemInstance); - bonus = &transmogData.second; - } - else - { - resetAppearanceItems.push_back(itemTransmogrified); - continue; - } - - // entry of transmogrifier and from packet - if (itemInstance != transmogItem.Item) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid item instance data for %s.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcItemGUID->ToString().c_str()); - return; - } - - // validity of the transmogrification items - if (!Item::CanTransmogrifyItemWithItem(itemTransmogrified, transmogItem.Item, bonus)) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemTransmogrified->GetEntry(), transmogItem.Item.ItemID); - return; - } - - // add cost - cost += itemTransmogrified->GetSpecialPrice(); - } - - if (cost) // 0 cost if reverting look - { - if (!player->HasEnoughMoney(cost)) - return; - player->ModifyMoney(-cost); - } - - // Everything is fine, proceed - for (auto& transmogPair : transmogItems) - { - Item* transmogrified = transmogPair.first; - Item* transmogrifier = transmogPair.second; - - transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogrifier->GetEntry()); - transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, transmogrifier->GetAppearanceModId()); - player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); - - transmogrified->SetNotRefundable(player); - transmogrified->ClearSoulboundTradeable(player); - - transmogrifier->SetNotRefundable(player); - transmogrifier->ClearSoulboundTradeable(player); - - if (transmogrifier->GetTemplate()->GetBonding() == BIND_WHEN_EQUIPED || transmogrifier->GetTemplate()->GetBonding() == BIND_WHEN_USE) - transmogrifier->SetBinding(true); - - transmogrified->SetState(ITEM_CHANGED, player); - } - - for (auto& transmogVoirPair : transmogVoidItems) - { - Item* transmogrified = transmogVoirPair.first; - VoidStorageItem* transmogrifier = transmogVoirPair.second.first; - BonusData& bonus = transmogVoirPair.second.second; - - transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogrifier->ItemEntry); - transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, bonus.AppearanceModID); - player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); - - transmogrified->SetNotRefundable(player); - transmogrified->ClearSoulboundTradeable(player); - transmogrified->SetState(ITEM_CHANGED, player); - } - - for (Item* item : resetAppearanceItems) - { - item->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, 0); - item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, 0); - item->SetState(ITEM_CHANGED, player); - player->SetVisibleItemSlot(item->GetSlot(), item); - } -} - bool WorldSession::CanUseBank(ObjectGuid bankerGUID) const { // bankerGUID parameter is optional, set to 0 by default. diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 8ce4a88ef5a..4bfada8aab3 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -17,6 +17,7 @@ */ #include "WorldSession.h" +#include "CollectionMgr.h" #include "Common.h" #include "Config.h" #include "GameObjectAI.h" @@ -111,6 +112,7 @@ void WorldSession::HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet) { item->SetState(ITEM_CHANGED, user); item->SetBinding(true); + GetCollectionMgr()->AddItemAppearance(item); } } @@ -544,7 +546,7 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI (slot == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))) itemDisplayId = 0; else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) - itemDisplayId = item->GetDisplayId(); + itemDisplayId = item->GetDisplayId(player); else itemDisplayId = 0; diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp new file mode 100644 index 00000000000..0d8406beb45 --- /dev/null +++ b/src/server/game/Handlers/TransmogrificationHandler.cpp @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "WorldSession.h" +#include "CollectionMgr.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "TransmogrificationPackets.h" + +void WorldSession::HandleTransmogrifyItems(WorldPackets::Transmogrification::TransmogrifyItems& transmogrifyItems) +{ + Player* player = GetPlayer(); + // Validate + if (!player->GetNPCIfCanInteractWith(transmogrifyItems.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER)) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s not found or player can't interact with it.", transmogrifyItems.Npc.ToString().c_str()); + return; + } + + int64 cost = 0; + std::unordered_map transmogItems; + std::unordered_map illusionItems; + + std::vector resetAppearanceItems; + std::vector resetIllusionItems; + std::vector bindAppearances; + + for (WorldPackets::Transmogrification::TransmogrifyItem const& transmogItem : transmogrifyItems.Items) + { + // slot of the transmogrified item + if (transmogItem.Slot >= EQUIPMENT_SLOT_END) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify wrong slot (%u) when transmogrifying items.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); + return; + } + + // transmogrified item + Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, transmogItem.Slot); + if (!itemTransmogrified) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); + return; + } + + if (transmogItem.ItemModifiedAppearanceID) + { + ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(transmogItem.ItemModifiedAppearanceID); + if (!itemModifiedAppearance) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify using invalid appearance (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.ItemModifiedAppearanceID); + return; + } + + bool hasAppearance, isTemporary; + std::tie(hasAppearance, isTemporary) = GetCollectionMgr()->HasItemAppearance(transmogItem.ItemModifiedAppearanceID); + if (!hasAppearance) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify using appearance he has not collected (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.ItemModifiedAppearanceID); + return; + } + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemModifiedAppearance->ItemID); + if (player->CanUseItem(itemTemplate) != EQUIP_ERR_OK) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify using appearance he can never use (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.ItemModifiedAppearanceID); + return; + } + + // validity of the transmogrification items + if (!Item::CanTransmogrifyItemWithItem(itemTransmogrified, itemModifiedAppearance)) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s failed CanTransmogrifyItemWithItem (%u with appearance %d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemTransmogrified->GetEntry(), transmogItem.ItemModifiedAppearanceID); + return; + } + + transmogItems[itemTransmogrified] = transmogItem.ItemModifiedAppearanceID; + if (isTemporary) + bindAppearances.push_back(transmogItem.ItemModifiedAppearanceID); + + // add cost + cost += itemTransmogrified->GetSpecialPrice(); + } + else + resetAppearanceItems.push_back(itemTransmogrified); + + if (transmogItem.SpellItemEnchantmentID) + { + if (transmogItem.Slot != EQUIPMENT_SLOT_MAINHAND && transmogItem.Slot != EQUIPMENT_SLOT_OFFHAND) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion into non-weapon slot (%u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); + return; + } + + SpellItemEnchantmentEntry const* illusion = sSpellItemEnchantmentStore.LookupEntry(transmogItem.SpellItemEnchantmentID); + if (!illusion) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using invalid enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); + return; + } + + if (!illusion->ItemVisual || !(illusion->Flags & ENCHANTMENT_COLLECTABLE)) + { + 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; + } + + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->PlayerConditionID)) + { + 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); + return; + } + } + + if (illusion->ScalingClassRestricted > 0 && uint8(illusion->ScalingClassRestricted) != player->getClass()) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not allowed class enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); + return; + } + + illusionItems[itemTransmogrified] = transmogItem.SpellItemEnchantmentID; + cost += illusion->TransmogCost; + } + else + resetIllusionItems.push_back(itemTransmogrified); + } + + if (cost) // 0 cost if reverting look + { + if (!player->HasEnoughMoney(cost)) + return; + player->ModifyMoney(-cost); + } + + // Everything is fine, proceed + for (auto& transmogPair : transmogItems) + { + Item* transmogrified = transmogPair.first; + + if (!transmogrifyItems.CurrentSpecOnly) + { + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, transmogPair.second); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, 0); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, 0); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, 0); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, 0); + } + else + { + if (!transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1)) + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2)) + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3)) + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4)) + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, transmogrified->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + transmogrified->SetModifier(AppearanceModifierSlotBySpec[player->GetActiveTalentGroup()], transmogPair.second); + } + + player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); + + transmogrified->SetNotRefundable(player); + transmogrified->ClearSoulboundTradeable(player); + transmogrified->SetState(ITEM_CHANGED, player); + } + + for (auto& illusionPair : illusionItems) + { + Item* transmogrified = illusionPair.first; + + if (!transmogrifyItems.CurrentSpecOnly) + { + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, illusionPair.second); + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, 0); + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, 0); + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, 0); + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, 0); + } + else + { + if (!transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1)) + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2)) + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3)) + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4)) + transmogrified->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, transmogrified->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + transmogrified->SetModifier(IllusionModifierSlotBySpec[player->GetActiveTalentGroup()], illusionPair.second); + } + + player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); + + transmogrified->SetNotRefundable(player); + transmogrified->ClearSoulboundTradeable(player); + transmogrified->SetState(ITEM_CHANGED, player); + } + + for (Item* item : resetAppearanceItems) + { + if (!transmogrifyItems.CurrentSpecOnly) + { + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, 0); + } + else + { + if (!item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1)) + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2)) + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3)) + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4)) + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, item->GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS)); + item->SetModifier(AppearanceModifierSlotBySpec[player->GetActiveTalentGroup()], 0); + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, 0); + } + + item->SetState(ITEM_CHANGED, player); + player->SetVisibleItemSlot(item->GetSlot(), item); + } + + for (Item* item : resetIllusionItems) + { + if (!transmogrifyItems.CurrentSpecOnly) + { + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, 0); + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, 0); + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, 0); + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, 0); + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, 0); + } + else + { + if (!item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1)) + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2)) + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3)) + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + if (!item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4)) + item->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, item->GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + item->SetModifier(IllusionModifierSlotBySpec[player->GetActiveTalentGroup()], 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, 0); + } + + item->SetState(ITEM_CHANGED, player); + player->SetVisibleItemSlot(item->GetSlot(), item); + } + + for (uint32 itemModifedAppearanceId : bindAppearances) + { + std::unordered_set itemsProvidingAppearance = GetCollectionMgr()->GetItemsProvidingTemporaryAppearance(itemModifedAppearanceId); + for (ObjectGuid const& itemGuid : itemsProvidingAppearance) + { + if (Item* item = player->GetItemByGuid(itemGuid)) + { + item->SetNotRefundable(player); + item->ClearSoulboundTradeable(player); + GetCollectionMgr()->AddItemAppearance(item); + } + } + } +} + +void WorldSession::HandleTransmogAppearanceSetFavorite(WorldPackets::Transmogrification::TransmogAppearanceSetFavorite& transmogAppearanceSetFavorite) +{ + bool hasAppearance, isTemporary; + std::tie(hasAppearance, isTemporary) = GetCollectionMgr()->HasItemAppearance(transmogAppearanceSetFavorite.ItemModifiedAppearanceID); + if (!hasAppearance || isTemporary) + return; + + GetCollectionMgr()->SetAppearanceIsFavorite(transmogAppearanceSetFavorite.ItemModifiedAppearanceID, transmogAppearanceSetFavorite.IsFavorite); +} diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 637566d894a..6575f7b045c 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -16,6 +16,7 @@ */ #include "Common.h" +#include "CollectionMgr.h" #include "WorldPacket.h" #include "WorldSession.h" #include "World.h" @@ -196,6 +197,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor item->SetGuidValue(ITEM_FIELD_CREATOR, itemVS->CreatorGuid); item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemVS->ItemUpgradeId); item->SetBinding(true); + GetCollectionMgr()->AddItemAppearance(item); voidStorageTransferChanges.RemovedItems.push_back(ObjectGuid::Create(itemVS->ItemId)); diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 2c2aa528bb1..932b38bbd5e 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -70,6 +70,7 @@ #include "TotemPackets.h" #include "ToyPackets.h" #include "TradePackets.h" +#include "TransmogrificationPackets.h" #include "VehiclePackets.h" #include "VoicePackets.h" #include "VoidStoragePackets.h" diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index ffaa7f0a88b..3ae94dfb84a 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -503,36 +503,6 @@ WorldPacket const* WorldPackets::Item::ItemEnchantTimeUpdate::Write() return &_worldPacket; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::TransmogrifyItem& transmogItem) -{ - if (data.ReadBit()) - transmogItem.SrcItemGUID = boost::in_place(); - - if (data.ReadBit()) - transmogItem.SrcVoidItemGUID = boost::in_place(); - - data >> transmogItem.Item; - data >> transmogItem.Slot; - - if (transmogItem.SrcItemGUID.is_initialized()) - data >> *transmogItem.SrcItemGUID; - - if (transmogItem.SrcVoidItemGUID.is_initialized()) - data >> *transmogItem.SrcVoidItemGUID; - - return data; -} - -void WorldPackets::Item::TransmogrifyItems::Read() -{ - Items.resize(_worldPacket.read()); - _worldPacket >> Npc; - for (TransmogrifyItem& item : Items) - _worldPacket >> item; - - CurrentSpecOnly = _worldPacket.ReadBit(); -} - void WorldPackets::Item::UseCritterItem::Read() { _worldPacket >> ItemGuid; diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index df2e5c9e1d0..384ba7eea5b 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -474,30 +474,6 @@ namespace WorldPackets uint32 Slot = 0; }; - struct TransmogrifyItem - { - Optional SrcItemGUID; - Optional SrcVoidItemGUID; - ItemInstance Item; - uint32 Slot = 0; - }; - - class TransmogrifyItems final : public ClientPacket - { - public: - enum - { - MAX_TRANSMOGRIFY_ITEMS = 11 - }; - - TransmogrifyItems(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOGRIFY_ITEMS, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - Array Items; - }; - class UseCritterItem final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.cpp b/src/server/game/Server/Packets/TransmogrificationPackets.cpp new file mode 100644 index 00000000000..55d4cec7c98 --- /dev/null +++ b/src/server/game/Server/Packets/TransmogrificationPackets.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "TransmogrificationPackets.h" + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Transmogrification::TransmogrifyItem& transmogItem) +{ + data >> transmogItem.ItemModifiedAppearanceID; + data >> transmogItem.Slot; + data >> transmogItem.SpellItemEnchantmentID; + + return data; +} + +void WorldPackets::Transmogrification::TransmogrifyItems::Read() +{ + Items.resize(_worldPacket.read()); + _worldPacket >> Npc; + for (TransmogrifyItem& item : Items) + _worldPacket >> item; + + CurrentSpecOnly = _worldPacket.ReadBit(); +} + +void WorldPackets::Transmogrification::TransmogAppearanceSetFavorite::Read() +{ + _worldPacket >> ItemModifiedAppearanceID; + IsFavorite = _worldPacket.ReadBit(); +} + +WorldPacket const* WorldPackets::Transmogrification::TransmogCollectionUpdate::Write() +{ + _worldPacket.WriteBit(IsFullUpdate); + _worldPacket.WriteBit(IsSetFavorite); + _worldPacket << uint32(FavoriteAppearances.size()); + for (uint32 itemModifiedAppearanceId : FavoriteAppearances) + _worldPacket << uint32(itemModifiedAppearanceId); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.h b/src/server/game/Server/Packets/TransmogrificationPackets.h new file mode 100644 index 00000000000..93305b1e0bf --- /dev/null +++ b/src/server/game/Server/Packets/TransmogrificationPackets.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef TransmogrificationPackets_h__ +#define TransmogrificationPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "PacketUtilities.h" + +namespace WorldPackets +{ + namespace Transmogrification + { + struct TransmogrifyItem + { + int32 ItemModifiedAppearanceID = 0; + uint32 Slot = 0; + int32 SpellItemEnchantmentID = 0; + }; + + class TransmogrifyItems final : public ClientPacket + { + public: + enum + { + MAX_TRANSMOGRIFY_ITEMS = 13 + }; + + TransmogrifyItems(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOGRIFY_ITEMS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Npc; + Array Items; + bool CurrentSpecOnly = false; + }; + + class TransmogAppearanceSetFavorite final : public ClientPacket + { + public: + TransmogAppearanceSetFavorite(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, std::move(packet)) { } + + void Read() override; + + uint32 ItemModifiedAppearanceID = 0; + bool IsFavorite = false; + }; + + class TransmogCollectionUpdate final : public ServerPacket + { + public: + TransmogCollectionUpdate() : ServerPacket(SMSG_TRANSMOG_COLLECTION_UPDATE) { } + + WorldPacket const* Write() override; + + bool IsFullUpdate = false; + bool IsSetFavorite = false; + std::vector FavoriteAppearances; + }; + } +} + +#endif // TransmogrificationPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ac47130dcee..777f69c1c17 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -774,8 +774,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); - DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); - DEFINE_HANDLER(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Transmogrification::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); + DEFINE_HANDLER(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Transmogrification::TransmogAppearanceSetFavorite, &WorldSession::HandleTransmogAppearanceSetFavorite); DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_HANDLER(CMSG_TWITTER_CHECK_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -1710,7 +1710,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOG_COLLECTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOG_COLLECTION_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 937961ad571..a013d8bd662 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1079,6 +1079,8 @@ public: BATTLE_PET_SLOTS, GLOBAL_ACCOUNT_HEIRLOOMS, GLOBAL_REALM_CHARACTER_COUNTS, + ITEM_APPEARANCES, + ITEM_FAVORITE_APPEARANCES, MAX_QUERIES }; @@ -1109,6 +1111,14 @@ public: stmt->setUInt32(0, accountId); ok = SetPreparedQuery(GLOBAL_REALM_CHARACTER_COUNTS, stmt) && ok; + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ITEM_APPEARANCES); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(ITEM_APPEARANCES, stmt) && ok; + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(ITEM_FAVORITE_APPEARANCES, stmt) && ok; + return ok; } }; @@ -1142,6 +1152,7 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue LoadTutorialsData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS)); _collectionMgr->LoadAccountToys(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_TOYS)); _collectionMgr->LoadAccountHeirlooms(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_HEIRLOOMS)); + _collectionMgr->LoadAccountItemAppearances(holder->GetPreparedResult(AccountInfoQueryHolder::ITEM_APPEARANCES), holder->GetPreparedResult(AccountInfoQueryHolder::ITEM_FAVORITE_APPEARANCES)); if (!m_inQueue) SendAuthResponse(ERROR_OK, false); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5f155420ff4..02ba3d182ec 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -366,7 +366,6 @@ namespace WorldPackets class SwapItem; class WrapItem; class CancelTempEnchantment; - class TransmogrifyItems; class UseCritterItem; class SocketGems; struct ItemInstance; @@ -666,6 +665,12 @@ namespace WorldPackets class TradeStatus; } + namespace Transmogrification + { + class TransmogrifyItems; + class TransmogAppearanceSetFavorite; + } + namespace Vehicle { class MoveDismissVehicle; @@ -1642,7 +1647,8 @@ class TC_GAME_API WorldSession void SendVoidStorageTransferResult(VoidTransferError result); // Transmogrification - void HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems); + void HandleTransmogrifyItems(WorldPackets::Transmogrification::TransmogrifyItems& transmogrifyItems); + void HandleTransmogAppearanceSetFavorite(WorldPackets::Transmogrification::TransmogAppearanceSetFavorite& transmogAppearanceSetFavorite); // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b7239b21a7b..c69c2ebea5f 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4137,7 +4137,7 @@ void Spell::UpdateSpellCastDataAmmo(WorldPackets::Spells::SpellAmmo& ammo) { ammoInventoryType = pItem->GetTemplate()->GetInventoryType(); if (ammoInventoryType == INVTYPE_THROWN) - ammoDisplayID = pItem->GetDisplayId(); + ammoDisplayID = pItem->GetDisplayId(m_caster->ToPlayer()); else if (m_caster->HasAura(46699)) // Requires No Ammo { ammoDisplayID = 5996; // normal arrow diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 0cca7a27d2c..3720c2addc8 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5803,9 +5803,9 @@ void Spell::EffectApplyEnchantIllusion(SpellEffIndex /*effIndex*/) return; itemTarget->SetState(ITEM_CHANGED, player); - itemTarget->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION, effectInfo->MiscValue); + itemTarget->SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, effectInfo->MiscValue); if (itemTarget->IsEquipped()) - player->SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (itemTarget->GetSlot() * 2), 1, itemTarget->GetVisibleItemVisual()); + player->SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (itemTarget->GetSlot() * 2), 1, itemTarget->GetVisibleItemVisual(player)); player->RemoveTradeableItem(itemTarget); itemTarget->ClearSoulboundTradeable(player); -- cgit v1.2.3 From 452cae0c0b343597c3e6721fd5aa57fd787a06c9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 10 Jul 2016 14:41:18 +0200 Subject: Core/Items: Fixed saving gem bonuses --- .../2016_xx_xx_xx_characters_legion_09.sql | 7 ++ .../Database/Implementation/CharacterDatabase.cpp | 4 +- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 19 ++--- src/server/game/Entities/Item/Item.cpp | 93 ++++++++++++++++------ src/server/game/Entities/Item/Item.h | 13 +++ src/server/game/Entities/Object/Object.h | 61 ++++++++++++++ src/server/game/Entities/Player/Player.cpp | 25 +++--- src/server/game/Guilds/Guild.cpp | 40 +++++----- src/server/game/Guilds/GuildMgr.cpp | 6 +- src/server/game/Handlers/ItemHandler.cpp | 92 ++++++++++----------- src/server/game/Handlers/TradeHandler.cpp | 19 ++--- src/server/game/Server/Packets/InspectPackets.cpp | 19 ++--- src/server/game/Server/Packets/ItemPackets.cpp | 14 ++++ src/server/game/Server/Packets/ItemPackets.h | 1 + src/server/game/Server/Packets/MailPackets.cpp | 19 ++--- 15 files changed, 290 insertions(+), 142 deletions(-) create mode 100644 sql/updates/characters/2016_xx_xx_xx_characters_legion_09.sql (limited to 'src/server/database') diff --git a/sql/updates/characters/2016_xx_xx_xx_characters_legion_09.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_09.sql new file mode 100644 index 00000000000..993f227ce30 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_09.sql @@ -0,0 +1,7 @@ +ALTER TABLE `item_instance_gems` + ADD `gemBonuses1` TEXT AFTER `gemItemId1`, + ADD `gemContext1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `gemBonuses1`, + ADD `gemBonuses2` TEXT AFTER `gemItemId2`, + ADD `gemContext2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `gemBonuses2`, + ADD `gemBonuses3` TEXT AFTER `gemItemId3`, + ADD `gemContext3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `gemBonuses3`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index f88307db19c..5789bab01c4 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -26,7 +26,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, " \ "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " \ "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " \ - "ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" + "ig.gemItemId1, ig.gemBonuses1, ig.gemContext1, ig.gemItemId2, ig.gemBonuses2, ig.gemContext2, ig.gemItemId3, ig.gemBonuses3, ig.gemContext3" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -170,7 +170,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemBonuses1, gemContext1, gemItemId2, gemBonuses2, gemContext2, gemItemId3, gemBonuses3, gemContext3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_INSTANCE_TRANSMOG, "INSERT INTO item_instance_transmog (itemGuid, itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, " diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 190ee4d49d8..bc764a33659 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -845,16 +845,17 @@ void AuctionEntry::BuildAuctionInfo(std::vectorGetEnchantmentId((EnchantmentSlot) i), item->GetEnchantmentDuration((EnchantmentSlot) i), item->GetEnchantmentCharges((EnchantmentSlot) i), i); } - for (std::size_t i = 0; i < item->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) { - uint32 gemItemId = item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - WorldPackets::Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - auctionItem.Gems.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + auctionItem.Gems.push_back(gem); + } + ++i; } items.emplace_back(auctionItem); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 94d6c4ee19a..2372318ad2d 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -407,19 +407,42 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(1, GetGUID().GetCounter()); trans->Append(stmt); } - if (!GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).empty()) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + if (GetGems().size()) + { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_GEMS); stmt->setUInt64(0, GetGUID().GetCounter()); uint32 i = 0; - for (; i < MAX_GEM_SOCKETS && i < GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) - stmt->setUInt32(1 + i, GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i)); + for (ItemDynamicFieldGems const& gemData : GetGems()) + { + if (gemData.ItemId) + { + stmt->setUInt32(1 + i * MAX_GEM_SOCKETS, gemData.ItemId); + std::ostringstream gemBonusListIDs; + for (uint16 bonusListID : gemData.BonusListIDs) + if (bonusListID) + gemBonusListIDs << bonusListID << ' '; + stmt->setString(2 + i * MAX_GEM_SOCKETS, gemBonusListIDs.str()); + stmt->setUInt8(3 + i * MAX_GEM_SOCKETS, gemData.Context); + } + else + { + stmt->setUInt32(1 + i * MAX_GEM_SOCKETS, 0); + stmt->setString(2 + i * MAX_GEM_SOCKETS, ""); + stmt->setUInt8(3 + i * MAX_GEM_SOCKETS, 0); + } + ++i; + } for (; i < MAX_GEM_SOCKETS; ++i) - stmt->setUInt32(1 + i, 0); + { + stmt->setUInt32(1 + i * MAX_GEM_SOCKETS, 0); + stmt->setString(2 + i * MAX_GEM_SOCKETS, ""); + stmt->setUInt8(3 + i * MAX_GEM_SOCKETS, 0); + } trans->Append(stmt); } @@ -508,8 +531,8 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 29 30 31 - // gemItemId1, gemItemId2, gemItemId3 FROM item_instance + // 29 30 31 32 33 34 35 36 37 + // gemItemId1, gemBonuses1, gemContext1, gemItemId2, gemBonuses2, gemContext2, gemItemId3, gemBonuses3, gemContext3 FROM item_instance // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -618,15 +641,20 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[27].GetUInt32()); SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[28].GetUInt32()); - uint32 gemItemIds[3] = { fields[29].GetUInt32(), fields[30].GetUInt32(), fields[31].GetUInt32() }; - if (gemItemIds[0] || gemItemIds[1] || gemItemIds[2]) + ItemDynamicFieldGems gemData[MAX_GEM_SOCKETS]; + memset(gemData, 0, sizeof(gemData)); + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) { - // gem slots must be preserved, hence funky logic - AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[0]); - if (gemItemIds[1] || gemItemIds[2]) - AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[1]); - if (gemItemIds[2]) - AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[2]); + gemData[i].ItemId = fields[29 + i * MAX_GEM_SOCKETS].GetUInt32(); + Tokenizer bonusListIDs(fields[30 + i * MAX_GEM_SOCKETS].GetString(), ' '); + uint32 b = 0; + for (char const* token : bonusListIDs) + if (uint32 bonusListID = atoul(token)) + gemData[i].BonusListIDs[b++] = bonusListID; + + gemData[i].Context = fields[31 + i * MAX_GEM_SOCKETS].GetUInt8(); + if (gemData[i].ItemId) + SetGem(i, &gemData[i]); } if (need_save) // normal item changed state set not work at loading @@ -1050,10 +1078,27 @@ void Item::ClearEnchantment(EnchantmentSlot slot) SetState(ITEM_CHANGED, GetOwner()); } +DynamicFieldStructuredView Item::GetGems() const +{ + return GetDynamicStructuredValues(ITEM_DYNAMIC_FIELD_GEMS); +} + +ItemDynamicFieldGems const* Item::GetGem(uint16 slot) const +{ + ASSERT(slot < MAX_GEM_SOCKETS); + return GetDynamicStructuredValue(ITEM_DYNAMIC_FIELD_GEMS, slot); +} + +void Item::SetGem(uint16 slot, ItemDynamicFieldGems const* gem) +{ + ASSERT(slot < MAX_GEM_SOCKETS); + SetDynamicStructuredValue(ITEM_DYNAMIC_FIELD_GEMS, slot, gem); +} + bool Item::GemsFitSockets() const { uint32 gemSlot = 0; - for (uint32 gemItemId : GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) + for (ItemDynamicFieldGems const& gemData : GetGems()) { uint8 SocketColor = GetTemplate()->GetSocketColor(gemSlot); if (!SocketColor) // no socket slot @@ -1061,7 +1106,7 @@ bool Item::GemsFitSockets() const uint32 GemColor = 0; - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemId); if (gemProto) { GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); @@ -1077,17 +1122,17 @@ bool Item::GemsFitSockets() const uint8 Item::GetGemCountWithID(uint32 GemID) const { - return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [GemID](uint32 gemItemId) + return std::count_if(GetGems().begin(), GetGems().end(), [GemID](ItemDynamicFieldGems const& gemData) { - return gemItemId == GemID; + return gemData.ItemId == GemID; }); } uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const { - return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [limitCategory](uint32 gemItemId) + return std::count_if(GetGems().begin(), GetGems().end(), [limitCategory](ItemDynamicFieldGems const& gemData) { - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemId); if (!gemProto) return false; diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 26acb7d8ada..68d903f6a81 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -278,6 +278,16 @@ struct BonusData void AddBonus(uint32 type, int32 const (&values)[2]); }; +#pragma pack(push, 1) +struct ItemDynamicFieldGems +{ + uint32 ItemId; + uint16 BonusListIDs[16]; + uint8 Context; + uint8 Padding[3]; +}; +#pragma pack(pop) + class TC_GAME_API Item : public Object { public: @@ -373,6 +383,9 @@ class TC_GAME_API Item : public Object uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);} uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);} uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);} + DynamicFieldStructuredView GetGems() const; + ItemDynamicFieldGems const* GetGem(uint16 slot) const; + void SetGem(uint16 slot, ItemDynamicFieldGems const* gem); std::string const& GetText() const { return m_text; } void SetText(std::string const& text) { m_text = text; } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 3dc53538d23..e0aedc79c7f 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -92,6 +92,33 @@ class ZoneScript; typedef std::unordered_map UpdateDataMapType; +// Helper class used to iterate object dynamic fields while interpreting them as a structure instead of raw int array +template +class DynamicFieldStructuredView +{ +public: + explicit DynamicFieldStructuredView(std::vector const& data) : _data(data) { } + + T const* begin() const + { + return reinterpret_cast(_data.data()); + } + + T const* end() const + { + return reinterpret_cast(_data.data() + _data.size()); + } + + std::size_t size() const + { + using BlockCount = std::integral_constant; + return _data.size() / BlockCount::value; + } + +private: + std::vector const& _data; +}; + class TC_GAME_API Object { public: @@ -174,6 +201,40 @@ class TC_GAME_API Object void ClearDynamicValue(uint16 index); void SetDynamicValue(uint16 index, uint16 offset, uint32 value); + template + DynamicFieldStructuredView GetDynamicStructuredValues(uint16 index) const + { + static_assert(std::is_pod::value, "T used for Object::SetDynamicStructuredValue is not a POD type"); + using BlockCount = std::integral_constant; + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + std::vector const& values = _dynamicValues[index]; + ASSERT((values.size() % BlockCount::value) == 0, "Dynamic field value count must exactly fit into structure"); + return DynamicFieldStructuredView(values); + } + + template + T const* GetDynamicStructuredValue(uint16 index, uint16 offset) const + { + static_assert(std::is_pod::value, "T used for Object::SetDynamicStructuredValue is not a POD type"); + using BlockCount = std::integral_constant; + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + std::vector const& values = _dynamicValues[index]; + ASSERT((values.size() % BlockCount::value) == 0, "Dynamic field value count must exactly fit into structure"); + if (offset * BlockCount::value >= values.size()) + return nullptr; + return reinterpret_cast(&values[offset * BlockCount::value]); + } + + template + void SetDynamicStructuredValue(uint16 index, uint16 offset, T const* value) + { + static_assert(std::is_pod::value, "T used for Object::SetDynamicStructuredValue is not a POD type"); + using BlockCount = std::integral_constant; + SetDynamicValue(index, (offset + 1) * BlockCount::value - 1, 0); // reserve space + for (uint16 i = 0; i < BlockCount::value; ++i) + SetDynamicValue(index, offset * BlockCount::value + i, *(reinterpret_cast(value) + i)); + } + void ClearUpdateMask(bool remove); uint16 GetValuesCount() const { return m_valuesCount; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2bf30369a5c..749aa969585 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -12821,9 +12821,10 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool } // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 - if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, uint32(slot - SOCK_ENCHANTMENT_SLOT)))) - if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) - return; + if (ItemDynamicFieldGems const* gem = item->GetGem(uint16(slot - SOCK_ENCHANTMENT_SLOT))) + if (ItemTemplate const* gemTemplate = sObjectMgr->GetItemTemplate(gem->ItemId)) + if (gemTemplate->GetRequiredSkill() && GetSkillValue(gemTemplate->GetRequiredSkill()) < gemTemplate->GetRequiredSkillRank()) + return; } if (!item->IsBroken()) @@ -17339,8 +17340,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 29 30 31 32 33 - // gemItemId1, gemItemId2, gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 29 30 31 32 33 34 35 36 37 38 39 + // gemItemId1, gemBonuses1, gemContext1, gemItemId2, gemBonuses2, gemContext2, gemItemId3, gemBonuses3, gemContext3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17362,8 +17363,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[32].GetUInt64() ? ObjectGuid::Create(fields[32].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[33].GetUInt8(); + ObjectGuid bagGuid = fields[38].GetUInt64() ? ObjectGuid::Create(fields[38].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[39].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); GetSession()->GetCollectionMgr()->AddItemAppearance(item); @@ -17692,7 +17693,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[32].GetUInt64() ? ObjectGuid::Create(fields[32].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[38].GetUInt64() ? ObjectGuid::Create(fields[38].GetUInt64()) : ObjectGuid::Empty; if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: " UI64FMTD ") in mail (%u) doesn't exist, deleted from mail.", itemGuid, mail->messageID); @@ -21641,9 +21642,9 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) Item* pItem2 = GetItemByPos(INVENTORY_SLOT_BAG_0, i); if (pItem2 && !pItem2->IsBroken()) { - for (uint32 gemItemId : pItem2->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) + for (ItemDynamicFieldGems const& gemData : pItem2->GetGems()) { - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemId); if (!gemProto) continue; @@ -24529,9 +24530,9 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi return res; // check unique-equipped on gems - for (uint32 gemItemId : pItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) + for (ItemDynamicFieldGems const& gemData : pItem->GetGems()) { - ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(gemItemId); + ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(gemData.ItemId); if (!pGem) continue; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 2bd97bd7728..5140b74547b 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2394,7 +2394,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[33].GetUInt8(); + uint8 tabId = fields[39].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", @@ -3214,16 +3214,17 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const if (tabItem) { - for (std::size_t i = 0; i < tabItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : tabItem->GetGems()) { - uint32 gemItemId = tabItem->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - WorldPackets::Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - itemInfo.SocketEnchant.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + itemInfo.SocketEnchant.push_back(gem); + } + ++i; } } @@ -3297,16 +3298,17 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/; itemInfo.Flags = 0; - for (std::size_t i = 0; i < tabItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : tabItem->GetGems()) { - uint32 gemItemId = tabItem->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - WorldPackets::Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - itemInfo.SocketEnchant.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + itemInfo.SocketEnchant.push_back(gem); + } + ++i; } itemInfo.Locked = false; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 48216a2809a..bb65c6c00bd 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -409,8 +409,8 @@ void GuildMgr::LoadGuilds() // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 29 30 31 32 33 - // gemItemId1, gemItemId2, gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 29 30 31 32 33 34 35 36 37 38 39 + // gemItemId1, gemBonuses1, gemContext1, gemItemId2, gemBonuses2, gemContext2, gemItemId3, gemBonuses3, gemContext3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -423,7 +423,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[32].GetUInt64(); + uint64 guildId = fields[38].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 91a8eee27e6..a4e35620bd2 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -872,22 +872,38 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) //this slot is excepted when applying / removing meta gem bonus uint8 slot = itemTarget->IsEquipped() ? itemTarget->GetSlot() : uint8(NULL_SLOT); - Item* Gems[MAX_GEM_SOCKETS]; - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) - Gems[i] = !socketGems.GemItem[i].IsEmpty() ? _player->GetItemByGuid(socketGems.GemItem[i]) : NULL; + Item* gems[MAX_GEM_SOCKETS]; + memset(gems, 0, sizeof(gems)); + ItemDynamicFieldGems gemData[MAX_GEM_SOCKETS]; + memset(gemData, 0, sizeof(gemData)); + GemPropertiesEntry const* gemProperties[MAX_GEM_SOCKETS]; + memset(gemProperties, 0, sizeof(gemProperties)); + ItemDynamicFieldGems const* oldGemData[MAX_GEM_SOCKETS]; + memset(oldGemData, 0, sizeof(oldGemData)); + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + { + if (Item* gem = _player->GetItemByGuid(socketGems.GemItem[i])) + { + gems[i] = gem; + gemData[i].ItemId = gem->GetEntry(); + gemData[i].Context = gem->GetUInt32Value(ITEM_FIELD_CONTEXT); + for (std::size_t b = 0; b < gem->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS).size() && b < 16; ++b) + gemData[i].BonusListIDs[b] = gem->GetDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, b); - GemPropertiesEntry const* GemProps[MAX_GEM_SOCKETS]; - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get geminfo from dbc storage - GemProps[i] = (Gems[i]) ? sGemPropertiesStore.LookupEntry(Gems[i]->GetTemplate()->GetGemProperties()) : NULL; + gemProperties[i] = sGemPropertiesStore.LookupEntry(gem->GetTemplate()->GetGemProperties()); + } + + oldGemData[i] = itemTarget->GetGem(i); + } // Find first prismatic socket - int32 firstPrismatic = 0; + uint32 firstPrismatic = 0; while (firstPrismatic < MAX_GEM_SOCKETS && itemTarget->GetSocketColor(firstPrismatic)) ++firstPrismatic; - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //check for hack maybe + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) //check for hack maybe { - if (!GemProps[i]) + if (!gemProperties[i]) continue; // tried to put gem in socket where no socket exists (take care about prismatic sockets) @@ -902,50 +918,42 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) } // Gem must match socket color - if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != GemProps[i]->Type) + if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != gemProperties[i]->Type) { // unless its red, blue, yellow or prismatic - if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(GemProps[i]->Type & SOCKET_COLOR_PRISMATIC)) + if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(gemProperties[i]->Type & SOCKET_COLOR_PRISMATIC)) return; } } - uint32 GemEnchants[MAX_GEM_SOCKETS]; - uint32 oldGemItemIds[MAX_GEM_SOCKETS]; - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get new and old enchantments - { - GemEnchants[i] = (GemProps[i]) ? GemProps[i]->EnchantID : 0; - oldGemItemIds[i] = itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() > i ? itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)[i] : 0; - } - // check unique-equipped conditions - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (!Gems[i]) + if (!gems[i]) continue; // continue check for case when attempt add 2 similar unique equipped gems in one item. - ItemTemplate const* iGemProto = Gems[i]->GetTemplate(); + ItemTemplate const* iGemProto = gems[i]->GetTemplate(); // unique item (for new and already placed bit removed enchantments if (iGemProto->GetFlags() & ITEM_FLAG_UNIQUE_EQUIPPED) { - for (int j = 0; j < MAX_GEM_SOCKETS; ++j) + for (uint32 j = 0; j < MAX_GEM_SOCKETS; ++j) { if (i == j) // skip self continue; - if (Gems[j]) + if (gems[j]) { - if (iGemProto->GetId() == Gems[j]->GetEntry()) + if (iGemProto->GetId() == gems[j]->GetEntry()) { _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); return; } } - else if (oldGemItemIds[j]) + else if (oldGemData[j]) { - if (iGemProto->GetId() == oldGemItemIds[j]) + if (iGemProto->GetId() == oldGemData[j]->ItemId) { _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); return; @@ -963,16 +971,16 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) // NOTE: limitEntry->mode is not checked because if item has limit then it is applied in equip case for (int j = 0; j < MAX_GEM_SOCKETS; ++j) { - if (Gems[j]) + if (gems[j]) { // new gem - if (iGemProto->GetItemLimitCategory() == Gems[j]->GetTemplate()->GetItemLimitCategory()) + if (iGemProto->GetItemLimitCategory() == gems[j]->GetTemplate()->GetItemLimitCategory()) ++limit_newcount; } - else if (oldGemItemIds[j]) + else if (oldGemData[j]) { // existing gem - if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemItemIds[j])) + if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemData[j]->ItemId)) if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) ++limit_newcount; } @@ -989,7 +997,7 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) // for equipped item check all equipment for duplicate equipped gems if (itemTarget->IsEquipped()) { - if (InventoryResult res = _player->CanEquipUniqueItem(Gems[i], slot, std::max(limit_newcount, 0))) + if (InventoryResult res = _player->CanEquipUniqueItem(gems[i], slot, std::max(limit_newcount, 0))) { _player->SendEquipError(res, itemTarget, NULL); return; @@ -1006,25 +1014,17 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot) _player->ApplyEnchantment(itemTarget, EnchantmentSlot(enchant_slot), false); - uint32 reqGemSlots = 0; - for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) - if (Gems[i]) - reqGemSlots = i + 1; - - while (itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() < reqGemSlots) - itemTarget->AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, 0); - - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) + for (uint16 i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) + if (gems[i]) { - itemTarget->SetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i, guidItem->GetEntry()); + itemTarget->SetGem(i, &gemData[i]); - if (GemEnchants[i]) - itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); + if (gemProperties[i] && gemProperties[i]->EnchantID) + itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), gemProperties[i]->EnchantID, 0, 0, _player->GetGUID()); uint32 gemCount = 1; - _player->DestroyItemCount(guidItem, gemCount, true); + _player->DestroyItemCount(gems[i], gemCount, true); } } diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 7c672b86137..ae263301fc9 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -79,16 +79,17 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) tradeItem.Unwrapped->MaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); tradeItem.Unwrapped->Durability = item->GetUInt32Value(ITEM_FIELD_DURABILITY); - for (std::size_t i = 0; i < item->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) { - uint32 gemItemId = item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - WorldPackets::Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - tradeItem.Unwrapped->Gems.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + tradeItem.Unwrapped->Gems.push_back(gem); + } + ++i; } } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index fe81ac6c048..666f653d69e 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -71,16 +71,17 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint if (uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(i))) Enchants.emplace_back(enchId, i); - for (std::size_t i = 0; i < item->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) { - uint32 gemItemId = item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - WorldPackets::Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - Gems.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + Gems.push_back(gem); + } + ++i; } } diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index c6609812af5..54bc120d178 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -281,6 +281,20 @@ void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) } } +void WorldPackets::Item::ItemInstance::Initialize(::ItemDynamicFieldGems const* gem) +{ + ItemID = gem->ItemId; + + ItemBonusInstanceData bonus; + bonus.Context = gem->Context; + for (uint16 bonusListId : gem->BonusListIDs) + if (bonusListId) + bonus.BonusListIDs.push_back(bonusListId); + + if (bonus.Context || !bonus.BonusListIDs.empty()) + ItemBonus = bonus; +} + void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) { ItemID = lootItem.itemid; diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index aef6060b260..feb4f8f1120 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -40,6 +40,7 @@ namespace WorldPackets struct ItemInstance { void Initialize(::Item const* item); + void Initialize(::ItemDynamicFieldGems const* gem); void Initialize(::LootItem const& lootItem); void Initialize(::VoidStorageItem const* voidItem); diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index 12f48debe3d..f9bfaad578b 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -44,16 +44,17 @@ WorldPackets::Mail::MailAttachedItem::MailAttachedItem(::Item const* item, uint8 Enchants.push_back(enchant); } - for (std::size_t i = 0; i < item->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) { - uint32 gemItemId = item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i); - if (!gemItemId) - continue; - - Item::ItemGemInstanceData gem; - gem.Slot = i; - gem.Item.ItemID = gemItemId; - Gems.push_back(gem); + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + Gems.push_back(gem); + } + ++i; } } -- cgit v1.2.3 From 64de4b38ef5eddb14d9d456740fee62595c89e06 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 16 Jul 2016 13:52:12 +0200 Subject: Core/Items: Implemented child equipment --- .../hotfixes/2016_xx_xx_xx_hotfixes_legion_12.sql | 12 + .../Database/Implementation/HotfixDatabase.cpp | 3 + .../Database/Implementation/HotfixDatabase.h | 2 + src/server/game/DataStores/DB2Stores.cpp | 17 + src/server/game/DataStores/DB2Stores.h | 3 + src/server/game/DataStores/DB2Structure.h | 8 + src/server/game/Entities/Item/Item.cpp | 10 +- src/server/game/Entities/Item/Item.h | 4 + src/server/game/Entities/Item/ItemTemplate.h | 7 +- src/server/game/Entities/Player/Player.cpp | 626 ++++++++++++++++++++- src/server/game/Entities/Player/Player.h | 16 +- src/server/game/Handlers/ItemHandler.cpp | 116 ++-- src/server/game/Handlers/MailHandler.cpp | 2 +- 13 files changed, 763 insertions(+), 63 deletions(-) create mode 100644 sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_12.sql (limited to 'src/server/database') diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_12.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_12.sql new file mode 100644 index 00000000000..1d9354f9d15 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_12.sql @@ -0,0 +1,12 @@ +-- +-- Table structure for table `item_child_equipment` +-- +DROP TABLE IF EXISTS `item_child_equipment`; +CREATE TABLE `item_child_equipment` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ItemID` int(10) unsigned NOT NULL DEFAULT '0', + `AltItemID` int(10) unsigned NOT NULL DEFAULT '0', + `AltEquipmentSlot` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 524392fb474..beff06ff757 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -382,6 +382,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, PriceMod, Name, Flags FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Name_lang FROM item_class_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemChildEquipment.db2 + PrepareStatement(HOTFIX_SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ItemID, AltItemID, AltEquipmentSlot FROM item_child_equipment ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemCurrencyCost.db2 PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemId FROM item_currency_cost ORDER BY ID DESC", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 4221e05f0cc..4fc4d796f58 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -218,6 +218,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_CLASS, HOTFIX_SEL_ITEM_CLASS_LOCALE, + HOTFIX_SEL_ITEM_CHILD_EQUIPMENT, + HOTFIX_SEL_ITEM_CURRENCY_COST, HOTFIX_SEL_ITEM_DAMAGE_AMMO, diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2d7c3003688..40eeae312f8 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -101,6 +101,7 @@ DB2Storage sItemBagFamilyStore("ItemBagFami DB2Storage sItemBonusStore("ItemBonus.db2", ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS); DB2Storage sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE); DB2Storage sItemClassStore("ItemClass.db2", ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS); +DB2Storage sItemChildEquipmentStore("ItemChildEquipment.db2", ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT); DB2Storage sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST); DB2Storage sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO); DB2Storage sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); @@ -362,6 +363,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemBonusStore); LOAD_DB2(sItemBonusTreeNodeStore); LOAD_DB2(sItemClassStore); + LOAD_DB2(sItemChildEquipmentStore); LOAD_DB2(sItemCurrencyCostStore); LOAD_DB2(sItemDamageAmmoStore); LOAD_DB2(sItemDamageOneHandStore); @@ -600,6 +602,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } } + for (ItemChildEquipmentEntry const* itemChildEquipment : sItemChildEquipmentStore) + { + ASSERT(_itemChildEquipment.find(itemChildEquipment->ItemID) == _itemChildEquipment.end(), "Item must have max 1 child item."); + _itemChildEquipment[itemChildEquipment->ItemID] = itemChildEquipment; + } + for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore) _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemId); @@ -1062,6 +1070,15 @@ std::set DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTre return bonusListIDs; } +ItemChildEquipmentEntry const* DB2Manager::GetItemChildEquipment(uint32 itemId) const +{ + auto itr = _itemChildEquipment.find(itemId); + if (itr != _itemChildEquipment.end()) + return itr->second; + + return nullptr; +} + uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const { if (ItemModifiedAppearanceEntry const* modifiedAppearance = GetItemModifiedAppearance(itemId, appearanceModId)) diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 9ee2bb3b553..fdf3b744c4c 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -235,6 +235,7 @@ public: typedef std::vector ItemBonusList; typedef std::unordered_map ItemBonusListContainer; typedef std::unordered_multimap ItemToBonusTreeContainer; + typedef std::unordered_map ItemChildEquipmentContainer; typedef std::unordered_map ItemModifiedAppearanceByItemContainer; typedef std::unordered_map> ItemBonusTreeContainer; typedef std::unordered_map> ItemSetSpellContainer; @@ -283,6 +284,7 @@ public: HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; std::set GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; + ItemChildEquipmentEntry const* GetItemChildEquipment(uint32 itemId) const; bool HasItemCurrencyCost(uint32 itemId) const { return _itemsWithCurrencyCost.count(itemId) > 0; } uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; ItemModifiedAppearanceEntry const* GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId) const; @@ -333,6 +335,7 @@ private: HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; + ItemChildEquipmentContainer _itemChildEquipment; std::unordered_set _itemsWithCurrencyCost; ItemModifiedAppearanceByItemContainer _itemModifiedAppearancesByItem; ItemToBonusTreeContainer _itemToBonusTree; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index f9a7c7116d8..2101661912a 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -1182,6 +1182,14 @@ struct ItemBonusTreeNodeEntry uint8 BonusTreeModID; }; +struct ItemChildEquipmentEntry +{ + uint32 ID; + uint32 ItemID; + uint32 AltItemID; + uint8 AltEquipmentSlot; +}; + struct ItemClassEntry { uint32 ID; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 5acfa65ee7b..18c61a4c094 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -551,9 +551,15 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie if (!ownerGuid.IsEmpty()) SetOwnerGUID(ownerGuid); + uint32 itemFlags = fields[7].GetUInt32(); bool need_save = false; // need explicit save data at load fixes if (uint64 creator = fields[2].GetUInt64()) - SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create(creator)); + { + if (!(itemFlags & ITEM_FIELD_FLAG_CHILD)) + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create(creator)); + else + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create(creator)); + } if (uint64 giftCreator = fields[3].GetUInt64()) SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Create(giftCreator)); SetCount(fields[4].GetUInt32()); @@ -572,7 +578,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie for (uint8 i = 0; i < proto->Effects.size(); ++i) SetSpellCharges(i, atoi(tokens[i])); - SetUInt32Value(ITEM_FIELD_FLAGS, fields[7].GetUInt32()); + SetUInt32Value(ITEM_FIELD_FLAGS, itemFlags); // Remove bind flag for items vs NO_BIND set if (IsSoulBound() && proto->GetBonding() == NO_BIND) { diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 68d903f6a81..683353a7fe3 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -477,6 +477,9 @@ class TC_GAME_API Item : public Object uint32 GetModifier(ItemModifier modifier) const; void SetModifier(ItemModifier modifier, uint32 value); + ObjectGuid GetChildItem() const { return m_childItem; } + void SetChildItem(ObjectGuid childItem) { m_childItem = childItem; } + protected: BonusData _bonusData; @@ -492,5 +495,6 @@ class TC_GAME_API Item : public Object uint32 m_paidMoney; uint32 m_paidExtendedCost; GuidSet allowedGUIDs; + ObjectGuid m_childItem; }; #endif diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index a41c8d91a88..d95b361da89 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -152,7 +152,7 @@ enum ItemFieldFlags : uint32 ITEM_FIELD_FLAG_UNK11 = 0x00010000, ITEM_FIELD_FLAG_UNK12 = 0x00020000, ITEM_FIELD_FLAG_UNK13 = 0x00040000, - ITEM_FIELD_FLAG_UNK14 = 0x00080000, + ITEM_FIELD_FLAG_CHILD = 0x00080000, ITEM_FIELD_FLAG_UNK15 = 0x00100000, ITEM_FIELD_FLAG_UNK16 = 0x00200000, ITEM_FIELD_FLAG_UNK17 = 0x00400000, @@ -164,9 +164,7 @@ enum ItemFieldFlags : uint32 ITEM_FIELD_FLAG_UNK23 = 0x10000000, ITEM_FIELD_FLAG_UNK24 = 0x20000000, ITEM_FIELD_FLAG_UNK25 = 0x40000000, - ITEM_FIELD_FLAG_UNK26 = 0x80000000, - - ITEM_FIELD_FLAG_MAIL_TEXT_MASK = ITEM_FIELD_FLAG_READABLE | ITEM_FIELD_FLAG_UNK13 | ITEM_FIELD_FLAG_UNK14 + ITEM_FIELD_FLAG_UNK26 = 0x80000000 }; enum ItemFlags : uint32 @@ -789,6 +787,7 @@ struct TC_GAME_API ItemTemplate bool IsPotion() const { return GetClass() == ITEM_CLASS_CONSUMABLE && GetSubClass() == ITEM_SUBCLASS_POTION; } bool IsVellum() const { return GetClass() == ITEM_CLASS_TRADE_GOODS && GetSubClass() == ITEM_SUBCLASS_ENCHANTMENT; } bool IsConjuredConsumable() const { return GetClass() == ITEM_CLASS_CONSUMABLE && (GetFlags() & ITEM_FLAG_CONJURED); } + bool IsCraftingReagent() const { return (GetFlags2() & ITEM_FLAG2_CRAFTING_MATERIAL) != 0; } bool IsRangedWeapon() const { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 045066cdedf..e0d958d431f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3581,6 +3581,22 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c m_items[i]->BuildCreateUpdateBlockForPlayer(data, target); } + + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + { + if (m_items[i] == nullptr) + continue; + + m_items[i]->BuildCreateUpdateBlockForPlayer(data, target); + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + { + if (m_items[i] == nullptr) + continue; + + m_items[i]->BuildCreateUpdateBlockForPlayer(data, target); + } } Unit::BuildCreateUpdateBlockForPlayer(data, target); @@ -3607,6 +3623,22 @@ void Player::DestroyForPlayer(Player* target) const m_items[i]->DestroyForPlayer(target); } + + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + { + if (m_items[i] == nullptr) + continue; + + m_items[i]->DestroyForPlayer(target); + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + { + if (m_items[i] == nullptr) + continue; + + m_items[i]->DestroyForPlayer(target); + } } } @@ -9296,6 +9328,24 @@ InventoryResult Player::CanUnequipItems(uint32 item, uint32 count) const } + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetEntry() == item) + { + tempcount += pItem->GetCount(); + if (tempcount >= count) + return EQUIP_ERR_OK; + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetEntry() == item) + { + tempcount += pItem->GetCount(); + if (tempcount >= count) + return EQUIP_ERR_OK; + } + for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) if (Bag* pBag = GetBagByPos(i)) for (uint32 j = 0; j < pBag->GetBagSize(); ++j) @@ -9348,6 +9398,28 @@ uint32 Player::GetItemCount(uint32 item, bool inBankAlso, Item* skipItem) const count += pItem->GetGemCountWithID(item); } + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem && pItem->GetEntry() == item) + count += pItem->GetCount(); + + if (skipItem && skipItem->GetTemplate()->GetGemProperties()) + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem && pItem->GetSocketColor(0)) + count += pItem->GetGemCountWithID(item); + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem && pItem->GetEntry() == item) + count += pItem->GetCount(); + + if (skipItem && skipItem->GetTemplate()->GetGemProperties()) + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem && pItem->GetSocketColor(0)) + count += pItem->GetGemCountWithID(item); + return count; } @@ -9376,6 +9448,20 @@ uint32 Player::GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipIte if (Bag* pBag = GetBagByPos(i)) count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem); + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem) + if (ItemTemplate const* pProto = pItem->GetTemplate()) + if (pProto->GetItemLimitCategory() == limitCategory) + count += pItem->GetCount(); + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem != skipItem) + if (ItemTemplate const* pProto = pItem->GetTemplate()) + if (pProto->GetItemLimitCategory() == limitCategory) + count += pItem->GetCount(); + return count; } @@ -9386,7 +9472,17 @@ Item* Player::GetItemByGuid(ObjectGuid guid) const if (pItem->GetGUID() == guid) return pItem; - for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) + for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetGUID() == guid) + return pItem; + + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetGUID() == guid) + return pItem; + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (pItem->GetGUID() == guid) return pItem; @@ -9417,7 +9513,7 @@ Item* Player::GetItemByPos(uint16 pos) const Item* Player::GetItemByPos(uint8 bag, uint8 slot) const { - if (bag == INVENTORY_SLOT_BAG_0 && slot < BANK_SLOT_BAG_END) + if (bag == INVENTORY_SLOT_BAG_0 && slot < PLAYER_SLOT_END && (slot < BUYBACK_SLOT_START || slot >= BUYBACK_SLOT_END)) return m_items[slot]; if (Bag* pBag = GetBagByPos(bag)) return pBag->GetItemByPos(slot); @@ -9494,6 +9590,21 @@ Item* Player::GetShield(bool useable) const return item; } +Item* Player::GetChildItemByGuid(ObjectGuid guid) const +{ + for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetGUID() == guid) + return pItem; + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetGUID() == guid) + return pItem; + + return nullptr; +} + uint8 Player::GetAttackBySlot(uint8 slot, InventoryType inventoryType) { switch (slot) @@ -9512,6 +9623,10 @@ bool Player::IsInventoryPos(uint8 bag, uint8 slot) return true; if (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END) return true; + if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)) + return true; + if (bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END)) + return true; return false; } @@ -9546,6 +9661,11 @@ bool Player::IsBagPos(uint16 pos) return false; } +bool Player::IsChildEquipmentPos(uint8 bag, uint8 slot) +{ + return bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END); +} + bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const { // post selected @@ -9657,6 +9777,28 @@ bool Player::HasItemCount(uint32 item, uint32 count, bool inBankAlso) const } } + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; i++) + { + Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i); + if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade()) + { + tempcount += pItem->GetCount(); + if (tempcount >= count) + return true; + } + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; i++) + { + Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i); + if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade()) + { + tempcount += pItem->GetCount(); + if (tempcount >= count) + return true; + } + } + return false; } @@ -9826,6 +9968,20 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const } } + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + { + item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i); + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + return true; + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + { + item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i); + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + return true; + } + return false; } @@ -9839,8 +9995,17 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP uint32 need_space; - if (pSrcItem && pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot)) - return EQUIP_ERR_DESTROY_NONEMPTY_BAG; + if (pSrcItem) + { + if (pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot)) + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; + + if (pSrcItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD) && !IsEquipmentPos(bag, slot) && !IsChildEquipmentPos(bag, slot)) + return EQUIP_ERR_WRONG_BAG_TYPE_3; + + if (!pSrcItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD) && IsChildEquipmentPos(bag, slot)) + return EQUIP_ERR_WRONG_BAG_TYPE_3; + } // empty specific slot - check item fit to slot if (!pItem2 || swap) @@ -9906,8 +10071,14 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite if (!pBag || pBag == pSrcItem) return EQUIP_ERR_WRONG_BAG_TYPE; - if (pSrcItem && pSrcItem->IsNotEmptyBag()) - return EQUIP_ERR_DESTROY_NONEMPTY_BAG; + if (pSrcItem) + { + if (pSrcItem->IsNotEmptyBag()) + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; + + if (pSrcItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + return EQUIP_ERR_WRONG_BAG_TYPE_3; + } ItemTemplate const* pBagProto = pBag->GetTemplate(); if (!pBagProto) @@ -10090,6 +10261,42 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des { if (bag == INVENTORY_SLOT_BAG_0) // inventory { + res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + + res = CanStoreItem_InInventorySlots(REAGENT_SLOT_START, REAGENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot); if (res != EQUIP_ERR_OK) { @@ -10137,6 +10344,47 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des // search free slot in bag for place to if (bag == INVENTORY_SLOT_BAG_0) // inventory { + if (pItem && pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + { + res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + } + else if (pProto->IsCraftingReagent() && HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED)) + { + res = CanStoreItem_InInventorySlots(REAGENT_SLOT_START, REAGENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + } + res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot); if (res != EQUIP_ERR_OK) { @@ -10185,6 +10433,42 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des // search stack for merge to if (pProto->GetMaxStackSize() != 1) { + res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + + res = CanStoreItem_InInventorySlots(REAGENT_SLOT_START, REAGENT_SLOT_END, dest, pProto, count, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot); if (res != EQUIP_ERR_OK) { @@ -10265,6 +10549,47 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (pItem && pItem->IsNotEmptyBag()) return EQUIP_ERR_BAG_IN_BAG; + if (pItem && pItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + { + res = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + } + else if (pProto->IsCraftingReagent() && HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED)) + { + res = CanStoreItem_InInventorySlots(REAGENT_SLOT_START, REAGENT_SLOT_END, dest, pProto, count, false, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + { + if (no_space_count) + *no_space_count = count + no_similar_count; + return res; + } + + if (count == 0) + { + if (no_similar_count == 0) + return EQUIP_ERR_OK; + + if (no_space_count) + *no_space_count = count + no_similar_count; + return EQUIP_ERR_ITEM_MAX_COUNT; + } + } + // search free slot res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot); if (res != EQUIP_ERR_OK) @@ -10662,6 +10987,46 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool return !swap ? EQUIP_ERR_ITEM_NOT_FOUND : EQUIP_ERR_CANT_SWAP; } +InventoryResult Player::CanEquipChildItem(Item* parentItem) const +{ + Item* childItem = GetChildItemByGuid(parentItem->GetChildItem()); + if (!childItem) + return EQUIP_ERR_OK; + + ItemChildEquipmentEntry const* childEquipement = sDB2Manager.GetItemChildEquipment(parentItem->GetEntry()); + if (!childItem) + return EQUIP_ERR_OK; + + Item* dstItem = GetItemByPos(INVENTORY_SLOT_BAG_0, childEquipement->AltEquipmentSlot); + if (!dstItem) + return EQUIP_ERR_OK; + + uint16 childDest = (INVENTORY_SLOT_BAG_0 << 8) | childEquipement->AltEquipmentSlot; + InventoryResult msg = CanUnequipItem(childDest, !childItem->IsBag()); + if (msg != EQUIP_ERR_OK) + return msg; + + // check dest->src move possibility + uint16 src = parentItem->GetPos(); + ItemPosCountVec dest; + if (IsInventoryPos(src)) + { + msg = CanStoreItem(parentItem->GetBagSlot(), NULL_SLOT, dest, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = CanStoreItem(NULL_BAG, NULL_SLOT, dest, dstItem, true); + } + else if (IsBankPos(src)) + { + msg = CanBankItem(parentItem->GetBagSlot(), NULL_SLOT, dest, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = CanBankItem(NULL_BAG, NULL_SLOT, dest, dstItem, true); + } + else if (IsEquipmentPos(src)) + return EQUIP_ERR_CANT_SWAP; + + return msg; +} + InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const { // Applied only to equipped items and bank bags @@ -11110,6 +11475,20 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat if (addToCollection) GetSession()->GetCollectionMgr()->OnItemAdded(item); + + if (ItemChildEquipmentEntry const* childItemEntry = sDB2Manager.GetItemChildEquipment(itemId)) + { + if (ItemTemplate const* childTemplate = sObjectMgr->GetItemTemplate(childItemEntry->AltItemID)) + { + ItemPosCountVec childDest; + CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, childDest, childTemplate, count, false, nullptr, NULL_BAG, NULL_SLOT); + if (Item* childItem = StoreNewItem(childDest, childTemplate->GetId(), update, 0, {}, {}, addToCollection)) + { + childItem->SetGuidValue(ITEM_FIELD_CREATOR, item->GetGUID()); + childItem->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD); + } + } + } } return item; } @@ -11135,6 +11514,9 @@ Item* Player::StoreItem(ItemPosCountVec const& dest, Item* pItem, bool update) lastItem = _StoreItem(pos, pItem, count, true, update); } + + AutoUnequipChildItem(pItem); + return lastItem; } @@ -11368,6 +11750,105 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) return pItem; } +void Player::EquipChildItem(uint8 parentBag, uint8 parentSlot, Item* parentItem) +{ + if (ItemChildEquipmentEntry const* itemChildEquipment = sDB2Manager.GetItemChildEquipment(parentItem->GetEntry())) + { + if (Item* childItem = GetChildItemByGuid(parentItem->GetChildItem())) + { + uint16 childDest = (INVENTORY_SLOT_BAG_0 << 8) | itemChildEquipment->AltEquipmentSlot; + if (childItem->GetPos() != childDest) + { + Item* dstItem = GetItemByPos(childDest); + if (!dstItem) // empty slot, simple case + { + RemoveItem(childItem->GetBagSlot(), childItem->GetSlot(), true); + EquipItem(childDest, childItem, true); + AutoUnequipOffhandIfNeed(); + } + else // have currently equipped item, not simple case + { + uint8 dstbag = dstItem->GetBagSlot(); + uint8 dstslot = dstItem->GetSlot(); + + InventoryResult msg = CanUnequipItem(childDest, !childItem->IsBag()); + if (msg != EQUIP_ERR_OK) + { + SendEquipError(msg, dstItem); + return; + } + + // check dest->src move possibility but try to store currently equipped item in the bag where the parent item is + ItemPosCountVec sSrc; + uint16 eSrc = 0; + if (IsInventoryPos(parentBag, parentSlot)) + { + msg = CanStoreItem(parentBag, NULL_SLOT, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); + } + else if (IsBankPos(parentBag, parentSlot)) + { + msg = CanBankItem(parentBag, NULL_SLOT, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); + } + else if (IsEquipmentPos(parentBag, parentSlot)) + { + msg = CanEquipItem(parentSlot, eSrc, dstItem, true); + if (msg == EQUIP_ERR_OK) + msg = CanUnequipItem(eSrc, true); + } + + if (msg != EQUIP_ERR_OK) + { + SendEquipError(msg, dstItem, childItem); + return; + } + + // now do moves, remove... + RemoveItem(dstbag, dstslot, false); + RemoveItem(childItem->GetBagSlot(), childItem->GetSlot(), false); + + // add to dest + EquipItem(childDest, childItem, true); + + // add to src + if (IsInventoryPos(parentBag, parentSlot)) + StoreItem(sSrc, dstItem, true); + else if (IsBankPos(parentBag, parentSlot)) + BankItem(sSrc, dstItem, true); + else if (IsEquipmentPos(parentBag, parentSlot)) + EquipItem(eSrc, dstItem, true); + + AutoUnequipOffhandIfNeed(); + } + } + } + } +} + +void Player::AutoUnequipChildItem(Item* parentItem) +{ + if (ItemChildEquipmentEntry const* itemChildEquipment = sDB2Manager.GetItemChildEquipment(parentItem->GetEntry())) + { + if (Item* childItem = GetChildItemByGuid(parentItem->GetChildItem())) + { + if (IsChildEquipmentPos(childItem->GetPos())) + return; + + ItemPosCountVec dest; + uint32 count = childItem->GetCount(); + InventoryResult result = CanStoreItem_InInventorySlots(CHILD_EQUIPMENT_SLOT_START, CHILD_EQUIPMENT_SLOT_END, dest, childItem->GetTemplate(), count, false, childItem, NULL_BAG, NULL_SLOT); + if (result != EQUIP_ERR_OK) + return; + + RemoveItem(childItem->GetBagSlot(), childItem->GetSlot(), true); + StoreItem(dest, childItem, true); + } + } +} + void Player::QuickEquipItem(uint16 pos, Item* pItem) { if (pItem) @@ -11515,6 +11996,8 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update) pItem->SetSlot(NULL_SLOT); if (IsInWorld() && update) pItem->SendUpdateToPlayer(this); + + AutoUnequipChildItem(pItem); } } @@ -11825,6 +12308,63 @@ void Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, bool } } } + + for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) + { + if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + { + if (item->GetEntry() == itemEntry && !item->IsInTrade()) + { + if (item->GetCount() + remcount <= count) + { + // all keys can be unequipped + remcount += item->GetCount(); + DestroyItem(INVENTORY_SLOT_BAG_0, i, update); + + if (remcount >= count) + return; + } + else + { + ItemRemovedQuestCheck(item->GetEntry(), count - remcount); + item->SetCount(item->GetCount() - count + remcount); + if (IsInWorld() && update) + item->SendUpdateToPlayer(this); + item->SetState(ITEM_CHANGED, this); + return; + } + } + } + } + + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + { + if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + { + if (item->GetEntry() == itemEntry && !item->IsInTrade()) + { + if (item->GetCount() + remcount <= count) + { + // all keys can be unequipped + remcount += item->GetCount(); + DestroyItem(INVENTORY_SLOT_BAG_0, i, update); + + if (remcount >= count) + return; + } + else + { + ItemRemovedQuestCheck(item->GetEntry(), count - remcount); + item->SetCount(item->GetCount() - count + remcount); + if (IsInWorld() && update) + item->SendUpdateToPlayer(this); + item->SetState(ITEM_CHANGED, this); + return; + } + } + } + } + } void Player::DestroyZoneLimitedItem(bool update, uint32 new_zone) @@ -11901,6 +12441,11 @@ Item* Player::GetItemByEntry(uint32 entry) const if (pItem->GetEntry() == entry) return pItem; + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (pItem->GetEntry() == entry) + return pItem; + return nullptr; } @@ -11933,6 +12478,11 @@ std::vector Player::GetItemListByEntry(uint32 entry, bool inBankAlso) con itemList.push_back(item); } + for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) + if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (item->GetEntry() == entry) + itemList.push_back(item); + return itemList; } @@ -12091,6 +12641,33 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!pSrcItem) return; + if (pSrcItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + { + if (Item* parentItem = GetItemByGuid(pSrcItem->GetGuidValue(ITEM_FIELD_CREATOR))) + { + if (IsEquipmentPos(src)) + { + AutoUnequipChildItem(parentItem); // we need to unequip child first since it cannot go into whatever is going to happen next + SwapItem(dst, src); // src is now empty + SwapItem(parentItem->GetPos(), dst);// dst is now empty + return; + } + } + } + else if (pDstItem && pDstItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + { + if (Item* parentItem = GetItemByGuid(pDstItem->GetGuidValue(ITEM_FIELD_CREATOR))) + { + if (IsEquipmentPos(dst)) + { + AutoUnequipChildItem(parentItem); // we need to unequip child first since it cannot go into whatever is going to happen next + SwapItem(src, dst); // dst is now empty + SwapItem(parentItem->GetPos(), src);// src is now empty + return; + } + } + } + TC_LOG_DEBUG("entities.player.items", "Player::SwapItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u", GetName().c_str(), GetGUID().ToString().c_str(), dstbag, dstslot, pSrcItem->GetEntry()); @@ -12129,7 +12706,6 @@ void Player::SwapItem(uint16 src, uint16 dst) } // DST checks - if (pDstItem) { // check unequip potability for equipped items and bank bags @@ -12213,6 +12789,9 @@ void Player::SwapItem(uint16 src, uint16 dst) else return; + if (msg == EQUIP_ERR_OK && IsEquipmentPos(dst) && !pSrcItem->GetChildItem().IsEmpty()) + msg = CanEquipChildItem(pSrcItem); + // can be merge/fill if (msg == EQUIP_ERR_OK) { @@ -12227,6 +12806,9 @@ void Player::SwapItem(uint16 src, uint16 dst) else if (IsEquipmentPos(dst)) { EquipItem(eDest, pSrcItem, true); + if (!pSrcItem->GetChildItem().IsEmpty()) + EquipChildItem(srcbag, srcslot, pSrcItem); + AutoUnequipOffhandIfNeed(); } } @@ -12284,6 +12866,9 @@ void Player::SwapItem(uint16 src, uint16 dst) msg = CanUnequipItem(eDest2, true); } + if (msg == EQUIP_ERR_OK && IsEquipmentPos(dst) && !pSrcItem->GetChildItem().IsEmpty()) + msg = CanEquipChildItem(pSrcItem); + if (msg != EQUIP_ERR_OK) { SendEquipError(msg, pDstItem, pSrcItem); @@ -12367,7 +12952,11 @@ void Player::SwapItem(uint16 src, uint16 dst) else if (IsBankPos(dst)) BankItem(sDest, pSrcItem, true); else if (IsEquipmentPos(dst)) + { EquipItem(eDest, pSrcItem, true); + if (!pSrcItem->GetChildItem().IsEmpty()) + EquipChildItem(srcbag, srcslot, pSrcItem); + } // add to src if (IsInventoryPos(src)) @@ -17353,6 +17942,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) std::map bagMap; // fast guid lookup for bags std::map invalidBagMap; // fast guid lookup for bags + std::vector childItems; std::list problematicItems; SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -17439,9 +18029,14 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) } + // Item's state may have changed after storing if (err == EQUIP_ERR_OK) + { item->SetState(ITEM_UNCHANGED, this); + if (item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) + childItems.push_back(item); + } else { TC_LOG_ERROR("entities.player", "Player::_LoadInventory: Player '%s' (%s) has item (%s, entry: %u) which can't be loaded into inventory (Bag %s, slot: %u) by reason %u. Item will be sent by mail.", @@ -17467,6 +18062,15 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) } draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED); } + + for (Item* childItem : childItems) + { + if (Item* parent = GetItemByGuid(childItem->GetGuidValue(ITEM_FIELD_CREATOR))) + parent->SetChildItem(childItem->GetGUID()); + else + childItem->SetState(ITEM_REMOVED, this); + } + CharacterDatabase.CommitTransaction(trans); } //if (IsAlive()) @@ -17516,14 +18120,6 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) continue; } - std::string name; - if (!creatorGuid.IsEmpty() && !ObjectMgr::GetPlayerNameByGUID(creatorGuid, name)) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '%s' (%s) has an item with an invalid creator guid, set to 0 (item id: " UI64FMTD ", entry: %u, creator: %s).", - GetName().c_str(), GetGUID().ToString().c_str(), itemId, itemEntry, creatorGuid.ToString().c_str()); - creatorGuid.Clear(); - } - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs); WorldPackets::Item::ItemInstance voidInstance; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c836fda5435..99591ea5729 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -726,7 +726,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 184, + PLAYER_SLOT_END = 187, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -797,6 +797,12 @@ enum ReagentSlots REAGENT_SLOT_END = 184, }; +enum ChildEquipmentSlots +{ + CHILD_EQUIPMENT_SLOT_START = 184, + CHILD_EQUIPMENT_SLOT_END = 187, +}; + enum EquipmentSetUpdateState { EQUIPMENT_SET_UNCHANGED = 0, @@ -1325,6 +1331,7 @@ class TC_GAME_API Player : public Unit, public GridObject Bag* GetBagByPos(uint8 slot) const; Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const; Item* GetShield(bool useable = false) const; + Item* GetChildItemByGuid(ObjectGuid guid) const; static uint8 GetAttackBySlot(uint8 slot, InventoryType inventoryType); // MAX_ATTACK if not weapon slot std::vector &GetItemUpdateQueue() { return m_itemUpdateQueue; } static bool IsInventoryPos(uint16 pos) { return IsInventoryPos(pos >> 8, pos & 255); } @@ -1334,6 +1341,8 @@ class TC_GAME_API Player : public Unit, public GridObject static bool IsBagPos(uint16 pos); static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } static bool IsBankPos(uint8 bag, uint8 slot); + static bool IsChildEquipmentPos(uint16 pos) { return IsChildEquipmentPos(pos >> 8, pos & 255); } + static bool IsChildEquipmentPos(uint8 bag, uint8 slot); bool IsValidPos(uint16 pos, bool explicit_pos) const { return IsValidPos(pos >> 8, pos & 255, explicit_pos); } bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const; uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_BANK_BAG_SLOTS); } @@ -1351,6 +1360,9 @@ class TC_GAME_API Player : public Unit, public GridObject InventoryResult CanEquipNewItem(uint8 slot, uint16& dest, uint32 item, bool swap) const; InventoryResult CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool swap, bool not_loading = true) const; + // This method must be called before equipping parent item! + InventoryResult CanEquipChildItem(Item* parentItem) const; + InventoryResult CanEquipUniqueItem(Item* pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const; InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const; InventoryResult CanUnequipItems(uint32 item, uint32 count) const; @@ -1365,6 +1377,8 @@ class TC_GAME_API Player : public Unit, public GridObject Item* EquipNewItem(uint16 pos, uint32 item, bool update); Item* EquipItem(uint16 pos, Item* pItem, bool update); void AutoUnequipOffhandIfNeed(bool force = false); + void EquipChildItem(uint8 parentBag, uint8 parentSlot, Item* parentItem); + void AutoUnequipChildItem(Item* parentItem); bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count); void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast = false); void AutoStoreLoot(uint32 loot_id, LootStore const& store, bool broadcast = false) { AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index a4e35620bd2..26f88bc6528 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -201,8 +201,21 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& Item* dstItem = _player->GetItemByPos(dest); if (!dstItem) // empty slot, simple case { + if (!srcItem->GetChildItem().IsEmpty()) + { + InventoryResult childEquipResult = _player->CanEquipChildItem(srcItem); + if (childEquipResult != EQUIP_ERR_OK) + { + _player->SendEquipError(msg, srcItem); + return; + } + } + _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, true); _player->EquipItem(dest, srcItem, true); + if (!srcItem->GetChildItem().IsEmpty()) + _player->EquipChildItem(autoEquipItem.PackSlot, autoEquipItem.Slot, srcItem); + _player->AutoUnequipOffhandIfNeed(); } else // have currently equipped item, not simple case @@ -217,52 +230,75 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& return; } - // check dest->src move possibility - ItemPosCountVec sSrc; - uint16 eSrc = 0; - if (_player->IsInventoryPos(src)) - { - msg = _player->CanStoreItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); - if (msg != EQUIP_ERR_OK) - msg = _player->CanStoreItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); - if (msg != EQUIP_ERR_OK) - msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); - } - else if (_player->IsBankPos(src)) + if (!dstItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD)) { - msg = _player->CanBankItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); - if (msg != EQUIP_ERR_OK) - msg = _player->CanBankItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); + // check dest->src move possibility + ItemPosCountVec sSrc; + uint16 eSrc = 0; + if (_player->IsInventoryPos(src)) + { + msg = _player->CanStoreItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = _player->CanStoreItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); + } + else if (_player->IsBankPos(src)) + { + msg = _player->CanBankItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = _player->CanBankItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); + if (msg != EQUIP_ERR_OK) + msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); + } + else if (_player->IsEquipmentPos(src)) + { + msg = _player->CanEquipItem(autoEquipItem.Slot, eSrc, dstItem, true); + if (msg == EQUIP_ERR_OK) + msg = _player->CanUnequipItem(eSrc, true); + } + + if (msg == EQUIP_ERR_OK && Player::IsEquipmentPos(dest) && !srcItem->GetChildItem().IsEmpty()) + msg = _player->CanEquipChildItem(srcItem); + if (msg != EQUIP_ERR_OK) - msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); - } - else if (_player->IsEquipmentPos(src)) - { - msg = _player->CanEquipItem(autoEquipItem.Slot, eSrc, dstItem, true); - if (msg == EQUIP_ERR_OK) - msg = _player->CanUnequipItem(eSrc, true); - } + { + _player->SendEquipError(msg, dstItem, srcItem); + return; + } - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, dstItem, srcItem); - return; - } + // now do moves, remove... + _player->RemoveItem(dstbag, dstslot, false); + _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, false); - // now do moves, remove... - _player->RemoveItem(dstbag, dstslot, false); - _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, false); + // add to dest + _player->EquipItem(dest, srcItem, true); - // add to dest - _player->EquipItem(dest, srcItem, true); + // add to src + if (_player->IsInventoryPos(src)) + _player->StoreItem(sSrc, dstItem, true); + else if (_player->IsBankPos(src)) + _player->BankItem(sSrc, dstItem, true); + else if (_player->IsEquipmentPos(src)) + _player->EquipItem(eSrc, dstItem, true); - // add to src - if (_player->IsInventoryPos(src)) - _player->StoreItem(sSrc, dstItem, true); - else if (_player->IsBankPos(src)) - _player->BankItem(sSrc, dstItem, true); - else if (_player->IsEquipmentPos(src)) - _player->EquipItem(eSrc, dstItem, true); + if (Player::IsEquipmentPos(dest) && !srcItem->GetChildItem().IsEmpty()) + _player->EquipChildItem(autoEquipItem.PackSlot, autoEquipItem.Slot, srcItem); + } + else + { + if (Item* parentItem = _player->GetItemByGuid(dstItem->GetGuidValue(ITEM_FIELD_CREATOR))) + { + if (Player::IsEquipmentPos(dest)) + { + _player->AutoUnequipChildItem(parentItem); + // dest is now empty + _player->SwapItem(src, dest); + // src is now empty + _player->SwapItem(parentItem->GetPos(), src); + } + } + } _player->AutoUnequipOffhandIfNeed(); } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 69bafe9bc11..e86b304b554 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -635,7 +635,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextIt if (m->messageType == MAIL_NORMAL) bodyItem->SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create(m->sender)); - bodyItem->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_MAIL_TEXT_MASK); + bodyItem->SetFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_READABLE); ItemPosCountVec dest; uint8 msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, bodyItem, false); -- cgit v1.2.3 From 6c1c8e7581091bcd94a208cbfbd440ba0fd1a766 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 19 Jul 2016 17:44:00 +0200 Subject: Core/PacketIO: Send spec id in char enum --- .../database/Database/Implementation/CharacterDatabase.cpp | 8 ++++---- src/server/game/Handlers/CharacterHandler.cpp | 2 ++ src/server/game/Server/Packets/CharacterPackets.cpp | 10 ++++++---- src/server/game/Server/Packets/CharacterPackets.h | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) (limited to 'src/server/database') diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 8ca023b1856..daa75e5cae8 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -49,21 +49,21 @@ void CharacterDatabaseConnection::DoPrepareStatements() "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, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " "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, " "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, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, 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, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " "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, " "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, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, 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_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 2278e001aba..abac1b283fb 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -304,6 +304,8 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (charInfo.Class == CLASS_DEMON_HUNTER) charEnum.HasDemonHunterOnRealm = true; + if (charInfo.Level >= 70) + charEnum.HasLevel70OnRealm = true; charEnum.Characters.emplace_back(charInfo); } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 5e7efd257f7..7e44b8f9fe7 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -30,8 +30,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // 19 20 21 22 23 24 25 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 26 27 28 29 - // "character_banned.guid, characters.slot, characters.logout_time, character_declinedname.genitive" + // 26 27 28 29 30 + // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, character_declinedname.genitive" Guid = ObjectGuid::Create(fields[0].GetUInt64()); Name = fields[1].GetString(); @@ -77,7 +77,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (fields[26].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[29].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[30].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -109,6 +109,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel Tokenizer equipment(fields[25].GetString(), ' '); ListPosition = fields[27].GetUInt8(); LastPlayedTime = fields[28].GetUInt32(); + if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(Class, fields[29].GetUInt8())) + SpecID = spec->ID; for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -127,7 +129,7 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsDemonHunterCreationAllowed); _worldPacket.WriteBit(HasDemonHunterOnRealm); - _worldPacket.WriteBit(HasLevel70OnAccount); + _worldPacket.WriteBit(HasLevel70OnRealm); _worldPacket.WriteBit(Unknown7x); _worldPacket.WriteBit(DisabledClassesMask.is_initialized()); _worldPacket << uint32(Characters.size()); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index ec3ac9dc172..695697468f9 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -179,7 +179,7 @@ namespace WorldPackets bool IsDeletedCharacters = false; ///< used for character undelete list bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access bool HasDemonHunterOnRealm = false; - bool HasLevel70OnAccount = false; + bool HasLevel70OnRealm = false; bool Unknown7x = false; Optional DisabledClassesMask; -- cgit v1.2.3